+++ /dev/null
-Copyright 1999 - 2003 Michael Day
-
-
-SOURCE CODE ORGANIZATION
-==========================
-
-The source code is organized as follows:
-
-Initial directory = ldap_slp
-+---conf <-- contains the DA configuration file
-+---doc <-- contains some internet-drafts
-+---scripts <-- shell scripts that demonstrate functions
-+---src <-- source code
-| +---cmd-utils <-- command-line utilities
-| | +---slp_client <-- slp client library
-| | +---slp_query <-- command-line slp user agent
-| | +---slp_srvreg <-- command-line and daemon slp service agent
-
-
-BUILD REQUIREMENTS
-===========================
-
-To build the source tree, you must have Bash, Gnu Make, Gnu Autoconf,
-and Gnu Libtool, and a C compiler and linker.
-
-Information on downloading, installing, and using Autoconf and Libtool
-is in the file README.AUTOCONF.
-
-
-COPYING GNU SHELL SCRIPTS TO BULD DIRECTORY
-============================================
-
-There are four shell scripts that you may need to copy to the build
-directory in order for the build to be successful. These scripts are
-generated and installed as part of the Autoconf and Libtool
-installation procedures (see README.AUTOCONF).
-
-
-1) config.guess
-
-This shell script determines the build platform. It will be
-located in one of the libtool directories, but will probably be
-located in multiple directores on your system if you have done a lot
-of building products from source (as opposed to RPM packages). Here is
-how I copied it on my RedHat 7.3 system:
-
-cp /usr/share/libtool/config.guess $PEGASUS_ROOT/src/Unsupported/slp_client/
-
-2) config.sub
-
-This shell script contains subroutines used by Autoconf. Here is now I
-copied it on my RedHat 7.3 system:
-
-cp /usr/share/automake-1.5/config.sub $PEGASUS_ROOT/src/Unsupported/slp_client/
-
-3) install-sh
-
-This shell script performs library installation for Libtool. Here is
-how I copied it on my RedHat 7.3 system:
-
-cp /usr/share/automake-1.5/install-sh $PEGASUS_ROOT/src/Unsupported/slp_client/
-
-
-4) ltmain.sh
-
-This is a template for generating the libtool script for your specific
-platform. Here is how I copied it on my RedHat 7.3 system:
-
-
-cp /usr/share/libtool/ltmain.sh $PEGASUS_ROOT/src/Unsupported/slp_client/
-
-
-BUILD COMMANDS
-===========================
-
-1) Untar distribution tarball and cd into the slp_client directory.
-2) type ./configure <Enter>
-3) type make <Enter>
-
-Binaries will be located in the same directories as thier source. The
-mysterious machinations of libtool allow you to link and run binaries
-against the libslp_client.so shared library without actually
-installing anything.
-
-To clean all the binaries, type make clean <Enter>
-
-
-INSTALLATION
-===========================
-
-To install, su to root and type make install <Enter>
-
-
-
+++ /dev/null
- Copyright (c) 2000 - 2003 Michael Day
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-
-
+++ /dev/null
-#//%2005////////////////////////////////////////////////////////////////////////
-#//
-#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation, The Open Group.
-#// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; VERITAS Software Corporation; The Open Group.
-#//
-#// Permission is hereby granted, free of charge, to any person obtaining a copy
-#// of this software and associated documentation files (the "Software"), to
-#// deal in the Software without restriction, including without limitation the
-#// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-#// sell copies of the Software, and to permit persons to whom the Software is
-#// furnished to do so, subject to the following conditions:
-#//
-#// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-#// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-#// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-#// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-#// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-#// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-#// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#//
-#//==============================================================================
-VPATH = .
-
-COMPONENTS = all
-CLEAN = clean
-INSTALL = install
-
-
-## capture the appropriate environment variables to
-## control the build process
-##
-export BUILD_ROOT := /home/mdday/my-programs/pegasus/src/Unsupported/slp_client
-export SRC_DIR := $(BUILD_ROOT)/src
-export BUILD_DIR := $(shell pwd)
-export WORDS_BIG_ENDIAN := @WORDS_BIG_ENDIAN@
-export PACKAGE := slp
-export PACKAGE_VERSION := 0.8
-export DEBUG := true
-export LIBTOOL := /home/mdday/my-programs/pegasus/src/Unsupported/slp_client/libtool
-export OBJ := .lo
-export IGNORE := -
-export LIB_PATH := -rpath
-export LEX := flex
-export YACC := bison
-export STATIC_LINK_CMD := -static
-export DLL_LINK_CMD := -module
-export MV := mv
-export MV_FLAGS := -fv
-export RM := rm
-export RM_FLAGS := -fv
-export CP := cp
-export CP_FLAGS := -fv
-export MAKE := make
-export OS_PORT_INC := lslp-linux.h
-export OS_PORT_SRC := lslp-linux.c
-export OS_PORT_OBJ := lslp-linux.lo
-export HOST_OS := linux
-export LINKER := gcc
-export EXE :=
-export LIBS :=
-export THREAD_LIBS := -lpthread
-export REENTRANT_FLAG := -D_REENTRANT
-export NO_LINK_FLAG := -c
-export LIB_SUFFIX := .o
-export DLL_SUFFIX := @DLL_SUFFIX@
-export EXE_OUT := -o
-export OBJ_OUT := -o
-export LIB_INCLUDE_FLAG := -l
-export CFLAGS := -g -Wall -Dlinux -DDEBUG_ALLOC
-export LDFLAGS := -g
-export DLL_LIB_FLAG :=
-export LFLAGS := -p -v -d
-export YFLAGS := -v -d
-export bindir := /bin
-export sbindir := /sbin
-export libexecdir := /lib
-export sysconfdir := /etc
-export libdir := /usr/lib
-export PLATFORM := x86
-export CC := gcc
-
-export BINDIR := /bin
-export SBINDIR := /sbin
-export LIBEXECDIR := /lib
-export SYSCONFIGDIR := /etc
-export LIBDIR := /usr/lib
-
-all: $(COMPONENTS)
-.PHONY: all
-
-clean: $(CLEAN)
-.PHONY: clean
-
-install: $(INSTALL)
-.PHONY: install
-
-test: $(TEST)
-.PHONY: test
-
-
-SRC_DIRS := $(SRC_DIR)
-
-$(INSTALL) :
- $(foreach dir, $(SRC_DIRS), cd $(dir) && $(MAKE) all;)
- $(foreach dir, $(SRC_DIRS), cd $(dir) && $(MAKE) $(INSTALL);)
-$(COMPONENTS) $(CLEAN) :
- $(foreach dir, $(SRC_DIRS),cd $(dir) && $(MAKE) $@;)
-
-
+++ /dev/null
-#//%2005////////////////////////////////////////////////////////////////////////
-#//
-#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation, The Open Group.
-#// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; VERITAS Software Corporation; The Open Group.
-#//
-#// Permission is hereby granted, free of charge, to any person obtaining a copy
-#// of this software and associated documentation files (the "Software"), to
-#// deal in the Software without restriction, including without limitation the
-#// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-#// sell copies of the Software, and to permit persons to whom the Software is
-#// furnished to do so, subject to the following conditions:
-#//
-#// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-#// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-#// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-#// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-#// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-#// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-#// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#//
-#//==============================================================================
-VPATH = .
-
-COMPONENTS = all
-CLEAN = clean
-INSTALL = install
-
-
-## capture the appropriate environment variables to
-## control the build process
-##
-export BUILD_ROOT := @abs_builddir@
-export SRC_DIR := $(BUILD_ROOT)/src
-export BUILD_DIR := $(shell pwd)
-export WORDS_BIG_ENDIAN := @WORDS_BIG_ENDIAN@
-export PACKAGE := @PACKAGE_NAME@
-export PACKAGE_VERSION := @PACKAGE_VERSION@
-export DEBUG := @DEBUG@
-export LIBTOOL := @abs_builddir@/@LIBTOOL@
-export OBJ := @OBJ@
-export IGNORE := @IGNORE@
-export LIB_PATH := @LIB_PATH@
-export LEX := @LEX@
-export YACC := @YACC@
-export STATIC_LINK_CMD := @STATIC_LINK_CMD@
-export DLL_LINK_CMD := @DLL_LINK_CMD@
-export MV := @MV@
-export MV_FLAGS := @MV_FLAGS@
-export RM := @RM@
-export RM_FLAGS := @RM_FLAGS@
-export CP := @CP@
-export CP_FLAGS := @CP_FLAGS@
-export MAKE := @MAKE@
-export OS_PORT_INC := @OS_PORT_INC@
-export OS_PORT_SRC := @OS_PORT_SRC@
-export OS_PORT_OBJ := @OS_PORT_OBJ@
-export HOST_OS := @HOST_OS@
-export LINKER := @LINKER@
-export EXE := @EXE@
-export LIBS := @LIBS@
-export THREAD_LIBS := @THREAD_LIBS@
-export REENTRANT_FLAG := @REENTRANT_FLAG@
-export NO_LINK_FLAG := @NO_LINK_FLAG@
-export LIB_SUFFIX := @LIB_SUFFIX@
-export DLL_SUFFIX := @DLL_SUFFIX@
-export EXE_OUT := @EXE_OUT@
-export OBJ_OUT := @OBJ_OUT@
-export LIB_INCLUDE_FLAG := @LIB_INCLUDE_FLAG@
-export CFLAGS := @CFLAGS@
-export LDFLAGS := @LDFLAGS@
-export DLL_LIB_FLAG := @DLL_LIB_FLAG@
-export LFLAGS := @LFLAGS@
-export YFLAGS := @YFLAGS@
-export bindir := @bindir@
-export sbindir := @sbindir@
-export libexecdir := @libexecdir@
-export sysconfdir := @sysconfdir@
-export libdir := @libdir@
-export PLATFORM := @PLATFORM@
-export CC := @CC@
-
-export BINDIR := @bindir@
-export SBINDIR := @sbindir@
-export LIBEXECDIR := @libexecdir@
-export SYSCONFIGDIR := @sysconfdir@
-export LIBDIR := @libdir@
-
-all: $(COMPONENTS)
-.PHONY: all
-
-clean: $(CLEAN)
-.PHONY: clean
-
-install: $(INSTALL)
-.PHONY: install
-
-test: $(TEST)
-.PHONY: test
-
-
-SRC_DIRS := $(SRC_DIR)
-
-$(INSTALL) :
- $(foreach dir, $(SRC_DIRS), cd $(dir) && $(MAKE) all;)
- $(foreach dir, $(SRC_DIRS), cd $(dir) && $(MAKE) $(INSTALL);)
-$(COMPONENTS) $(CLEAN) :
- $(foreach dir, $(SRC_DIRS),cd $(dir) && $(MAKE) $@;)
-
-
+++ /dev/null
-#//%2005////////////////////////////////////////////////////////////////////////
-#//
-#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation, The Open Group.
-#// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; VERITAS Software Corporation; The Open Group.
-#//
-#// Permission is hereby granted, free of charge, to any person obtaining a copy
-#// of this software and associated documentation files (the "Software"), to
-#// deal in the Software without restriction, including without limitation the
-#// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-#// sell copies of the Software, and to permit persons to whom the Software is
-#// furnished to do so, subject to the following conditions:
-#//
-#// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-#// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-#// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-#// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-#// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-#// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-#// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#//
-#//==============================================================================
-
-SRC_DIRS := src
-
-all clean:
- $(foreach dir, $(SRC_DIRS),cd $(dir) && $(MAKE) -f Makefile.nt $@;)
-
-
+++ /dev/null
-Copyright 1999 - 2003 Michael Day
-
-mdday@us.ibm.com
-md@soft-hackle.net
-
-CMD-UTILS
-===========
-The cmd-utils directory contains a general purpose client library,
-plus two command-line programs designed to be used with Bash or
-Perl. The library contains all the features of an SLP client, and the
-two programs use the library to implement an SLP Service Agent and an
-SLP User Agent
-
-
-State of the Source Tree
-=======================
-As of Mon May 12 2003 the Windows build is broken. The Linux build is
-working on at least two linux platforms.
-
-The source tree has undergone significant reorgination lately. I have
-converted from really ugly kludged makefiles to using the GNU autoconf
-and libtool programs to organize and control the building
-process. (Some of you may think that autoconf is really ugly and
-kludged but considering all of the problems it solves I would have to
-disagree.)
-
-Here is how the source tree is now organized:
-
-Initial directory = ldap_slp
-+---conf <-- contains the DA configuration file
-+---doc <-- contains some internet-drafts
-+---scripts <-- shell scripts that demonstrate functions
-+---src <-- source code
-| +---cmd-utils <-- command-line utilities
-| | +---slp_client <-- slp client library
-| | +---slp_query <-- command-line slp user agent
-| | +---slp_srvreg <-- command-line and daemon slp service agent
-
-
-Windows Build
-=============
-The Windows build is broken because I haven't debugged the autoconf
-macros for windows. If you are curious, look at the file
-ldap_slp/configure.ac.
-
-When windows builds once again it will require Bash, gmake, and GNU
-Autoconf and Libtool. The best thing to do if you want to build on
-windows and don't know what I'm talking about is to get Cygwin. You
-can get Cygwin at http://www.cygwin.com
-
-
-Porting
-=========
-Porting this code to any POSIX operating system is straightforward.
-Each operating system needs to have its own compatibility source
-modules. For linux, those are lslp-linux.h and lslp-linux.c
-
-To add support for a new platform, you must start with the autoconf
-script, configure.ac. In that script there are placeholders for each
-platform. Here is a sample that implements part of the linux support:
-
- *-*-linux*)
- AC_DEFINE([HOST_OS], ["Linux"], [Target Operation System])
- AC_DEFINE([OS_PORT_INCLUDE], ["lslp-linux.h"], [Portability Header])
- OS_PORT_INC=lslp-linux.h
- OS_PORT_SRC=lslp-linux.c
- OS_PORT_OBJ=lslp-linux.lo
-
-Each of these symbols has a counterpart within the build system. For a
-new platform you need to flesh out the placeholder for that platform
-in configure.ac. Then you need to implement the portability header and
-possibly a portability source file.
-
-
+++ /dev/null
-Autoconf and Libtool are Gnu utilities that automate the building and
-installation of software libraries and executables. They abstract
-platform differences and provide a toolkit of macros and shell scripts
-that solve platform interoperability issues.
-
-Building slp_client library requires Autoconf and Libtool. However,
-these tools are licensed under the Gnu Public License and therefore
-they are not included in the Pegasus CVS repository.
-
-You need to obtain Autoconf and Libtool and install them on your
-platform prior to rebuilding the slp_client library. Most Unix
-platforms have versions of Autoconf and Libtool
-pre-installed. However, you should still update your platform to the
-latest versions.
-
-
-Obtaining Autoconf
-====================
-
-The following web page contains information on downloading and using
-Autoconf:
-
-http://www.gnu.org/software/autoconf/
-
-Obtaining Libtool
-=================
-
-The following web page contains information on downloading and using
-Libtool:
-
- http://www.gnu.org/directory/libtool.html
-
-Autoconf Manual
-===============
-
-There is an up-to-date Autoconf manual at:
-
-http://www.gnu.org/manual/autoconf/html_mono/autoconf.html
-
-
-Online Book on Autoconf and Libtool
-====================================
-
-You may be interested in a book on Autoconf, Automake (another Gnu
-tool), and Libtool that was published commercially and is now
-available on-line:
-
-http://sources.redhat.com/autobook/
-
-This book is out of date but nevertheless contains a lot of very
-useful information about using Autoconf and Libtool.
+++ /dev/null
-################################# slp.conf ###############################
-# #
-# configuration file for l-SLP kernel #
-# #
-###########################################################################
-
-
-##### DA Advertisement #######
-#
-# DA advertisement provides regular publication over the network of the
-# existence and properties of the SLP Directory Agent. You need to ensure
-# that each network segment receives regular DA advertisements.
-# The best way to do this is through multicast advertising to
-# address 239.255.255.253. However, if multicast is not enabled to cross
-# routers, the next best option is to do directed broadcast.
-#
-# DA advertisement should be done regularly but not too frequently because
-# it is unsolicited network traffic.
-#
-# syntax is as follows:
-# da_advert, <type>, <interval>, <target address>, <sending interface>, <mask>
-#
-# where <type> is one of multicast, broadcast, or unicast ;
-# <interval> is the number of seconds between each advertisement;
-# <target address> is the IP address to which the advertisement will be sent ;
-# <sending interface> is the IP address from which to send the advertisement;
-# <mask> is the IP mask to apply to broadcast advertisements
-
-# next line is a multicast to the SLP group
-da_advert, multicast, 1000, 239.255.255.253, 0.0.0.0
-# next line is a directed broadcast to
-#da_advert, broadcast, 1000, 137.69.141.112, 0.0.0.0, 255.255.255.0
-# next line is a directed broadcast to 127.69.142.255
-#da_advert, broadcast, 1000, 137.69.142.112, 0.0.0.0, 255.255.255.0
-# next line is a directed broadcast to 127.69.143.255
-#da_advert, broadcast, 1000, 137.69.143.112, 0.0.0.0, 255.255.255.0
-# next line is an example of a unicast advertisement
-#da_advert, unicast, 1000, 137.69.141.39, 0.0.0.0
-
-
-##### Active DA Discovery #####
-#
-# Active DA discovery allows the DA agent to actively query for other
-# SLP directory agents.
-#
-# Active DA discovery can be done more frequently than DA Advertisement
-# but also can generate needless traffic if done too frequently. You should
-# experiment with the interval for each DA discovery line.
-#
-# syntax is as follows:
-# da_disc, <type>, <interval>, <target address>, <sending interface>, <mask>
-# the syntax is the same as for DA Advertisement, above.
-da_disc, multicast, 200, 239.255.255.253, 0.0.0.0
-#da_disc, broadcast, 200, 137.69.141.112, 0.0.0.0, 255.255.255.0
-#da_disc, broadcast, 200, 137.69.142.112, 0.0.0.0, 255.255.255.0
-#da_disc, broadcast, 200, 137.69.143.112, 0.0.0.0, 255.255.255.0
-
-# how many seconds before an inactive TCP connection should be closed
-# NOTE: for mesh operation, this setting must be the same for all
-# participants in the mesh. Otherwise they will time the slow
-# DA out of the mesh!!
-close_conn, 300
-#listen, 9.37.98.90
-
-
-# which port should the l-slp simplified network API operate upon
-# you should select an unused port - it should be in the unreserved range
-api_port, 4800
-
-# which port should the SLP DA operate on -- 427 is the default
-operational_port, 427
-
-# max time to wait for a complete multicast query response
-mc_max, 15
-
-# how long to wait upon startup to perform DA Discovery
-start_wait, 3
-
-# wait interval before retransmission of multicast or broadcast queries
-retry_interval, 2
-
-# time to wait before giving up on unicast message transmission
-retry_max, 15
-
-# time between regular multicast da advertisements
-da_beat, 10800
-
-# time between regular multicast active da discovery
-da_find, 900
-
-# wait to register services upon passive da discovery
-reg_passive, 1
-
-# wait to register services upon active da discovery
-reg_active, 1
-
-# not support in this release
-slp_mtu, 1458
-
-# time-to-live for multicast messages
-slp_ttl, 255
-
-# max message size the DA can process. messages larger than this will
-# be discarded. This is a security feature to prevent buffer overruns or
-# uncontrolled memory allocation
-max_msg, 8192
-
-# not used -- redundant
-# converge_retries, <seconds>
-
-# not used -- redundant
-# converge_wait, <seconds>
-
-# file to hold debugging messages -- not recommended right now
-# log_file, <file name>
-
-# not tested yet
-# use_syslog <1 or 0>
-
-# not tested yet
-# log_stderr < 1 or 0>
-
-# not tested yet
-# log_level <1 - 5>
-
-# not completely implemented
-# www_file, <file name>
-
-# ip address of the DA - useful to force the DA to live at a
-# specified address on multi-homed hosts
-da_addr, 192.168.2.45
-
-# language tag
-language, en
-
-#scope list for DA
-# format is scopes, <scope0>, <scope1>, <scopeN>
-scopes, DEFAULT
-
+++ /dev/null
-//%2005////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation, The Open Group.
-// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-// EMC Corporation; VERITAS Software Corporation; The Open Group.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//==============================================================================
-/* config.h. Generated by configure. */
-/* config.h.in. Generated from configure.ac by autoheader. */
-
-/* Enable debugging options in build. */
-#define DEBUG 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#ifdef _WIN32
-#define HAVE_UNISTD_H 0
-#else
-#define HAVE_UNISTD_H 1
-#endif
-
-/* OK to #include /linux/if.h */
-#define HAVE_IF_H 1
-
-/* Target Operation System */
-#ifdef _WIN32
-#define HOST_OS "Windows"
-#else
-#define HOST_OS "Linux"
-#endif
-
-/* Portability Header */
-#ifdef _WIN32
-#define OS_PORT_INCLUDE "lslp-windows.h"
-#else
-#define OS_PORT_INCLUDE "lslp-linux.h"
-#endif
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "lslp-bugs@lists.sourceforge.net"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "slp"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "slp 0.8 "
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "lslp.tar.gz"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "0.8 "
-
-/* Target Processor */
-#define PLATFORM "x86"
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-#ifdef _WIN32
-#define DLL_IMPORT __declspec(dllimport)
-#define DLL_EXPORT __declspec(dllexport)
-#else
-#define DLL_IMPORT
-#define DLL_EXPORT
-#endif
-
-/* #undef WORDS_BIG_ENDIAN */
+++ /dev/null
-/* config.h.in. Generated from configure.ac by autoheader. */
-
-/* Enable debugging options in build. */
-#undef DEBUG
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* OK to #include /linux/if.h */
-#undef HAVE_IF_H
-
-/* Target Operation System */
-#undef HOST_OS
-
-/* Portability Header */
-#undef OS_PORT_INCLUDE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* Target Processor */
-#undef PLATFORM
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-#undef DLL_IMPORT
-
-#undef DLL_EXPORT
-
-#undef WORDS_BIG_ENDIAN
+++ /dev/null
-#! /bin/sh
-# From configure.ac Revision: 1.14 .
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.53 for slp 0.8 .
-#
-# Report bugs to <lslp-bugs@lists.sourceforge.net>.
-#
-# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-#
-# Configuration input files:
-# Copyright (c) 2002, Michael Day
-# Copyright (c) 2002, International Business Machines
-#
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the "Software"),
-# to deal in the Software without restriction, including without limitation
-# the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# and/or sell copies of the Software, and to permit persons to whom the
-# Software is furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-
-# Find the correct PATH separator. Usually this is `:', but
-# DJGPP uses `;' like DOS.
-if test "X${PATH_SEPARATOR+set}" != Xset; then
- UNAME=${UNAME-`uname 2>/dev/null`}
- case X$UNAME in
- *-DOS) lt_cv_sys_path_separator=';' ;;
- *) lt_cv_sys_path_separator=':' ;;
- esac
- PATH_SEPARATOR=$lt_cv_sys_path_separator
-fi
-
-
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$ECHO in
-X*--fallback-echo)
- # Remove one level of quotation (which was required for Make).
- ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
- ;;
-esac
-
-echo=${ECHO-echo}
-if test "X$1" = X--no-reexec; then
- # Discard the --no-reexec flag, and continue.
- shift
-elif test "X$1" = X--fallback-echo; then
- # Avoid inline document here, it may be left over
- :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
- # Yippee, $echo works!
- :
-else
- # Restart under the correct shell.
- exec $SHELL "$0" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
- # used as fallback echo
- shift
- cat <<EOF
-
-EOF
- exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
-
-if test -z "$ECHO"; then
-if test "X${echo_test_string+set}" != Xset; then
-# find a string as large as possible, as long as the shell can cope with it
- for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
- # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
- if (echo_test_string="`eval $cmd`") 2>/dev/null &&
- echo_test_string="`eval $cmd`" &&
- (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
- then
- break
- fi
- done
-fi
-
-if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- :
-else
- # The Solaris, AIX, and Digital Unix default echo programs unquote
- # backslashes. This makes it impossible to quote backslashes using
- # echo "$something" | sed 's/\\/\\\\/g'
- #
- # So, first we look for a working echo in the user's PATH.
-
- IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for dir in $PATH /usr/ucb; do
- if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
- test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- echo="$dir/echo"
- break
- fi
- done
- IFS="$save_ifs"
-
- if test "X$echo" = Xecho; then
- # We didn't find a better echo, so look for alternatives.
- if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- # This shell has a builtin print -r that does the trick.
- echo='print -r'
- elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
- test "X$CONFIG_SHELL" != X/bin/ksh; then
- # If we have ksh, try running configure again with it.
- ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
- export ORIGINAL_CONFIG_SHELL
- CONFIG_SHELL=/bin/ksh
- export CONFIG_SHELL
- exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
- else
- # Try using printf.
- echo='printf %s\n'
- if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- # Cool, printf works
- :
- elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
- test "X$echo_testing_string" = 'X\t' &&
- echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
- export CONFIG_SHELL
- SHELL="$CONFIG_SHELL"
- export SHELL
- echo="$CONFIG_SHELL $0 --fallback-echo"
- elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
- test "X$echo_testing_string" = 'X\t' &&
- echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- echo="$CONFIG_SHELL $0 --fallback-echo"
- else
- # maybe with a smaller string...
- prev=:
-
- for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
- if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
- then
- break
- fi
- prev="$cmd"
- done
-
- if test "$prev" != 'sed 50q "$0"'; then
- echo_test_string=`eval $prev`
- export echo_test_string
- exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
- else
- # Oops. We lost completely, so just stick with echo.
- echo=echo
- fi
- fi
- fi
- fi
-fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-ECHO=$echo
-if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
- ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
-fi
-
-
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-
-## --------------------- ##
-## M4sh Initialization. ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
- emulate sh
- NULLCMD=:
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
- set -o posix
-fi
-
-# NLS nuisances.
-# Support unset when possible.
-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
- as_unset=unset
-else
- as_unset=false
-fi
-
-(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
- { $as_unset LANG || test "${LANG+set}" != set; } ||
- { LANG=C; export LANG; }
-(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
- { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
- { LC_ALL=C; export LC_ALL; }
-(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
- { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
- { LC_TIME=C; export LC_TIME; }
-(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
- { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
- { LC_CTYPE=C; export LC_CTYPE; }
-(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
- { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
- { LANGUAGE=C; export LANGUAGE; }
-(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
- { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
- { LC_COLLATE=C; export LC_COLLATE; }
-(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
- { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
- { LC_NUMERIC=C; export LC_NUMERIC; }
-(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
- { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
- { LC_MESSAGES=C; export LC_MESSAGES; }
-
-
-# Name of the executable.
-as_me=`(basename "$0") 2>/dev/null ||
-$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" >conftest.sh
- echo "exit 0" >>conftest.sh
- chmod +x conftest.sh
- if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
- else
- PATH_SEPARATOR=:
- fi
- rm -f conftest.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
- 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
-
-as_executable_p="test -f"
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="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="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 || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export 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
-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='slp'
-PACKAGE_TARNAME='lslp.tar.gz'
-PACKAGE_VERSION='0.8 '
-PACKAGE_STRING='slp 0.8 '
-PACKAGE_BUGREPORT='lslp-bugs@lists.sourceforge.net'
-
-ac_unique_file="config.guess"
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#if STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# if HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
-#endif
-#if HAVE_STRING_H
-# if !STDC_HEADERS && HAVE_MEMORY_H
-# include <memory.h>
-# endif
-# include <string.h>
-#endif
-#if HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#else
-# if HAVE_STDINT_H
-# include <stdint.h>
-# endif
-#endif
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-
-# 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
-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 slp 0.8 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
-
-System types:
- --build=BUILD configure for building on BUILD [guessed]
- --host=HOST cross-compile to build programs to run on HOST [BUILD]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
- case $ac_init_help in
- short | recursive ) echo "Configuration of slp 0.8 :";;
- esac
- cat <<\_ACEOF
-
-Optional Features:
- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
- --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --enable-shared=PKGS build shared libraries default=yes
- --enable-static=PKGS build static libraries default=yes
- --enable-fast-install=PKGS optimize for fast installation default=yes
- --disable-libtool-lock avoid locking (might break parallel builds)
-
-Optional Packages:
- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --with-gnu-ld assume the C compiler uses GNU ld default=no
- --with-pic try to use only PIC/non-PIC objects default=use both
-
-Some influential environment variables:
- CC C compiler command
- CFLAGS C compiler flags
- LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
- nonstandard directory <lib dir>
- CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
- headers in a nonstandard directory <include dir>
- 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.
-
-Report bugs to <lslp-bugs@lists.sourceforge.net>.
-_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
-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
-# absolute.
-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
-
- 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
-slp configure 0.8
-generated by GNU Autoconf 2.53
-
-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
-Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-
-Configuration input files:
-Copyright (c) 2002, Michael Day
-Copyright (c) 2002, International Business Machines
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-_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 slp $as_me 0.8 , which was
-generated by GNU Autoconf 2.53. 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.
-# Also quote any args containing shell meta-characters.
-ac_configure_args=
-ac_sep=
-for ac_arg
-do
- case $ac_arg in
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c | -n ) continue ;;
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
- continue ;;
- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
- ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
- esac
- case " $ac_configure_args " in
- *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
- *) ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
- ac_sep=" " ;;
- esac
- # Get rid of the leading space.
-done
-
-# 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
- if test -s confdefs.h; then
- cat <<\_ASBOX
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-_ASBOX
- echo
- sed "/^$/d" confdefs.h
- echo
- fi
- test "$ac_signal" != 0 &&
- echo "$as_me: caught signal $ac_signal"
- echo "$as_me: exit $exit_status"
- } >&5
- rm -f core 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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-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.
-
-# Make sure we can run config.sub.
-$ac_config_sub sun4 >/dev/null 2>&1 ||
- { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
-echo "$as_me: error: cannot run $ac_config_sub" >&2;}
- { (exit 1); exit 1; }; }
-
-echo "$as_me:$LINENO: checking build system type" >&5
-echo $ECHO_N "checking build system type... $ECHO_C" >&6
-if test "${ac_cv_build+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_build_alias=$build_alias
-test -z "$ac_cv_build_alias" &&
- ac_cv_build_alias=`$ac_config_guess`
-test -z "$ac_cv_build_alias" &&
- { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
-echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
- { (exit 1); exit 1; }; }
-ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
- { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
- { (exit 1); exit 1; }; }
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-echo "${ECHO_T}$ac_cv_build" >&6
-build=$ac_cv_build
-build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-
-
-
-
-# Check whether --enable-shared or --disable-shared was given.
-if test "${enable_shared+set}" = set; then
- enableval="$enable_shared"
- p=${PACKAGE-default}
-case $enableval in
-yes) enable_shared=yes ;;
-no) enable_shared=no ;;
-*)
- enable_shared=no
- # Look at the argument we got. We use all the common list separators.
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
- for pkg in $enableval; do
- if test "X$pkg" = "X$p"; then
- enable_shared=yes
- fi
- done
- IFS="$ac_save_ifs"
- ;;
-esac
-else
- enable_shared=yes
-fi;
-# Check whether --enable-static or --disable-static was given.
-if test "${enable_static+set}" = set; then
- enableval="$enable_static"
- p=${PACKAGE-default}
-case $enableval in
-yes) enable_static=yes ;;
-no) enable_static=no ;;
-*)
- enable_static=no
- # Look at the argument we got. We use all the common list separators.
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
- for pkg in $enableval; do
- if test "X$pkg" = "X$p"; then
- enable_static=yes
- fi
- done
- IFS="$ac_save_ifs"
- ;;
-esac
-else
- enable_static=yes
-fi;
-# Check whether --enable-fast-install or --disable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then
- enableval="$enable_fast_install"
- p=${PACKAGE-default}
-case $enableval in
-yes) enable_fast_install=yes ;;
-no) enable_fast_install=no ;;
-*)
- enable_fast_install=no
- # Look at the argument we got. We use all the common list separators.
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
- for pkg in $enableval; do
- if test "X$pkg" = "X$p"; then
- enable_fast_install=yes
- fi
- done
- IFS="$ac_save_ifs"
- ;;
-esac
-else
- enable_fast_install=yes
-fi;
-echo "$as_me:$LINENO: checking host system type" >&5
-echo $ECHO_N "checking host system type... $ECHO_C" >&6
-if test "${ac_cv_host+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_host_alias=$host_alias
-test -z "$ac_cv_host_alias" &&
- ac_cv_host_alias=$ac_cv_build_alias
-ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
- { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
- { (exit 1); exit 1; }; }
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-echo "${ECHO_T}$ac_cv_host" >&6
-host=$ac_cv_host
-host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-
-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
- set dummy "$as_dir/$ac_word" ${1+"$@"}
- shift
- ac_cv_prog_CC="$@"
- 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" >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH" >&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 </dev/null >&5\"") >&5
- (eval $ac_compiler --version </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
- (eval $ac_compiler -v </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
- (eval $ac_compiler -V </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.exe"
-# 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" >&5
-echo $ECHO_N "checking for C compiler default output... $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=
-for ac_file in `ls a_out.exe a.exe conftest.exe 2>/dev/null;
- ls a.out conftest 2>/dev/null;
- ls a.* conftest.* 2>/dev/null`; do
- case $ac_file in
- *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb | *.xSYM ) ;;
- a.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 --akim.
- export ac_cv_exeext
- break;;
- * ) break;;
- esac
-done
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-{ { echo "$as_me:$LINENO: error: C compiler cannot create executables" >&5
-echo "$as_me: error: C compiler cannot create executables" >&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'." >&5
-echo "$as_me: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'." >&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
-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 `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
- case $ac_file in
- *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;;
- *.* ) 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" >&5
-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link" >&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
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-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 ) ;;
- *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
- break;;
- esac
-done
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile" >&5
-echo "$as_me: error: cannot compute suffix of object files: cannot compile" >&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
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-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>&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
-cat conftest.$ac_ext >&5
-ac_compiler_gnu=no
-fi
-rm -f 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
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-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); } &&
- { 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
-cat conftest.$ac_ext >&5
-ac_cv_prog_cc_g=no
-fi
-rm -f 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
-# 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>&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 \
- ''\
- '#include <stdlib.h>' \
- '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
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-$ac_declaration
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-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>&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
-cat conftest.$ac_ext >&5
-continue
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-$ac_declaration
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-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>&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
-cat conftest.$ac_ext >&5
-fi
-rm -f 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
-cat conftest.$ac_ext >&5
-fi
-rm -f 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
-
-# Find the correct PATH separator. Usually this is `:', but
-# DJGPP uses `;' like DOS.
-if test "X${PATH_SEPARATOR+set}" != Xset; then
- UNAME=${UNAME-`uname 2>/dev/null`}
- case X$UNAME in
- *-DOS) lt_cv_sys_path_separator=';' ;;
- *) lt_cv_sys_path_separator=':' ;;
- esac
- PATH_SEPARATOR=$lt_cv_sys_path_separator
-fi
-
-
-# Check whether --with-gnu-ld or --without-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then
- withval="$with_gnu_ld"
- test "$withval" = no || with_gnu_ld=yes
-else
- with_gnu_ld=no
-fi;
-ac_prog=ld
-if test "$GCC" = yes; then
- # Check if gcc -print-prog-name=ld gives a path.
- echo "$as_me:$LINENO: checking for ld used by GCC" >&5
-echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6
- case $host in
- *-*-mingw*)
- # gcc leaves a trailing carriage return which upsets mingw
- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
- *)
- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
- esac
- case $ac_prog in
- # Accept absolute paths.
- [\\/]* | [A-Za-z]:[\\/]*)
- re_direlt='/[^/][^/]*/\.\./'
- # Canonicalize the path of ld
- ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
- while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
- done
- test -z "$LD" && LD="$ac_prog"
- ;;
- "")
- # If it fails, then pretend we aren't using GCC.
- ac_prog=ld
- ;;
- *)
- # If it is relative, then search for the first ld in PATH.
- with_gnu_ld=unknown
- ;;
- esac
-elif test "$with_gnu_ld" = yes; then
- echo "$as_me:$LINENO: checking for GNU ld" >&5
-echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
-else
- echo "$as_me:$LINENO: checking for non-GNU ld" >&5
-echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
-fi
-if test "${lt_cv_path_LD+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -z "$LD"; then
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH; do
- test -z "$ac_dir" && ac_dir=.
- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
- lt_cv_path_LD="$ac_dir/$ac_prog"
- # Check to see if the program is GNU ld. I'd rather use --version,
- # but apparently some GNU ld's only accept -v.
- # Break only if it was the GNU/non-GNU ld that we prefer.
- if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
- test "$with_gnu_ld" != no && break
- else
- test "$with_gnu_ld" != yes && break
- fi
- fi
- done
- IFS="$ac_save_ifs"
-else
- lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
- echo "$as_me:$LINENO: result: $LD" >&5
-echo "${ECHO_T}$LD" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
-echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
- { (exit 1); exit 1; }; }
-echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
-echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
-if test "${lt_cv_prog_gnu_ld+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- # I'd rather use --version here, but apparently some GNU ld's only accept -v.
-if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
- lt_cv_prog_gnu_ld=yes
-else
- lt_cv_prog_gnu_ld=no
-fi
-fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
-echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
-echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
-if test "${lt_cv_ld_reload_flag+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- lt_cv_ld_reload_flag='-r'
-fi
-echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
-echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
-reload_flag=$lt_cv_ld_reload_flag
-test -n "$reload_flag" && reload_flag=" $reload_flag"
-
-echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
-echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
-if test "${lt_cv_path_NM+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$NM"; then
- # Let the user override the test.
- lt_cv_path_NM="$NM"
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
- test -z "$ac_dir" && ac_dir=.
- tmp_nm=$ac_dir/${ac_tool_prefix}nm
- if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then
- # Check to see if the nm accepts a BSD-compat flag.
- # Adding the `sed 1q' prevents false positives on HP-UX, which says:
- # nm: unknown option "B" ignored
- # Tru64's nm complains that /dev/null is an invalid object file
- if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then
- lt_cv_path_NM="$tmp_nm -B"
- break
- elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
- lt_cv_path_NM="$tmp_nm -p"
- break
- else
- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
- continue # so that we can try to find one that supports BSD flags
- fi
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
-fi
-fi
-
-NM="$lt_cv_path_NM"
-echo "$as_me:$LINENO: result: $NM" >&5
-echo "${ECHO_T}$NM" >&6
-
-echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
-echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6
-if test "${lt_cv_path_SED+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- # Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_executable_p="test -f"
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in sed gsed; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
- _sed_list="$_sed_list $as_dir/$ac_prog$ac_exec_ext"
- fi
- done
- done
-done
-
- # 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.
-: ${TMPDIR=/tmp}
-{
- tmp=`(umask 077 && mktemp -d -q "$TMPDIR/sedXXXXXX") 2>/dev/null` &&
- test -n "$tmp" && test -d "$tmp"
-} ||
-{
- tmp=$TMPDIR/sed$$-$RANDOM
- (umask 077 && mkdir $tmp)
-} ||
-{
- echo "$me: cannot create a temporary directory in $TMPDIR" >&2
- { (exit 1); exit 1; }
-}
- _max=0
- _count=0
- # Add /usr/xpg4/bin/sed as it is typically found on Solaris
- # along with /bin/sed that truncates output.
- for _sed in $_sed_list /usr/xpg4/bin/sed; do
- test ! -f ${_sed} && break
- cat /dev/null > "$tmp/sed.in"
- _count=0
- echo ${ECHO_N-$ac_n} "0123456789${ECHO_C-$ac_c}" >"$tmp/sed.in"
- # Check for GNU sed and select it if it is found.
- if "${_sed}" --version 2>&1 < /dev/null | egrep '(GNU)' > /dev/null; then
- lt_cv_path_SED=${_sed}
- break
- fi
- while true; do
- cat "$tmp/sed.in" "$tmp/sed.in" >"$tmp/sed.tmp"
- mv "$tmp/sed.tmp" "$tmp/sed.in"
- cp "$tmp/sed.in" "$tmp/sed.nl"
- echo >>"$tmp/sed.nl"
- ${_sed} -e 's/a$//' < "$tmp/sed.nl" >"$tmp/sed.out" || break
- cmp -s "$tmp/sed.out" "$tmp/sed.nl" || break
- # 40000 chars as input seems more than enough
- test $_count -gt 10 && break
- _count=`expr $_count + 1`
- if test $_count -gt $_max; then
- _max=$_count
- lt_cv_path_SED=$_sed
- fi
- done
- done
- rm -rf "$tmp"
-
-fi
-
-if test "X$SED" != "X"; then
- lt_cv_path_SED=$SED
-else
- SED=$lt_cv_path_SED
-fi
-echo "$as_me:$LINENO: result: $SED" >&5
-echo "${ECHO_T}$SED" >&6
-
-echo "$as_me:$LINENO: checking whether ln -s works" >&5
-echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
- echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
- echo "$as_me:$LINENO: result: no, using $LN_S" >&5
-echo "${ECHO_T}no, using $LN_S" >&6
-fi
-
-echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5
-echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6
-if test "${lt_cv_deplibs_check_method+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given egrep regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix4* | aix5*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-beos*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-bsdi4*)
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
- lt_cv_file_magic_cmd='/usr/bin/file -L'
- lt_cv_file_magic_test_file=/shlib/libc.so
- ;;
-
-cygwin* | mingw* | pw32*)
- lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
- lt_cv_file_magic_cmd='$OBJDUMP -f'
- ;;
-
-darwin* | rhapsody*)
- lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library'
- lt_cv_file_magic_cmd='/usr/bin/file -L'
- case "$host_os" in
- rhapsody* | darwin1.[012])
- lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1`
- ;;
- *) # Darwin 1.3 on
- lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib'
- ;;
- esac
- ;;
-
-freebsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
- case $host_cpu in
- i*86 )
- # Not sure whether the presence of OpenBSD here was a mistake.
- # Let's accept both of them until this is cleared up.
- lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
- ;;
- esac
- else
- lt_cv_deplibs_check_method=pass_all
- fi
- ;;
-
-gnu*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-hpux10.20*|hpux11*)
- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=/usr/lib/libc.sl
- ;;
-
-irix5* | irix6* | nonstopux*)
- case $host_os in
- irix5* | nonstopux*)
- # this will be overridden with pass_all, but let us keep it just in case
- lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
- ;;
- *)
- case $LD in
- *-32|*"-32 ") libmagic=32-bit;;
- *-n32|*"-n32 ") libmagic=N32;;
- *-64|*"-64 ") libmagic=64-bit;;
- *) libmagic=never-match;;
- esac
- # this will be overridden with pass_all, but let us keep it just in case
- lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1"
- ;;
- esac
- lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*`
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-# This must be Linux ELF.
-linux-gnu*)
- case $host_cpu in
- alpha* | hppa* | i*86 | mips | mipsel | powerpc* | sparc* | ia64*)
- lt_cv_deplibs_check_method=pass_all ;;
- *)
- # glibc up to 2.1.1 does not perform some relocations on ARM
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;;
- esac
- lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
- ;;
-
-netbsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
- lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
- else
- lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so$'
- fi
- ;;
-
-newos6*)
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=/usr/lib/libnls.so
- ;;
-
-openbsd*)
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object'
- else
- lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library'
- fi
- ;;
-
-osf3* | osf4* | osf5*)
- # this will be overridden with pass_all, but let us keep it just in case
- lt_cv_deplibs_check_method='file_magic COFF format alpha shared library'
- lt_cv_file_magic_test_file=/shlib/libc.so
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sco3.2v5*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-solaris*)
- lt_cv_deplibs_check_method=pass_all
- lt_cv_file_magic_test_file=/lib/libc.so
- ;;
-
-sysv5uw[78]* | sysv4*uw2*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- case $host_vendor in
- motorola)
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
- ;;
- ncr)
- lt_cv_deplibs_check_method=pass_all
- ;;
- sequent)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
- ;;
- sni)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
- lt_cv_file_magic_test_file=/lib/libc.so
- ;;
- siemens)
- lt_cv_deplibs_check_method=pass_all
- ;;
- esac
- ;;
-esac
-
-fi
-echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
-echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-
-
-
-
-
-
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-echo "$as_me:$LINENO: checking command to parse $NM output" >&5
-echo $ECHO_N "checking command to parse $NM output... $ECHO_C" >&6
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix. What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Transform the above into a raw symbol and a C symbol.
-symxfrm='\1 \2\3 \3'
-
-# Transform an extracted symbol line into a proper C declaration
-lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
-
-# Define system-specific variables.
-case $host_os in
-aix*)
- symcode='[BCDT]'
- ;;
-cygwin* | mingw* | pw32*)
- symcode='[ABCDGISTW]'
- ;;
-hpux*) # Its linker distinguishes data from code symbols
- lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
- lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
- ;;
-irix* | nonstopux*)
- symcode='[BCDEGRST]'
- ;;
-osf*)
- symcode='[BCDEGQRST]'
- ;;
-solaris* | sysv5*)
- symcode='[BDT]'
- ;;
-sysv4)
- symcode='[DFNSTU]'
- ;;
-esac
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $host_os in
-mingw*)
- opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
- ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
- symcode='[ABCDGISTW]'
-fi
-
-# Try without a prefix undercore, then with it.
-for ac_symprfx in "" "_"; do
-
- # Write the raw and C identifiers.
-lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'"
-
- # Check to see that the pipe works correctly.
- pipe_works=no
- rm -f conftest*
- cat > conftest.$ac_ext <<EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-EOF
-
- 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
- # Now try to grab the symbols.
- nlist=conftest.nm
- if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
- (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && test -s "$nlist"; then
- # Try sorting and uniquifying the output.
- if sort "$nlist" | uniq > "$nlist"T; then
- mv -f "$nlist"T "$nlist"
- else
- rm -f "$nlist"T
- fi
-
- # Make sure that we snagged all the symbols we need.
- if egrep ' nm_test_var$' "$nlist" >/dev/null; then
- if egrep ' nm_test_func$' "$nlist" >/dev/null; then
- cat <<EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-EOF
- # Now generate the symbol file.
- eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext'
-
- cat <<EOF >> conftest.$ac_ext
-#if defined (__STDC__) && __STDC__
-# define lt_ptr void *
-#else
-# define lt_ptr char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-const struct {
- const char *name;
- lt_ptr address;
-}
-lt_preloaded_symbols[] =
-{
-EOF
- sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext
- cat <<\EOF >> conftest.$ac_ext
- {0, (lt_ptr) 0}
-};
-
-#ifdef __cplusplus
-}
-#endif
-EOF
- # Now try linking the two files.
- mv conftest.$ac_objext conftstm.$ac_objext
- save_LIBS="$LIBS"
- save_CFLAGS="$CFLAGS"
- LIBS="conftstm.$ac_objext"
- CFLAGS="$CFLAGS$no_builtin_flag"
- 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); } && test -s conftest$ac_exeext; then
- pipe_works=yes
- fi
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
- else
- echo "cannot find nm_test_func in $nlist" >&5
- fi
- else
- echo "cannot find nm_test_var in $nlist" >&5
- fi
- else
- echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
- fi
- else
- echo "$progname: failed program was:" >&5
- cat conftest.$ac_ext >&5
- fi
- rm -f conftest* conftst*
-
- # Do not use the global_symbol_pipe unless it works.
- if test "$pipe_works" = yes; then
- break
- else
- lt_cv_sys_global_symbol_pipe=
- fi
-done
-
-fi
-
-global_symbol_pipe="$lt_cv_sys_global_symbol_pipe"
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
- global_symbol_to_cdecl=
- global_symbol_to_c_name_address=
-else
- global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl"
- global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address"
-fi
-if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address";
-then
- echo "$as_me:$LINENO: result: failed" >&5
-echo "${ECHO_T}failed" >&6
-else
- echo "$as_me:$LINENO: result: ok" >&5
-echo "${ECHO_T}ok" >&6
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-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.
- # 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
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <assert.h>
- 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=$?
- egrep -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
- 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
- cat 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
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -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
- 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
- cat 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.
- # 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
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <assert.h>
- 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=$?
- egrep -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
- 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
- cat 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
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -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
- 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
- cat 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" >&5
-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&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 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
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -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
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_cv_header_stdc=yes
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_cv_header_stdc=no
-fi
-rm -f conftest.err 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
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "memchr" >/dev/null 2>&1; then
- :
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "free" >/dev/null 2>&1; then
- :
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then
- :
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <ctype.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- 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
-cat conftest.$ac_ext >&5
-( exit $ac_status )
-ac_cv_header_stdc=no
-fi
-rm -f core core.* *.core 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
-#line $LINENO "configure"
-#include "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>&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
-cat conftest.$ac_ext >&5
-eval "$as_ac_Header=no"
-fi
-rm -f 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
-
-
-
-for ac_header in dlfcn.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
- 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
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "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>&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
-cat conftest.$ac_ext >&5
-ac_header_compiler=no
-fi
-rm -f 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 $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -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
- 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
- cat 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 in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
-esac
-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
- eval "$as_ac_Header=$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-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
-
-
-
-
-
-
-# Only perform the check for file, if the check method requires it
-case $deplibs_check_method in
-file_magic*)
- if test "$file_magic_cmd" = '$MAGIC_CMD'; then
- echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
-echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- case $MAGIC_CMD in
- /*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
- ;;
- ?:/*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
- ;;
- *)
- ac_save_MAGIC_CMD="$MAGIC_CMD"
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="/usr/bin:$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/${ac_tool_prefix}file; then
- lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
- if test -n "$file_magic_test_file"; then
- case $deplibs_check_method in
- "file_magic "*)
- file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
- egrep "$file_magic_regex" > /dev/null; then
- :
- else
- cat <<EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such. This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem. Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-EOF
- fi ;;
- esac
- fi
- break
- fi
- done
- IFS="$ac_save_ifs"
- MAGIC_CMD="$ac_save_MAGIC_CMD"
- ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
- echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
- if test -n "$ac_tool_prefix"; then
- echo "$as_me:$LINENO: checking for file" >&5
-echo $ECHO_N "checking for file... $ECHO_C" >&6
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- case $MAGIC_CMD in
- /*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
- ;;
- ?:/*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
- ;;
- *)
- ac_save_MAGIC_CMD="$MAGIC_CMD"
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="/usr/bin:$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/file; then
- lt_cv_path_MAGIC_CMD="$ac_dir/file"
- if test -n "$file_magic_test_file"; then
- case $deplibs_check_method in
- "file_magic "*)
- file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
- egrep "$file_magic_regex" > /dev/null; then
- :
- else
- cat <<EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such. This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem. Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-EOF
- fi ;;
- esac
- fi
- break
- fi
- done
- IFS="$ac_save_ifs"
- MAGIC_CMD="$ac_save_MAGIC_CMD"
- ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
- echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- else
- MAGIC_CMD=:
- fi
-fi
-
- fi
- ;;
-esac
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_RANLIB+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$RANLIB"; then
- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
- echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
- ac_ct_RANLIB=$RANLIB
- # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-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_RANLIB+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$ac_ct_RANLIB"; then
- ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_RANLIB="ranlib"
- 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_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
- echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- RANLIB=$ac_ct_RANLIB
-else
- RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-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
-
-
-enable_dlopen=no
-enable_win32_dll=no
-
-# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then
- enableval="$enable_libtool_lock"
-
-fi;
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-*-*-irix6*)
- # Find out which ABI we are using.
- echo '#line 3791 "configure"' > conftest.$ac_ext
- 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
- case `/usr/bin/file conftest.$ac_objext` in
- *32-bit*)
- LD="${LD-ld} -32"
- ;;
- *N32*)
- LD="${LD-ld} -n32"
- ;;
- *64-bit*)
- LD="${LD-ld} -64"
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-
-*-*-sco3.2v5*)
- # On SCO OpenServer 5, we need -belf to get full-featured binaries.
- SAVE_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -belf"
- echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
-echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
-if test "${lt_cv_cc_needs_belf+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-
-
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext 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='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
- lt_cv_cc_needs_belf=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-lt_cv_cc_needs_belf=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
-echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
- if test x"$lt_cv_cc_needs_belf" != x"yes"; then
- # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
- CFLAGS="$SAVE_CFLAGS"
- fi
- ;;
-
-
-esac
-
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e s/^X//'
-sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Constants:
-rm="rm -f"
-
-# Global variables:
-default_ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except M$VC,
-# which needs '.lib').
-libext=a
-ltmain="$ac_aux_dir/ltmain.sh"
-ofile="$default_ofile"
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-need_locks="$enable_libtool_lock"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-test -z "$AS" && AS=as
-test -z "$CC" && CC=cc
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-test -z "$LD" && LD=ld
-test -z "$LN_S" && LN_S="ln -s"
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-test -z "$NM" && NM=nm
-test -z "$OBJDUMP" && OBJDUMP=objdump
-test -z "$RANLIB" && RANLIB=:
-test -z "$STRIP" && STRIP=:
-test -z "$ac_objext" && ac_objext=o
-
-if test x"$host" != x"$build"; then
- ac_tool_prefix=${host_alias}-
-else
- ac_tool_prefix=
-fi
-
-# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
-case $host_os in
-linux-gnu*) ;;
-linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
-esac
-
-case $host_os in
-aix3*)
- # AIX sometimes has problems with the GCC collect2 program. For some
- # reason, if we set the COLLECT_NAMES environment variable, the problems
- # vanish in a puff of smoke.
- if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
- fi
- ;;
-esac
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
- case $host_os in
- openbsd*)
- old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds"
- ;;
- *)
- old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
- ;;
- esac
- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-# Allow CC to be a program name with arguments.
-set dummy $CC
-compiler="$2"
-
-echo "$as_me:$LINENO: checking for objdir" >&5
-echo $ECHO_N "checking for objdir... $ECHO_C" >&6
-rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
- objdir=.libs
-else
- # MS-DOS does not allow filenames that begin with a dot.
- objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-echo "$as_me:$LINENO: result: $objdir" >&5
-echo "${ECHO_T}$objdir" >&6
-
-
-
-# Check whether --with-pic or --without-pic was given.
-if test "${with_pic+set}" = set; then
- withval="$with_pic"
- pic_mode="$withval"
-else
- pic_mode=default
-fi;
-test -z "$pic_mode" && pic_mode=default
-
-# We assume here that the value for lt_cv_prog_cc_pic will not be cached
-# in isolation, and that seeing it set (from the cache) indicates that
-# the associated values are set (in the cache) correctly too.
-echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
-echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
-if test "${lt_cv_prog_cc_pic+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- lt_cv_prog_cc_pic=
- lt_cv_prog_cc_shlib=
- lt_cv_prog_cc_wl=
- lt_cv_prog_cc_static=
- lt_cv_prog_cc_no_builtin=
- lt_cv_prog_cc_can_build_shared=$can_build_shared
-
- if test "$GCC" = yes; then
- lt_cv_prog_cc_wl='-Wl,'
- lt_cv_prog_cc_static='-static'
-
- case $host_os in
- aix*)
- # Below there is a dirty hack to force normal static linking with -ldl
- # The problem is because libdl dynamically linked with both libc and
- # libC (AIX C++ library), which obviously doesn't included in libraries
- # list by gcc. This cause undefined symbols with -static flags.
- # This hack allows C programs to be linked with "-static -ldl", but
- # not sure about C++ programs.
- lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC"
- ;;
- amigaos*)
- # FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
- lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4'
- ;;
- beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
- # PIC is the default for these OSes.
- ;;
- darwin* | rhapsody*)
- # PIC is the default on this platform
- # Common symbols not allowed in MH_DYLIB files
- lt_cv_prog_cc_pic='-fno-common'
- ;;
- cygwin* | mingw* | pw32* | os2*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- lt_cv_prog_cc_pic='-DDLL_EXPORT'
- ;;
- sysv4*MP*)
- if test -d /usr/nec; then
- lt_cv_prog_cc_pic=-Kconform_pic
- fi
- ;;
- *)
- lt_cv_prog_cc_pic='-fPIC'
- ;;
- esac
- else
- # PORTME Check for PIC flags for the system compiler.
- case $host_os in
- aix3* | aix4* | aix5*)
- lt_cv_prog_cc_wl='-Wl,'
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- lt_cv_prog_cc_static='-Bstatic'
- else
- lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp'
- fi
- ;;
-
- hpux9* | hpux10* | hpux11*)
- # Is there a better lt_cv_prog_cc_static that works with the bundled CC?
- lt_cv_prog_cc_wl='-Wl,'
- lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive"
- lt_cv_prog_cc_pic='+Z'
- ;;
-
- irix5* | irix6* | nonstopux*)
- lt_cv_prog_cc_wl='-Wl,'
- lt_cv_prog_cc_static='-non_shared'
- # PIC (with -KPIC) is the default.
- ;;
-
- cygwin* | mingw* | pw32* | os2*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- lt_cv_prog_cc_pic='-DDLL_EXPORT'
- ;;
-
- newsos6)
- lt_cv_prog_cc_pic='-KPIC'
- lt_cv_prog_cc_static='-Bstatic'
- ;;
-
- osf3* | osf4* | osf5*)
- # All OSF/1 code is PIC.
- lt_cv_prog_cc_wl='-Wl,'
- lt_cv_prog_cc_static='-non_shared'
- ;;
-
- sco3.2v5*)
- lt_cv_prog_cc_pic='-Kpic'
- lt_cv_prog_cc_static='-dn'
- lt_cv_prog_cc_shlib='-belf'
- ;;
-
- solaris*)
- lt_cv_prog_cc_pic='-KPIC'
- lt_cv_prog_cc_static='-Bstatic'
- lt_cv_prog_cc_wl='-Wl,'
- ;;
-
- sunos4*)
- lt_cv_prog_cc_pic='-PIC'
- lt_cv_prog_cc_static='-Bstatic'
- lt_cv_prog_cc_wl='-Qoption ld '
- ;;
-
- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- lt_cv_prog_cc_pic='-KPIC'
- lt_cv_prog_cc_static='-Bstatic'
- lt_cv_prog_cc_wl='-Wl,'
- ;;
-
- uts4*)
- lt_cv_prog_cc_pic='-pic'
- lt_cv_prog_cc_static='-Bstatic'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec ;then
- lt_cv_prog_cc_pic='-Kconform_pic'
- lt_cv_prog_cc_static='-Bstatic'
- fi
- ;;
-
- *)
- lt_cv_prog_cc_can_build_shared=no
- ;;
- esac
- fi
-
-fi
-
-if test -z "$lt_cv_prog_cc_pic"; then
- echo "$as_me:$LINENO: result: none" >&5
-echo "${ECHO_T}none" >&6
-else
- echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic" >&5
-echo "${ECHO_T}$lt_cv_prog_cc_pic" >&6
-
- # Check to make sure the pic_flag actually works.
- echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_cv_prog_cc_pic works" >&5
-echo $ECHO_N "checking if $compiler PIC flag $lt_cv_prog_cc_pic works... $ECHO_C" >&6
- if test "${lt_cv_prog_cc_pic_works+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC"
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-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); } &&
- { 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
- case $host_os in
- hpux9* | hpux10* | hpux11*)
- # On HP-UX, both CC and GCC only warn that PIC is supported... then
- # they create non-PIC objects. So, if there were any warnings, we
- # assume that PIC is not supported.
- if test -s conftest.err; then
- lt_cv_prog_cc_pic_works=no
- else
- lt_cv_prog_cc_pic_works=yes
- fi
- ;;
- *)
- lt_cv_prog_cc_pic_works=yes
- ;;
- esac
-
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
- lt_cv_prog_cc_pic_works=no
-
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- CFLAGS="$save_CFLAGS"
-
-fi
-
-
- if test "X$lt_cv_prog_cc_pic_works" = Xno; then
- lt_cv_prog_cc_pic=
- lt_cv_prog_cc_can_build_shared=no
- else
- lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic"
- fi
-
- echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic_works" >&5
-echo "${ECHO_T}$lt_cv_prog_cc_pic_works" >&6
-fi
-
-# Check for any special shared library compilation flags.
-if test -n "$lt_cv_prog_cc_shlib"; then
- { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&5
-echo "$as_me: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&2;}
- if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$lt_cv_prog_cc_shlib[ ]" >/dev/null; then :
- else
- { echo "$as_me:$LINENO: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5
-echo "$as_me: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;}
- lt_cv_prog_cc_can_build_shared=no
- fi
-fi
-
-echo "$as_me:$LINENO: checking if $compiler static flag $lt_cv_prog_cc_static works" >&5
-echo $ECHO_N "checking if $compiler static flag $lt_cv_prog_cc_static works... $ECHO_C" >&6
-if test "${lt_cv_prog_cc_static_works+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- lt_cv_prog_cc_static_works=no
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static"
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext 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='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
- lt_cv_prog_cc_static_works=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
- LDFLAGS="$save_LDFLAGS"
-
-fi
-
-
-# Belt *and* braces to stop my trousers falling down:
-test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static=
-echo "$as_me:$LINENO: result: $lt_cv_prog_cc_static_works" >&5
-echo "${ECHO_T}$lt_cv_prog_cc_static_works" >&6
-
-pic_flag="$lt_cv_prog_cc_pic"
-special_shlib_compile_flags="$lt_cv_prog_cc_shlib"
-wl="$lt_cv_prog_cc_wl"
-link_static_flag="$lt_cv_prog_cc_static"
-no_builtin_flag="$lt_cv_prog_cc_no_builtin"
-can_build_shared="$lt_cv_prog_cc_can_build_shared"
-
-
-# Check to see if options -o and -c are simultaneously supported by compiler
-echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
-if test "${lt_cv_compiler_c_o+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-
-$rm -r conftest 2>/dev/null
-mkdir conftest
-cd conftest
-echo "int some_variable = 0;" > conftest.$ac_ext
-mkdir out
-# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
-# that will create temporary files in the current directory regardless of
-# the output directory. Thus, making CWD read-only will cause this test
-# to fail, enabling locking or at least warning the user not to do parallel
-# builds.
-chmod -w .
-save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
-compiler_c_o=no
-if { (eval echo configure:4323: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s out/conftest.err; then
- lt_cv_compiler_c_o=no
- else
- lt_cv_compiler_c_o=yes
- fi
-else
- # Append any errors to the config.log.
- cat out/conftest.err 1>&5
- lt_cv_compiler_c_o=no
-fi
-CFLAGS="$save_CFLAGS"
-chmod u+w .
-$rm conftest* out/*
-rmdir out
-cd ..
-rmdir conftest
-$rm -r conftest 2>/dev/null
-
-fi
-
-compiler_c_o=$lt_cv_compiler_c_o
-echo "$as_me:$LINENO: result: $compiler_c_o" >&5
-echo "${ECHO_T}$compiler_c_o" >&6
-
-if test x"$compiler_c_o" = x"yes"; then
- # Check to see if we can write to a .lo
- echo "$as_me:$LINENO: checking if $compiler supports -c -o file.lo" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.lo... $ECHO_C" >&6
- if test "${lt_cv_compiler_o_lo+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-
- lt_cv_compiler_o_lo=no
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -c -o conftest.lo"
- save_objext="$ac_objext"
- ac_objext=lo
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-int some_variable = 0;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-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); } &&
- { 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
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- lt_cv_compiler_o_lo=no
- else
- lt_cv_compiler_o_lo=yes
- fi
-
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- ac_objext="$save_objext"
- CFLAGS="$save_CFLAGS"
-
-fi
-
- compiler_o_lo=$lt_cv_compiler_o_lo
- echo "$as_me:$LINENO: result: $compiler_o_lo" >&5
-echo "${ECHO_T}$compiler_o_lo" >&6
-else
- compiler_o_lo=no
-fi
-
-# Check to see if we can do hard links to lock some files if needed
-hard_links="nottested"
-if test "$compiler_c_o" = no && test "$need_locks" != no; then
- # do not overwrite the value of need_locks provided by the user
- echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
-echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
- hard_links=yes
- $rm conftest*
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- touch conftest.a
- ln conftest.a conftest.b 2>&5 || hard_links=no
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- echo "$as_me:$LINENO: result: $hard_links" >&5
-echo "${ECHO_T}$hard_links" >&6
- if test "$hard_links" = no; then
- { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
- need_locks=warn
- fi
-else
- need_locks=no
-fi
-
-if test "$GCC" = yes; then
- # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
- echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
- echo "int some_variable = 0;" > conftest.$ac_ext
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext"
- compiler_rtti_exceptions=no
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-int some_variable = 0;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-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); } &&
- { 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
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- compiler_rtti_exceptions=no
- else
- compiler_rtti_exceptions=yes
- fi
-
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- CFLAGS="$save_CFLAGS"
- echo "$as_me:$LINENO: result: $compiler_rtti_exceptions" >&5
-echo "${ECHO_T}$compiler_rtti_exceptions" >&6
-
- if test "$compiler_rtti_exceptions" = "yes"; then
- no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
- else
- no_builtin_flag=' -fno-builtin'
- fi
-fi
-
-# See if the linker supports building shared libraries.
-echo "$as_me:$LINENO: checking whether the linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the linker ($LD) supports shared libraries... $ECHO_C" >&6
-
-allow_undefined_flag=
-no_undefined_flag=
-need_lib_prefix=unknown
-need_version=unknown
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-archive_cmds=
-archive_expsym_cmds=
-old_archive_from_new_cmds=
-old_archive_from_expsyms_cmds=
-export_dynamic_flag_spec=
-whole_archive_flag_spec=
-thread_safe_flag_spec=
-hardcode_into_libs=no
-hardcode_libdir_flag_spec=
-hardcode_libdir_separator=
-hardcode_direct=no
-hardcode_minus_L=no
-hardcode_shlibpath_var=unsupported
-runpath_var=
-link_all_deplibs=unknown
-always_export_symbols=no
-export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
-# include_expsyms should be a list of space-separated symbols to be *always*
-# included in the symbol list
-include_expsyms=
-# exclude_expsyms can be an egrep regular expression of symbols to exclude
-# it will be wrapped by ` (' and `)$', so one must not match beginning or
-# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-# as well as any symbol that contains `d'.
-exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
-# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-# platforms (ab)use it in PIC code, but their linkers get confused if
-# the symbol is explicitly referenced. Since portable code cannot
-# rely on this symbol name, it's probably fine to never include it in
-# preloaded symbol tables.
-extract_expsyms_cmds=
-
-case $host_os in
-cygwin* | mingw* | pw32*)
- # FIXME: the MSVC++ port hasn't been tested in a loooong time
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- if test "$GCC" != yes; then
- with_gnu_ld=no
- fi
- ;;
-openbsd*)
- with_gnu_ld=no
- ;;
-esac
-
-ld_shlibs=yes
-if test "$with_gnu_ld" = yes; then
- # If archive_cmds runs LD, not CC, wlarc should be empty
- wlarc='${wl}'
-
- # See if GNU ld supports shared libraries.
- case $host_os in
- aix3* | aix4* | aix5*)
- # On AIX, the GNU linker is very broken
- # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available.
- ld_shlibs=no
- cat <<EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support. If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-EOF
- ;;
-
- amigaos*)
- archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
-
- # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
- # that the semantics of dynamic libraries on AmigaOS, at least up
- # to version 4, is to share data among multiple programs linked
- # with the same dynamic library. Since this doesn't match the
- # behavior of shared libraries on other platforms, we can use
- # them.
- ld_shlibs=no
- ;;
-
- beos*)
- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
- allow_undefined_flag=unsupported
- # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
- # support --undefined. This deserves some investigation. FIXME
- archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- cygwin* | mingw* | pw32*)
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec='-L$libdir'
- allow_undefined_flag=unsupported
- always_export_symbols=yes
-
- extract_expsyms_cmds='test -f $output_objdir/impgen.c || \
- sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~
- test -f $output_objdir/impgen.exe || (cd $output_objdir && \
- if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \
- else $CC -o impgen impgen.c ; fi)~
- $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def'
-
- old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib'
-
- # cygwin and mingw dlls have different entry points and sets of symbols
- # to exclude.
- # FIXME: what about values for MSVC?
- dll_entry=__cygwin_dll_entry@12
- dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~
- case $host_os in
- mingw*)
- # mingw values
- dll_entry=_DllMainCRTStartup@12
- dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~
- ;;
- esac
-
- # mingw and cygwin differ, and it's simplest to just exclude the union
- # of the two symbol sets.
- dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12
-
- # recent cygwin and mingw systems supply a stub DllMain which the user
- # can override, but on older systems we have to supply one (in ltdll.c)
- if test "x$lt_cv_need_dllmain" = "xyes"; then
- ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext "
- ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~
- test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~'
- else
- ltdll_obj=
- ltdll_cmds=
- fi
-
- # Extract the symbol export list from an `--export-all' def file,
- # then regenerate the def file from the symbol export list, so that
- # the compiled dll only exports the symbol export list.
- # Be careful not to strip the DATA tag left be newer dlltools.
- export_symbols_cmds="$ltdll_cmds"'
- $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~
- sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols'
-
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is.
- # If DATA tags from a recent dlltool are present, honour them!
- archive_expsym_cmds='if test "x`sed 1q $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname-def;
- else
- echo EXPORTS > $output_objdir/$soname-def;
- _lt_hint=1;
- cat $export_symbols | while read symbol; do
- set dummy \$symbol;
- case \$# in
- 2) echo " \$2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;;
- 4) echo " \$2 \$3 \$4 ; " >> $output_objdir/$soname-def; _lt_hint=`expr \$_lt_hint - 1`;;
- *) echo " \$2 @ \$_lt_hint \$3 ; " >> $output_objdir/$soname-def;;
- esac;
- _lt_hint=`expr 1 + \$_lt_hint`;
- done;
- fi~
- '"$ltdll_cmds"'
- $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~
- $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~
- $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags'
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
- archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
- wlarc=
- else
- archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- fi
- ;;
-
- solaris* | sysv5*)
- if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
- ld_shlibs=no
- cat <<EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems. Therefore, libtool
-*** is disabling shared libraries support. We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer. Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-EOF
- elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- sunos4*)
- archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- wlarc=
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- *)
- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
- esac
-
- if test "$ld_shlibs" = yes; then
- runpath_var=LD_RUN_PATH
- hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
- export_dynamic_flag_spec='${wl}--export-dynamic'
- case $host_os in
- cygwin* | mingw* | pw32*)
- # dlltool doesn't understand --whole-archive et. al.
- whole_archive_flag_spec=
- ;;
- *)
- # ancient GNU ld didn't support --whole-archive et. al.
- if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- else
- whole_archive_flag_spec=
- fi
- ;;
- esac
- fi
-else
- # PORTME fill in a description of your system's linker (not GNU ld)
- case $host_os in
- aix3*)
- allow_undefined_flag=unsupported
- always_export_symbols=yes
- archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
- # Note: this linker hardcodes the directories in LIBPATH if there
- # are no directories specified by -L.
- hardcode_minus_L=yes
- if test "$GCC" = yes && test -z "$link_static_flag"; then
- # Neither direct hardcoding nor static linking is supported with a
- # broken collect2.
- hardcode_direct=unsupported
- fi
- ;;
-
- aix4* | aix5*)
- if test "$host_cpu" = ia64; then
- # On IA64, the linker does run time linking by default, so we don't
- # have to do anything special.
- aix_use_runtimelinking=no
- exp_sym_flag='-Bexport'
- no_entry_flag=""
- else
- aix_use_runtimelinking=no
-
- # Test if we are trying to use run time linking or normal
- # AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
- case $host_os in aix4.[23]|aix4.[23].*|aix5*)
- for ld_flag in $LDFLAGS; do
- case $ld_flag in
- *-brtl*)
- aix_use_runtimelinking=yes
- break
- ;;
- esac
- done
- esac
-
- exp_sym_flag='-bexport'
- no_entry_flag='-bnoentry'
- fi
-
- # When large executables or shared objects are built, AIX ld can
- # have problems creating the table of contents. If linking a library
- # or program results in "error TOC overflow" add -mminimal-toc to
- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
- hardcode_direct=yes
- archive_cmds=''
- hardcode_libdir_separator=':'
- if test "$GCC" = yes; then
- case $host_os in aix4.[012]|aix4.[012].*)
- collect2name=`${CC} -print-prog-name=collect2`
- if test -f "$collect2name" && \
- strings "$collect2name" | grep resolve_lib_name >/dev/null
- then
- # We have reworked collect2
- hardcode_direct=yes
- else
- # We have old collect2
- hardcode_direct=unsupported
- # It fails to find uninstalled libraries when the uninstalled
- # path is not listed in the libpath. Setting hardcode_minus_L
- # to unsupported forces relinking
- hardcode_minus_L=yes
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_libdir_separator=
- fi
- esac
-
- shared_flag='-shared'
- else
- # not using gcc
- if test "$host_cpu" = ia64; then
- shared_flag='${wl}-G'
- else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
- else
- shared_flag='${wl}-bM:SRE'
- fi
- fi
- fi
-
- # It seems that -bexpall can do strange things, so it is better to
- # generate a list of symbols to export.
- always_export_symbols=yes
- if test "$aix_use_runtimelinking" = yes; then
- # Warning - without using the other runtime loading flags (-brtl),
- # -berok will link without error, but may produce a broken library.
- allow_undefined_flag='-berok'
- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib'
- archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
- else
- if test "$host_cpu" = ia64; then
- hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
- allow_undefined_flag="-z nodefs"
- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
- else
- hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib'
- # Warning - without using the other run time loading flags,
- # -berok will link without error, but may produce a broken library.
- allow_undefined_flag='${wl}-berok'
- # This is a bit strange, but is similar to how AIX traditionally builds
- # it's shared libraries.
- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname'
- fi
- fi
- ;;
-
- amigaos*)
- archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- # see comment about different semantics on the GNU ld section
- ld_shlibs=no
- ;;
-
- cygwin* | mingw* | pw32*)
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec=' '
- allow_undefined_flag=unsupported
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # FIXME: Setting linknames here is a bad hack.
- archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
- # The linker will automatically build a .lib file if we build a DLL.
- old_archive_from_new_cmds='true'
- # FIXME: Should let the user specify the lib program.
- old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
- fix_srcfile_path='`cygpath -w "$srcfile"`'
- ;;
-
- darwin* | rhapsody*)
- case "$host_os" in
- rhapsody* | darwin1.[012])
- allow_undefined_flag='-undefined suppress'
- ;;
- *) # Darwin 1.3 on
- allow_undefined_flag='-flat_namespace -undefined suppress'
- ;;
- esac
- # FIXME: Relying on posixy $() will cause problems for
- # cross-compilation, but unfortunately the echo tests do not
- # yet detect zsh echo's removal of \ escapes. Also zsh mangles
- # `"' quotes if we put them in here... so don't!
- archive_cmds='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs && $CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib ${lib}-master.o $deplibs$linker_flags $(test .$module != .yes && echo -install_name $rpath/$soname $verstring)'
- # We need to add '_' to the symbols in $export_symbols first
- #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- whole_archive_flag_spec='-all_load $convenience'
- ;;
-
- freebsd1*)
- ld_shlibs=no
- ;;
-
- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
- # support. Future versions do this automatically, but an explicit c++rt0.o
- # does not break anything, and helps significantly (at the cost of a little
- # extra space).
- freebsd2.2*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- # Unfortunately, older versions of FreeBSD 2 do not have this feature.
- freebsd2*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
- freebsd*)
- archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- hpux9* | hpux10* | hpux11*)
- case $host_os in
- hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;;
- *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;;
- esac
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_direct=yes
- hardcode_minus_L=yes # Not in the search PATH, but as the default
- # location of the library.
- export_dynamic_flag_spec='${wl}-E'
- ;;
-
- irix5* | irix6* | nonstopux*)
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- else
- archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
- hardcode_libdir_flag_spec='-rpath $libdir'
- fi
- hardcode_libdir_separator=:
- link_all_deplibs=yes
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
- else
- archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
- fi
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- newsos6)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_shlibpath_var=no
- ;;
-
- openbsd*)
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- export_dynamic_flag_spec='${wl}-E'
- else
- case "$host_os" in
- openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-R$libdir'
- ;;
- *)
- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- ;;
- esac
- fi
- ;;
-
- os2*)
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- allow_undefined_flag=unsupported
- archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
- old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
- ;;
-
- osf3*)
- if test "$GCC" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- else
- allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
- fi
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- ;;
-
- osf4* | osf5*) # as osf3* with the addition of -msym flag
- if test "$GCC" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- else
- allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
- archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
- $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
-
- #Both c and cxx compiler support -rpath directly
- hardcode_libdir_flag_spec='-rpath $libdir'
- fi
- hardcode_libdir_separator=:
- ;;
-
- sco3.2v5*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_shlibpath_var=no
- runpath_var=LD_RUN_PATH
- hardcode_runpath_var=yes
- export_dynamic_flag_spec='${wl}-Bexport'
- ;;
-
- solaris*)
- # gcc --version < 3.0 without binutils cannot create self contained
- # shared libraries reliably, requiring libgcc.a to resolve some of
- # the object symbols generated in some cases. Libraries that use
- # assert need libgcc.a to resolve __eprintf, for example. Linking
- # a copy of libgcc.a into every shared library to guarantee resolving
- # such symbols causes other problems: According to Tim Van Holder
- # <tim.van.holder@pandora.be>, C++ libraries end up with a separate
- # (to the application) exception stack for one thing.
- no_undefined_flag=' -z defs'
- if test "$GCC" = yes; then
- case `$CC --version 2>/dev/null` in
- [12].*)
- cat <<EOF 1>&2
-
-*** Warning: Releases of GCC earlier than version 3.0 cannot reliably
-*** create self contained shared libraries on Solaris systems, without
-*** introducing a dependency on libgcc.a. Therefore, libtool is disabling
-*** -no-undefined support, which will at least allow you to build shared
-*** libraries. However, you may find that when you link such libraries
-*** into an application without using GCC, you have to manually add
-*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to
-*** upgrade to a newer version of GCC. Another option is to rebuild your
-*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer.
-
-EOF
- no_undefined_flag=
- ;;
- esac
- fi
- # $CC -shared without GNU ld will not create a library from C++
- # object files and a static libstdc++, better avoid it by now
- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_shlibpath_var=no
- case $host_os in
- solaris2.[0-5] | solaris2.[0-5].*) ;;
- *) # Supported since Solaris 2.6 (maybe 2.5.1?)
- whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
- esac
- link_all_deplibs=yes
- ;;
-
- sunos4*)
- if test "x$host_vendor" = xsequent; then
- # Use $CC to link under sequent, because it throws in some extra .o
- # files that make .init and .fini sections work.
- archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
- fi
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- sysv4)
- case $host_vendor in
- sni)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes # is this really true???
- ;;
- siemens)
- ## LD is ld it makes a PLAMLIB
- ## CC just makes a GrossModule.
- archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
- reload_cmds='$CC -r -o $output$reload_objs'
- hardcode_direct=no
- ;;
- motorola)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=no #Motorola manual says yes, but my tests say they lie
- ;;
- esac
- runpath_var='LD_RUN_PATH'
- hardcode_shlibpath_var=no
- ;;
-
- sysv4.3*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_shlibpath_var=no
- export_dynamic_flag_spec='-Bexport'
- ;;
-
- sysv5*)
- no_undefined_flag=' -z text'
- # $CC -shared without GNU ld will not create a library from C++
- # object files and a static libstdc++, better avoid it by now
- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
- hardcode_libdir_flag_spec=
- hardcode_shlibpath_var=no
- runpath_var='LD_RUN_PATH'
- ;;
-
- uts4*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_shlibpath_var=no
- ;;
-
- dgux*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_shlibpath_var=no
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec; then
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_shlibpath_var=no
- runpath_var=LD_RUN_PATH
- hardcode_runpath_var=yes
- ld_shlibs=yes
- fi
- ;;
-
- sysv4.2uw2*)
- archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes
- hardcode_minus_L=no
- hardcode_shlibpath_var=no
- hardcode_runpath_var=yes
- runpath_var=LD_RUN_PATH
- ;;
-
- sysv5uw7* | unixware7*)
- no_undefined_flag='${wl}-z ${wl}text'
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- fi
- runpath_var='LD_RUN_PATH'
- hardcode_shlibpath_var=no
- ;;
-
- *)
- ld_shlibs=no
- ;;
- esac
-fi
-echo "$as_me:$LINENO: result: $ld_shlibs" >&5
-echo "${ECHO_T}$ld_shlibs" >&6
-test "$ld_shlibs" = no && can_build_shared=no
-
-# Check hardcoding attributes.
-echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" || \
- test -n "$runpath_var"; then
-
- # We can hardcode non-existant directories.
- if test "$hardcode_direct" != no &&
- # If the only mechanism to avoid hardcoding is shlibpath_var, we
- # have to relink, otherwise we might link with an installed library
- # when we should be linking with a yet-to-be-installed one
- ## test "$hardcode_shlibpath_var" != no &&
- test "$hardcode_minus_L" != no; then
- # Linking always hardcodes the temporary library directory.
- hardcode_action=relink
- else
- # We can link without hardcoding, and we can hardcode nonexisting dirs.
- hardcode_action=immediate
- fi
-else
- # We cannot hardcode anything, or else we can only hardcode existing
- # directories.
- hardcode_action=unsupported
-fi
-echo "$as_me:$LINENO: result: $hardcode_action" >&5
-echo "${ECHO_T}$hardcode_action" >&6
-
-striplib=
-old_striplib=
-echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
-echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
-if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
- test -z "$striplib" && striplib="$STRIP --strip-unneeded"
- echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-# PORTME Fill in your ld.so characteristics
-echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
-echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-
-case $host_os in
-aix3*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix $libname.a'
- shlibpath_var=LIBPATH
-
- # AIX has no versioning support, so we append a major version to the name.
- soname_spec='${libname}${release}.so$major'
- ;;
-
-aix4* | aix5*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- hardcode_into_libs=yes
- if test "$host_cpu" = ia64; then
- # AIX 5 supports IA64
- library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- else
- # With GCC up to 2.95.x, collect2 would create an import file
- # for dependence libraries. The import file would start with
- # the line `#! .'. This would cause the generated library to
- # depend on `.', always an invalid library. This was fixed in
- # development snapshots of GCC prior to 3.0.
- case $host_os in
- aix4 | aix4.[01] | aix4.[01].*)
- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
- echo ' yes '
- echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
- :
- else
- can_build_shared=no
- fi
- ;;
- esac
- # AIX (on Power*) has no versioning support, so currently we can
- # not hardcode correct soname into executable. Probably we can
- # add versioning support to collect2, so additional links can
- # be useful in future.
- if test "$aix_use_runtimelinking" = yes; then
- # If using run time linking (on AIX 4.2 or later) use lib<name>.so
- # instead of lib<name>.a to let people know that these are not
- # typical AIX shared libraries.
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- else
- # We preserve .a as extension for shared libraries through AIX4.2
- # and later when we are not doing run time linking.
- library_names_spec='${libname}${release}.a $libname.a'
- soname_spec='${libname}${release}.so$major'
- fi
- shlibpath_var=LIBPATH
- fi
- hardcode_into_libs=yes
- ;;
-
-amigaos*)
- library_names_spec='$libname.ixlibrary $libname.a'
- # Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
- ;;
-
-beos*)
- library_names_spec='${libname}.so'
- dynamic_linker="$host_os ld.so"
- shlibpath_var=LIBRARY_PATH
- ;;
-
-bsdi4*)
- version_type=linux
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
- export_dynamic_flag_spec=-rdynamic
- # the default ld.so.conf also contains /usr/contrib/lib and
- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
- # libtool to hard-code these into programs
- ;;
-
-cygwin* | mingw* | pw32*)
- version_type=windows
- need_version=no
- need_lib_prefix=no
- case $GCC,$host_os in
- yes,cygwin*)
- library_names_spec='$libname.dll.a'
- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
- postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog .libs/$dlname \$dldir/$dlname'
- postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $rm \$dlpath'
- ;;
- yes,mingw*)
- library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
- sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g" -e "s,=/,/,g"`
- ;;
- yes,pw32*)
- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/./-/g'`${versuffix}.dll'
- ;;
- *)
- library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'
- ;;
- esac
- dynamic_linker='Win32 ld.exe'
- # FIXME: first we should search . and the directory the executable is in
- shlibpath_var=PATH
- ;;
-
-darwin* | rhapsody*)
- dynamic_linker="$host_os dyld"
- version_type=darwin
- need_lib_prefix=no
- need_version=no
- # FIXME: Relying on posixy $() will cause problems for
- # cross-compilation, but unfortunately the echo tests do not
- # yet detect zsh echo's removal of \ escapes.
- library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)'
- soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)'
- shlibpath_overrides_runpath=yes
- shlibpath_var=DYLD_LIBRARY_PATH
- ;;
-
-freebsd1*)
- dynamic_linker=no
- ;;
-
-freebsd*)
- objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
- version_type=freebsd-$objformat
- case $version_type in
- freebsd-elf*)
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
- need_version=no
- need_lib_prefix=no
- ;;
- freebsd-*)
- library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
- need_version=yes
- ;;
- esac
- shlibpath_var=LD_LIBRARY_PATH
- case $host_os in
- freebsd2*)
- shlibpath_overrides_runpath=yes
- ;;
- *)
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
- esac
- ;;
-
-gnu*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- hardcode_into_libs=yes
- ;;
-
-hpux9* | hpux10* | hpux11*)
- # Give a soname corresponding to the major version so that dld.sl refuses to
- # link against other versions.
- dynamic_linker="$host_os dld.sl"
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- shlibpath_var=SHLIB_PATH
- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
- library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
- soname_spec='${libname}${release}.sl$major'
- # HP-UX runs *really* slowly unless shared libraries are mode 555.
- postinstall_cmds='chmod 555 $lib'
- ;;
-
-irix5* | irix6* | nonstopux*)
- case $host_os in
- nonstopux*) version_type=nonstopux ;;
- *) version_type=irix ;;
- esac
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}.so$major'
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so'
- case $host_os in
- irix5* | nonstopux*)
- libsuff= shlibsuff=
- ;;
- *)
- case $LD in # libtool.m4 will add one of these switches to LD
- *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
- *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
- *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
- *) libsuff= shlibsuff= libmagic=never-match;;
- esac
- ;;
- esac
- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
- ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
- dynamic_linker=no
- ;;
-
-# This must be Linux ELF.
-linux-gnu*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- # This implies no fast_install, which is unacceptable.
- # Some rework will be needed to allow for fast_install
- # before this can be enabled.
- hardcode_into_libs=yes
-
- # We used to test for /lib/ld.so.1 and disable shared libraries on
- # powerpc, because MkLinux only supported shared libraries with the
- # GNU dynamic linker. Since this was broken with cross compilers,
- # most powerpc-linux boxes support dynamic linking these days and
- # people can always --disable-shared, the test was removed, and we
- # assume the GNU/Linux dynamic linker is in use.
- dynamic_linker='GNU/Linux ld.so'
- ;;
-
-netbsd*)
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- dynamic_linker='NetBSD (a.out) ld.so'
- else
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
- soname_spec='${libname}${release}.so$major'
- dynamic_linker='NetBSD ld.elf_so'
- fi
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
-
-newsos6)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- ;;
-
-openbsd*)
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- case "$host_os" in
- openbsd2.[89] | openbsd2.[89].*)
- shlibpath_overrides_runpath=no
- ;;
- *)
- shlibpath_overrides_runpath=yes
- ;;
- esac
- else
- shlibpath_overrides_runpath=yes
- fi
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-os2*)
- libname_spec='$name'
- need_lib_prefix=no
- library_names_spec='$libname.dll $libname.a'
- dynamic_linker='OS/2 ld.exe'
- shlibpath_var=LIBPATH
- ;;
-
-osf3* | osf4* | osf5*)
- version_type=osf
- need_version=no
- soname_spec='${libname}${release}.so$major'
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
- hardcode_into_libs=yes
- ;;
-
-sco3.2v5*)
- version_type=osf
- soname_spec='${libname}${release}.so$major'
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-solaris*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- # ldd complains unless libraries are executable
- postinstall_cmds='chmod +x $lib'
- ;;
-
-sunos4*)
- version_type=sunos
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- if test "$with_gnu_ld" = yes; then
- need_lib_prefix=no
- fi
- need_version=yes
- ;;
-
-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- case $host_vendor in
- sni)
- shlibpath_overrides_runpath=no
- need_lib_prefix=no
- export_dynamic_flag_spec='${wl}-Blargedynsym'
- runpath_var=LD_RUN_PATH
- ;;
- siemens)
- need_lib_prefix=no
- ;;
- motorola)
- need_lib_prefix=no
- need_version=no
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
- ;;
- esac
- ;;
-
-uts4*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-dgux*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-sysv4*MP*)
- if test -d /usr/nec ;then
- version_type=linux
- library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
- soname_spec='$libname.so.$major'
- shlibpath_var=LD_LIBRARY_PATH
- fi
- ;;
-
-*)
- dynamic_linker=no
- ;;
-esac
-echo "$as_me:$LINENO: result: $dynamic_linker" >&5
-echo "${ECHO_T}$dynamic_linker" >&6
-test "$dynamic_linker" = no && can_build_shared=no
-
-# Report the final consequences.
-echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
-echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $can_build_shared" >&5
-echo "${ECHO_T}$can_build_shared" >&6
-
-echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
-echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
-test "$can_build_shared" = "no" && enable_shared=no
-
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case "$host_os" in
-aix3*)
- test "$enable_shared" = yes && enable_static=no
- if test -n "$RANLIB"; then
- archive_cmds="$archive_cmds~\$RANLIB \$lib"
- postinstall_cmds='$RANLIB $lib'
- fi
- ;;
-
-aix4*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
- fi
- ;;
-esac
-echo "$as_me:$LINENO: result: $enable_shared" >&5
-echo "${ECHO_T}$enable_shared" >&6
-
-echo "$as_me:$LINENO: checking whether to build static libraries" >&5
-echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-echo "$as_me:$LINENO: result: $enable_static" >&5
-echo "${ECHO_T}$enable_static" >&6
-
-if test "$hardcode_action" = relink; then
- # Fast installation is not supported
- enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
- test "$enable_shared" = no; then
- # Fast installation is not necessary
- enable_fast_install=needless
-fi
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "x$enable_dlopen" != xyes; then
- enable_dlopen=unknown
- enable_dlopen_self=unknown
- enable_dlopen_self_static=unknown
-else
- lt_cv_dlopen=no
- lt_cv_dlopen_libs=
-
- case $host_os in
- beos*)
- lt_cv_dlopen="load_add_on"
- lt_cv_dlopen_libs=
- lt_cv_dlopen_self=yes
- ;;
-
- cygwin* | mingw* | pw32*)
- lt_cv_dlopen="LoadLibrary"
- lt_cv_dlopen_libs=
- ;;
-
- *)
- echo "$as_me:$LINENO: checking for shl_load" >&5
-echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
-if test "${ac_cv_func_shl_load+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char shl_load (); below. */
-#include <assert.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 shl_load ();
-char (*f) ();
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_shl_load) || defined (__stub___shl_load)
-choke me
-#else
-f = shl_load;
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext 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='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_func_shl_load=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_func_shl_load=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
-echo "${ECHO_T}$ac_cv_func_shl_load" >&6
-if test $ac_cv_func_shl_load = yes; then
- lt_cv_dlopen="shl_load"
-else
- echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
-echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "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 shl_load ();
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-shl_load ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext 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='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_dld_shl_load=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_lib_dld_shl_load=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
-if test $ac_cv_lib_dld_shl_load = yes; then
- lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
-else
- echo "$as_me:$LINENO: checking for dlopen" >&5
-echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
-if test "${ac_cv_func_dlopen+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char dlopen (); below. */
-#include <assert.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 dlopen ();
-char (*f) ();
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_dlopen) || defined (__stub___dlopen)
-choke me
-#else
-f = dlopen;
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext 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='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_func_dlopen=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_func_dlopen=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
-echo "${ECHO_T}$ac_cv_func_dlopen" >&6
-if test $ac_cv_func_dlopen = yes; then
- lt_cv_dlopen="dlopen"
-else
- echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "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 dlopen ();
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-dlopen ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext 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='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_dl_dlopen=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_lib_dl_dlopen=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
-if test $ac_cv_lib_dl_dlopen = yes; then
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
- echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
-echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "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 dlopen ();
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-dlopen ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext 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='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_svld_dlopen=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_lib_svld_dlopen=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
-if test $ac_cv_lib_svld_dlopen = yes; then
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
- echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
-echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "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 dld_link ();
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-dld_link ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext 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='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_dld_dld_link=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_lib_dld_dld_link=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
-if test $ac_cv_lib_dld_dld_link = yes; then
- lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
- ;;
- esac
-
- if test "x$lt_cv_dlopen" != xno; then
- enable_dlopen=yes
- else
- enable_dlopen=no
- fi
-
- case $lt_cv_dlopen in
- dlopen)
- save_CPPFLAGS="$CPPFLAGS"
- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
- save_LDFLAGS="$LDFLAGS"
- eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
- save_LIBS="$LIBS"
- LIBS="$lt_cv_dlopen_libs $LIBS"
-
- echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
-echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
-if test "${lt_cv_dlopen_self+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test "$cross_compiling" = yes; then :
- lt_cv_dlopen_self=cross
-else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<EOF
-#line 6145 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LT_DLGLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LT_DLGLOBAL DL_GLOBAL
-# else
-# define LT_DLGLOBAL 0
-# endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
- find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-# ifdef RTLD_LAZY
-# define LT_DLLAZY_OR_NOW RTLD_LAZY
-# else
-# ifdef DL_LAZY
-# define LT_DLLAZY_OR_NOW DL_LAZY
-# else
-# ifdef RTLD_NOW
-# define LT_DLLAZY_OR_NOW RTLD_NOW
-# else
-# ifdef DL_NOW
-# define LT_DLLAZY_OR_NOW DL_NOW
-# else
-# define LT_DLLAZY_OR_NOW 0
-# endif
-# endif
-# endif
-# endif
-#endif
-
-#ifdef __cplusplus
-extern "C" void exit (int);
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
- int status = $lt_dlunknown;
-
- if (self)
- {
- if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
- /* dlclose (self); */
- }
-
- exit (status);
-}
-EOF
- 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); } && test -s conftest${ac_exeext} 2>/dev/null; then
- (./conftest; exit; ) 2>/dev/null
- lt_status=$?
- case x$lt_status in
- x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
- x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
- x$lt_unknown|x*) lt_cv_dlopen_self=no ;;
- esac
- else :
- # compilation failed
- lt_cv_dlopen_self=no
- fi
-fi
-rm -fr conftest*
-
-
-fi
-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self" >&6
-
- if test "x$lt_cv_dlopen_self" = xyes; then
- LDFLAGS="$LDFLAGS $link_static_flag"
- echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
-echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
-if test "${lt_cv_dlopen_self_static+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test "$cross_compiling" = yes; then :
- lt_cv_dlopen_self_static=cross
-else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<EOF
-#line 6243 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LT_DLGLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LT_DLGLOBAL DL_GLOBAL
-# else
-# define LT_DLGLOBAL 0
-# endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
- find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-# ifdef RTLD_LAZY
-# define LT_DLLAZY_OR_NOW RTLD_LAZY
-# else
-# ifdef DL_LAZY
-# define LT_DLLAZY_OR_NOW DL_LAZY
-# else
-# ifdef RTLD_NOW
-# define LT_DLLAZY_OR_NOW RTLD_NOW
-# else
-# ifdef DL_NOW
-# define LT_DLLAZY_OR_NOW DL_NOW
-# else
-# define LT_DLLAZY_OR_NOW 0
-# endif
-# endif
-# endif
-# endif
-#endif
-
-#ifdef __cplusplus
-extern "C" void exit (int);
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
- int status = $lt_dlunknown;
-
- if (self)
- {
- if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
- /* dlclose (self); */
- }
-
- exit (status);
-}
-EOF
- 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); } && test -s conftest${ac_exeext} 2>/dev/null; then
- (./conftest; exit; ) 2>/dev/null
- lt_status=$?
- case x$lt_status in
- x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
- x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
- x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;;
- esac
- else :
- # compilation failed
- lt_cv_dlopen_self_static=no
- fi
-fi
-rm -fr conftest*
-
-
-fi
-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
- fi
-
- CPPFLAGS="$save_CPPFLAGS"
- LDFLAGS="$save_LDFLAGS"
- LIBS="$save_LIBS"
- ;;
- esac
-
- case $lt_cv_dlopen_self in
- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
- *) enable_dlopen_self=unknown ;;
- esac
-
- case $lt_cv_dlopen_self_static in
- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
- *) enable_dlopen_self_static=unknown ;;
- esac
-fi
-
-
-if test "$enable_shared" = yes && test "$GCC" = yes; then
- case $archive_cmds in
- *'~'*)
- # FIXME: we may have to deal with multi-command sequences.
- ;;
- '$CC '*)
- # Test whether the compiler implicitly links with -lc since on some
- # systems, -lgcc has to come before -lc. If gcc already passes -lc
- # to ld, don't add -lc before -lgcc.
- echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
- if test "${lt_cv_archive_cmds_need_lc+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- $rm conftest*
- echo 'static int dummy;' > conftest.$ac_ext
-
- 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
- soname=conftest
- lib=conftest
- libobjs=conftest.$ac_objext
- deplibs=
- wl=$lt_cv_prog_cc_wl
- compiler_flags=-v
- linker_flags=-v
- verstring=
- output_objdir=.
- libname=conftest
- save_allow_undefined_flag=$allow_undefined_flag
- allow_undefined_flag=
- if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
- (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
- then
- lt_cv_archive_cmds_need_lc=no
- else
- lt_cv_archive_cmds_need_lc=yes
- fi
- allow_undefined_flag=$save_allow_undefined_flag
- else
- cat conftest.err 1>&5
- fi
-fi
-
- echo "$as_me:$LINENO: result: $lt_cv_archive_cmds_need_lc" >&5
-echo "${ECHO_T}$lt_cv_archive_cmds_need_lc" >&6
- ;;
- esac
-fi
-need_lc=${lt_cv_archive_cmds_need_lc-yes}
-
-# The second clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
- :
-else
- # If there is no Makefile yet, we rely on a make rule to execute
- # `config.status --recheck' to rerun these tests and create the
- # libtool script then.
- test -f Makefile && make "$ltmain"
-fi
-
-if test -f "$ltmain"; then
- trap "$rm \"${ofile}T\"; exit 1" 1 2 15
- $rm -f "${ofile}T"
-
- echo creating $ofile
-
- # Now quote all the things that may contain metacharacters while being
- # careful not to overquote the AC_SUBSTed values. We take copies of the
- # variables and quote the copies for generation of the libtool script.
- for var in echo old_CC old_CFLAGS SED \
- AR AR_FLAGS CC LD LN_S NM SHELL \
- reload_flag reload_cmds wl \
- pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
- thread_safe_flag_spec whole_archive_flag_spec libname_spec \
- library_names_spec soname_spec \
- RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
- old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \
- postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \
- old_striplib striplib file_magic_cmd export_symbols_cmds \
- deplibs_check_method allow_undefined_flag no_undefined_flag \
- finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
- global_symbol_to_c_name_address \
- hardcode_libdir_flag_spec hardcode_libdir_separator \
- sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
- compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
-
- case $var in
- reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
- old_postinstall_cmds | old_postuninstall_cmds | \
- export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
- extract_expsyms_cmds | old_archive_from_expsyms_cmds | \
- postinstall_cmds | postuninstall_cmds | \
- finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
- # Double-quote double-evaled strings.
- eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
- ;;
- *)
- eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
- ;;
- esac
- done
-
- cat <<__EOF__ > "${ofile}T"
-#! $SHELL
-
-# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-# Copyright (C) 1996-2000 Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# A sed that does not truncate output.
-SED=$lt_SED
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="${SED} -e s/^X//"
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$need_lc
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# The host system.
-host_alias=$host_alias
-host=$host
-
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# The default C compiler.
-CC=$lt_CC
-
-# Is the compiler the GNU C compiler?
-with_gcc=$GCC
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
-
-# A BSD-compatible nm program.
-NM=$lt_NM
-
-# A symbol stripping program
-STRIP=$STRIP
-
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
-
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
-
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
-
-# Used on cygwin: assembler.
-AS="$AS"
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# How to pass a linker flag through the compiler.
-wl=$lt_wl
-
-# Object file suffix (normally "o").
-objext="$ac_objext"
-
-# Old archive suffix (normally "a").
-libext="$libext"
-
-# Executable file suffix (normally "").
-exeext="$exeext"
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_pic_flag
-pic_mode=$pic_mode
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_compiler_c_o
-
-# Can we write directly to a .lo ?
-compiler_o_lo=$lt_compiler_o_lo
-
-# Must we lock files when doing compilation ?
-need_locks=$lt_need_locks
-
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_link_static_flag
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_no_builtin_flag
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_thread_safe_flag_spec
-
-# Library versioning type.
-version_type=$version_type
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names. First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_old_archive_cmds
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address
-
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
-
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path"
-
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# ### END LIBTOOL CONFIG
-
-__EOF__
-
- case $host_os in
- aix3*)
- cat <<\EOF >> "${ofile}T"
-
-# AIX sometimes has problems with the GCC collect2 program. For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
-fi
-EOF
- ;;
- esac
-
- case $host_os in
- cygwin* | mingw* | pw32* | os2*)
- cat <<'EOF' >> "${ofile}T"
- # This is a source program that is used to create dlls on Windows
- # Don't remove nor modify the starting and closing comments
-# /* ltdll.c starts here */
-# #define WIN32_LEAN_AND_MEAN
-# #include <windows.h>
-# #undef WIN32_LEAN_AND_MEAN
-# #include <stdio.h>
-#
-# #ifndef __CYGWIN__
-# # ifdef __CYGWIN32__
-# # define __CYGWIN__ __CYGWIN32__
-# # endif
-# #endif
-#
-# #ifdef __cplusplus
-# extern "C" {
-# #endif
-# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
-# #ifdef __cplusplus
-# }
-# #endif
-#
-# #ifdef __CYGWIN__
-# #include <cygwin/cygwin_dll.h>
-# DECLARE_CYGWIN_DLL( DllMain );
-# #endif
-# HINSTANCE __hDllInstance_base;
-#
-# BOOL APIENTRY
-# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
-# {
-# __hDllInstance_base = hInst;
-# return TRUE;
-# }
-# /* ltdll.c ends here */
- # This is a source program that is used to create import libraries
- # on Windows for dlls which lack them. Don't remove nor modify the
- # starting and closing comments
-# /* impgen.c starts here */
-# /* Copyright (C) 1999-2000 Free Software Foundation, Inc.
-#
-# This file is part of GNU libtool.
-#
-# 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 <stdio.h> /* for printf() */
-# #include <unistd.h> /* for open(), lseek(), read() */
-# #include <fcntl.h> /* for O_RDONLY, O_BINARY */
-# #include <string.h> /* for strdup() */
-#
-# /* O_BINARY isn't required (or even defined sometimes) under Unix */
-# #ifndef O_BINARY
-# #define O_BINARY 0
-# #endif
-#
-# static unsigned int
-# pe_get16 (fd, offset)
-# int fd;
-# int offset;
-# {
-# unsigned char b[2];
-# lseek (fd, offset, SEEK_SET);
-# read (fd, b, 2);
-# return b[0] + (b[1]<<8);
-# }
-#
-# static unsigned int
-# pe_get32 (fd, offset)
-# int fd;
-# int offset;
-# {
-# unsigned char b[4];
-# lseek (fd, offset, SEEK_SET);
-# read (fd, b, 4);
-# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
-# }
-#
-# static unsigned int
-# pe_as32 (ptr)
-# void *ptr;
-# {
-# unsigned char *b = ptr;
-# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
-# }
-#
-# int
-# main (argc, argv)
-# int argc;
-# char *argv[];
-# {
-# int dll;
-# unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
-# unsigned long export_rva, export_size, nsections, secptr, expptr;
-# unsigned long name_rvas, nexp;
-# unsigned char *expdata, *erva;
-# char *filename, *dll_name;
-#
-# filename = argv[1];
-#
-# dll = open(filename, O_RDONLY|O_BINARY);
-# if (dll < 1)
-# return 1;
-#
-# dll_name = filename;
-#
-# for (i=0; filename[i]; i++)
-# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
-# dll_name = filename + i +1;
-#
-# pe_header_offset = pe_get32 (dll, 0x3c);
-# opthdr_ofs = pe_header_offset + 4 + 20;
-# num_entries = pe_get32 (dll, opthdr_ofs + 92);
-#
-# if (num_entries < 1) /* no exports */
-# return 1;
-#
-# export_rva = pe_get32 (dll, opthdr_ofs + 96);
-# export_size = pe_get32 (dll, opthdr_ofs + 100);
-# nsections = pe_get16 (dll, pe_header_offset + 4 +2);
-# secptr = (pe_header_offset + 4 + 20 +
-# pe_get16 (dll, pe_header_offset + 4 + 16));
-#
-# expptr = 0;
-# for (i = 0; i < nsections; i++)
-# {
-# char sname[8];
-# unsigned long secptr1 = secptr + 40 * i;
-# unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
-# unsigned long vsize = pe_get32 (dll, secptr1 + 16);
-# unsigned long fptr = pe_get32 (dll, secptr1 + 20);
-# lseek(dll, secptr1, SEEK_SET);
-# read(dll, sname, 8);
-# if (vaddr <= export_rva && vaddr+vsize > export_rva)
-# {
-# expptr = fptr + (export_rva - vaddr);
-# if (export_rva + export_size > vaddr + vsize)
-# export_size = vsize - (export_rva - vaddr);
-# break;
-# }
-# }
-#
-# expdata = (unsigned char*)malloc(export_size);
-# lseek (dll, expptr, SEEK_SET);
-# read (dll, expdata, export_size);
-# erva = expdata - export_rva;
-#
-# nexp = pe_as32 (expdata+24);
-# name_rvas = pe_as32 (expdata+32);
-#
-# printf ("EXPORTS\n");
-# for (i = 0; i<nexp; i++)
-# {
-# unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
-# printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
-# }
-#
-# return 0;
-# }
-# /* impgen.c ends here */
-
-EOF
- ;;
- esac
-
- # We use sed instead of cat because bash on DJGPP gets confused if
- # if finds mixed CR/LF and LF-only lines. Since sed operates in
- # text mode, it properly converts lines to CR/LF. This bash problem
- # is reportedly fixed, but why not run on old versions too?
- sed '$q' "$ltmain" >> "${ofile}T" || (rm -f "${ofile}T"; exit 1)
-
- mv -f "${ofile}T" "$ofile" || \
- (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T")
- chmod +x "$ofile"
-fi
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-# Prevent multiple expansion
-
-
-## establish the kind of executable to build (debug or production)
-
-if
- [ $DEBUG ]
-then
- echo Configuring to build $PACKAGE_NAME with debugging symbols
-
-cat >>confdefs.h <<\_ACEOF
-#define DEBUG 1
-_ACEOF
-
-
-else
- echo Configuring to build a production version of $PACKAGE_NAME
-fi
-
-## libtool & Make variables
-LIBTOOL=libtool
-OBJ=.lo
-IGNORE=-
-LIB_PATH=-rpath
-LEX=flex
-YACC=bison
-STATIC_LINK_CMD=-static
-DLL_LINK_CMD=-module
-
-MV=mv
-MV_FLAGS=-fv
-RM=rm
-RM_FLAGS=-fv
-CP=cp
-CP_FLAGS=-fv
-MAKE=make
-## establish the target OS and PROC
-
-case $build in
- *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
-
-cat >>confdefs.h <<\_ACEOF
-#define HOST_OS "Windows"
-_ACEOF
-
-
-cat >>confdefs.h <<\_ACEOF
-#define OS_PORT_INCLUDE "lslp-windows.h"
-_ACEOF
-
- OS_PORT_INC=lslp-windows.h
- OS_PORT_SRC=lslp-windows.c
- OS_PORT_OBJ=lslp-windows.lo
- HOST_OS=Windows
- CC=cl
- LINKER=$CC
- EXE=.exe
- LIBS=ws2_32.lib
- THREAD_LIBS=
- REENTRANT_FLAG=
- NO_LINK_FLAG=
- LIB_SUFFIX=.lib
- DLL_SUFFIX=.dll
- EXE_OUT=/Fe
- OBJ_OUT=/Fo
- LIB_INCLUDE_FLAG
-
-cat >>confdefs.h <<\_ACEOF
-#define DLL_IMPORT __declspec(dllimport)
-_ACEOF
-
-
-cat >>confdefs.h <<\_ACEOF
-#define DLL_EXPORT __declspec(dllexport)
-_ACEOF
-
- if [ $DEBUG ]
- then
- CFLAGS="-GX -GR -W3 -Od -Zi -MDd -DDEBUG_ALLOC"
- LDFLAGS=-debug
- DLL_LIB_FLAG=/LDd
- LFLAGS="-p -v -d"
- YFLAGS="-v -d"
- else
- CFLAGS="-GX -GR -W3 -O2 -MD"
- LDFLAGS=""
- DLL_LIB_FLAG=/LD
- LFLAGS="-f -w"
- YFLAGS=-l
- fi
-
- bindir=$SYSTEMROOT/system32
- sbindir=$SYSTEMROOT/system32
- libexecdir=$SYSTEMROOT/system32
- sysconfdir=$SYSTEMROOT/system32
- libdir=$SYSTEMROOT/system32
-
-
- ;;
- *-*-linux*)
-
-cat >>confdefs.h <<\_ACEOF
-#define HOST_OS "Linux"
-_ACEOF
-
-
-cat >>confdefs.h <<\_ACEOF
-#define OS_PORT_INCLUDE "lslp-linux.h"
-_ACEOF
-
- OS_PORT_INC=lslp-linux.h
- OS_PORT_SRC=lslp-linux.c
- OS_PORT_OBJ=lslp-linux.lo
- HOST_OS=linux
- 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
- set dummy "$as_dir/$ac_word" ${1+"$@"}
- shift
- ac_cv_prog_CC="$@"
- 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" >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH" >&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 </dev/null >&5\"") >&5
- (eval $ac_compiler --version </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
- (eval $ac_compiler -v </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
- (eval $ac_compiler -V </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-
-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
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-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>&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
-cat conftest.$ac_ext >&5
-ac_compiler_gnu=no
-fi
-rm -f 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
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-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); } &&
- { 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
-cat conftest.$ac_ext >&5
-ac_cv_prog_cc_g=no
-fi
-rm -f 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
-# 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>&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 \
- ''\
- '#include <stdlib.h>' \
- '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
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-$ac_declaration
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-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>&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
-cat conftest.$ac_ext >&5
-continue
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-$ac_declaration
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-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>&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
-cat conftest.$ac_ext >&5
-fi
-rm -f 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
-cat conftest.$ac_ext >&5
-fi
-rm -f 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
-
- LINKER=$CC
- EXE=
- LIBS=
- LIB_INCLUDE_FLAG=-l
- THREAD_LIBS=-lpthread
- REENTRANT_FLAG=-D_REENTRANT
- NO_LINK_FLAG=-c
- LIB_SUFFIX=.o
- DLL_SUFFIX=.so
-
-cat >>confdefs.h <<\_ACEOF
-#define DLL_IMPORT
-_ACEOF
-
-
-cat >>confdefs.h <<\_ACEOF
-#define DLL_EXPORT
-_ACEOF
-
- EXE_OUT=-o
- OBJ_OUT=-o
- if [ $DEBUG ]
- then
- CFLAGS="-g -Wall -Dlinux -DDEBUG_ALLOC"
- LDFLAGS=-g
- LFLAGS="-p -v -d "
- YFLAGS="-v -d"
- else
- CFLAGS="-O -Wall -Dlinux"
- LDFLAGS=-s
- LFLAGS="-f -w"
- YFLAGS=-l
- fi
-
- bindir=/bin
- sbindir=/sbin
- libexecdir=/lib
- sysconfdir=/etc
- libdir=/usr/lib
-
- ;;
- *-*-aix*)
-
-cat >>confdefs.h <<\_ACEOF
-#define HOST_OS "AIX"
-_ACEOF
-
- HOST_OS=AIX
- ;;
-esac
-
-case $build in
- i?86-*-*)
-
-cat >>confdefs.h <<\_ACEOF
-#define PLATFORM "x86"
-_ACEOF
-
- PLATFORM=x86
- ;;
- ia64-*-*)
-
-cat >>confdefs.h <<\_ACEOF
-#define PLATFORM "ia64"
-_ACEOF
-
- PLATFORM=ia64
- ;;
- ppc-*-*)
-
-cat >>confdefs.h <<\_ACEOF
-#define PLATFORM "ppc"
-_ACEOF
-
- PLATFORM=ppc
- ;;
- mipsel-*-*)
-
-cat >>confdefs.h <<\_ACEOF
-#define PLATFORM "mipsel"
-_ACEOF
-
- PLATFORM=mipsel
- ;;
- mipseb-*-*)
-
-cat >>confdefs.h <<\_ACEOF
-#define PLATFORM "mipseb"
-_ACEOF
-
- PLATFORM=mipseb
-esac
-
-
-## check for headers and declarations we need
-
-# will be false on windows systems
-
-for ac_header in unistd.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
- 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
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "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>&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
-cat conftest.$ac_ext >&5
-ac_header_compiler=no
-fi
-rm -f 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 $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -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
- 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
- cat 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 in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
-esac
-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
- eval "$as_ac_Header=$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-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
-
-
-for ac_header in linux/if.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
- 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
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "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>&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
-cat conftest.$ac_ext >&5
-ac_header_compiler=no
-fi
-rm -f 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 $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -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
- 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
- cat 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 in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
-esac
-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
- eval "$as_ac_Header=$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
- cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
- HAVE_IF_H=1
-fi
-
-done
-
-
-if
- [ $HAVE_IF_H ]
-then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_IF_H 1
-_ACEOF
-
-fi
-
-## create the appropriate directories to hold binaries
-SRC_DIR=
-
-
-## set up environment variables that control the build for specific variants
-case $HOST_OS in
- linux)
- case $PLATFORM in
- x86)
-
- ;;
-
- ia64)
-
- ;;
-
- ppc)
-
-
- ;;
- esac
-
- ;;
- Windows)
- case $PLATFORM in
- x86)
-
- ;;
-
- ia64)
-
- ;;
-
- ppc)
-
-
- ;;
- esac
-
- ;;
- AIX)
- case $PLATFORM in
- x86)
-
- ;;
-
- ia64)
-
- ;;
-
- ppc)
-
-
- ;;
- esac
- ;;
-
-esac
-
-echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
-echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6
-if test "${ac_cv_c_bigendian+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- # See if sys/param.h defines the BYTE_ORDER macro.
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <sys/param.h>
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
- bogus endian macros
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-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); } &&
- { 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
- # It does; now see whether it defined to BIG_ENDIAN or not.
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <sys/types.h>
-#include <sys/param.h>
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-#if BYTE_ORDER != BIG_ENDIAN
- not big endian
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-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); } &&
- { 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_c_bigendian=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_c_bigendian=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-# It does not; compile a test program.
-if test "$cross_compiling" = yes; then
- # try to guess the endianess by grep'ing values into an object file
- ac_cv_c_bigendian=unknown
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
-short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
-void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; }
-short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
-short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
-void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; }
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
- _ascii (); _ebcdic ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-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); } &&
- { 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
- if fgrep BIGenDianSyS conftest.$ac_objext >/dev/null ; then
- ac_cv_c_bigendian=yes
-fi
-if fgrep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
- if test "$ac_cv_c_bigendian" = unknown; then
- ac_cv_c_bigendian=no
- else
- # finding both strings is unlikely to happen, but who knows?
- ac_cv_c_bigendian=unknown
- fi
-fi
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-int
-main ()
-{
- /* Are we little or big endian? From Harbison&Steele. */
- union
- {
- long l;
- char c[sizeof (long)];
- } u;
- u.l = 1;
- exit (u.c[sizeof (long) - 1] == 1);
-}
-_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
- ac_cv_c_bigendian=no
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-( exit $ac_status )
-ac_cv_c_bigendian=yes
-fi
-rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
-echo "${ECHO_T}$ac_cv_c_bigendian" >&6
-case $ac_cv_c_bigendian in
- yes)
-
-cat >>confdefs.h <<\_ACEOF
-#define WORDS_BIGENDIAN 1
-_ACEOF
- ;;
- no)
- ;;
- *)
- { { echo "$as_me:$LINENO: error: unknown endianess
-presetting ac_cv_c_bigendian=no (or yes) will help" >&5
-echo "$as_me: error: unknown endianess
-presetting ac_cv_c_bigendian=no (or yes) will help" >&2;}
- { (exit 1); exit 1; }; } ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-echo Build Process set for $HOST_OS running on $PLATFORM
-echo Using Compiler: $CC $CFLAGS
-echo Using Linker: $LINKER $LDFLAGS $LIBS
-ac_config_files="$ac_config_files Makefile"
-
-ac_config_headers="$ac_config_headers config.h"
-
-
-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 overriden 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 cmp -s $cache_file confcache; 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
-
-DEFS=-DHAVE_CONFIG_H
-
-
-: ${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
-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=:
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
- set -o posix
-fi
-
-# NLS nuisances.
-# Support unset when possible.
-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
- as_unset=unset
-else
- as_unset=false
-fi
-
-(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
- { $as_unset LANG || test "${LANG+set}" != set; } ||
- { LANG=C; export LANG; }
-(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
- { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
- { LC_ALL=C; export LC_ALL; }
-(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
- { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
- { LC_TIME=C; export LC_TIME; }
-(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
- { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
- { LC_CTYPE=C; export LC_CTYPE; }
-(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
- { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
- { LANGUAGE=C; export LANGUAGE; }
-(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
- { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
- { LC_COLLATE=C; export LC_COLLATE; }
-(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
- { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
- { LC_NUMERIC=C; export LC_NUMERIC; }
-(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
- { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
- { LC_MESSAGES=C; export LC_MESSAGES; }
-
-
-# Name of the executable.
-as_me=`(basename "$0") 2>/dev/null ||
-$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" >conftest.sh
- echo "exit 0" >>conftest.sh
- chmod +x conftest.sh
- if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
- else
- PATH_SEPARATOR=:
- fi
- rm -f conftest.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
- 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
-
-as_executable_p="test -f"
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="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="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 || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export 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 slp $as_me 0.8 , which was
-generated by GNU Autoconf 2.53. 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
- -d, --debug don't remove temporary files
- --recheck update $as_me by reconfiguring in the same conditions
- --file=FILE[:TEMPLATE]
- instantiate the configuration file FILE
- --header=FILE[:TEMPLATE]
- instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Report bugs to <bug-autoconf@gnu.org>."
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-ac_cs_version="\\
-slp config.status 0.8
-configured by $0, generated by GNU Autoconf 2.53,
- with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
-
-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
-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
-_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[^=]*=\(.*\)'`
- shift
- set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
- shift
- ;;
- -*);;
- *) # This is not an option, so the user has probably given explicit
- # arguments.
- ac_need_defaults=false;;
- esac
-
- case $1 in
- # Handling of the options.
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
- -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
- echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
- exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
- --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 )
- shift
- CONFIG_FILES="$CONFIG_FILES $1"
- ac_need_defaults=false;;
- --header | --heade | --head | --hea )
- shift
- CONFIG_HEADERS="$CONFIG_HEADERS $1"
- ac_need_defaults=false;;
-
- # 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
-
-_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" ;;
- "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
- *) { { 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_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-fi
-
-# 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.
-: ${TMPDIR=/tmp}
-{
- tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
- test -n "$tmp" && test -d "$tmp"
-} ||
-{
- tmp=$TMPDIR/cs$$-$RANDOM
- (umask 077 && mkdir $tmp)
-} ||
-{
- echo "$me: cannot create a temporary directory in $TMPDIR" >&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,@build@,$build,;t t
-s,@build_cpu@,$build_cpu,;t t
-s,@build_vendor@,$build_vendor,;t t
-s,@build_os@,$build_os,;t t
-s,@host@,$host,;t t
-s,@host_cpu@,$host_cpu,;t t
-s,@host_vendor@,$host_vendor,;t t
-s,@host_os@,$host_os,;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,@LN_S@,$LN_S,;t t
-s,@ECHO@,$ECHO,;t t
-s,@RANLIB@,$RANLIB,;t t
-s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
-s,@STRIP@,$STRIP,;t t
-s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
-s,@CPP@,$CPP,;t t
-s,@LIBTOOL@,$LIBTOOL,;t t
-s,@WORDS_BIGENDIAN@,$WORDS_BIGENDIAN,;t t
-s,@DEBUG@,$DEBUG,;t t
-s,@OBJ@,$OBJ,;t t
-s,@IGNORE@,$IGNORE,;t t
-s,@LIB_PATH@,$LIB_PATH,;t t
-s,@LEX@,$LEX,;t t
-s,@YACC@,$YACC,;t t
-s,@STATIC_LINK_CMD@,$STATIC_LINK_CMD,;t t
-s,@DLL_LINK_CMD@,$DLL_LINK_CMD,;t t
-s,@MV@,$MV,;t t
-s,@MV_FLAGS@,$MV_FLAGS,;t t
-s,@RM@,$RM,;t t
-s,@RM_FLAGS@,$RM_FLAGS,;t t
-s,@CP@,$CP,;t t
-s,@CP_FLAGS@,$CP_FLAGS,;t t
-s,@MAKE@,$MAKE,;t t
-s,@OS_PORT_INC@,$OS_PORT_INC,;t t
-s,@OS_PORT_SRC@,$OS_PORT_SRC,;t t
-s,@OS_PORT_OBJ@,$OS_PORT_OBJ,;t t
-s,@HOST_OS@,$HOST_OS,;t t
-s,@LINKER@,$LINKER,;t t
-s,@EXE@,$EXE,;t t
-s,@THREAD_LIBS@,$THREAD_LIBS,;t t
-s,@REENTRANT_FLAG@,$REENTRANT_FLAG,;t t
-s,@NO_LINK_FLAG@,$NO_LINK_FLAG,;t t
-s,@LIB_SUFFIX@,$LIB_SUFFIX,;t t
-s,@DLL_SUFFIX @,$DLL_SUFFIX ,;t t
-s,@EXE_OUT@,$EXE_OUT,;t t
-s,@OBJ_OUT@,$OBJ_OUT,;t t
-s,@LIB_INCLUDE_FLAG@,$LIB_INCLUDE_FLAG,;t t
-s,@DLL_LIB_FLAG@,$DLL_LIB_FLAG,;t t
-s,@LFLAGS@,$LFLAGS,;t t
-s,@YFLAGS@,$YFLAGS,;t t
-s,@PLATFORM@,$PLATFORM,;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'`
- { case "$ac_dir" in
- [\\/]* | ?:[\\/]* ) as_incr_dir=;;
- *) as_incr_dir=.;;
-esac
-as_dummy="$ac_dir"
-for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
- case $as_mkdir_dir in
- # Skip DOS drivespec
- ?:) as_incr_dir=$as_mkdir_dir ;;
- *)
- as_incr_dir=$as_incr_dir/$as_mkdir_dir
- test -d "$as_incr_dir" ||
- mkdir "$as_incr_dir" ||
- { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create \"$ac_dir\"" >&2;}
- { (exit 1); exit 1; }; }
- ;;
- esac
-done; }
-
- 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
-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
-# absolute.
-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
-
-
-
- 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
-" $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_HEADER section.
-#
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
-ac_dB='[ ].*$,\1#\2'
-ac_dC=' '
-ac_dD=',;t'
-# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
-ac_uB='$,\1#\2define\3'
-ac_uC=' '
-ac_uD=',;t'
-
-for ac_file in : $CONFIG_HEADERS; 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
-
- test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-
- # 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; }
- # Remove the trailing spaces.
- sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
-
-_ACEOF
-
-# Transform confdefs.h into two sed scripts, `conftest.defines' and
-# `conftest.undefs', that substitutes the proper values into
-# config.h.in to produce config.h. The first handles `#define'
-# templates, and the second `#undef' templates.
-# And first: Protect against being on the right side of a sed subst in
-# config.status. Protect against being in an unquoted here document
-# in config.status.
-rm -f conftest.defines conftest.undefs
-# Using a here document instead of a string reduces the quoting nightmare.
-# Putting comments in sed scripts is not portable.
-#
-# `end' is used to avoid that the second main sed command (meant for
-# 0-ary CPP macros) applies to n-ary macro definitions.
-# See the Autoconf documentation for `clear'.
-cat >confdef2sed.sed <<\_ACEOF
-s/[\\&,]/\\&/g
-s,[\\$`],\\&,g
-t clear
-: clear
-s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
-t end
-s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
-: end
-_ACEOF
-# If some macros were called several times there might be several times
-# the same #defines, which is useless. Nevertheless, we may not want to
-# sort them, since we want the *last* AC-DEFINE to be honored.
-uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
-sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
-rm -f confdef2sed.sed
-
-# This sed command replaces #undef with comments. This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-cat >>conftest.undefs <<\_ACEOF
-s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
-_ACEOF
-
-# Break up conftest.defines because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
-echo ' if egrep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
-echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
-echo ' :' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.defines >/dev/null
-do
- # Write a limited-size here document to $tmp/defines.sed.
- echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
- # Speed up: don't consider the non `#define' lines.
- echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
- # Work around the forget-to-reset-the-flag bug.
- echo 't clr' >>$CONFIG_STATUS
- echo ': clr' >>$CONFIG_STATUS
- sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
- echo 'CEOF
- sed -f $tmp/defines.sed $tmp/in >$tmp/out
- rm -f $tmp/in
- mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
- sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
- rm -f conftest.defines
- mv conftest.tail conftest.defines
-done
-rm -f conftest.defines
-echo ' fi # egrep' >>$CONFIG_STATUS
-echo >>$CONFIG_STATUS
-
-# Break up conftest.undefs because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.undefs >/dev/null
-do
- # Write a limited-size here document to $tmp/undefs.sed.
- echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
- # Speed up: don't consider the non `#undef'
- echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
- # Work around the forget-to-reset-the-flag bug.
- echo 't clr' >>$CONFIG_STATUS
- echo ': clr' >>$CONFIG_STATUS
- sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
- echo 'CEOF
- sed -f $tmp/undefs.sed $tmp/in >$tmp/out
- rm -f $tmp/in
- mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
- sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
- rm -f conftest.undefs
- mv conftest.tail conftest.undefs
-done
-rm -f conftest.undefs
-
-cat >>$CONFIG_STATUS <<\_ACEOF
- # 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
- echo "/* Generated by configure. */" >$tmp/config.h
- else
- echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
- fi
- cat $tmp/in >>$tmp/config.h
- rm -f $tmp/in
- if test x"$ac_file" != x-; then
- if cmp -s $ac_file $tmp/config.h 2>/dev/null; then
- { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
-echo "$as_me: $ac_file is unchanged" >&6;}
- else
- 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'`
- { case "$ac_dir" in
- [\\/]* | ?:[\\/]* ) as_incr_dir=;;
- *) as_incr_dir=.;;
-esac
-as_dummy="$ac_dir"
-for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
- case $as_mkdir_dir in
- # Skip DOS drivespec
- ?:) as_incr_dir=$as_mkdir_dir ;;
- *)
- as_incr_dir=$as_incr_dir/$as_mkdir_dir
- test -d "$as_incr_dir" ||
- mkdir "$as_incr_dir" ||
- { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create \"$ac_dir\"" >&2;}
- { (exit 1); exit 1; }; }
- ;;
- esac
-done; }
-
- rm -f $ac_file
- mv $tmp/config.h $ac_file
- fi
- else
- cat $tmp/config.h
- rm -f $tmp/config.h
- fi
-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=:
- exec 5>/dev/null
- $SHELL $CONFIG_STATUS || 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
-
+++ /dev/null
-AC_PREREQ([2.53])
-AC_REVISION([$Revision: 1.1 $])
-AC_INIT([slp],[0.8] ,[lslp-bugs@lists.sourceforge.net], [lslp.tar.gz])
-
-AC_COPYRIGHT([Configuration input files:
-Copyright (c) 2002, Michael Day
-Copyright (c) 2002, International Business Machines
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.])
-AC_CONFIG_SRCDIR([config.guess])
-
-AC_CANONICAL_BUILD
-
-
-
-AC_PROG_LIBTOOL
-## establish the kind of executable to build (debug or production)
-
-if
-[ [ $DEBUG ] ]
-then
- echo Configuring to build $PACKAGE_NAME with debugging symbols
- AC_DEFINE([DEBUG], 1, [Enable debugging options in build.])
-
-else
- echo Configuring to build a production version of $PACKAGE_NAME
-fi
-
-## libtool & Make variables
-LIBTOOL=libtool
-OBJ=.lo
-IGNORE=-
-LIB_PATH=-rpath
-LEX=flex
-YACC=bison
-STATIC_LINK_CMD=-static
-DLL_LINK_CMD=-module
-
-MV=mv
-MV_FLAGS=-fv
-RM=rm
-RM_FLAGS=-fv
-CP=cp
-CP_FLAGS=-fv
-MAKE=make
-## establish the target OS and PROC
-
-case $build in
- *-*-go32* | *-*-mingw32* | *-*-cygwin* | *-*-windows*)
- AC_DEFINE([HOST_OS], ["Windows"], [Target Operation System])
- AC_DEFINE([OS_PORT_INCLUDE], ["lslp-windows.h"], [Portability Header])
- OS_PORT_INC=lslp-windows.h
- OS_PORT_SRC=lslp-windows.c
- OS_PORT_OBJ=lslp-windows.lo
- HOST_OS=Windows
- CC=cl
- LINKER=$CC
- EXE=.exe
- LIBS=ws2_32.lib
- THREAD_LIBS=
- REENTRANT_FLAG=
- NO_LINK_FLAG=
- LIB_SUFFIX=.lib
- DLL_SUFFIX=.dll
- EXE_OUT=/Fe
- OBJ_OUT=/Fo
- LIB_INCLUDE_FLAG
- AC_DEFINE([DLL_IMPORT], [__declspec(dllimport)], [DLL import declaration])
- AC_DEFINE([DLL_EXPORT], [__declspec(dllexport)], [DLL export declaration])
- if [ [ $DEBUG ] ]
- then
- CFLAGS="-GX -GR -W3 -Od -Zi -MDd -DDEBUG_ALLOC"
- LDFLAGS=-debug
- DLL_LIB_FLAG=/LDd
- LFLAGS="-p -v -d"
- YFLAGS="-v -d"
- else
- CFLAGS="-GX -GR -W3 -O2 -MD"
- LDFLAGS=""
- DLL_LIB_FLAG=/LD
- LFLAGS="-f -w"
- YFLAGS=-l
- fi
-
- bindir=$SYSTEMROOT/system32
- sbindir=$SYSTEMROOT/system32
- libexecdir=$SYSTEMROOT/system32
- sysconfdir=$SYSTEMROOT/system32
- libdir=$SYSTEMROOT/system32
-
-
- ;;
- *-*-linux*)
- AC_DEFINE([HOST_OS], ["Linux"], [Target Operation System])
- AC_DEFINE([OS_PORT_INCLUDE], ["lslp-linux.h"], [Portability Header])
- OS_PORT_INC=lslp-linux.h
- OS_PORT_SRC=lslp-linux.c
- OS_PORT_OBJ=lslp-linux.lo
- HOST_OS=linux
- AC_PROG_CC()
- LINKER=$CC
- EXE=
- LIBS=
- LIB_INCLUDE_FLAG=-l
- THREAD_LIBS=-lpthread
- REENTRANT_FLAG=-D_REENTRANT
- NO_LINK_FLAG=-c
- LIB_SUFFIX=.o
- DLL_SUFFIX=.so
- AC_DEFINE([DLL_IMPORT], , [DLL import declaration])
- AC_DEFINE([DLL_EXPORT], , [DLL export declaration])
- EXE_OUT=-o
- OBJ_OUT=-o
- if [ [ $DEBUG ] ]
- then
- CFLAGS="-g -Wall -Dlinux -DDEBUG_ALLOC"
- LDFLAGS=-g
- LFLAGS="-p -v -d "
- YFLAGS="-v -d"
- else
- CFLAGS="-O -Wall -Dlinux"
- LDFLAGS=-s
- LFLAGS="-f -w"
- YFLAGS=-l
- fi
-
- bindir=/bin
- sbindir=/sbin
- libexecdir=/lib
- sysconfdir=/etc
- libdir=/usr/lib
-
- ;;
- *-*-aix*)
- AC_DEFINE([HOST_OS], ["AIX"], [Target Operation System])
- HOST_OS=AIX
- ;;
-esac
-
-case $build in
- i?86-*-*)
- AC_DEFINE([PLATFORM], ["x86"], [Target Processor])
- PLATFORM=x86
- ;;
- ia64-*-*)
- AC_DEFINE([PLATFORM], ["ia64"], [Target Processor])
- PLATFORM=ia64
- ;;
- ppc-*-*)
- AC_DEFINE([PLATFORM], ["ppc"], [Target Processor])
- PLATFORM=ppc
- ;;
- mipsel-*-*)
- AC_DEFINE([PLATFORM], ["mipsel"], [Target Processor])
- PLATFORM=mipsel
- ;;
- mipseb-*-*)
- AC_DEFINE([PLATFORM], ["mipseb"], [Target Processor])
- PLATFORM=mipseb
-esac
-
-
-## check for headers and declarations we need
-
-# will be false on windows systems
-AC_CHECK_HEADERS([unistd.h])
-AC_CHECK_HEADERS([linux/if.h], HAVE_IF_H=1, ,)
-
-if
-[ [ $HAVE_IF_H ] ]
-then
- AC_DEFINE([HAVE_IF_H], 1, [Use linux include for IOCTL on network devices.])
-fi
-
-## create the appropriate directories to hold binaries
-SRC_DIR=
-
-
-## set up environment variables that control the build for specific variants
-case $HOST_OS in
- linux)
- case $PLATFORM in
- x86)
-
- ;;
-
- ia64)
-
- ;;
-
- ppc)
-
-
- ;;
- esac
-
- ;;
- Windows)
- case $PLATFORM in
- x86)
-
- ;;
-
- ia64)
-
- ;;
-
- ppc)
-
-
- ;;
- esac
-
- ;;
- AIX)
- case $PLATFORM in
- x86)
-
- ;;
-
- ia64)
-
- ;;
-
- ppc)
-
-
- ;;
- esac
- ;;
-
-esac
-
-AC_C_BIGENDIAN
-AC_SUBST([WORDS_BIGENDIAN])
-AC_SUBST([DEBUG])
-AC_SUBST([PACKAGE_NAME])
-AC_SUBST([PACKAGE_VERSION])
-AC_SUBST([LIBTOOL])
-AC_SUBST([OBJ])
-AC_SUBST([IGNORE])
-AC_SUBST([LIB_PATH])
-AC_SUBST([LEX])
-AC_SUBST([YACC])
-AC_SUBST([STATIC_LINK_CMD])
-AC_SUBST([DLL_LINK_CMD])
-AC_SUBST([MV])
-AC_SUBST([MV_FLAGS])
-AC_SUBST([RM])
-AC_SUBST([RM_FLAGS])
-AC_SUBST([CP])
-AC_SUBST([CP_FLAGS])
-AC_SUBST([MAKE])
-AC_SUBST([OS_PORT_INC])
-AC_SUBST([OS_PORT_SRC])
-AC_SUBST([OS_PORT_OBJ])
-AC_SUBST([HOST_OS])
-AC_SUBST([LINKER])
-AC_SUBST([EXE])
-AC_SUBST([LIBS])
-AC_SUBST([THREAD_LIBS])
-AC_SUBST([REENTRANT_FLAG])
-AC_SUBST([NO_LINK_FLAG])
-AC_SUBST([LIB_SUFFIX])
-AC_SUBST([DLL_SUFFIX ])
-AC_SUBST([EXE_OUT])
-AC_SUBST([OBJ_OUT])
-AC_SUBST([LIB_INCLUDE_FLAG])
-AC_SUBST([CFLAGS])
-AC_SUBST([LDFLAGS])
-AC_SUBST([DLL_LIB_FLAG])
-AC_SUBST([LFLAGS])
-AC_SUBST([YFLAGS])
-AC_SUBST([bindir])
-AC_SUBST([sbindir])
-AC_SUBST([libexecdir])
-AC_SUBST([sysconfdir])
-AC_SUBST([libdir])
-AC_SUBST([PLATFORM])
-AC_SUBST([CC])
-
-echo Build Process set for $HOST_OS running on $PLATFORM
-echo Using Compiler: $CC $CFLAGS
-echo Using Linker: $LINKER $LDFLAGS $LIBS
-AC_CONFIG_FILES([Makefile])
-AC_CONFIG_HEADERS([config.h])
-
-AC_OUTPUT
+++ /dev/null
-.\"-----------------------------------------------------------------
-.\" Registers to store heading levels as variables
-.\"-----------------------------------------------------------------
-.nr head1 0 1
-.nr head2 0 1
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-
-.\"-----------------------------------------------------------------
-.\" Return to header level 1, 2, etc.
-.\" resets the level registers and indent
-.\"-----------------------------------------------------------------
-.de RETURN_HDR_1
-.nr head2 0 1
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_1 \\$1
-..
-
-.de RETURN_HDR_2
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_2 \\$1
-..
-
-.de RETURN_HDR_3
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_3 \\$1
-..
-
-.de RETURN_HDR_4
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_4 \\$1
-..
-
-.de RETURN_HDR_5
-.nr head6 0 1
-.in 0
-\.HDR_5 \\$1
-..
-
-.\"-----------------------------------------------------------------
-.\" Create a level 1, 2, etc,. heading
-.\" resets indent, creates a TOC entry
-.\" Parameter is the title of the heading
-.\"-----------------------------------------------------------------
-.de HDR_1
-.sp 1
-.in 0
-\\n+[head1]\\ \\$1
-.XS
-\\n[head1]\\ \\$1
-.XE
-.in 3
-..
-
-
-.de HDR_2
-.sp 1
-.in 0
-\\n[head1]\\.\\n+[head2]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_3
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n+[head3]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_4
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n+[head4]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_5
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n+[head5]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_6
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\.\\n+[head6]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\.\\n[head6]\\ \\$1
-.in 3
-.XE
-..
-
-.\"-----------------------------------------------------------------
-.\" END MACRO DEFINITIONS
-.\"-----------------------------------------------------------------
-
-.pl 58
-.po 0
-.ll 72
-.lt 72
-.ds LF Day
-.ds RF FORMFEED[Page %]^
-.ds CF
-.ds LH INTERNET DRAFT
-.ds CH SLP Exclusion Directive
-.ds RH Exp. May 2003
-.hy 0
-.ad l
-.in 0
-
-
-Internet Engineering Task Force Michael Day
-INTERNET DRAFT IBM
-23 December Expires in six months
-
-.ce 1000
-Exclusion Extension for Service Location Protocol v2
-draft-day-svrloc-exclusion-01.txt
-.ce 0
-.sp 5
-
-.in 0
-Status of This Memo
-.in 3
-
-This document is an individual contribution to the Internet
-Engineering Task Force (IETF). Comments should be submitted to the
-srvloc@srvloc.org mailing list.
-
-Distribution of this memo is unlimited.
-
-This document is an Internet-Draft and is in full conformance with
-all provisions of Section 10 of RFC2026. Internet-Drafts are working
-documents of the Internet Engineering Task Force (IETF), its areas,
-and its working groups. Note that other groups may also distribute
-working documents as Internet-Drafts.
-
-Internet-Drafts are draft documents valid for a maximum of six months
-and may be updated, replaced, or obsoleted by other documents at any
-time. It is inappropriate to use Internet-Drafts as reference
-material or to cite them other than as "work in progress."
-
-The list of current Internet-Drafts can be accessed at
-http://www.ietf.org/ietf/1id-abstracts.txt
-
-The list of Internet-Draft Shadow Directories can be accessed at
-http://www.ietf.org/shadow.html.
-
-.bp
-.HDR_1 Introduction
-
-The Service Location Protocol, Version 2 [1] allows the use of
-multicast and broadcast discovery requests. The SLP exclusion
-directive is an extension to SLP that optimizes the use of
-multicasting and broadcasting to find services on an intranet. This
-document hereafter refers to multicast discovery but all its contents
-apply to broadcast discovery as well.
-
-.HDR_2 "Present SLPv2 Multicast Behavior"
-
-Multicast discovery requests allow an SLP User Agent to discover
-services with no prior configuration. Multicast discovery requests are
-not sent reliably and must be retransmitted in order to find all
-services of the desired type on the network.
-
-When SLP v2 SrvRqst, SrvTypeRqst, and AttrRqst messages are multicast,
-they contain a <PRList> of previous respondents. Initially the
-<PRList> is empty. When these requests are unicast, the <PRList> is
-always empty.
-
-Any DA or SA which sees its address in the <PRList> does not respond
-to the request (as specified in RFC 2608).
-
-The User Agent then retransmits the discovery request until the
-<PRList> causes no further responses to be elicited or the previous
-responder list and the request will not fit into a single datagram or
-until CONFIG_MC_MAX seconds elapse[1].
-
-The PR list is an effective mechanism for suppressing duplicate
-responses in smaller environments. However, because of the way PR
-lists are encoded with the SLP v2 header, the PR List has a limit of
-as few as 90 IPv4 addressees, and even fewer IPv6 addresses. This
-means in most environments a User Agent may suppress duplicate
-responses from approximately 90 host addresses at best.
-
-.HDR_2 Optimizations\ Made\ by\ Exclusion\ Directive
-
-The Exclusion Directive extension presented in this document allows a
-User Agent (UA) to direct those Directory Agents (DAs) and Service
-Agents (SAs) from which it has already received responses not to
-respond to retransmissions of a particular query. Hence subsequent
-retransmissions only generate responses from agents from which the
-requester has not already received a response.
-
-This extension can be used in conjunction with the SLP v2 PR list.
-SAs and DAs which do not understand the Exclusion Directive extension
-will ignore it. With the use of the Exclusion Directive extension, SLP
-v2 User Agents may perform multicast discovery with a high degree of
-success and efficiency, even when the number of respondents reaches
-into the thousands. .
-
-.HDR_2 Terminology
-
-In this document, the key words "MAY", "MUST, "MUST NOT", "optional",
-"recommended", "SHOULD", and "SHOULD NOT", are to be interpreted as
-described in RFC 2119 [2].
-
-.bp
-.RETURN_HDR_1 Exclusion\ Extension\ Format
-
-The fields in an Exclusion extension form an Exclusion Directive that
-tells receiving agents not to respond to a specific request from a
-specific host for a specific time interval.
-
-Each Exclusion Directive is fully contained within one SLP v2
-extension block. However, a single SLP v2 request message may contain
-multiple Exclusion Directives. For example, a single Service Request
-may contain three Exclusion Directives within three distinct SLP v2
-extension blocks.
-
-.KS
-.HDR_2 Exclusion\ Extension\ Fields
-
-The Exclusion extension has the following format:
-.DS L
-
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Extension ID = 0x000? | Next Extension Offset |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Offset, contd.| size | Exclusion XID |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Nonce |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion Interval | Number of Entries |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion Entries |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | # auth blocks | authentication block (if any) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-.DE
-.KE
-.HDR_3 Size\ Field
-
-The size field specifies the size, in bytes, of each address entry. A
-size value of 4 bytes MUST be encoded as an IP v4 address in network
-byte order. A size value of 16 bytes MUST be encoded as an IP v6
-address in network byte order. Other address sizes are assumed to be
-opaque data and will not be interoperable among different
-implementations
-
-.HDR_4 Using\ the\ Size\ Field\ to\ Calculate\ Length\ of\ Entries
-
-The size of the Exclusion Entries field MUST be calculated by
-multiplying the value of the Size field by the value of the Number of
-Entries field.
-
-.RETURN_HDR_3 Exclusion\ XID
-
-The Exclusion XID identifies the SLP request to which the enclosing
-Exclusion Directive applies. An Exclusion Directive always applies to
-exactly one specific XID from exactly one host IP address.
-
-It is possible that the value of XID field in the Exclusion Directive
-and the XID in the SLP header of the message containing the Exclusion
-Directive will be different. This is a subtle but important point: the
-SLP v2 header XID and the Exclusion XID are not equivalent. See
-section 3.0 for details of how the exclusion XID works.
-
-.HDR_3 Nonce
-
-The Nonce adds a unique value to each Exclusion Directive that makes
-it difficult to mount a denial of service attack by replaying
-Exclusion Directives. The Nonce is a 128-bit field which MUST contain
-a cryptographic-quality random unique value; or alternatively must be
-filled with zero bytes. (If the Nonce is filled with zero bytes, it is
-ignored.)
-
-The usage of the Nonce is explained further in section 4.3.
-
-.HDR_3 Exclusion\ Interval
-
-The Exclusion Interval indicates the lifetime, in seconds, of the
-containing Exclusion Directive. The interval begins when the SA or DA
-receives the Exclusion Directive. Exclusion Directives SHOULD have an
-interval from one to several seconds. However, the Exclusion Interval
-may need to be increased for unusually large networks or media with
-high latency characteristics, such as satellite links.
-
-.HDR_3 Exclusion\ Entries
-
-The Exclusion Entries field is the list of host IP addresses that are
-subject to the containing Exclusion Directive. The length of the Exclusion
-Entries field is the number of IP addresses in the list multiplied by
-the size of each IP address.
-
-The size of each IP address is determined by the value of the size
-field. Each Exclusion Directive therefore may only contain IPv4
-addresses or IPv6 addresses, but not both.
-
-.HDR_4 Dual-stack\ IP\ Environments
-
-In environments using both IPv4 and IPv6 addresses it may be necessary
-to deliver two Exclusion Directives where otherwise one would be
-sufficient. E.g., one Directive containing IPv4 addresses and another
-Directive containing IPv6 addresses. One way to accomplish this is to
-pack two separate Exclusion Directives into a single SLP
-request. Another way involves using dummy request messages to deliver
-Exclusion Directives. Dummy request messages are covered in section
-3.1 below.
-
-.RETURN_HDR_3 Authentication\ Blocks
-
-The Number of Auth Blocks indicates how many authentication blocks
-are contained in the containing Exclusion Directive. The format of the
-authentication block is covered in section 4 below.
-
-.KS
-.RETURN_HDR_2 Exclusion\ Directive\ Functionality
-
-The purpose of the Exclusion Directive is to cause SAs or DAs to
-silently discard specific SLP requests that originate from specific IP
-addresses. This purpose aids in the use of multicasting to discover
-services in large network environments. The Exclusion Directive makes
-multicast discovery more reliable and efficient by:
-
-.nr PI 5
-.nr step 1 1
-.RS
-.IP \n[step]. 3
-Providing a more compact mechanism to silence previous responders.
-.IP \n+[step].
-Magnifying the effect of the silencing mechanism by specifying a quiet interval.
-.RE
-.KE
-
-.HDR_3 Exclusion\ Directive\ State\ Table\ (EDST)
-
-When the Exclusion Directive is present in an SLP request, the
-receiving agent uses the directive to create and maintain state
-information that causes the receiving agent to ignore and discard
-matching requests (possibly including the request containing the
-Exclusion Directive).
-
-The Exclusion Directive State Table (EDST) is the collection of
-information describing all current Exclusion Directives received by
-the agent. EDST entries are a record with five fields: Source Address,
-Source Port, exclusion XID , exclusion nonce value, and expiration
-time. (The nonce value MAY be zero filled.)
-
-The Exclusion Directive only applies to SLP v2 messages that have the
-multicast flag set. The SA or DA MUST respond to SLP v2 messages that
-do not have the multicast flag set as specified in [1].
-
-If the incoming request message matches a current record in the
-receiving agent's EDST, and if the incoming request's Multicast flag
-is set in the SLP header, the DA or SA MUST silently discard the
-message.
-
-When the Exclusion Interval of an Exclusion Directive has expired, the
-SA or DA MUST delete the corresponding record in its EDST and resume
-processing SLP v2 multicast request as if that Exclusion Directive
-was never received.
-
-If an incoming request does not contain an Exclusion Directive, the
-receiving agent MUST process that request without regard to the local
-EDST. (In other words, process the request normally.)
-
-
-.RETURN_HDR_1 Exclusion\ Directives\ in\ SLP\ v2\ Request\ Messages
-
-An SA or DA may encounter the Exclusion Directive in Service Request,
-Attribute Request, and Service Type Request messages. In each case,
-the request may also contain a PR list as described in [1].
-
-A UA MUST NOT include an Exclusion Directive in a unicast SLP v2
-request message. DAs and SAs MUST ignore Exclusion Directives that
-are erroneously included in unicast request messages.
-
-.KS
-If the SA or DA supports the Exclusion Directive, it MUST perform the
-following steps when processing an SLP v2 Request message.
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-If the request message is unicast or if the receiving agent does not
-recognize the Exclusion Directive, go to step 6 below.
-.IP \n+[step].
-If the incoming request does not have an Exclusion Directive,
-proceed to step 6.
-.IP \n+[step].
-Extract the Exclusion Directive from the request. Search the
-Directive's Exclusion Entries list for the receiving agent's IP
-address. If not found, proceed to step 6.
-.IP \n+[step].
-Extract the source address and port from the UDP header and the
-Exclusion XID and nonce from the Exclusion Directive. The receiving
-agent MUST ensure that its EDST contains a record for this directive,
-creating a new EDST record if necessary. (This step is also a
-convenient time to delete expired entries from the EDST.)
-.IP \n+[step].
-Extract the source address and port from the incoming request's UDP
-header. Extract the XID from the request's SLP v2 header. If the
-incoming request has an Exclusion Directive, extract the nonce from
-the directive.
-
-Search the EDST for an entry containing matching values for these data
-(Optionally ignoring the nonce from the EDST entry if the incoming
-request does not contain an exclusion directive). Upon finding a
-matching EDST entry, silently discard the request. Otherwise continue.
-.IP \n+[step].
-If the SA or DA has not discarded the request up to this point,
-evaluate the request normally as outlined in [1].
-.RE
-.KE
-.in 3
-
-It is worth repeating that the Exclusion Directive only applies to
-SLP v2 request messages that have the R (Request Multicast) flag
-turned on in the SLP v2 header. Agents MUST NOT silently discard
-unicast request messages regardless of exclusion directives or EDST
-entries.
-
-Note that additional steps may be necessary if the Exclusion
-directive contains one or more authentication blocks. These
-steps are outlined in section 4.
-
-.KS
-.HDR_2 Dummy\ Service\ Request\ Message\ with\ Exclusion\ Directive
-
-A "dummy" request message is one that has zero-length fields
-for the entire request body, exclusive of the SLP v2 header and the
-Exclusion directive.
-
-Using a dummy SLP request message for the sole purpose of transporting
-an Exclusion Directive may be helpful in two cases:
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-The Exclusion Directive is too large to fit within a single request
-datagram alongside the SLP header, service type, predicate, and other request
-data. However, it will fit in a datagram with just itself and the SLP
-header.
-.IP \n+[step].
-The Exclusion Directive is larger than the sum of the network MTU
-and the SLP Header. The agent can divide the Exclusion Entries list
-across two or more Exclusion Directives and transport those Directives
-within a corresponding number of dummy SLP request messages.
-
-This method can support Exclusion Entry lists that contain thousands
-of addresses.
-.RE
-.in 3
-.sp 1
-When an SA or DA receives a dummy SLP request that contains an
-Exclusion Directive, the receiving agent MUST extract the Exclusion
-Directive from the dummy request and ensure that the local EDST
-contains a record corresponding to the Exclusion Directive. This is
-described in section 3, step 4 above.
-
-
-A Dummy request message MUST have the R (Request Multicast) flag
-turned on in the SLP v2 header. This causes SLP v2 SAs and DAs that
-are unaware of the Exclusion Directive to silently discard dummy
-request messages due to a parsing error (instead of responding to the
-sending agent with an error code).
-.KE
-.KS
-
-.HDR_3 Format\ of\ Dummy\ Service\ Request
-.DS L
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location Header (R flag on) (function = SrvRqst = 1) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <PRList> = 0 | length of <service-type> = 0 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <scope-list> = 0 | length of <predicate> = 0 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <SLP SPI > = 0 | Extension ID = Exclusion |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Next Extension Offset | size |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion XID | Nonce |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Nonce, cont'd. | Exclusion Interval |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Number of Entries | Exclusion Entries \\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- \\ # auth blocks | authentication block (if any)\\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-.DE
-.KE
-.HDR_3 Processing\ the\ Dummy\ Service\ Request
-
-Dummy Service Request messages MUST be processed as outlined in
-section 3 above. The result is that the receiving agents which support
-the Exclusion Directive will process the Directive, while all other
-agents will silently discard the message due to a parsing error.
-
-After processing the Exclusion Directive, the receiving agent will
-produce a parse error. Because the service request has the multicast
-flag set, the receiving agent will not send an error response to the
-originating agent.
-
-Note that if the Exclusion Directive contains an authentication
-block, the SA or DA SHOULD validate the signature of the Exclusion
-Directive. Authentication of Exclusion Directives is covered in
-section 4.
-
-.KS
-.HDR_3 Using\ the\ Exclusion\ Directive\ and\ PR\ List\ Together
-
-The steps below show how to use the
-Exclusion Directive in combination with the SLP PR list to perform
-multicast discovery (substitute actual XIDs in real usage):
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-Send a new Service Request with no PR list and no Exclusion Directive;
-process the replies and remember the respondents as RL1.
-.IP \n+[step].
-Build an exclusion list and remember it as list EL1.
-.IP \n+[step].
-Immediately re-transmit the Service Request from (1) with no PR list
-and but with an Exclusion Directive that contains Exclusion List EL1;
-process the replies and remember the respondents as RL2.
-.IP \n+[step].
-The intersection of EL1 and RL2 are agents that do not support the
-Exclusion Directive. Create PRL1 = EL1 n RL2. Build EL2 = RL2 - PRL1.
-.IP \n+[step].
-Immediately re-transmit the Service Request from (3) including PRL1 in
-the SLP header and substituting EL2 for EL1 in the Exclusion
-Directive. If no responses the discovery cycle is complete.
-.IP \n+[step].
-Repeat the previous thre steps n times using ELn-1, RLn, PRLn-1, and ELn until the
-UA receives no responses for the configured timeout period.
-.RE
-.in 3
-.sp 1
-In steps 1 - 6 above, it is important that each Service Request (steps
-1, 3, and 5) have the same XID in the SLP Header ; and equally that
-each Exclusion Directive also has the same value in the XID field.
-.KE
-.KS
-
-.RETURN_HDR_1 Authenticating\ Exclusion\ Directives
-
-To prevent denial of service attacks against UAs, all agents that
-recognize the Exclusion Directive SHOULD support authentication of
-the Exclusion Directive.
-
-Authenticating Exclusion Directives places the additional burden upon
-the User Agent of signing data. In standard SLP v2, UAs only need to
-verify signatures. The additional ability to generate signatures
-means that UAs must be issued private key material.
-
-.HDR_2 The\ Exclusion\ Directive\ Authentication\ Block
-
-The format of the Exclusion Directive Authentication Block is the same
-as that used by SLP v2 [1].
-
-.DS L
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Block Structure Descriptor | Authentication Block Length |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Timestamp |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | SLP SPI String Length | SLP SPI String \\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- \\ Structured Authentication Block... \\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-.DE
-.KE
-.KS
-.HDR_2 Exclusion\ Directive\ Authentication\ Rules
-
-To sign or verify the signature of an Exclusion Directive, the SLP
-agent MUST use the following components of the Exclusion Directive as
-if they were a single continuous byte-aligned buffer:
-.nr PI 5
-.RS
-.IP \[bu] 3
-16-bit Exclusion XID
-.IP \[bu]
-32-bit Nonce
-.IP \[bu]
-16-bit Exclusion Interval
-.IP \[bu]
-8-bit Exclusion Entry size
-.IP \[bu]
-16-bit Number of Entries
-.IP \[bu]
-Variable-length Exclusion Entries.
-.RE
-.KE
-
-.RETURN_HDR_1 Using\ the\ NONCE\ Value\ to\ Prevent\ Replay\ Attacks
-
-Despite the use of signatures to authenticate Exclusion Directives,
-UAs may still be vulnerable to a replay denial of service attack. To
-prevent this possibility, SLP Agents that recognize the Exclusion
-directive SHOULD make use of the nonce value as described in this
-section.
-
-Every Exclusion Directive contains a 128-bit nonce field, which MUST
-contain a 128-bit cryptographicly random value or be filled with
-zeros. If the nonce is filled with zeroes, the UA is open to a
-denial-of service attack.
-
-Because the nonce field is included in signature generation and
-validation, each signed Exclusion Directive can be cryptographically
-unique. Unsigned Exclusion Directives can also be cryptographically
-unique but their source can be spoofed.
-
-.KS
-By using the nonce correctly, Exclusion Directives can be specific
-to:
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-The source address and port of the requesting UA.
-.IP \n+[step].
-The XID of the request.
-.IP \n+[step].
-A cryptographically unique value for each and every request. To make
-this work, SAs and DAs MUST include the nonce value, along with the UA
-source address and the request XID when deciding whether or not an
-Exclusion Directive applies to a request message.
-.RE
-.KE
-
-.HDR_2 UA\ Use\ of\ the\ Nonce\ to\ Prevent\ Denial\ of\ Service\ Attack
-
-The UA is the SLP component vulnerable to a denial of service attack
-so it is responsible for using an appropriate algorithm to generate a
-nonce with the requisite random characteristics.
-
-.KS
-For each Exclusion Directive:
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-Generate a random 128-bit integer to use as the nonce.
-.IP \n+[step].
-Initialize an Exclusion Directive, including the XID of the
-request that is subject to response suppression.
-.IP \n+[step].
-Insert the nonce value from (1) into the Exclusion Directive.
-.IP \n+[step].
-Optionally sign the Exclusion Directive as outlined in the section on
-Authentication above.
-.IP \n+[step].
-Use a Exclusion Directive containing the nonce in all
-requests and dummy Service Requests for the XID in step (2).
-.IP \n+[step].
-IMPORTANT - use a DIFFERENT, cryptographically generated nonce
-for each request XID for which you are issuing an Exclusion
-directive.
-.RE
-.KE
-.KS
-.HDR_2 DA\ and\ SA\ Use\ of\ the\ Nonce
-
-SA's DAs that recognize the Exclusion Directive MUST use the nonce
-value to initialize EDST entries and to evaluate Exclusion Directives
-in request messages.
-
-.HDR_3 Zero-filled\ Nonce
-
-UAs that don't have the ability to generate unique
-nonce values MUST fill the nonce field of the Exclusion Directive
-with zeros. This opens the agent up to a denial of service attack,
-however. (See below).
-
-.RETURN_HDR_2 Theory\ Behind\ the\ Nonce
-The nonce is a simple mechanism to make it as difficult as possible
-for an attacker to predict the composition of SLP service
-requests that a particular UA may issue in the near future.
-
-Most UA's use the XID field in the SLP 2 header as a sequential
-counter. Hence an attacker that has a copy of a recent SLP request can
-guess the XID of the next request the agent will make. Using the
-Exclusion Directive, an attacker can cause DA's and SA's not to
-respond to subsequent SLP requests made by the attacked agent.
-
-However, the inclusion of the nonce value in the Exclusion Directive
-makes it infeasible for an attacker to guess the composition of future
-requests made by the UA. This is true because the nonce, unlike the
-XID, is a random value. Also, the nonce is large enough to make
-guessing its value in the next request too difficult for the attacker.
-.KE
-.RETURN_HDR_1 Security\ Considerations
-
-Implementing the Exclusion Directive without using the nonce value
-opens SLP v2 UAs up to a trivial denial of service attack, which would
-nullify the ability of the UA to perform discovery.
-
-Implementing the Exclusion Directive with authentication but without
-using the nonce value may leave the UA open to a more sophisticated
-replay attack using previously signed and multicast request messages.
-
-UAs that support the Exclusion Directive SHOULD authenticate their
-requests as outlined in section 4 and SHOULD include the nonce value
-in all Exclusion Directives.
-
-SAs and DAs that support the Exclusion Directive SHOULD be able to
-verify signed Exclusion Directives and MUST store the nonce value in
-the EDST entry for that directive.
-
-Nonce values generated by UAs MUST be cryptographically unique and
-random values if they are to provide any safeguard against a replay
-attack.
-
-.HDR_1 Acknowledgements
-
-Erik Guttman has provided a great deal of feedback and improvements
-to this document. The srvloc working group also contributed to the
-development of this document, especialy Kevin Arnold, James Kempf,
-Ira McDonald, Evan Hughes, Terry Lambert, and others. Thomas Narten
-recommended some important changes during the review process.
-.KS
-.HDR_1 References
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-Guttman, E., Perkins, C., Veizades, J., and M. Day, "Service
-Location Protocol Version 2", RFC 2608, June 1999.
-.IP \n+[step].
-Bradner, S,. "Key Words for Use in RFCs to Indicate Requirements
-Levels", BCP 14, RFC 2119, March 1997
-.RE
-.KE
-.KS
-.HDR_1 Author's\ Contact\ Information
-
-Michael Day
-IBM
-3039 Cornwallis Road
-Research Triangle Park, NC 27709
-
-Phone: 919 543-4283
-
-Email: mdday@us.ibm.com
-.KE
-.KS
-.HDR_1 Full\ Copyright\ Statement
-
-Copyright (C) The Internet Society (2000-2002). All Rights Reserved.
-
-This document and translations of it may be copied and furnished to
-others, and derivative works that comment on or otherwise explain it
-or assist in its implementation may be prepared, copied, published and
-distributed, in whole or in part, without restriction of any kind,
-provided that the above copyright notice and this paragraph are
-included on all such copies and derivative works. However, this
-document itself may not be modified in any way, such as by removing
-the copyright notice or references to the Internet Society or other
-Internet organizations, except as needed for the purpose of developing
-Internet standards in which case the procedures for copyrights defined
-in the Internet Standards process must be followed, or as required to
-translate it into languages other than English.
-
-The limited permissions granted above are perpetual and will not be
-revoked by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an
-"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
-TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
-NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN
-WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE."
-.KE
-
-.TC
+++ /dev/null
-.\"-----------------------------------------------------------------
-.\" Registers to store heading levels as variables
-.\"-----------------------------------------------------------------
-.nr head1 0 1
-.nr head2 0 1
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-
-.\"-----------------------------------------------------------------
-.\" Return to header level 1, 2, etc.
-.\" resets the level registers and indent
-.\"-----------------------------------------------------------------
-.de RETURN_HDR_1
-.nr head2 0 1
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_1 \\$1
-..
-
-.de RETURN_HDR_2
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_2 \\$1
-..
-
-.de RETURN_HDR_3
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_3 \\$1
-..
-
-.de RETURN_HDR_4
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_4 \\$1
-..
-
-.de RETURN_HDR_5
-.nr head6 0 1
-.in 0
-\.HDR_5 \\$1
-..
-
-.\"-----------------------------------------------------------------
-.\" Create a level 1, 2, etc,. heading
-.\" resets indent, creates a TOC entry
-.\" Parameter is the title of the heading
-.\"-----------------------------------------------------------------
-.de HDR_1
-.sp 1
-.in 0
-\\n+[head1]\\ \\$1
-.XS
-\\n[head1]\\ \\$1
-.XE
-.in 3
-..
-
-
-.de HDR_2
-.sp 1
-.in 0
-\\n[head1]\\.\\n+[head2]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_3
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n+[head3]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_4
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n+[head4]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_5
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n+[head5]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_6
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\.\\n+[head6]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\.\\n[head6]\\ \\$1
-.in 3
-.XE
-..
-
-.\"-----------------------------------------------------------------
-.\" END MACRO DEFINITIONS
-.\"-----------------------------------------------------------------
-
-.pl 58
-.po 0
-.ll 72
-.lt 72
-.ds LF Day
-.ds RF FORMFEED[Page %]^
-.ds CF
-.ds LH INTERNET DRAFT
-.ds CH SLP Exclusion Directive
-.ds RH Exp. May 2003
-.hy 0
-.ad l
-.in 0
-
-
-Internet Engineering Task Force Michael Day
-INTERNET DRAFT IBM
-23 December 2002 Expires in six months
-
-.ce 1000
-Exclusion Extension for Service Location Protocol v2
-draft-day-svrloc-exclusion-03.txt
-.ce 0
-.sp 5
-
-.in 0
-Status of This Memo
-.in 3
-This document is an Internet-Draft and is subject to
-all provisions of Section 10 of RFC2026.
-
-Internet-Drafts are working documents of the Internet Engineering
-Task Force (IETF), its areas, and its working groups. Note that
-other groups may also distribute working documents as
-Internet-Drafts.
-
-Internet-Drafts are draft documents valid for a maximum of six
-months and may be updated, replaced, or obsoleted by other
-documents at any time. It is inappropriate to use Internet-
-Drafts as reference material or to cite them other than as
-"work in progress."
-
-The list of current Internet-Drafts can be accessed at
-http://www.ietf.org/1id-abstracts.html
-
-The list of Internet-Draft Shadow Directories can be accessed at
-http://www.ietf.org/shadow.html
-
-This document is an individual contribution to the Internet
-Engineering Task Force (IETF). Comments should be submitted to the
-srvloc@srvloc.org mailing list.
-
-Distribution of this memo is unlimited.
-
-.bp
-.HDR_1 Introduction
-
-The Service Location Protocol, Version 2 [1] allows the use of
-multicast and broadcast discovery requests. The SLP exclusion
-directive is an extension to SLP that optimizes the use of
-multicasting and broadcasting to find services on an intranet. This
-document hereafter refers to multicast discovery but all its contents
-apply to broadcast discovery as well.
-
-.HDR_2 "Present SLPv2 Multicast Behavior"
-
-Multicast discovery requests allow an SLP User Agent to discover
-services with no prior configuration. Multicast discovery requests are
-not sent reliably and must be retransmitted in order to find all
-services of the desired type on the network.
-
-When SLP v2 SrvRqst, SrvTypeRqst, and AttrRqst messages are multicast,
-they contain a <PRList> of previous respondents. Initially the
-<PRList> is empty. When these requests are unicast, the <PRList> is
-always empty.
-
-Any DA or SA which sees its address in the <PRList> does not respond
-to the request (as specified in RFC 2608).
-
-The User Agent then retransmits the discovery request until the
-<PRList> causes no further responses to be elicited or the previous
-responder list and the request will not fit into a single datagram or
-until CONFIG_MC_MAX seconds elapse[1].
-
-The PR list is an effective mechanism for suppressing duplicate
-responses in smaller environments. However, because of the way PR
-lists are encoded with the SLP v2 header, the PR List has a limit of
-as few as 90 IPv4 addressees, and even fewer IPv6 addresses. This
-means in most environments a User Agent may suppress duplicate
-responses from approximately 90 host addresses at best.
-
-.HDR_2 Optimizations\ Made\ by\ Exclusion\ Directive
-
-The Exclusion Directive extension presented in this document allows a
-User Agent (UA) to direct those Directory Agents (DAs) and Service
-Agents (SAs) from which it has already received responses not to
-respond to retransmissions of a particular query. Hence subsequent
-retransmissions only generate responses from agents from which the
-requester has not already received a response.
-
-This extension can be used in conjunction with the SLP v2 PR list.
-SAs and DAs which do not understand the Exclusion Directive extension
-will ignore it. With the use of the Exclusion Directive extension, SLP
-v2 User Agents may perform multicast discovery with a high degree of
-success and efficiency, even when the number of respondents reaches
-into the thousands. .
-
-.HDR_2 Terminology
-
-In this document, the key words "MAY", "MUST, "MUST NOT", "optional",
-"recommended", "SHOULD", and "SHOULD NOT", are to be interpreted as
-described in RFC 2119 [2].
-
-.bp
-.RETURN_HDR_1 Exclusion\ Extension\ Format
-
-The fields in an Exclusion extension form an Exclusion Directive that
-tells receiving agents not to respond to a specific request from a
-specific host for a specific time interval.
-
-Each Exclusion Directive is fully contained within one SLP v2
-extension block. However, a single SLP v2 request message may contain
-multiple Exclusion Directives. For example, a single Service Request
-may contain three Exclusion Directives within three distinct SLP v2
-extension blocks.
-
-.KS
-.HDR_2 Exclusion\ Extension\ Fields
-
-The Exclusion extension has the following format:
-.DS L
-
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Extension ID = 0x000? | Next Extension Offset |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Offset, contd.| size | Exclusion XID |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Nonce |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion Interval | Number of Entries |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion Entries |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | # auth blocks | authentication block (if any) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-.DE
-.KE
-.HDR_3 Size\ Field
-
-The size field specifies the size, in bytes, of each address entry. A
-size value of 4 bytes MUST be encoded as an IP v4 address in network
-byte order. A size value of 16 bytes MUST be encoded as an IP v6
-address in network byte order. Other address sizes are assumed to be
-opaque data and will not be interoperable among different
-implementations
-
-.HDR_4 Using\ the\ Size\ Field\ to\ Calculate\ Length\ of\ Entries
-
-The size of the Exclusion Entries field MUST be calculated by
-multiplying the value of the Size field by the value of the Number of
-Entries field.
-
-.RETURN_HDR_3 Exclusion\ XID
-
-The Exclusion XID identifies the SLP request to which the enclosing
-Exclusion Directive applies. An Exclusion Directive always applies to
-exactly one specific XID from exactly one host IP address.
-
-It is possible that the value of XID field in the Exclusion Directive
-and the XID in the SLP header of the message containing the Exclusion
-Directive will be different. This is a subtle but important point: the
-SLP v2 header XID and the Exclusion XID are not equivalent. See
-section 3.0 for details of how the exclusion XID works.
-
-.HDR_3 Nonce
-
-The Nonce adds a unique value to each Exclusion Directive that makes
-it difficult to mount a denial of service attack by replaying
-Exclusion Directives. The Nonce is a 128-bit field which MUST contain
-a cryptographic-quality random unique value; or alternatively must be
-filled with zero bytes. (If the Nonce is filled with zero bytes, it is
-ignored.)
-
-The usage of the Nonce is explained further in section 4.3.
-
-.HDR_3 Exclusion\ Interval
-
-The Exclusion Interval indicates the lifetime, in seconds, of the
-containing Exclusion Directive. The interval begins when the SA or DA
-receives the Exclusion Directive. Exclusion Directives SHOULD have an
-interval from one to several seconds. However, the Exclusion Interval
-may need to be increased for unusually large networks or media with
-high latency characteristics, such as satellite links.
-
-.HDR_3 Exclusion\ Entries
-
-The Exclusion Entries field is the list of host IP addresses that are
-subject to the containing Exclusion Directive. The length of the Exclusion
-Entries field is the number of IP addresses in the list multiplied by
-the size of each IP address.
-
-The size of each IP address is determined by the value of the size
-field. Each Exclusion Directive therefore may only contain IPv4
-addresses or IPv6 addresses, but not both.
-
-.HDR_4 Dual-stack\ IP\ Environments
-
-In environments using both IPv4 and IPv6 addresses it may be necessary
-to deliver two Exclusion Directives where otherwise one would be
-sufficient. E.g., one Directive containing IPv4 addresses and another
-Directive containing IPv6 addresses. One way to accomplish this is to
-pack two separate Exclusion Directives into a single SLP
-request. Another way involves using dummy request messages to deliver
-Exclusion Directives. Dummy request messages are covered in section
-3.1 below.
-
-.RETURN_HDR_3 Authentication\ Blocks
-
-The Number of Auth Blocks indicates how many authentication blocks
-are contained in the containing Exclusion Directive. The format of the
-authentication block is covered in section 4 below.
-
-.KS
-.RETURN_HDR_2 Exclusion\ Directive\ Functionality
-
-The purpose of the Exclusion Directive is to cause SAs or DAs to
-silently discard specific SLP requests that originate from specific IP
-addresses. This purpose aids in the use of multicasting to discover
-services in large network environments. The Exclusion Directive makes
-multicast discovery more reliable and efficient by:
-
-.nr PI 5
-.nr step 1 1
-.RS
-.IP \n[step]. 3
-Providing a more compact mechanism to silence previous responders.
-.IP \n+[step].
-Magnifying the effect of the silencing mechanism by specifying a quiet interval.
-.RE
-.KE
-
-.HDR_3 Exclusion\ Directive\ State\ Table\ (EDST)
-
-When the Exclusion Directive is present in an SLP request, the
-receiving agent uses the directive to create and maintain state
-information that causes the receiving agent to ignore and discard
-matching requests (possibly including the request containing the
-Exclusion Directive).
-
-The Exclusion Directive State Table (EDST) is the collection of
-information describing all current Exclusion Directives received by
-the agent. EDST entries are a record with five fields: Source Address,
-Source Port, exclusion XID , exclusion nonce value, and expiration
-time. (The nonce value MAY be zero filled.)
-
-The Exclusion Directive only applies to SLP v2 messages that have the
-multicast flag set. The SA or DA MUST respond to SLP v2 messages that
-do not have the multicast flag set as specified in [1].
-
-If the incoming request message matches a current record in the
-receiving agent's EDST, and if the incoming request's Multicast flag
-is set in the SLP header, the DA or SA MUST silently discard the
-message.
-
-When the Exclusion Interval of an Exclusion Directive has expired, the
-SA or DA MUST delete the corresponding record in its EDST and resume
-processing SLP v2 multicast request as if that Exclusion Directive
-was never received.
-
-If an incoming request does not contain an Exclusion Directive, the
-receiving agent MUST process that request without regard to the local
-EDST. (In other words, process the request normally.)
-
-
-.RETURN_HDR_1 Exclusion\ Directives\ in\ SLP\ v2\ Request\ Messages
-
-An SA or DA may encounter the Exclusion Directive in Service Request,
-Attribute Request, and Service Type Request messages. In each case,
-the request may also contain a PR list as described in [1].
-
-A UA MUST NOT include an Exclusion Directive in a unicast SLP v2
-request message. DAs and SAs MUST ignore Exclusion Directives that
-are erroneously included in unicast request messages.
-
-.KS
-If the SA or DA supports the Exclusion Directive, it MUST perform the
-following steps when processing an SLP v2 Request message.
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-If the request message is unicast or if the receiving agent does not
-recognize the Exclusion Directive, go to step 6 below.
-.IP \n+[step].
-If the incoming request does not have an Exclusion Directive,
-proceed to step 6.
-.IP \n+[step].
-Extract the Exclusion Directive from the request. Search the
-Directive's Exclusion Entries list for the receiving agent's IP
-address. If not found, proceed to step 6.
-.IP \n+[step].
-Extract the source address and port from the UDP header and the
-Exclusion XID and nonce from the Exclusion Directive. The receiving
-agent MUST ensure that its EDST contains a record for this directive,
-creating a new EDST record if necessary. (This step is also a
-convenient time to delete expired entries from the EDST.)
-.IP \n+[step].
-Extract the source address and port from the incoming request's UDP
-header. Extract the XID from the request's SLP v2 header. If the
-incoming request has an Exclusion Directive, extract the nonce from
-the directive.
-
-Search the EDST for an entry containing matching values for these data
-(Optionally ignoring the nonce from the EDST entry if the incoming
-request does not contain an exclusion directive). Upon finding a
-matching EDST entry, silently discard the request. Otherwise continue.
-.IP \n+[step].
-If the SA or DA has not discarded the request up to this point,
-evaluate the request normally as outlined in [1].
-.RE
-.KE
-.in 3
-
-It is worth repeating that the Exclusion Directive only applies to
-SLP v2 request messages that have the R (Request Multicast) flag
-turned on in the SLP v2 header. Agents MUST NOT silently discard
-unicast request messages regardless of exclusion directives or EDST
-entries.
-
-Note that additional steps may be necessary if the Exclusion
-directive contains one or more authentication blocks. These
-steps are outlined in section 4.
-
-.KS
-.HDR_2 Dummy\ Service\ Request\ Message\ with\ Exclusion\ Directive
-
-A "dummy" request message is one that has zero-length fields
-for the entire request body, exclusive of the SLP v2 header and the
-Exclusion directive.
-
-Using a dummy SLP request message for the sole purpose of transporting
-an Exclusion Directive may be helpful in two cases:
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-The Exclusion Directive is too large to fit within a single request
-datagram alongside the SLP header, service type, predicate, and other request
-data. However, it will fit in a datagram with just itself and the SLP
-header.
-.IP \n+[step].
-The Exclusion Directive is larger than the sum of the network MTU
-and the SLP Header. The agent can divide the Exclusion Entries list
-across two or more Exclusion Directives and transport those Directives
-within a corresponding number of dummy SLP request messages.
-
-This method can support Exclusion Entry lists that contain thousands
-of addresses.
-.RE
-.in 3
-.sp 1
-When an SA or DA receives a dummy SLP request that contains an
-Exclusion Directive, the receiving agent MUST extract the Exclusion
-Directive from the dummy request and ensure that the local EDST
-contains a record corresponding to the Exclusion Directive. This is
-described in section 3, step 4 above.
-
-
-A Dummy request message MUST have the R (Request Multicast) flag
-turned on in the SLP v2 header. This causes SLP v2 SAs and DAs that
-are unaware of the Exclusion Directive to silently discard dummy
-request messages due to a parsing error (instead of responding to the
-sending agent with an error code).
-.KE
-.KS
-
-.HDR_3 Format\ of\ Dummy\ Service\ Request
-.DS L
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location Header (R flag on) (function = SrvRqst = 1) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <PRList> = 0 | length of <service-type> = 0 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <scope-list> = 0 | length of <predicate> = 0 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <SLP SPI > = 0 | Extension ID = Exclusion |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Next Extension Offset | size |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion XID | Nonce |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Nonce, cont'd. | Exclusion Interval |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Number of Entries | Exclusion Entries \\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- \\ # auth blocks | authentication block (if any)\\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-.DE
-.KE
-.HDR_3 Processing\ the\ Dummy\ Service\ Request
-
-Dummy Service Request messages MUST be processed as outlined in
-section 3 above. The result is that the receiving agents which support
-the Exclusion Directive will process the Directive, while all other
-agents will silently discard the message due to a parsing error.
-
-After processing the Exclusion Directive, the receiving agent will
-produce a parse error. Because the service request has the multicast
-flag set, the receiving agent will not send an error response to the
-originating agent.
-
-Note that if the Exclusion Directive contains an authentication
-block, the SA or DA SHOULD validate the signature of the Exclusion
-Directive. Authentication of Exclusion Directives is covered in
-section 4.
-
-.KS
-.HDR_3 Using\ the\ Exclusion\ Directive\ and\ PR\ List\ Together
-
-The steps below show how to use the
-Exclusion Directive in combination with the SLP PR list to perform
-multicast discovery (substitute actual XIDs in real usage):
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-Send a new Service Request with no PR list and no Exclusion Directive;
-process the replies and remember the respondents as RL1.
-.IP \n+[step].
-Build an exclusion list and remember it as list EL1.
-.IP \n+[step].
-Immediately re-transmit the Service Request from (1) with no PR list
-and but with an Exclusion Directive that contains Exclusion List EL1;
-process the replies and remember the respondents as RL2.
-.IP \n+[step].
-The intersection of EL1 and RL2 are agents that do not support the
-Exclusion Directive. Create PRL1 = EL1 n RL2. Build EL2 = RL2 - PRL1.
-.IP \n+[step].
-Immediately re-transmit the Service Request from (3) including PRL1 in
-the SLP header and substituting EL2 for EL1 in the Exclusion
-Directive. If no responses the discovery cycle is complete.
-.IP \n+[step].
-Repeat the previous thre steps n times using ELn-1, RLn, PRLn-1, and ELn until the
-UA receives no responses for the configured timeout period.
-.RE
-.in 3
-.sp 1
-In steps 1 - 6 above, it is important that each Service Request (steps
-1, 3, and 5) have the same XID in the SLP Header ; and equally that
-each Exclusion Directive also has the same value in the XID field.
-.KE
-.KS
-
-.RETURN_HDR_1 Authenticating\ Exclusion\ Directives
-
-To prevent denial of service attacks against UAs, all agents that
-recognize the Exclusion Directive SHOULD support authentication of
-the Exclusion Directive.
-
-Authenticating Exclusion Directives places the additional burden upon
-the User Agent of signing data. In standard SLP v2, UAs only need to
-verify signatures. The additional ability to generate signatures
-means that UAs must be issued private key material.
-
-.HDR_2 The\ Exclusion\ Directive\ Authentication\ Block
-
-The format of the Exclusion Directive Authentication Block is the same
-as that used by SLP v2 [1].
-
-.DS L
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Block Structure Descriptor | Authentication Block Length |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Timestamp |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | SLP SPI String Length | SLP SPI String \\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- \\ Structured Authentication Block... \\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-.DE
-.KE
-.KS
-.HDR_2 Exclusion\ Directive\ Authentication\ Rules
-
-To sign or verify the signature of an Exclusion Directive, the SLP
-agent MUST use the following components of the Exclusion Directive as
-if they were a single continuous byte-aligned buffer:
-.nr PI 5
-.RS
-.IP \[bu] 3
-16-bit Exclusion XID
-.IP \[bu]
-32-bit Nonce
-.IP \[bu]
-16-bit Exclusion Interval
-.IP \[bu]
-8-bit Exclusion Entry size
-.IP \[bu]
-16-bit Number of Entries
-.IP \[bu]
-Variable-length Exclusion Entries.
-.RE
-.KE
-
-.RETURN_HDR_1 Using\ the\ NONCE\ Value\ to\ Prevent\ Replay\ Attacks
-
-Despite the use of signatures to authenticate Exclusion Directives,
-UAs may still be vulnerable to a replay denial of service attack. To
-prevent this possibility, SLP Agents that recognize the Exclusion
-directive SHOULD make use of the nonce value as described in this
-section.
-
-Every Exclusion Directive contains a 128-bit nonce field, which MUST
-contain a 128-bit cryptographicly random value or be filled with
-zeros. If the nonce is filled with zeroes, the UA is open to a
-denial-of service attack.
-
-Because the nonce field is included in signature generation and
-validation, each signed Exclusion Directive can be cryptographically
-unique. Unsigned Exclusion Directives can also be cryptographically
-unique but their source can be spoofed.
-
-.KS
-By using the nonce correctly, Exclusion Directives can be specific
-to:
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-The source address and port of the requesting UA.
-.IP \n+[step].
-The XID of the request.
-.IP \n+[step].
-A cryptographically unique value for each and every request. To make
-this work, SAs and DAs MUST include the nonce value, along with the UA
-source address and the request XID when deciding whether or not an
-Exclusion Directive applies to a request message.
-.RE
-.KE
-
-.HDR_2 UA\ Use\ of\ the\ Nonce\ to\ Prevent\ Denial\ of\ Service\ Attack
-
-The UA is the SLP component vulnerable to a denial of service attack
-so it is responsible for using an appropriate algorithm to generate a
-nonce with the requisite random characteristics.
-
-.KS
-For each Exclusion Directive:
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-Generate a random 128-bit integer to use as the nonce.
-.IP \n+[step].
-Initialize an Exclusion Directive, including the XID of the
-request that is subject to response suppression.
-.IP \n+[step].
-Insert the nonce value from (1) into the Exclusion Directive.
-.IP \n+[step].
-Optionally sign the Exclusion Directive as outlined in the section on
-Authentication above.
-.IP \n+[step].
-Use a Exclusion Directive containing the nonce in all
-requests and dummy Service Requests for the XID in step (2).
-.IP \n+[step].
-IMPORTANT - use a DIFFERENT, cryptographically generated nonce
-for each request XID for which you are issuing an Exclusion
-directive.
-.RE
-.KE
-.KS
-.HDR_2 DA\ and\ SA\ Use\ of\ the\ Nonce
-
-SA's DAs that recognize the Exclusion Directive MUST use the nonce
-value to initialize EDST entries and to evaluate Exclusion Directives
-in request messages.
-
-.HDR_3 Zero-filled\ Nonce
-
-UAs that don't have the ability to generate unique
-nonce values MUST fill the nonce field of the Exclusion Directive
-with zeros. This opens the agent up to a denial of service attack,
-however. (See below).
-
-.RETURN_HDR_2 Theory\ Behind\ the\ Nonce
-The nonce is a simple mechanism to make it as difficult as possible
-for an attacker to predict the composition of SLP service
-requests that a particular UA may issue in the near future.
-
-Most UA's use the XID field in the SLP 2 header as a sequential
-counter. Hence an attacker that has a copy of a recent SLP request can
-guess the XID of the next request the agent will make. Using the
-Exclusion Directive, an attacker can cause DA's and SA's not to
-respond to subsequent SLP requests made by the attacked agent.
-
-However, the inclusion of the nonce value in the Exclusion Directive
-makes it infeasible for an attacker to guess the composition of future
-requests made by the UA. This is true because the nonce, unlike the
-XID, is a random value. Also, the nonce is large enough to make
-guessing its value in the next request too difficult for the attacker.
-.KE
-.RETURN_HDR_1 Security\ Considerations
-
-Implementing the Exclusion Directive without using the nonce value
-opens SLP v2 UAs up to a trivial denial of service attack, which would
-nullify the ability of the UA to perform discovery.
-
-Implementing the Exclusion Directive with authentication but without
-using the nonce value may leave the UA open to a more sophisticated
-replay attack using previously signed and multicast request messages.
-
-UAs that support the Exclusion Directive SHOULD authenticate their
-requests as outlined in section 4 and SHOULD include the nonce value
-in all Exclusion Directives.
-
-SAs and DAs that support the Exclusion Directive SHOULD be able to
-verify signed Exclusion Directives and MUST store the nonce value in
-the EDST entry for that directive.
-
-Nonce values generated by UAs MUST be cryptographically unique and
-random values if they are to provide any safeguard against a replay
-attack.
-
-.HDR_1 Acknowledgements
-
-Erik Guttman has provided a great deal of feedback and improvements
-to this document. The srvloc working group also contributed to the
-development of this document, especialy Kevin Arnold, James Kempf,
-Ira McDonald, Evan Hughes, Terry Lambert, and others. Thomas Narten
-recommended some important changes during the review process.
-.KS
-.HDR_1 References
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-Guttman, E., Perkins, C., Veizades, J., and M. Day, "Service
-Location Protocol Version 2", RFC 2608, June 1999.
-.IP \n+[step].
-Bradner, S,. "Key Words for Use in RFCs to Indicate Requirements
-Levels", BCP 14, RFC 2119, March 1997
-.RE
-.KE
-.KS
-.HDR_1 Author's\ Contact\ Information
-
-Michael Day
-IBM
-3039 Cornwallis Road
-Research Triangle Park, NC 27709
-
-Phone: 919 543-4283
-
-Email: mdday@us.ibm.com
-.KE
-.KS
-.HDR_1 Full\ Copyright\ Statement
-
-Copyright (C) The Internet Society (2000-2002). All Rights Reserved.
-
-This document and translations of it may be copied and furnished to
-others, and derivative works that comment on or otherwise explain it
-or assist in its implementation may be prepared, copied, published and
-distributed, in whole or in part, without restriction of any kind,
-provided that the above copyright notice and this paragraph are
-included on all such copies and derivative works. However, this
-document itself may not be modified in any way, such as by removing
-the copyright notice or references to the Internet Society or other
-Internet organizations, except as needed for the purpose of developing
-Internet standards in which case the procedures for copyrights defined
-in the Internet Standards process must be followed, or as required to
-translate it into languages other than English.
-
-The limited permissions granted above are perpetual and will not be
-revoked by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an
-"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
-TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
-NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN
-WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE."
-.KE
-
-.TC
+++ /dev/null
-
-
-
-
-
-
-Internet Engineering Task Force Michael Day
-INTERNET DRAFT IBM
-23 December 2002 Expires in six months
-
- Exclusion Extension for Service Location Protocol v2
- draft-day-srvloc-exclusion-02.txt
-
-
-
-
-
-
-Status of This Memo
- This document is an Internet-Draft and is subject to all provisions
- of Section 10 of RFC2026.
-
- Internet-Drafts are working documents of the Internet Engineering
- Task Force (IETF), its areas, and its working groups. Note that
- other groups may also distribute working documents as Internet-
- Drafts.
-
- Internet-Drafts are draft documents valid for a maximum of six months
- and may be updated, replaced, or obsoleted by other documents at any
- time. It is inappropriate to use Internet- Drafts as reference
- material or to cite them other than as "work in progress."
-
- The list of current Internet-Drafts can be accessed at
- http://www.ietf.org/1id-abstracts.html
-
- The list of Internet-Draft Shadow Directories can be accessed at
- http://www.ietf.org/shadow.html
-
- This document is an individual contribution to the Internet
- Engineering Task Force (IETF). Comments should be submitted to the
- srvloc@srvloc.org mailing list.
-
- Distribution of this memo is unlimited.
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page i]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
- Table of Contents
-
-
-1 Introduction . . . . . . . . . . . . . . . . . . . . 2
-1.1 Present SLPv2 Multicast Behavior . . . . . . . . . . 2
-1.2 Optimizations Made by Exclusion Directive . . . . . 2
-1.3 Terminology . . . . . . . . . . . . . . . . . . . . 3
-2 Exclusion Extension Format . . . . . . . . . . . . . 4
-2.1 Exclusion Extension Fields . . . . . . . . . . . . . 4
-2.1.1 Size Field . . . . . . . . . . . . . . . . . . . . 4
-2.1.1.1 Using the Size Field to Calcu-
-late Length of Entries . . . . . . . . . . . . . . . . . 5
-2.1.2 Exclusion XID . . . . . . . . . . . . . . . . . . 5
-2.1.3 Nonce . . . . . . . . . . . . . . . . . . . . . . 5
-2.1.4 Exclusion Interval . . . . . . . . . . . . . . . . 5
-2.1.5 Exclusion Entries . . . . . . . . . . . . . . . . 6
-2.1.5.1 Dual-stack IP Environments . . . . . . . . . . . 6
-2.1.6 Authentication Blocks . . . . . . . . . . . . . . 6
-2.2 Exclusion Directive Functionality . . . . . . . . . 6
-2.2.1 Exclusion Directive State Table (EDST) . . . . . . 7
-3 Exclusion Directives in SLP v2 Request Messages . . . 8
-3.1 Dummy Service Request Message with Exclu-
-sion Directive . . . . . . . . . . . . . . . . . . . . . 10
-3.1.1 Format of Dummy Service Request . . . . . . . . . 11
-3.1.2 Processing the Dummy Service Request . . . . . . . 11
-3.1.3 Using the Exclusion Direc-
-tive and PR List Together . . . . . . . . . . . . . . . 12
-4 Authenticating Exclusion Directives . . . . . . . . . 13
-4.1 The Exclusion Directive Authentication Block . . . . 13
-4.2 Exclusion Directive Authentication Rules . . . . . . 14
-5 Using the NONCE Value to Prevent Replay Attacks
- . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
-5.1 UA Use of the Nonce to Prevent Denial of Ser-
-vice Attack . . . . . . . . . . . . . . . . . . . . . . 16
-5.2 DA and SA Use of the Nonce . . . . . . . . . . . . . 16
-5.2.1 Zero-filled Nonce . . . . . . . . . . . . . . . . 16
-5.3 Theory Behind the Nonce . . . . . . . . . . . . . . 16
-6 Security Considerations . . . . . . . . . . . . . . . 16
-7 Acknowledgements . . . . . . . . . . . . . . . . . . 17
-8 References . . . . . . . . . . . . . . . . . . . . . 17
-9 Author's Contact Information . . . . . . . . . . . . 17
-10 Full Copyright Statement . . . . . . . . . . . . . . 18
-
-
-
-
-
-
-
-Day [Page 1]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
-1 Introduction
-
- The Service Location Protocol, Version 2 [1] allows the use of
- multicast and broadcast discovery requests. The SLP exclusion
- directive is an extension to SLP that optimizes the use of
- multicasting and broadcasting to find services on an intranet. This
- document hereafter refers to multicast discovery but all its contents
- apply to broadcast discovery as well.
-
-
-1.1 Present SLPv2 Multicast Behavior
-
- Multicast discovery requests allow an SLP User Agent to discover
- services with no prior configuration. Multicast discovery requests
- are not sent reliably and must be retransmitted in order to find all
- services of the desired type on the network.
-
- When SLP v2 SrvRqst, SrvTypeRqst, and AttrRqst messages are
- multicast, they contain a <PRList> of previous respondents. Initially
- the <PRList> is empty. When these requests are unicast, the <PRList>
- is always empty.
-
- Any DA or SA which sees its address in the <PRList> does not respond
- to the request (as specified in RFC 2608).
-
- The User Agent then retransmits the discovery request until the
- <PRList> causes no further responses to be elicited or the previous
- responder list and the request will not fit into a single datagram or
- until CONFIG_MC_MAX seconds elapse[1].
-
- The PR list is an effective mechanism for suppressing duplicate
- responses in smaller environments. However, because of the way PR
- lists are encoded with the SLP v2 header, the PR List has a limit of
- as few as 90 IPv4 addressees, and even fewer IPv6 addresses. This
- means in most environments a User Agent may suppress duplicate
- responses from approximately 90 host addresses at best.
-
-
-1.2 Optimizations Made by Exclusion Directive
-
- The Exclusion Directive extension presented in this document allows a
- User Agent (UA) to direct those Directory Agents (DAs) and Service
- Agents (SAs) from which it has already received responses not to
- respond to retransmissions of a particular query. Hence subsequent
- retransmissions only generate responses from agents from which the
- requester has not already received a response.
-
-
-
-Day [Page 2]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
- This extension can be used in conjunction with the SLP v2 PR list.
- SAs and DAs which do not understand the Exclusion Directive extension
- will ignore it. With the use of the Exclusion Directive extension,
- SLP v2 User Agents may perform multicast discovery with a high degree
- of success and efficiency, even when the number of respondents
- reaches into the thousands. .
-
-
-1.3 Terminology
-
- In this document, the key words "MAY", "MUST, "MUST NOT", "optional",
- "recommended", "SHOULD", and "SHOULD NOT", are to be interpreted as
- described in RFC 2119 [2].
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 3]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
-2 Exclusion Extension Format
-
- The fields in an Exclusion extension form an Exclusion Directive that
- tells receiving agents not to respond to a specific request from a
- specific host for a specific time interval.
-
- Each Exclusion Directive is fully contained within one SLP
- v2 extension block. However, a single SLP v2 request message may
- contain multiple Exclusion Directives. For example, a single Service
- Request may contain three Exclusion Directives within three
- distinct SLP v2 extension blocks.
-
-
-2.1 Exclusion Extension Fields
-
- The Exclusion extension has the following format:
-
-
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Extension ID = 0x000? | Next Extension Offset |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Offset, contd.| size | Exclusion XID |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Nonce |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion Interval | Number of Entries |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion Entries |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | # auth blocks | authentication block (if any) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-
-
-2.1.1 Size Field
-
- The size field specifies the size, in bytes, of each
- address entry. A size value of 4 bytes MUST be encoded as
- an IP v4 address in network byte order. A size value of
- 16 bytes MUST be encoded as an IP v6 address in network
- byte order. Other address sizes are assumed to be opaque
- data and will not be interoperable among different imple-
- mentations
-
-
-
-Day [Page 4]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
-2.1.1.1 Using the Size Field to Calculate Length of Entries
-
- The size of the Exclusion Entries field MUST be calcu-
- lated by multiplying the value of the Size field by the
- value of the Number of Entries field.
-
-
-2.1.2 Exclusion XID
-
- The Exclusion XID identifies the SLP request to which the
- enclosing Exclusion Directive applies. An Exclusion
- Directive always applies to exactly one specific XID from
- exactly one host IP address.
-
- It is possible that the value of XID field in the Exclu-
- sion Directive and the XID in the SLP header of the mes-
- sage containing the Exclusion Directive will be differ-
- ent. This is a subtle but important point: the SLP v2
- header XID and the Exclusion XID are not equivalent. See
- section 3.0 for details of how the exclusion XID works.
-
-
-2.1.3 Nonce
-
- The Nonce adds a unique value to each Exclusion Directive
- that makes it difficult to mount a denial of service
- attack by replaying Exclusion Directives. The Nonce is a
- 128-bit field which MUST contain a cryptographic-quality
- random unique value; or alternatively must be filled with
- zero bytes. (If the Nonce is filled with zero bytes, it
- is ignored.)
-
- The usage of the Nonce is explained further in section
- 4.3.
-
-
-2.1.4 Exclusion Interval
-
- The Exclusion Interval indicates the lifetime, in sec-
- onds, of the containing Exclusion Directive. The interval
- begins when the SA or DA receives the Exclusion Direc-
- tive. Exclusion Directives SHOULD have an interval from
- one to several seconds. However, the Exclusion Interval
- may need to be increased for unusually large networks or
- media with high latency characteristics, such as satel-
- lite links.
-
-
-
-Day [Page 5]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
-2.1.5 Exclusion Entries
-
- The Exclusion Entries field is the list of host IP
- addresses that are subject to the containing Exclusion
- Directive. The length of the Exclusion Entries field is
- the number of IP addresses in the list multiplied by the
- size of each IP address.
-
- The size of each IP address is determined by the value of
- the size field. Each Exclusion Directive therefore may
- only contain IPv4 addresses or IPv6 addresses, but not
- both.
-
-
-2.1.5.1 Dual-stack IP Environments
-
- In environments using both IPv4 and IPv6 addresses it may
- be necessary to deliver two Exclusion Directives where
- otherwise one would be sufficient. E.g., one Directive
- containing IPv4 addresses and another Directive contain-
- ing IPv6 addresses. One way to accomplish this is to pack
- two separate Exclusion Directives into a single SLP
- request. Another way involves using dummy request mes-
- sages to deliver Exclusion Directives. Dummy request mes-
- sages are covered in section 3.1 below.
-
-
-2.1.6 Authentication Blocks
-
- The Number of Auth Blocks indicates how many authentica-
- tion blocks are contained in the containing Exclusion
- Directive. The format of the authentication block is cov-
- ered in section 4 below.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 6]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
-2.2 Exclusion Directive Functionality
-
- The purpose of the Exclusion Directive is to cause SAs or
- DAs to silently discard specific SLP requests that origi-
- nate from specific IP addresses. This purpose aids in the
- use of multicasting to discover services in large network
- environments. The Exclusion Directive makes multicast
- discovery more reliable and efficient by:
-
-
- 1. Providing a more compact mechanism to silence previ-
- ous responders.
-
- 2. Magnifying the effect of the silencing mechanism by
- specifying a quiet interval.
-
-
-2.2.1 Exclusion Directive State Table (EDST)
-
- When the Exclusion Directive is present in an SLP
- request, the receiving agent uses the directive to create
- and maintain state information that causes the receiving
- agent to ignore and discard matching requests (possibly
- including the request containing the Exclusion Direc-
- tive).
-
- The Exclusion Directive State Table (EDST) is the collec-
- tion of information describing all current Exclusion
- Directives received by the agent. EDST entries are a
- record with five fields: Source Address, Source Port,
- exclusion XID , exclusion nonce value, and expiration
- time. (The nonce value MAY be zero filled.)
-
- The Exclusion Directive only applies to SLP v2 messages
- that have the multicast flag set. The SA or DA MUST
- respond to SLP v2 messages that do not have the multicast
- flag set as specified in [1].
-
- If the incoming request message matches a current record
- in the receiving agent's EDST, and if the incoming
- request's Multicast flag is set in the SLP header, the DA
- or SA MUST silently discard the message.
-
- When the Exclusion Interval of an Exclusion Directive has
- expired, the SA or DA MUST delete the corresponding
- record in its EDST and resume processing SLP v2 multicast
-
-
-
-Day [Page 7]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
- request as if that Exclusion Directive was never
- received.
-
- If an incoming request does not contain an Exclusion
- Directive, the receiving agent MUST process that request
- without regard to the local EDST. (In other words, pro-
- cess the request normally.)
-
-
-
-3 Exclusion Directives in SLP v2 Request Messages
-
- An SA or DA may encounter the Exclusion Directive in Ser-
- vice Request, Attribute Request, and Service Type Request
- messages. In each case, the request may also contain a PR
- list as described in [1].
-
- A UA MUST NOT include an Exclusion Directive in a unicast
- SLP v2 request message. DAs and SAs MUST ignore Exclusion
- Directives that are erroneously included in unicast
- request messages.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 8]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
- If the SA or DA supports the Exclusion Directive, it MUST
- perform the following steps when processing an SLP v2
- Request message.
-
- 1. If the request message is unicast or if the receiv-
- ing agent does not recognize the Exclusion Direc-
- tive, go to step 6 below.
-
- 2. If the incoming request does not have an Exclusion
- Directive, proceed to step 6.
-
- 3. Extract the Exclusion Directive from the request.
- Search the Directive's Exclusion Entries list for
- the receiving agent's IP address. If not found, pro-
- ceed to step 6.
-
- 4. Extract the source address and port from the UDP
- header and the Exclusion XID and nonce from the
- Exclusion Directive. The receiving agent MUST ensure
- that its EDST contains a record for this directive,
- creating a new EDST record if necessary. (This step
- is also a convenient time to delete expired entries
- from the EDST.)
-
- 5. Extract the source address and port from the incom-
- ing request's UDP header. Extract the XID from the
- request's SLP v2 header. If the incoming request has
- an Exclusion Directive, extract the nonce from the
- directive.
-
- Search the EDST for an entry containing matching
- values for these data (Optionally ignoring the nonce
- from the EDST entry if the incoming request does not
- contain an exclusion directive). Upon finding a
- matching EDST entry, silently discard the request.
- Otherwise continue.
-
- 6. If the SA or DA has not discarded the request up to
- this point, evaluate the request normally as out-
- lined in [1].
-
- It is worth repeating that the Exclusion Directive only
- applies to SLP v2 request messages that have the R
- (Request Multicast) flag turned on in the SLP v2 header.
- Agents MUST NOT silently discard unicast request messages
- regardless of exclusion directives or EDST entries.
-
-
-
-Day [Page 9]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
- Note that additional steps may be necessary if the Exclu-
- sion directive contains one or more authentication
- blocks. These steps are outlined in section 4.
-
-
-3.1 Dummy Service Request Message with Exclusion Directive
-
- A "dummy" request message is one that has zero-length
- fields for the entire request body, exclusive of the SLP
- v2 header and the Exclusion directive.
-
- Using a dummy SLP request message for the sole purpose of
- transporting an Exclusion Directive may be helpful in two
- cases:
-
- 1. The Exclusion Directive is too large to fit within a
- single request datagram alongside the SLP header,
- service type, predicate, and other request data.
- However, it will fit in a datagram with just itself
- and the SLP header.
-
- 2. The Exclusion Directive is larger than the sum of
- the network MTU and the SLP Header. The agent can
- divide the Exclusion Entries list across two or more
- Exclusion Directives and transport those Directives
- within a corresponding number of dummy SLP request
- messages.
-
- This method can support Exclusion Entry lists that
- contain thousands of addresses.
-
- When an SA or DA receives a dummy SLP request that con-
- tains an Exclusion Directive, the receiving agent MUST
- extract the Exclusion Directive from the dummy request
- and ensure that the local EDST contains a record corre-
- sponding to the Exclusion Directive. This is described in
- section 3, step 4 above.
-
-
- A Dummy request message MUST have the R (Request Multi-
- cast) flag turned on in the SLP v2 header. This causes
- SLP v2 SAs and DAs that are unaware of the Exclusion
- Directive to silently discard dummy request messages due
- to a parsing error (instead of responding to the sending
- agent with an error code).
-
-
-
-
-Day [Page 10]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
-3.1.1 Format of Dummy Service Request
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location Header (R flag on) (function = SrvRqst = 1) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <PRList> = 0 | length of <service-type> = 0 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <scope-list> = 0 | length of <predicate> = 0 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <SLP SPI > = 0 | Extension ID = Exclusion |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Next Extension Offset | size |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion XID | Nonce |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Nonce, cont'd. | Exclusion Interval |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Number of Entries | Exclusion Entries \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- \ # auth blocks | authentication block (if any)\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-
-3.1.2 Processing the Dummy Service Request
-
- Dummy Service Request messages MUST be processed as out-
- lined in section 3 above. The result is that the receiv-
- ing agents which support the Exclusion Directive will
- process the Directive, while all other agents will
- silently discard the message due to a parsing error.
-
- After processing the Exclusion Directive, the receiving
- agent will produce a parse error. Because the service
- request has the multicast flag set, the receiving agent
- will not send an error response to the originating agent.
-
- Note that if the Exclusion Directive contains an authen-
- tication block, the SA or DA SHOULD validate the signa-
- ture of the Exclusion Directive. Authentication of Exclu-
- sion Directives is covered in section 4.
-
-
-
-
-
-
-
-Day [Page 11]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
-3.1.3 Using the Exclusion Directive and PR List Together
-
- The steps below show how to use the Exclusion Directive
- in combination with the SLP PR list to perform multicast
- discovery (substitute actual XIDs in real usage):
-
- 1. Send a new Service Request with no PR list and no
- Exclusion Directive; process the replies and remem-
- ber the respondents as RL1.
-
- 2. Build an exclusion list and remember it as list EL1.
-
- 3. Immediately re-transmit the Service Request from (1)
- with no PR list and but with an Exclusion Directive
- that contains Exclusion List EL1; process the
- replies and remember the respondents as RL2.
-
- 4. The intersection of EL1 and RL2 are agents that do
- not support the Exclusion Directive. Create PRL1 =
- EL1 n RL2. Build EL2 = RL2 - PRL1.
-
- 5. Immediately re-transmit the Service Request from (3)
- including PRL1 in the SLP header and substituting
- EL2 for EL1 in the Exclusion Directive. If no
- responses the discovery cycle is complete.
-
- 6. Repeat the previous thre steps n times using ELn-1,
- RLn, PRLn-1, and ELn until the UA receives no
- responses for the configured timeout period.
-
- In steps 1 - 6 above, it is important that each Service
- Request (steps 1, 3, and 5) have the same XID in the SLP
- Header ; and equally that each Exclusion Directive also
- has the same value in the XID field.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 12]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
-4 Authenticating Exclusion Directives
-
- To prevent denial of service attacks against UAs, all
- agents that recognize the Exclusion Directive SHOULD sup-
- port authentication of the Exclusion Directive.
-
- Authenticating Exclusion Directives places the additional
- burden upon the User Agent of signing data. In standard
- SLP v2, UAs only need to verify signatures. The addi-
- tional ability to generate signatures means that UAs must
- be issued private key material.
-
-
-4.1 The Exclusion Directive Authentication Block
-
- The format of the Exclusion Directive Authentication
- Block is the same as that used by SLP v2 [1].
-
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Block Structure Descriptor | Authentication Block Length |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Timestamp |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | SLP SPI String Length | SLP SPI String \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- \ Structured Authentication Block... \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 13]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
-4.2 Exclusion Directive Authentication Rules
-
- To sign or verify the signature of an Exclusion Direc-
- tive, the SLP agent MUST use the following components of
- the Exclusion Directive as if they were a single continu-
- ous byte-aligned buffer:
-
- · 16-bit Exclusion XID
-
- · 32-bit Nonce
-
- · 16-bit Exclusion Interval
-
- · 8-bit Exclusion Entry size
-
- · 16-bit Number of Entries
-
- · Variable-length Exclusion Entries.
-
-
-5 Using the NONCE Value to Prevent Replay Attacks
-
- Despite the use of signatures to authenticate Exclusion
- Directives, UAs may still be vulnerable to a replay
- denial of service attack. To prevent this possibility,
- SLP Agents that recognize the Exclusion directive SHOULD
- make use of the nonce value as described in this section.
-
- Every Exclusion Directive contains a 128-bit nonce field,
- which MUST contain a 128-bit cryptographicly random value
- or be filled with zeros. If the nonce is filled with
- zeroes, the UA is open to a denial-of service attack.
-
- Because the nonce field is included in signature genera-
- tion and validation, each signed Exclusion Directive can
- be cryptographically unique. Unsigned Exclusion Direc-
- tives can also be cryptographically unique but their
- source can be spoofed.
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 14]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
- By using the nonce correctly, Exclusion Directives can be
- specific to:
-
- 1. The source address and port of the requesting UA.
-
- 2. The XID of the request.
-
- 3. A cryptographically unique value for each and every
- request. To make this work, SAs and DAs MUST include
- the nonce value, along with the UA source address
- and the request XID when deciding whether or not an
- Exclusion Directive applies to a request message.
-
-
-5.1 UA Use of the Nonce to Prevent Denial of Service Attack
-
- The UA is the SLP component vulnerable to a denial of
- service attack so it is responsible for using an appro-
- priate algorithm to generate a nonce with the requisite
- random characteristics.
-
- For each Exclusion Directive:
-
- 1. Generate a random 128-bit integer to use as the
- nonce.
-
- 2. Initialize an Exclusion Directive, including the XID
- of the request that is subject to response suppres-
- sion.
-
- 3. Insert the nonce value from (1) into the Exclusion
- Directive.
-
- 4. Optionally sign the Exclusion Directive as outlined
- in the section on Authentication above.
-
- 5. Use a Exclusion Directive containing the nonce in
- all requests and dummy Service Requests for the XID
- in step (2).
-
- 6. IMPORTANT - use a DIFFERENT, cryptographically gen-
- erated nonce for each request XID for which you are
- issuing an Exclusion directive.
-
-
-
-
-
-
-Day [Page 15]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
-5.2 DA and SA Use of the Nonce
-
- SA's DAs that recognize the Exclusion Directive MUST use
- the nonce value to initialize EDST entries and to evalu-
- ate Exclusion Directives in request messages.
-
-
-5.2.1 Zero-filled Nonce
-
- UAs that don't have the ability to generate unique nonce
- values MUST fill the nonce field of the Exclusion Direc-
- tive with zeros. This opens the agent up to a denial of
- service attack, however. (See below).
-
-
-5.3 Theory Behind the Nonce
- The nonce is a simple mechanism to make it as difficult
- as possible for an attacker to predict the composition of
- SLP service requests that a particular UA may issue in
- the near future.
-
- Most UA's use the XID field in the SLP 2 header as a
- sequential counter. Hence an attacker that has a copy of
- a recent SLP request can guess the XID of the next
- request the agent will make. Using the Exclusion Direc-
- tive, an attacker can cause DA's and SA's not to respond
- to subsequent SLP requests made by the attacked agent.
-
- However, the inclusion of the nonce value in the Exclu-
- sion Directive makes it infeasible for an attacker to
- guess the composition of future requests made by the UA.
- This is true because the nonce, unlike the XID, is a ran-
- dom value. Also, the nonce is large enough to make guess-
- ing its value in the next request too difficult for the
- attacker.
-
-6 Security Considerations
-
- Implementing the Exclusion Directive without using the
- nonce value opens SLP v2 UAs up to a trivial denial of
- service attack, which would nullify the ability of the UA
- to perform discovery.
-
- Implementing the Exclusion Directive with authentication
- but without using the nonce value may leave the UA open
- to a more sophisticated replay attack using previously
-
-
-
-Day [Page 16]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
- signed and multicast request messages.
-
- UAs that support the Exclusion Directive SHOULD authenti-
- cate their requests as outlined in section 4 and SHOULD
- include the nonce value in all Exclusion Directives.
-
- SAs and DAs that support the Exclusion Directive SHOULD
- be able to verify signed Exclusion Directives and MUST
- store the nonce value in the EDST entry for that direc-
- tive.
-
- Nonce values generated by UAs MUST be cryptographically
- unique and random values if they are to provide any safe-
- guard against a replay attack.
-
-
-7 Acknowledgements
-
- Erik Guttman has provided a great deal of feedback and
- improvements to this document. The srvloc working group
- also contributed to the development of this document,
- especialy Kevin Arnold, James Kempf, Ira McDonald, Evan
- Hughes, Terry Lambert, and others. Thomas Narten recom-
- mended some important changes during the review process.
-
-8 References
-
- 1. Guttman, E., Perkins, C., Veizades, J., and M. Day,
- "Service Location Protocol Version 2", RFC 2608,
- June 1999.
-
- 2. Bradner, S,. "Key Words for Use in RFCs to Indicate
- Requirements Levels", BCP 14, RFC 2119, March 1997
-
-9 Author's Contact Information
-
- Michael Day IBM 3039 Cornwallis Road Research Triangle
- Park, NC 27709
-
- Phone: 919 543-4283
-
- Email: mdday@us.ibm.com
-
-
-
-
-
-
-
-Day [Page 17]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. May 2003
-
-
-10 Full Copyright Statement
-
- Copyright (C) The Internet Society (2000-2002). All
- Rights Reserved.
-
- This document and translations of it may be copied and
- furnished to others, and derivative works that comment on
- or otherwise explain it or assist in its implementation
- may be prepared, copied, published and distributed, in
- whole or in part, without restriction of any kind, pro-
- vided that the above copyright notice and this paragraph
- are included on all such copies and derivative works.
- However, this document itself may not be modified in any
- way, such as by removing the copyright notice or refer-
- ences to the Internet Society or other Internet organiza-
- tions, except as needed for the purpose of developing
- Internet standards in which case the procedures for copy-
- rights defined in the Internet Standards process must be
- followed, or as required to translate it into languages
- other than English.
-
- The limited permissions granted above are perpetual and
- will not be revoked by the Internet Society or its suc-
- cessors or assigns.
-
- This document and the information contained herein is
- provided on an "AS IS" basis and THE INTERNET SOCIETY AND
- THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WAR-
- RANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
- ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL
- NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MER-
- CHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE."
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 18]
-
-
+++ /dev/null
-.\"-----------------------------------------------------------------
-.\" Registers to store heading levels as variables
-.\"-----------------------------------------------------------------
-.nr head1 0 1
-.nr head2 0 1
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-
-.\"-----------------------------------------------------------------
-.\" Return to header level 1, 2, etc.
-.\" resets the level registers and indent
-.\"-----------------------------------------------------------------
-.de RETURN_HDR_1
-.nr head2 0 1
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_1 \\$1
-..
-
-.de RETURN_HDR_2
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_2 \\$1
-..
-
-.de RETURN_HDR_3
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_3 \\$1
-..
-
-.de RETURN_HDR_4
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_4 \\$1
-..
-
-.de RETURN_HDR_5
-.nr head6 0 1
-.in 0
-\.HDR_5 \\$1
-..
-
-.\"-----------------------------------------------------------------
-.\" Create a level 1, 2, etc,. heading
-.\" resets indent, creates a TOC entry
-.\" Parameter is the title of the heading
-.\"-----------------------------------------------------------------
-.de HDR_1
-.sp 1
-.in 0
-\\n+[head1]\\ \\$1
-.XS
-\\n[head1]\\ \\$1
-.XE
-.in 3
-..
-
-
-.de HDR_2
-.sp 1
-.in 0
-\\n[head1]\\.\\n+[head2]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_3
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n+[head3]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_4
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n+[head4]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_5
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n+[head5]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_6
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\.\\n+[head6]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\.\\n[head6]\\ \\$1
-.in 3
-.XE
-..
-
-.\"-----------------------------------------------------------------
-.\" END MACRO DEFINITIONS
-.\"-----------------------------------------------------------------
-
-.pl 58
-.po 0
-.ll 72
-.lt 72
-.ds LF Day
-.ds RF FORMFEED[Page %]^
-.ds CF
-.ds LH INTERNET DRAFT
-.ds CH SLP Exclusion Directive
-.ds RH Exp. June 2003
-.hy 0
-.ad l
-.in 0
-
-
-Internet Engineering Task Force Michael Day
-INTERNET DRAFT IBM
-07 January 2003 Expires in six months
-
-.ce 1000
-Exclusion Extension for Service Location Protocol v2
-draft-day-svrloc-exclusion-03.txt
-.ce 0
-.sp 5
-
-.in 0
-Status of This Memo
-.in 3
-This document is an Internet-Draft and is subject to
-all provisions of Section 10 of RFC2026.
-
-Internet-Drafts are working documents of the Internet Engineering
-Task Force (IETF), its areas, and its working groups. Note that
-other groups may also distribute working documents as
-Internet-Drafts.
-
-Internet-Drafts are draft documents valid for a maximum of six
-months and may be updated, replaced, or obsoleted by other
-documents at any time. It is inappropriate to use Internet-
-Drafts as reference material or to cite them other than as
-"work in progress."
-
-The list of current Internet-Drafts can be accessed at
-http://www.ietf.org/1id-abstracts.html
-
-The list of Internet-Draft Shadow Directories can be accessed at
-http://www.ietf.org/shadow.html
-
-This document is an individual contribution to the Internet
-Engineering Task Force (IETF). Comments should be submitted to the
-srvloc@srvloc.org mailing list.
-
-Distribution of this memo is unlimited.
-
-.bp
-.HDR_1 Introduction
-
-The Service Location Protocol, Version 2 [1] allows the use of
-multicast and broadcast discovery requests. The SLP exclusion
-directive is an extension to SLP that optimizes the use of
-multicasting and broadcasting to find services on an intranet. This
-document hereafter refers to multicast discovery but all its contents
-apply to broadcast discovery as well.
-
-.HDR_2 "Present SLPv2 Multicast Behavior"
-
-Multicast discovery requests allow an SLP User Agent to discover
-services with no prior configuration. Multicast discovery requests are
-not sent reliably and must be retransmitted in order to find all
-services of the desired type on the network.
-
-When SLP v2 SrvRqst, SrvTypeRqst, and AttrRqst messages are multicast,
-they contain a <PRList> of previous respondents. Initially the
-<PRList> is empty. When these requests are unicast, the <PRList> is
-always empty.
-
-Any DA or SA which sees its address in the <PRList> does not respond
-to the request (as specified in RFC 2608).
-
-The User Agent then retransmits the discovery request until the
-<PRList> causes no further responses to be elicited or the previous
-responder list and the request will not fit into a single datagram or
-until CONFIG_MC_MAX seconds elapse[1].
-
-The PR list is an effective mechanism for suppressing duplicate
-responses in smaller environments. However, because of the way PR
-lists are encoded with the SLP v2 header, the PR List has a limit of
-as few as 90 IPv4 addressees, and even fewer IPv6 addresses. This
-means in most environments a User Agent may suppress duplicate
-responses from approximately 90 host addresses at best.
-
-.HDR_2 Optimizations\ Made\ by\ Exclusion\ Directive
-
-The Exclusion Directive extension presented in this document allows a
-User Agent (UA) to direct those Directory Agents (DAs) and Service
-Agents (SAs) from which it has already received responses not to
-respond to retransmissions of a particular query. Hence subsequent
-retransmissions only generate responses from agents from which the
-requester has not already received a response.
-
-This extension can be used in conjunction with the SLP v2 PR list.
-SAs and DAs which do not understand the Exclusion Directive extension
-will ignore it. With the use of the Exclusion Directive extension, SLP
-v2 User Agents may perform multicast discovery with a high degree of
-success and efficiency, even when the number of respondents reaches
-into the thousands. .
-
-.HDR_2 Terminology
-
-In this document, the key words "MAY", "MUST, "MUST NOT", "optional",
-"recommended", "SHOULD", and "SHOULD NOT", are to be interpreted as
-described in RFC 2119 [2].
-
-.bp
-.RETURN_HDR_1 Exclusion\ Extension\ Format
-
-The fields in an Exclusion extension form an Exclusion Directive that
-tells receiving agents not to respond to a specific request from a
-specific host for a specific time interval.
-
-Each Exclusion Directive is fully contained within one SLP v2
-extension block. However, a single SLP v2 request message may contain
-multiple Exclusion Directives. For example, a single Service Request
-may contain three Exclusion Directives within three distinct SLP v2
-extension blocks.
-
-.KS
-.HDR_2 Exclusion\ Extension\ Fields
-
-The Exclusion extension has the following format:
-.DS L
-
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Extension ID = 0x000? | Next Extension Offset |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Offset, contd.| size | Exclusion XID |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Nonce |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion Interval | Number of Entries |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion Entries |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | # auth blocks | authentication block (if any) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-.DE
-.KE
-.HDR_3 Size\ Field
-
-The size field specifies the size, in bytes, of each address entry. A
-size value of 4 bytes MUST be encoded as an IP v4 address in network
-byte order. A size value of 16 bytes MUST be encoded as an IP v6
-address in network byte order. Other address sizes are assumed to be
-opaque data and will not be interoperable among different
-implementations
-
-.HDR_4 Using\ the\ Size\ Field\ to\ Calculate\ Length\ of\ Entries
-
-The size of the Exclusion Entries field MUST be calculated by
-multiplying the value of the Size field by the value of the Number of
-Entries field.
-
-.RETURN_HDR_3 Exclusion\ XID
-
-The Exclusion XID identifies the SLP request to which the enclosing
-Exclusion Directive applies. An Exclusion Directive always applies to
-exactly one specific XID from exactly one host IP address.
-
-It is possible that the value of XID field in the Exclusion Directive
-and the XID in the SLP header of the message containing the Exclusion
-Directive will be different. This is a subtle but important point: the
-SLP v2 header XID and the Exclusion XID are not equivalent. See
-section 3.0 for details of how the exclusion XID works.
-
-.HDR_3 Nonce
-
-The Nonce adds a unique value to each Exclusion Directive that makes
-it difficult to mount a denial of service attack by replaying
-Exclusion Directives. The Nonce is a 128-bit field which MUST contain
-a cryptographic-quality random unique value; or alternatively must be
-filled with zero bytes. (If the Nonce is filled with zero bytes, it is
-ignored.)
-
-The usage of the Nonce is explained further in section 4.3.
-
-.HDR_3 Exclusion\ Interval
-
-The Exclusion Interval indicates the lifetime, in seconds, of the
-containing Exclusion Directive. The interval begins when the SA or DA
-receives the Exclusion Directive. Exclusion Directives SHOULD have an
-interval from one to several seconds. However, the Exclusion Interval
-may need to be increased for unusually large networks or media with
-high latency characteristics, such as satellite links.
-
-.HDR_3 Exclusion\ Entries
-
-The Exclusion Entries field is the list of host IP addresses that are
-subject to the containing Exclusion Directive. The length of the Exclusion
-Entries field is the number of IP addresses in the list multiplied by
-the size of each IP address.
-
-The size of each IP address is determined by the value of the size
-field. Each Exclusion Directive therefore may only contain IPv4
-addresses or IPv6 addresses, but not both.
-
-.HDR_4 Dual-stack\ IP\ Environments
-
-In environments using both IPv4 and IPv6 addresses it may be necessary
-to deliver two Exclusion Directives where otherwise one would be
-sufficient. E.g., one Directive containing IPv4 addresses and another
-Directive containing IPv6 addresses. One way to accomplish this is to
-pack two separate Exclusion Directives into a single SLP
-request. Another way involves using dummy request messages to deliver
-Exclusion Directives. Dummy request messages are covered in section
-3.1 below.
-
-.RETURN_HDR_3 Authentication\ Blocks
-
-The Number of Auth Blocks indicates how many authentication blocks
-are contained in the containing Exclusion Directive. The format of the
-authentication block is covered in section 4 below.
-
-.KS
-.RETURN_HDR_2 Exclusion\ Directive\ Functionality
-
-The purpose of the Exclusion Directive is to cause SAs or DAs to
-silently discard specific SLP requests that originate from specific IP
-addresses. This purpose aids in the use of multicasting to discover
-services in large network environments. The Exclusion Directive makes
-multicast discovery more reliable and efficient by:
-
-.nr PI 5
-.nr step 1 1
-.RS
-.IP \n[step]. 3
-Providing a more compact mechanism to silence previous responders.
-.IP \n+[step].
-Magnifying the effect of the silencing mechanism by specifying a quiet interval.
-.RE
-.KE
-
-.HDR_3 Exclusion\ Directive\ State\ Table\ (EDST)
-
-When the Exclusion Directive is present in an SLP request, the
-receiving agent uses the directive to create and maintain state
-information that causes the receiving agent to ignore and discard
-matching requests (possibly including the request containing the
-Exclusion Directive).
-
-The Exclusion Directive State Table (EDST) is the collection of
-information describing all current Exclusion Directives received by
-the agent. EDST entries are a record with five fields: Source Address,
-Source Port, exclusion XID , exclusion nonce value, and expiration
-time. (The nonce value MAY be zero filled.)
-
-The Exclusion Directive only applies to SLP v2 messages that have the
-multicast flag set. The SA or DA MUST respond to SLP v2 messages that
-do not have the multicast flag set as specified in [1].
-
-If the incoming request message matches a current record in the
-receiving agent's EDST, and if the incoming request's Multicast flag
-is set in the SLP header, the DA or SA MUST silently discard the
-message.
-
-When the Exclusion Interval of an Exclusion Directive has expired, the
-SA or DA MUST delete the corresponding record in its EDST and resume
-processing SLP v2 multicast request as if that Exclusion Directive
-was never received.
-
-If an incoming request does not contain an Exclusion Directive, the
-receiving agent MUST process that request without regard to the local
-EDST. (In other words, process the request normally.)
-
-
-.RETURN_HDR_1 Exclusion\ Directives\ in\ SLP\ v2\ Request\ Messages
-
-An SA or DA may encounter the Exclusion Directive in Service Request,
-Attribute Request, and Service Type Request messages. In each case,
-the request may also contain a PR list as described in [1].
-
-A UA MUST NOT include an Exclusion Directive in a unicast SLP v2
-request message. DAs and SAs MUST ignore Exclusion Directives that
-are erroneously included in unicast request messages.
-
-.KS
-If the SA or DA supports the Exclusion Directive, it MUST perform the
-following steps when processing an SLP v2 Request message.
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-If the request message is unicast or if the receiving agent does not
-recognize the Exclusion Directive, go to step 6 below.
-.IP \n+[step].
-If the incoming request does not have an Exclusion Directive,
-proceed to step 6.
-.IP \n+[step].
-Extract the Exclusion Directive from the request. Search the
-Directive's Exclusion Entries list for the receiving agent's IP
-address. If not found, proceed to step 6.
-.IP \n+[step].
-Extract the source address and port from the UDP header and the
-Exclusion XID and nonce from the Exclusion Directive. The receiving
-agent MUST ensure that its EDST contains a record for this directive,
-creating a new EDST record if necessary. (This step is also a
-convenient time to delete expired entries from the EDST.)
-.IP \n+[step].
-Extract the source address and port from the incoming request's UDP
-header. Extract the XID from the request's SLP v2 header. Extract the
-nonce from the Exclusion directive.
-
-Search the EDST for an entry containing matching values for these data
-(Optionally ignoring the nonce from the EDST entry if the incoming
-request does not contain an exclusion directive). Upon finding a
-matching EDST entry, silently discard the request. Otherwise continue.
-.IP \n+[step].
-If the SA or DA has not discarded the request up to this point,
-evaluate the request normally as outlined in [1].
-.RE
-.KE
-.in 3
-
-It is worth repeating that the Exclusion Directive only applies to
-SLP v2 request messages that have the R (Request Multicast) flag
-turned on in the SLP v2 header. Agents MUST NOT silently discard
-unicast request messages regardless of exclusion directives or EDST
-entries.
-
-Note that additional steps may be necessary if the Exclusion
-directive contains one or more authentication blocks. These
-steps are outlined in section 4.
-
-.KS
-.HDR_2 Dummy\ Service\ Request\ Message\ with\ Exclusion\ Directive
-
-A "dummy" request message is one that has zero-length fields
-for the entire request body, exclusive of the SLP v2 header and the
-Exclusion directive.
-
-Using a dummy SLP request message for the sole purpose of transporting
-an Exclusion Directive may be helpful in two cases:
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-The Exclusion Directive is too large to fit within a single request
-datagram alongside the SLP header, service type, predicate, and other request
-data. However, it will fit in a datagram with just itself and the SLP
-header.
-.IP \n+[step].
-The Exclusion Directive is larger than the sum of the network MTU
-and the SLP Header. The agent can divide the Exclusion Entries list
-across two or more Exclusion Directives and transport those Directives
-within a corresponding number of dummy SLP request messages.
-
-This method can support Exclusion Entry lists that contain thousands
-of addresses.
-.RE
-.in 3
-.sp 1
-When an SA or DA receives a dummy SLP request that contains an
-Exclusion Directive, the receiving agent MUST extract the Exclusion
-Directive from the dummy request and ensure that the local EDST
-contains a record corresponding to the Exclusion Directive. This is
-described in section 3, step 4 above.
-
-
-A Dummy request message MUST have the R (Request Multicast) flag
-turned on in the SLP v2 header. This causes SLP v2 SAs and DAs that
-are unaware of the Exclusion Directive to silently discard dummy
-request messages due to a parsing error (instead of responding to the
-sending agent with an error code).
-.KE
-.KS
-
-.HDR_3 Format\ of\ Dummy\ Service\ Request
-.DS L
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location Header (R flag on) (function = SrvRqst = 1) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <PRList> = 0 | length of <service-type> = 0 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <scope-list> = 0 | length of <predicate> = 0 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <SLP SPI > = 0 | Extension ID = Exclusion |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Next Extension Offset | size |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion XID | Nonce |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Nonce, cont'd. | Exclusion Interval |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Number of Entries | Exclusion Entries \\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- \\ # auth blocks | authentication block (if any)\\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-.DE
-.KE
-.HDR_3 Processing\ the\ Dummy\ Service\ Request
-
-Dummy Service Request messages MUST be processed as outlined in
-section 3 above. The result is that the receiving agents which support
-the Exclusion Directive will process the Directive, while all other
-agents will silently discard the message due to a parsing error.
-
-After processing the Exclusion Directive, the receiving agent will
-produce a parse error. Because the service request has the multicast
-flag set, the receiving agent will not send an error response to the
-originating agent.
-
-Note that if the Exclusion Directive contains an authentication
-block, the SA or DA SHOULD validate the signature of the Exclusion
-Directive. Authentication of Exclusion Directives is covered in
-section 4.
-
-.KS
-.HDR_3 Using\ the\ Exclusion\ Directive\ and\ PR\ List\ Together
-
-The steps below show how to use the
-Exclusion Directive in combination with the SLP PR list to perform
-multicast discovery (substitute actual XIDs in real usage):
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-Send a new Service Request with no PR list and no Exclusion Directive;
-process the replies and remember the respondents as RL1.
-.IP \n+[step].
-Build an exclusion list and remember it as list EL1.
-.IP \n+[step].
-Immediately re-transmit the Service Request from (1) with no PR list
-but with an Exclusion Directive that contains Exclusion List EL1;
-process the replies and remember the respondents as RL2.
-.IP \n+[step].
-The intersection of EL1 and RL2 are agents that do not support the
-Exclusion Directive. Create PRL1 = EL1 n RL2. Build EL2 = RL2 - PRL1.
-.IP \n+[step].
-Immediately re-transmit the Service Request from (3) including PRL1 in
-the SLP header and substituting EL2 for EL1 in the Exclusion
-Directive. If no responses the discovery cycle is complete.
-.IP \n+[step].
-Repeat the previous thre steps n times using ELn-1, RLn, PRLn-1, and ELn until the
-UA receives no responses for the configured timeout period.
-.RE
-.in 3
-.sp 1
-In steps 1 - 6 above, it is important that each Service Request (steps
-1, 3, and 5) have the same XID in the SLP Header ; and equally that
-each Exclusion Directive also has the same value in the XID field.
-.KE
-.KS
-
-.RETURN_HDR_1 Authenticating\ Exclusion\ Directives
-
-To prevent denial of service attacks against UAs, all agents that
-recognize the Exclusion Directive SHOULD support authentication of
-the Exclusion Directive.
-
-Authenticating Exclusion Directives places the additional burden upon
-the User Agent of signing data. In standard SLP v2, UAs only need to
-verify signatures. The additional ability to generate signatures
-means that UAs must be issued private key material.
-
-.HDR_2 The\ Exclusion\ Directive\ Authentication\ Block
-
-The format of the Exclusion Directive Authentication Block is the same
-as that used by SLP v2 [1].
-
-.DS L
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Block Structure Descriptor | Authentication Block Length |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Timestamp |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | SLP SPI String Length | SLP SPI String \\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- \\ Structured Authentication Block... \\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-.DE
-.KE
-.KS
-.HDR_2 Exclusion\ Directive\ Authentication\ Rules
-
-To sign or verify the signature of an Exclusion Directive, the SLP
-agent MUST use the following components of the Exclusion Directive as
-if they were a single continuous byte-aligned buffer:
-.nr PI 5
-.RS
-.IP \[bu] 3
-16-bit Exclusion XID
-.IP \[bu]
-32-bit Nonce
-.IP \[bu]
-16-bit Exclusion Interval
-.IP \[bu]
-8-bit Exclusion Entry size
-.IP \[bu]
-16-bit Number of Entries
-.IP \[bu]
-Variable-length Exclusion Entries.
-.RE
-.KE
-
-.RETURN_HDR_1 Using\ the\ NONCE\ Value\ to\ Prevent\ Replay\ Attacks
-
-Despite the use of signatures to authenticate Exclusion Directives,
-UAs may still be vulnerable to a replay denial of service attack. To
-prevent this possibility, SLP Agents that recognize the Exclusion
-directive SHOULD make use of the nonce value as described in this
-section.
-
-Every Exclusion Directive contains a 128-bit nonce field, which MUST
-contain a 128-bit cryptographicly random value or be filled with
-zeros. If the nonce is filled with zeroes, the UA is open to a
-denial-of service attack.
-
-Because the nonce field is included in signature generation and
-validation, each signed Exclusion Directive can be cryptographically
-unique. Unsigned Exclusion Directives can also be cryptographically
-unique but their source can be spoofed.
-
-.KS
-By using the nonce correctly, Exclusion Directives can be specific
-to:
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-The source address and port of the requesting UA.
-.IP \n+[step].
-The XID of the request.
-.IP \n+[step].
-A cryptographically unique value for each and every request. To make
-this work, SAs and DAs MUST include the nonce value, along with the UA
-source address and the request XID when deciding whether or not an
-Exclusion Directive applies to a request message.
-.RE
-.KE
-
-.HDR_2 UA\ Use\ of\ the\ Nonce\ to\ Prevent\ Denial\ of\ Service\ Attack
-
-The UA is the SLP component vulnerable to a denial of service attack
-so it is responsible for using an appropriate algorithm to generate a
-nonce with the requisite random characteristics.
-
-.KS
-For each Exclusion Directive:
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-Generate a random 128-bit integer to use as the nonce.
-.IP \n+[step].
-Initialize an Exclusion Directive, including the XID of the
-request that is subject to response suppression.
-.IP \n+[step].
-Insert the nonce value from (1) into the Exclusion Directive.
-.IP \n+[step].
-Optionally sign the Exclusion Directive as outlined in the section on
-Authentication above.
-.IP \n+[step].
-Use a Exclusion Directive containing the nonce in all
-requests and dummy Service Requests for the XID in step (2).
-.IP \n+[step].
-IMPORTANT - use a DIFFERENT, cryptographically generated nonce
-for each request XID for which you are issuing an Exclusion
-directive.
-.RE
-.KE
-.KS
-.HDR_2 DA\ and\ SA\ Use\ of\ the\ Nonce
-
-SA's DAs that recognize the Exclusion Directive MUST use the nonce
-value to initialize EDST entries and to evaluate Exclusion Directives
-in request messages.
-
-.HDR_3 Zero-filled\ Nonce
-
-UAs that don't have the ability to generate unique
-nonce values MUST fill the nonce field of the Exclusion Directive
-with zeros. This opens the agent up to a denial of service attack,
-however. (See below).
-
-.RETURN_HDR_2 Theory\ Behind\ the\ Nonce
-The nonce is a simple mechanism to make it as difficult as possible
-for an attacker to predict the composition of SLP service
-requests that a particular UA may issue in the near future.
-
-Most UA's use the XID field in the SLP 2 header as a sequential
-counter. Hence an attacker that has a copy of a recent SLP request can
-guess the XID of the next request the agent will make. Using the
-Exclusion Directive, an attacker can cause DA's and SA's not to
-respond to subsequent SLP requests made by the attacked agent.
-
-However, the inclusion of the nonce value in the Exclusion Directive
-makes it infeasible for an attacker to guess the composition of future
-requests made by the UA. This is true because the nonce, unlike the
-XID, is a random value. Also, the nonce is large enough to make
-guessing its value in the next request too difficult for the attacker.
-.KE
-.RETURN_HDR_1 Security\ Considerations
-
-Implementing the Exclusion Directive without using the nonce value
-opens SLP v2 UAs up to a trivial denial of service attack, which would
-nullify the ability of the UA to perform discovery.
-
-Implementing the Exclusion Directive with authentication but without
-using the nonce value may leave the UA open to a more sophisticated
-replay attack using previously signed and multicast request messages.
-
-UAs that support the Exclusion Directive SHOULD authenticate their
-requests as outlined in section 4 and SHOULD include the nonce value
-in all Exclusion Directives.
-
-SAs and DAs that support the Exclusion Directive SHOULD be able to
-verify signed Exclusion Directives and MUST store the nonce value in
-the EDST entry for that directive.
-
-Nonce values generated by UAs MUST be cryptographically unique and
-random values if they are to provide any safeguard against a replay
-attack.
-
-.HDR_1 Acknowledgements
-
-Erik Guttman has provided a great deal of feedback and improvements
-to this document. The srvloc working group also contributed to the
-development of this document, especialy Kevin Arnold, James Kempf,
-Ira McDonald, Evan Hughes, Terry Lambert, and others. Thomas Narten
-recommended some important changes during the review process.
-.KS
-.HDR_1 References
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-Guttman, E., Perkins, C., Veizades, J., and M. Day, "Service
-Location Protocol Version 2", RFC 2608, June 1999.
-.IP \n+[step].
-Bradner, S,. "Key Words for Use in RFCs to Indicate Requirements
-Levels", BCP 14, RFC 2119, March 1997
-.RE
-.KE
-.KS
-.HDR_1 Author's\ Contact\ Information
-
-Michael Day
-IBM
-3039 Cornwallis Road
-Research Triangle Park, NC 27709
-
-Phone: 919 543-4283
-
-Email: mdday@us.ibm.com
-.KE
-.KS
-.HDR_1 Full\ Copyright\ Statement
-
-Copyright (C) The Internet Society (2000-2002). All Rights Reserved.
-
-This document and translations of it may be copied and furnished to
-others, and derivative works that comment on or otherwise explain it
-or assist in its implementation may be prepared, copied, published and
-distributed, in whole or in part, without restriction of any kind,
-provided that the above copyright notice and this paragraph are
-included on all such copies and derivative works. However, this
-document itself may not be modified in any way, such as by removing
-the copyright notice or references to the Internet Society or other
-Internet organizations, except as needed for the purpose of developing
-Internet standards in which case the procedures for copyrights defined
-in the Internet Standards process must be followed, or as required to
-translate it into languages other than English.
-
-The limited permissions granted above are perpetual and will not be
-revoked by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an
-"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
-TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
-NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN
-WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE."
-.KE
-
-.TC
+++ /dev/null
-
-
-
-
-
-
-Internet Engineering Task Force Michael Day
-INTERNET DRAFT IBM
-07 January 2003 Expires in six months
-
- Exclusion Extension for Service Location Protocol v2
- draft-day-svrloc-exclusion-03.txt
-
-
-
-
-
-
-Status of This Memo
- This document is an Internet-Draft and is subject to all provisions
- of Section 10 of RFC2026.
-
- Internet-Drafts are working documents of the Internet Engineering
- Task Force (IETF), its areas, and its working groups. Note that
- other groups may also distribute working documents as Internet-
- Drafts.
-
- Internet-Drafts are draft documents valid for a maximum of six months
- and may be updated, replaced, or obsoleted by other documents at any
- time. It is inappropriate to use Internet- Drafts as reference
- material or to cite them other than as "work in progress."
-
- The list of current Internet-Drafts can be accessed at
- http://www.ietf.org/1id-abstracts.html
-
- The list of Internet-Draft Shadow Directories can be accessed at
- http://www.ietf.org/shadow.html
-
- This document is an individual contribution to the Internet
- Engineering Task Force (IETF). Comments should be submitted to the
- srvloc@srvloc.org mailing list.
-
- Distribution of this memo is unlimited.
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page i]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
- \e[1mTable of Contents\e[0m
-
-
-1 Introduction . . . . . . . . . . . . . . . . . . . . 2
-1.1 Present SLPv2 Multicast Behavior . . . . . . . . . . 2
-1.2 Optimizations Made by Exclusion Directive . . . . . 2
-1.3 Terminology . . . . . . . . . . . . . . . . . . . . 3
-2 Exclusion Extension Format . . . . . . . . . . . . . 4
-2.1 Exclusion Extension Fields . . . . . . . . . . . . . 4
-2.1.1 Size Field . . . . . . . . . . . . . . . . . . . . 4
-2.1.1.1 Using the Size Field to Calcu-
-late Length of Entries . . . . . . . . . . . . . . . . . 5
-2.1.2 Exclusion XID . . . . . . . . . . . . . . . . . . 5
-2.1.3 Nonce . . . . . . . . . . . . . . . . . . . . . . 5
-2.1.4 Exclusion Interval . . . . . . . . . . . . . . . . 5
-2.1.5 Exclusion Entries . . . . . . . . . . . . . . . . 6
-2.1.5.1 Dual-stack IP Environments . . . . . . . . . . . 6
-2.1.6 Authentication Blocks . . . . . . . . . . . . . . 6
-2.2 Exclusion Directive Functionality . . . . . . . . . 6
-2.2.1 Exclusion Directive State Table (EDST) . . . . . . 7
-3 Exclusion Directives in SLP v2 Request Messages . . . 8
-3.1 Dummy Service Request Message with Exclu-
-sion Directive . . . . . . . . . . . . . . . . . . . . . 10
-3.1.1 Format of Dummy Service Request . . . . . . . . . 11
-3.1.2 Processing the Dummy Service Request . . . . . . . 12
-3.1.3 Using the Exclusion Direc-
-tive and PR List Together . . . . . . . . . . . . . . . 12
-4 Authenticating Exclusion Directives . . . . . . . . . 13
-4.1 The Exclusion Directive Authentication Block . . . . 13
-4.2 Exclusion Directive Authentication Rules . . . . . . 13
-5 Using the NONCE Value to Prevent Replay Attacks
- . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
-5.1 UA Use of the Nonce to Prevent Denial of Ser-
-vice Attack . . . . . . . . . . . . . . . . . . . . . . 15
-5.2 DA and SA Use of the Nonce . . . . . . . . . . . . . 16
-5.2.1 Zero-filled Nonce . . . . . . . . . . . . . . . . 16
-5.3 Theory Behind the Nonce . . . . . . . . . . . . . . 16
-6 Security Considerations . . . . . . . . . . . . . . . 16
-7 Acknowledgements . . . . . . . . . . . . . . . . . . 17
-8 References . . . . . . . . . . . . . . . . . . . . . 17
-9 Author's Contact Information . . . . . . . . . . . . 17
-10 Full Copyright Statement . . . . . . . . . . . . . . 18
-
-
-
-
-
-
-
-Day [Page 1]
-\f
-
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
-1 Introduction
-
- The Service Location Protocol, Version 2 [1] allows the use of
- multicast and broadcast discovery requests. The SLP exclusion
- directive is an extension to SLP that optimizes the use of
- multicasting and broadcasting to find services on an intranet. This
- document hereafter refers to multicast discovery but all its contents
- apply to broadcast discovery as well.
-
-
-1.1 Present SLPv2 Multicast Behavior
-
- Multicast discovery requests allow an SLP User Agent to discover
- services with no prior configuration. Multicast discovery requests
- are not sent reliably and must be retransmitted in order to find all
- services of the desired type on the network.
-
- When SLP v2 SrvRqst, SrvTypeRqst, and AttrRqst messages are
- multicast, they contain a <PRList> of previous respondents. Initially
- the <PRList> is empty. When these requests are unicast, the <PRList>
- is always empty.
-
- Any DA or SA which sees its address in the <PRList> does not respond
- to the request (as specified in RFC 2608).
-
- The User Agent then retransmits the discovery request until the
- <PRList> causes no further responses to be elicited or the previous
- responder list and the request will not fit into a single datagram or
- until CONFIG_MC_MAX seconds elapse[1].
-
- The PR list is an effective mechanism for suppressing duplicate
- responses in smaller environments. However, because of the way PR
- lists are encoded with the SLP v2 header, the PR List has a limit of
- as few as 90 IPv4 addressees, and even fewer IPv6 addresses. This
- means in most environments a User Agent may suppress duplicate
- responses from approximately 90 host addresses at best.
-
-
-1.2 Optimizations Made by Exclusion Directive
-
- The Exclusion Directive extension presented in this document allows a
- User Agent (UA) to direct those Directory Agents (DAs) and Service
- Agents (SAs) from which it has already received responses not to
- respond to retransmissions of a particular query. Hence subsequent
- retransmissions only generate responses from agents from which the
- requester has not already received a response.
-
-
-
-Day [Page 2]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
- This extension can be used in conjunction with the SLP v2 PR list.
- SAs and DAs which do not understand the Exclusion Directive extension
- will ignore it. With the use of the Exclusion Directive extension,
- SLP v2 User Agents may perform multicast discovery with a high degree
- of success and efficiency, even when the number of respondents
- reaches into the thousands. .
-
-
-1.3 Terminology
-
- In this document, the key words "MAY", "MUST, "MUST NOT", "optional",
- "recommended", "SHOULD", and "SHOULD NOT", are to be interpreted as
- described in RFC 2119 [2].
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 3]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
-2 Exclusion Extension Format
-
- The fields in an Exclusion extension form an Exclusion Directive that
- tells receiving agents not to respond to a specific request from a
- specific host for a specific time interval.
-
- Each Exclusion Directive is fully contained within one SLP
- v2 extension block. However, a single SLP v2 request message may
- contain multiple Exclusion Directives. For example, a single Service
- Request may contain three Exclusion Directives within three
- distinct SLP v2 extension blocks.
-
-
-2.1 Exclusion Extension Fields
-
- The Exclusion extension has the following format:
-
-
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Extension ID = 0x000? | Next Extension Offset |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Offset, contd.| size | Exclusion XID |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Nonce |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion Interval | Number of Entries |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion Entries |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | # auth blocks | authentication block (if any) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-
-
-2.1.1 Size Field
-
- The size field specifies the size, in bytes, of each
- address entry. A size value of 4 bytes MUST be encoded as
- an IP v4 address in network byte order. A size value of
- 16 bytes MUST be encoded as an IP v6 address in network
- byte order. Other address sizes are assumed to be opaque
- data and will not be interoperable among different imple-
- mentations
-
-
-
-Day [Page 4]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
-2.1.1.1 Using the Size Field to Calculate Length of Entries
-
- The size of the Exclusion Entries field MUST be calcu-
- lated by multiplying the value of the Size field by the
- value of the Number of Entries field.
-
-
-2.1.2 Exclusion XID
-
- The Exclusion XID identifies the SLP request to which the
- enclosing Exclusion Directive applies. An Exclusion
- Directive always applies to exactly one specific XID from
- exactly one host IP address.
-
- It is possible that the value of XID field in the Exclu-
- sion Directive and the XID in the SLP header of the mes-
- sage containing the Exclusion Directive will be differ-
- ent. This is a subtle but important point: the SLP v2
- header XID and the Exclusion XID are not equivalent. See
- section 3.0 for details of how the exclusion XID works.
-
-
-2.1.3 Nonce
-
- The Nonce adds a unique value to each Exclusion Directive
- that makes it difficult to mount a denial of service
- attack by replaying Exclusion Directives. The Nonce is a
- 128-bit field which MUST contain a cryptographic-quality
- random unique value; or alternatively must be filled with
- zero bytes. (If the Nonce is filled with zero bytes, it
- is ignored.)
-
- The usage of the Nonce is explained further in section
- 4.3.
-
-
-2.1.4 Exclusion Interval
-
- The Exclusion Interval indicates the lifetime, in sec-
- onds, of the containing Exclusion Directive. The interval
- begins when the SA or DA receives the Exclusion Direc-
- tive. Exclusion Directives SHOULD have an interval from
- one to several seconds. However, the Exclusion Interval
- may need to be increased for unusually large networks or
- media with high latency characteristics, such as satel-
- lite links.
-
-
-
-Day [Page 5]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
-2.1.5 Exclusion Entries
-
- The Exclusion Entries field is the list of host IP
- addresses that are subject to the containing Exclusion
- Directive. The length of the Exclusion Entries field is
- the number of IP addresses in the list multiplied by the
- size of each IP address.
-
- The size of each IP address is determined by the value of
- the size field. Each Exclusion Directive therefore may
- only contain IPv4 addresses or IPv6 addresses, but not
- both.
-
-
-2.1.5.1 Dual-stack IP Environments
-
- In environments using both IPv4 and IPv6 addresses it may
- be necessary to deliver two Exclusion Directives where
- otherwise one would be sufficient. E.g., one Directive
- containing IPv4 addresses and another Directive contain-
- ing IPv6 addresses. One way to accomplish this is to pack
- two separate Exclusion Directives into a single SLP
- request. Another way involves using dummy request mes-
- sages to deliver Exclusion Directives. Dummy request mes-
- sages are covered in section 3.1 below.
-
-
-2.1.6 Authentication Blocks
-
- The Number of Auth Blocks indicates how many authentica-
- tion blocks are contained in the containing Exclusion
- Directive. The format of the authentication block is cov-
- ered in section 4 below.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 6]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
-2.2 Exclusion Directive Functionality
-
- The purpose of the Exclusion Directive is to cause SAs or
- DAs to silently discard specific SLP requests that origi-
- nate from specific IP addresses. This purpose aids in the
- use of multicasting to discover services in large network
- environments. The Exclusion Directive makes multicast
- discovery more reliable and efficient by:
-
-
- 1. Providing a more compact mechanism to silence previ-
- ous responders.
-
- 2. Magnifying the effect of the silencing mechanism by
- specifying a quiet interval.
-
-
-2.2.1 Exclusion Directive State Table (EDST)
-
- When the Exclusion Directive is present in an SLP
- request, the receiving agent uses the directive to create
- and maintain state information that causes the receiving
- agent to ignore and discard matching requests (possibly
- including the request containing the Exclusion Direc-
- tive).
-
- The Exclusion Directive State Table (EDST) is the collec-
- tion of information describing all current Exclusion
- Directives received by the agent. EDST entries are a
- record with five fields: Source Address, Source Port,
- exclusion XID , exclusion nonce value, and expiration
- time. (The nonce value MAY be zero filled.)
-
- The Exclusion Directive only applies to SLP v2 messages
- that have the multicast flag set. The SA or DA MUST
- respond to SLP v2 messages that do not have the multicast
- flag set as specified in [1].
-
- If the incoming request message matches a current record
- in the receiving agent's EDST, and if the incoming
- request's Multicast flag is set in the SLP header, the DA
- or SA MUST silently discard the message.
-
- When the Exclusion Interval of an Exclusion Directive has
- expired, the SA or DA MUST delete the corresponding
- record in its EDST and resume processing SLP v2 multicast
-
-
-
-Day [Page 7]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
- request as if that Exclusion Directive was never
- received.
-
- If an incoming request does not contain an Exclusion
- Directive, the receiving agent MUST process that request
- without regard to the local EDST. (In other words, pro-
- cess the request normally.)
-
-
-
-3 Exclusion Directives in SLP v2 Request Messages
-
- An SA or DA may encounter the Exclusion Directive in Ser-
- vice Request, Attribute Request, and Service Type Request
- messages. In each case, the request may also contain a PR
- list as described in [1].
-
- A UA MUST NOT include an Exclusion Directive in a unicast
- SLP v2 request message. DAs and SAs MUST ignore Exclusion
- Directives that are erroneously included in unicast
- request messages.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 8]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
- If the SA or DA supports the Exclusion Directive, it MUST
- perform the following steps when processing an SLP v2
- Request message.
-
- 1. If the request message is unicast or if the receiv-
- ing agent does not recognize the Exclusion Direc-
- tive, go to step 6 below.
-
- 2. If the incoming request does not have an Exclusion
- Directive, proceed to step 6.
-
- 3. Extract the Exclusion Directive from the request.
- Search the Directive's Exclusion Entries list for
- the receiving agent's IP address. If not found, pro-
- ceed to step 6.
-
- 4. Extract the source address and port from the UDP
- header and the Exclusion XID and nonce from the
- Exclusion Directive. The receiving agent MUST ensure
- that its EDST contains a record for this directive,
- creating a new EDST record if necessary. (This step
- is also a convenient time to delete expired entries
- from the EDST.)
-
- 5. Extract the source address and port from the incom-
- ing request's UDP header. Extract the XID from the
- request's SLP v2 header. Extract the nonce from the
- Exclusion directive.
-
- Search the EDST for an entry containing matching
- values for these data (Optionally ignoring the nonce
- from the EDST entry if the incoming request does not
- contain an exclusion directive). Upon finding a
- matching EDST entry, silently discard the request.
- Otherwise continue.
-
- 6. If the SA or DA has not discarded the request up to
- this point, evaluate the request normally as out-
- lined in [1].
-
- It is worth repeating that the Exclusion Directive only
- applies to SLP v2 request messages that have the R
- (Request Multicast) flag turned on in the SLP v2 header.
- Agents MUST NOT silently discard unicast request messages
- regardless of exclusion directives or EDST entries.
-
-
-
-
-Day [Page 9]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
- Note that additional steps may be necessary if the Exclu-
- sion directive contains one or more authentication
- blocks. These steps are outlined in section 4.
-
-
-3.1 Dummy Service Request Message with Exclusion Directive
-
- A "dummy" request message is one that has zero-length
- fields for the entire request body, exclusive of the SLP
- v2 header and the Exclusion directive.
-
- Using a dummy SLP request message for the sole purpose of
- transporting an Exclusion Directive may be helpful in two
- cases:
-
- 1. The Exclusion Directive is too large to fit within a
- single request datagram alongside the SLP header,
- service type, predicate, and other request data.
- However, it will fit in a datagram with just itself
- and the SLP header.
-
- 2. The Exclusion Directive is larger than the sum of
- the network MTU and the SLP Header. The agent can
- divide the Exclusion Entries list across two or more
- Exclusion Directives and transport those Directives
- within a corresponding number of dummy SLP request
- messages.
-
- This method can support Exclusion Entry lists that
- contain thousands of addresses.
-
- When an SA or DA receives a dummy SLP request that con-
- tains an Exclusion Directive, the receiving agent MUST
- extract the Exclusion Directive from the dummy request
- and ensure that the local EDST contains a record corre-
- sponding to the Exclusion Directive. This is described in
- section 3, step 4 above.
-
-
- A Dummy request message MUST have the R (Request Multi-
- cast) flag turned on in the SLP v2 header. This causes
- SLP v2 SAs and DAs that are unaware of the Exclusion
- Directive to silently discard dummy request messages due
- to a parsing error (instead of responding to the sending
- agent with an error code).
-
-
-
-
-Day [Page 10]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
-3.1.1 Format of Dummy Service Request
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location Header (R flag on) (function = SrvRqst = 1) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <PRList> = 0 | length of <service-type> = 0 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <scope-list> = 0 | length of <predicate> = 0 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <SLP SPI > = 0 | Extension ID = Exclusion |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Next Extension Offset | size |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Exclusion XID | Nonce |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Nonce, cont'd. | Exclusion Interval |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Number of Entries | Exclusion Entries \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- \ # auth blocks | authentication block (if any)\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-
-3.1.2 Processing the Dummy Service Request
-
- Dummy Service Request messages MUST be processed as out-
- lined in section 3 above. The result is that the receiv-
- ing agents which support the Exclusion Directive will
- process the Directive, while all other agents will
- silently discard the message due to a parsing error.
-
- After processing the Exclusion Directive, the receiving
- agent will produce a parse error. Because the service
- request has the multicast flag set, the receiving agent
- will not send an error response to the originating agent.
-
- Note that if the Exclusion Directive contains an authen-
- tication block, the SA or DA SHOULD validate the signa-
- ture of the Exclusion Directive. Authentication of Exclu-
- sion Directives is covered in section 4.
-
-
-
-
-
-
-
-Day [Page 11]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
-3.1.3 Using the Exclusion Directive and PR List Together
-
- The steps below show how to use the Exclusion Directive
- in combination with the SLP PR list to perform multicast
- discovery (substitute actual XIDs in real usage):
-
- 1. Send a new Service Request with no PR list and no
- Exclusion Directive; process the replies and remem-
- ber the respondents as RL1.
-
- 2. Build an exclusion list and remember it as list EL1.
-
- 3. Immediately re-transmit the Service Request from (1)
- with no PR list but with an Exclusion Directive that
- contains Exclusion List EL1; process the replies and
- remember the respondents as RL2.
-
- 4. The intersection of EL1 and RL2 are agents that do
- not support the Exclusion Directive. Create PRL1 =
- EL1 n RL2. Build EL2 = RL2 - PRL1.
-
- 5. Immediately re-transmit the Service Request from (3)
- including PRL1 in the SLP header and substituting
- EL2 for EL1 in the Exclusion Directive. If no
- responses the discovery cycle is complete.
-
- 6. Repeat the previous thre steps n times using ELn-1,
- RLn, PRLn-1, and ELn until the UA receives no
- responses for the configured timeout period.
-
- In steps 1 - 6 above, it is important that each Service
- Request (steps 1, 3, and 5) have the same XID in the SLP
- Header ; and equally that each Exclusion Directive also
- has the same value in the XID field.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 12]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
-4 Authenticating Exclusion Directives
-
- To prevent denial of service attacks against UAs, all
- agents that recognize the Exclusion Directive SHOULD sup-
- port authentication of the Exclusion Directive.
-
- Authenticating Exclusion Directives places the additional
- burden upon the User Agent of signing data. In standard
- SLP v2, UAs only need to verify signatures. The addi-
- tional ability to generate signatures means that UAs must
- be issued private key material.
-
-
-4.1 The Exclusion Directive Authentication Block
-
- The format of the Exclusion Directive Authentication
- Block is the same as that used by SLP v2 [1].
-
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Block Structure Descriptor | Authentication Block Length |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Timestamp |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | SLP SPI String Length | SLP SPI String \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- \ Structured Authentication Block... \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 13]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
-4.2 Exclusion Directive Authentication Rules
-
- To sign or verify the signature of an Exclusion Direc-
- tive, the SLP agent MUST use the following components of
- the Exclusion Directive as if they were a single continu-
- ous byte-aligned buffer:
-
- · 16-bit Exclusion XID
-
- · 32-bit Nonce
-
- · 16-bit Exclusion Interval
-
- · 8-bit Exclusion Entry size
-
- · 16-bit Number of Entries
-
- · Variable-length Exclusion Entries.
-
-
-5 Using the NONCE Value to Prevent Replay Attacks
-
- Despite the use of signatures to authenticate Exclusion
- Directives, UAs may still be vulnerable to a replay
- denial of service attack. To prevent this possibility,
- SLP Agents that recognize the Exclusion directive SHOULD
- make use of the nonce value as described in this section.
-
- Every Exclusion Directive contains a 128-bit nonce field,
- which MUST contain a 128-bit cryptographicly random value
- or be filled with zeros. If the nonce is filled with
- zeroes, the UA is open to a denial-of service attack.
-
- Because the nonce field is included in signature genera-
- tion and validation, each signed Exclusion Directive can
- be cryptographically unique. Unsigned Exclusion Direc-
- tives can also be cryptographically unique but their
- source can be spoofed.
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 14]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
- By using the nonce correctly, Exclusion Directives can be
- specific to:
-
- 1. The source address and port of the requesting UA.
-
- 2. The XID of the request.
-
- 3. A cryptographically unique value for each and every
- request. To make this work, SAs and DAs MUST include
- the nonce value, along with the UA source address
- and the request XID when deciding whether or not an
- Exclusion Directive applies to a request message.
-
-
-5.1 UA Use of the Nonce to Prevent Denial of Service Attack
-
- The UA is the SLP component vulnerable to a denial of
- service attack so it is responsible for using an appro-
- priate algorithm to generate a nonce with the requisite
- random characteristics.
-
- For each Exclusion Directive:
-
- 1. Generate a random 128-bit integer to use as the
- nonce.
-
- 2. Initialize an Exclusion Directive, including the XID
- of the request that is subject to response suppres-
- sion.
-
- 3. Insert the nonce value from (1) into the Exclusion
- Directive.
-
- 4. Optionally sign the Exclusion Directive as outlined
- in the section on Authentication above.
-
- 5. Use a Exclusion Directive containing the nonce in
- all requests and dummy Service Requests for the XID
- in step (2).
-
- 6. IMPORTANT - use a DIFFERENT, cryptographically gen-
- erated nonce for each request XID for which you are
- issuing an Exclusion directive.
-
-
-
-
-
-
-Day [Page 15]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
-5.2 DA and SA Use of the Nonce
-
- SA's DAs that recognize the Exclusion Directive MUST use
- the nonce value to initialize EDST entries and to evalu-
- ate Exclusion Directives in request messages.
-
-
-5.2.1 Zero-filled Nonce
-
- UAs that don't have the ability to generate unique nonce
- values MUST fill the nonce field of the Exclusion Direc-
- tive with zeros. This opens the agent up to a denial of
- service attack, however. (See below).
-
-
-5.3 Theory Behind the Nonce
- The nonce is a simple mechanism to make it as difficult
- as possible for an attacker to predict the composition of
- SLP service requests that a particular UA may issue in
- the near future.
-
- Most UA's use the XID field in the SLP 2 header as a
- sequential counter. Hence an attacker that has a copy of
- a recent SLP request can guess the XID of the next
- request the agent will make. Using the Exclusion Direc-
- tive, an attacker can cause DA's and SA's not to respond
- to subsequent SLP requests made by the attacked agent.
-
- However, the inclusion of the nonce value in the Exclu-
- sion Directive makes it infeasible for an attacker to
- guess the composition of future requests made by the UA.
- This is true because the nonce, unlike the XID, is a ran-
- dom value. Also, the nonce is large enough to make guess-
- ing its value in the next request too difficult for the
- attacker.
-
-6 Security Considerations
-
- Implementing the Exclusion Directive without using the
- nonce value opens SLP v2 UAs up to a trivial denial of
- service attack, which would nullify the ability of the UA
- to perform discovery.
-
- Implementing the Exclusion Directive with authentication
- but without using the nonce value may leave the UA open
- to a more sophisticated replay attack using previously
-
-
-
-Day [Page 16]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
- signed and multicast request messages.
-
- UAs that support the Exclusion Directive SHOULD authenti-
- cate their requests as outlined in section 4 and SHOULD
- include the nonce value in all Exclusion Directives.
-
- SAs and DAs that support the Exclusion Directive SHOULD
- be able to verify signed Exclusion Directives and MUST
- store the nonce value in the EDST entry for that direc-
- tive.
-
- Nonce values generated by UAs MUST be cryptographically
- unique and random values if they are to provide any safe-
- guard against a replay attack.
-
-
-7 Acknowledgements
-
- Erik Guttman has provided a great deal of feedback and
- improvements to this document. The srvloc working group
- also contributed to the development of this document,
- especialy Kevin Arnold, James Kempf, Ira McDonald, Evan
- Hughes, Terry Lambert, and others. Thomas Narten recom-
- mended some important changes during the review process.
-
-8 References
-
- 1. Guttman, E., Perkins, C., Veizades, J., and M. Day,
- "Service Location Protocol Version 2", RFC 2608,
- June 1999.
-
- 2. Bradner, S,. "Key Words for Use in RFCs to Indicate
- Requirements Levels", BCP 14, RFC 2119, March 1997
-
-9 Author's Contact Information
-
- Michael Day IBM 3039 Cornwallis Road Research Triangle
- Park, NC 27709
-
- Phone: 919 543-4283
-
- Email: mdday@us.ibm.com
-
-
-
-
-
-
-
-Day [Page 17]
-\f
-INTERNET DRAFT SLP Exclusion Directive Exp. June 2003
-
-
-10 Full Copyright Statement
-
- Copyright (C) The Internet Society (2000-2002). All
- Rights Reserved.
-
- This document and translations of it may be copied and
- furnished to others, and derivative works that comment on
- or otherwise explain it or assist in its implementation
- may be prepared, copied, published and distributed, in
- whole or in part, without restriction of any kind, pro-
- vided that the above copyright notice and this paragraph
- are included on all such copies and derivative works.
- However, this document itself may not be modified in any
- way, such as by removing the copyright notice or refer-
- ences to the Internet Society or other Internet organiza-
- tions, except as needed for the purpose of developing
- Internet standards in which case the procedures for copy-
- rights defined in the Internet Standards process must be
- followed, or as required to translate it into languages
- other than English.
-
- The limited permissions granted above are perpetual and
- will not be revoked by the Internet Society or its suc-
- cessors or assigns.
-
- This document and the information contained herein is
- provided on an "AS IS" basis and THE INTERNET SOCIETY AND
- THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WAR-
- RANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
- ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL
- NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MER-
- CHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE."
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day [Page 18]
+++ /dev/null
-\"-----------------------------------------------------------------
-.\" Registers to store heading levels as variables
-.\"-----------------------------------------------------------------
-.nr head1 0 1
-.nr head2 0 1
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-
-.\"-----------------------------------------------------------------
-.\" Return to header level 1, 2, etc.
-.\" resets the level registers and indent
-.\"-----------------------------------------------------------------
-.de RETURN_HDR_1
-.nr head2 0 1
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_1 \\$1
-..
-
-.de RETURN_HDR_2
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_2 \\$1
-..
-
-.de RETURN_HDR_3
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_3 \\$1
-..
-
-.de RETURN_HDR_4
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_4 \\$1
-..
-
-.de RETURN_HDR_5
-.nr head6 0 1
-.in 0
-\.HDR_5 \\$1
-..
-
-.\"-----------------------------------------------------------------
-.\" Create a level 1, 2, etc,. heading
-.\" resets indent, creates a TOC entry
-.\" Parameter is the title of the heading
-.\"-----------------------------------------------------------------
-.de HDR_1
-.sp 1
-.in 0
-\\n+[head1]\\ \\$1
-.XS
-\\n[head1]\\ \\$1
-.XE
-.in 3
-..
-
-
-.de HDR_2
-.sp 1
-.in 0
-\\n[head1]\\.\\n+[head2]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_3
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n+[head3]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_4
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n+[head4]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_5
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n+[head5]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_6
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\.\\n+[head6]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\.\\n[head6]\\ \\$1
-.in 3
-.XE
-..
-
-.\"-----------------------------------------------------------------
-.\" END MACRO DEFINITIONS
-.\"-----------------------------------------------------------------
-
-.pl 10.5i
-.po 0
-.ll 7.2i
-.lt 7.2i
-.nr LL 7.2i
-.nr LT 7.2i
-.ds LH Internet Draft
-.ds CH SLP Signature Extension
-.ds RH April 2003
-.ds LF Day, McDonald
-.ds CF Expires: \n(dy September 2003
-.ds RF FORMFEED[Page %]
-.hy 0
-.ad l
-.de NS
-.ne 4
-.ti 0
-..
-
-
-Internet Engineering Task Force Michael Day
-INTERNET DRAFT IBM
- Ira McDonald
-[Target Category: Experimental] High North
-\n(dy April 2003 Expires in Six Months
-
-.ce 1000
-Signature Extension for Service Location Protocol v2
-draft-day-svrloc-signature-00.txt
-.ce 0
-.sp 5
-
-.in 0
-Status of This Memo
-.in 3
-This document is an Internet-Draft and is subject to
-all provisions of Section 10 of RFC2026.
-
-Internet-Drafts are working documents of the Internet Engineering
-Task Force (IETF), its areas, and its working groups. Note that
-other groups may also distribute working documents as
-Internet-Drafts.
-
-Internet-Drafts are draft documents valid for a maximum of six
-months and may be updated, replaced, or obsoleted by other
-documents at any time. It is inappropriate to use Internet-
-Drafts as reference material or to cite them other than as
-"work in progress."
-
-The list of current Internet-Drafts can be accessed at
-http://www.ietf.org/1id-abstracts.html
-
-The list of Internet-Draft Shadow Directories can be accessed at
-http://www.ietf.org/shadow.html
-
-This document is an individual contribution to the Internet
-Engineering Task Force (IETF). Comments should be submitted to the
-srvloc@srvloc.org mailing list.
-
-Distribution of this memo is unlimited.
-
-.bp
-.HDR_1 Introduction
-
-The Service Location Protocol [rfc2608bis] provides a scalable
-framework for the discovery and selection of network services. Using
-this protocol, computers using the Internet need little or no static
-configuration of network services for network based applications.
-
-SLP recommends the use of IPSec Authentication Headers [AH] for
-authenticating service information. It also recommends the use of
-the IPSec Encapsulating Security Payload [ESP] for causing SLP
-exchanges to be private.
-
-An addition to [rfc2608bis], the internet-draft "Upgrading to TLS
-Within Service Location Protocol" (work in progress) [TLS] also
-specifies a method for upgrading TCP connections to be encrypted.
-
-The security discussion in section 15 of [rfcs608bis] enumerates the
-security implications of using SLP for the discovery and selection of
-network services. IPSec SHOULD be used in the manner described
-whenever possible.
-
-.KS
-There are some situations where the use of IPSEC is not an option for
-SLP. These include
-
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-SLP is being transported by a protocol stack other than IP. This point
-includes the case where SLP is publishing information about a service
-that is accessible only via non-IP media.
-.IP \n+[step].
-The SLP agent is running on a platform for which IPSec
-has not been implemented, such as an embedded system.
-.IP \n+[step].
-SLP is being used within an application model that does not have an
-affinity with IPSec security associations, such as with a high-latency
-store-and-forward protocol or a many-to-one fanout engine.
-.KE
-.RE
-.in 3
-
-When using SLP in environments where IPSec AH is not avialable
-it is still desirable to provide a means to authenticate SLP
-messages. This document describes an optional SLP protocol extension
-for the generation and verification of signatures of SLP messages. It
-uses the Crytographic Message Syntax [CMS] as the signature format.
-
-.HDR_1 Applicability\ Statement
-
-This extension SHOULD NOT be used with SLP when IPSec Authentication
-Headers [AH] are available for use. IPSec Authentication Headers
-SHOULD be used to authenticate SLP messages whenever possible, as
-outlined in [rfc2608bis].
-
-When there is an acceptable mechanism for managing public keys in
-place and when IPSec Authentication Headers are not available for use,
-the signature extension MAY be used to authenticate SLP
-messages.
-
-This extension is based upon the Cryptographic Message Syntax
-[CMS]. CMS requires distribution of key material to occur but does not
-specify how keys should be distributed. CMS supports different Public
-Key algorithms and the use of Public Key Certificates. There are many
-ways to distribute Certificates and other key material, and [CMS]
-states that "The recipient MAY obtain the correct public key for the
-signer by any means." Further, [CMS] states:
-
-.in 5
-"[CMS] supports a wide variety of architectures for certificate-based
-key management, such as the one defined by the PKIX working group. [PROFILE]."
-
-.in 3
-The selection and implementation of a public-key infrastructure is
-beyond the scope of this document.
-
-Assuming private keys are secret, the signature extension can provide
-assurance that SLP messages originate from the purported host and that
-they have not been modified in transit to the receiving host.
-
-.HDR_2 Use\ with\ DAs
-
-All SLP message are request-response tuples, even when using
-multicast or broadcast. The signature extension works for direct
-exchanges between two SLP agents. In such a case, the sender of an SLP
-message signs that message and the receiver verifies the signature.
-
-When using DAs, SLP transactions can involve three SLP agents and two
-request-response tuples. For example, an SA registers service
-information with a DA. Later, a UA requests that service information
-from the DA.
-
-In this case the UA and SA do not transact directly with each other
-and, therefore, cannot derive mutual trust through the direct exchange
-of signed messages. Instead, they communicate indirectly through the
-DA.
-
-Through administration of a public key infrastructure associative
-trust between the UA and SA may be achieved through the DA. For this
-to be achievable, the UA, SA, and DA must be configured with the same
-root certificate authority, and must also be configured to reject SLP
-signature extensions signed by a public key outside of the root of
-trust. When this is the case, a UA and SA can derive associative trust
-indirectly through signed messages via the DA.
-
-.bp
-.HDR_2 Use\ with\ SLP\ Messages
-
-The signature extension MAY be used with any SLP message.
-
-.RETURN_HDR_1 Signature\ Extension\ Format
-
-The Signature Extension comprises an envelope for a Cryptographic
-Message Syntax signed-data content type. (See section 5.1 of [CMS].)
-
-.KS
-.HDR_2 Signature\ Extension\ Fields
-
-The Signature Extension has the following format:
-.DS L
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Extension ID = 0x000? |Next Ext. Offset (must be zero)|
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Offset, contd.| CMS signed-data \\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-.DE
-.KE
-.HDR_3 CMS\ signed-data\ Field
-
-The CMS signed-data field contains the signature of the SLP message
-and accompanying data. The format for the signed-data field is
-outlined in section 5.1 of [CMS]. It is a BER-encoded [X.209-88]
-buffer that may include at least the following information:
-
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-Version of the CMS used to sign the message data.
-.IP \n+[step].
-Algorithms used to generate and sign the message digest.
-.IP \n+[step].
-Signed content, which includes a digest of the message data.
-.IP \n+[step].
-Optional Signer information, which may include Public-Key
-Certificates. Signer attributes are subject to additional encoding
-rules.
-.RE
-.in 3
-
-The list above is generalized. For example, if the signed-data field
-contains variable-length attribute data that data must use special
-additional rules. See [CMS] for precise details.
-.bp
-.HDR_3 Size\ of\ signed-data\ Field
-
-There is a paradox involving the size of the signed-data field and the
-generation of the signed message digest.
-
-The SLP header MUST be included in the input for the message digest
-contained in the signed-data field. Because the SLP Header includes a
-length field, the length of the message including the signature
-extension must be part of the input into the message digest contained
-in the signature extension.
-
-The message digest and the signature of the message digest are
-fixed-length fields and their length is known prior to generating the
-signed digest. This makes it straightforward to calculate the length
-of the SLP message, initialize the length field in the SLP header, and
-then generate the signed message digest.
-
-.HDR_2 Contents\ of\ signed-data\ Field
-
-The CMS provides considerable flexibility when generating signed-data
-content. For example, it allows multiple signers and multiple
-signatures. It also allows a variable number and type of signer
-attributes including certificates.
-
-To be consistent with the goals of SLP UAs and SAs SHOULD keep the
-signed-data field as simple as possible when generating signature
-extensions. A simple signed-data field with only a message digest, a
-signature of the message digest, and a subject key identifier makes a
-prior calculation of the signed-data length simple and ensures that
-generating and verifying signatures of SLP messages requires the
-smallest possible overhead.
-
-A signed-data field that contains only a signed message digest and a
-subject key identifier can fit easily within the datagram MTU of most
-network environments and does not represent an unusual field size relative to
-other SLP fields. However, embellishing the signed-data with
-additional variable length attributes may quickly cause the SLP
-message to exceed the datagram MTU.
-
-.HDR_2 Omission\ of\ eContent
-
-The CMS referrs to the data being signed for authentication as
-"eContent." In this case, the eContent is an SLP Message minus the
-signature extension.
-
-The CMS allows signed content to be either encapsulated within a
-signed-data "envelope" or "external." The signature extension requires
-the eContent to be "external."
-.KS
-To quote from section 5.2 of [CMS]:
-
-.in 5
-The optional omission of the eContent within the
-EncapsulatedContentInfo field makes it possible to construct
-"external signatures." In the case of external signatures, the
-content being signed is absent from the EncapsulatedContentInfo value
-included in the signed-data content type. If the eContent value
-within EncapsulatedContentInfo is absent, then the signatureValue is
-calculated and the eContentType is assigned as though the eContent
-value was present.
-.KE
-.in 3
-
-In other words, the signed-data field will always contain a signed
-digest of the SLP message but not the SLP message itself.
-
-.RETURN_HDR_1 Use\ of\ the\ Signature\ Extension
-
-Subject to the applicability guidelines in section 2 above, the
-Signature extension can provide additional security to SLP by
-authenticating the content SLP messages, including other SLP
-extensions. It cannot provide privacy and it cannot authenticate the
-origin of IP messages. IPSec [AH] is required to authenticate IP headers.
-
-.HDR_2 Input\ to\ signed-data\ Field
-
-When generating a signature extension for an SLP message, the
-following data MUST be used as input to the message digest:
-
-.KS
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-SLP Header and message.
-.IP \n+[step].
-Any SLP extension up to but not including the signature extension.
-.IP \n+[step].
-The Signature extension MUST be the last extension present in an SLP message.
-.KE
-.RE
-.in 3
-.KS
-.HDR_3 Calculating\ the\ Length\ of\ a\ Signed\ SLP\ Message
-
-The following steps should be used to calculate the length of an SLP
-message that includes the signature extension.
-
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-Determine the length of the signature extension. The signature
-extension will always be 6 bytes larger than the size of the CMS
-signed-data field. If the signed-data field will contain any variable
-length data such as signer attributes it will be necessary to encode
-the signed-data field using a dummy message digest and signature to
-obtain its length.
-.IP \n+[step].
-Determine the length of the SLP message, including the length of the
-signature extension and all preceeding extensions.
-.IP \n+[step].
-Initialize the SLP Header with the length of the message.
-.RE
-.in 3
-.KE
-
-.RETURN_HDR_2 Signature\ Generation\ Process
-
-The details of generating signatures for a CMS signed-data field are
-contained in [CMS] sections 5.4 and 5.5. The following is an overview
-for using CMS signed-data in the SLP signature extension. The details
-for performing the individual steps are covered in [CMS].
-
-.KS
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-Generate a message digest of the SLP message beginning with the first
-byte of the SLP Header up to and including the last byte of the
-message and extensions not including the signature extension. Note that if CMS signed
-attributes are to be included in the signed-data field they too must
-be input to the message digest. See [CMS] for details.
-.IP \n+[step].
-Generate a signature of the digest from step 1. The input to the
-signature is the digest and the signer's private key.
-.RE
-.KE
-.in 3
-.KS
-.HDR_2 Signature\ Verification\ Process
-
-The details of verifying signatures for a CMS signed-data field are
-contained in [CMS] section 5.6. The following is an overview for
-verifying signatures in CMS signed-data fields within an SLP signature
-extension.
-
-.nr PI 5
-.RS
-.nr step 1 1
-.IP \n[step]. 3
-Generate a message digest exactly as in step [1] in section 4.2
-above.
-.IP \n+[step].
-The signer's public key must be obtained separately.
-.IP \n+[step].
-The input to the signature verification step is the
-digest generated in step 1 and the signers public key. The details
-depend upon the exact signature algorithm employed but generally include
-encrypting the locally generated digest with the signers
-public key and comparing the result to the signature contained in the
-message.
-.RE
-.KE
-.in 3
-
-.HDR_1 Acknowledgements
-
-James Kempf was instrumental in the development of this document.
-Erik Guttman contributed the basic theory of using
-digital signatures with SLP and offered valuable insights
-during the preparation of this document.
-.
-.HDR_1 References
-
-.IP [rfc2608bis] 3
-Guttman, E., Kempf, J., Service Location Protocol, Version 2 (work in
-progress). draft-guttman-svrloc-rfc2608bis-03.txt, August 2002.
-
-.IP [TLS] 3
-McDonald, Ira, Kempf, J., Day, M., "Upgrading to TLS With
-Service Location Protocol", draft-mcdonald-svrloc-tls-00.txt (work in
-progress).
-
-.IP [AH] 3
-Kent, S., and Atkinson, R., "IP Authentication Header," RFC
-2402, November, 1998.
-.IP [ESP] 3
-Kent, S., and Atkinson, R., "IP Encapsulating Security Payload
-(ESP)," RFC 2406, November, 1998.
-.IP [CMS] 3
-Housely, R., "Cryptographic Message Syntax", RFC 3369, August, 2002.
-
-.IP [PROFILE] 3
-Housley, R., Polk, W., Ford, W. and D. Solo, "Internet
-X.509 Public Key Infrastructure: Certificate and CRL
-rofile", RFC 3280, April 2002.
-.IP [X.209-88] 3
-CCITT. Recommendation X.209: Specification of Basic
-Encoding Rules for Abstract Syntax Notation One (ASN.1).
-1988.
-
-.KS
-.HDR_1 Author's\ Contact\ Information
-
-Michael Day
-IBM
-3039 Cornwallis Road
-Research Triangle Park, NC 27709
-USA
-Phone: +1 919 543-4283
-Email: mdday@us.ibm.com
-
-Ira McDonald
-High North Inc
-221 Ridge Ave
-Grand Marais, MI 49839
-USA
-Phone: +1 906 494-2434
-Email: imcdonald@sharplabs.com
-.KE
-
-.HDR_1 Full\ Copyright\ Statement
-
-Copyright (C) The Internet Society (2000-2002). All Rights Reserved.
-
-This document and translations of it may be copied and furnished to
-others, and derivative works that comment on or otherwise explain it
-or assist in its implementation may be prepared, copied, published and
-distributed, in whole or in part, without restriction of any kind,
-provided that the above copyright notice and this paragraph are
-included on all such copies and derivative works. However, this
-document itself may not be modified in any way, such as by removing
-the copyright notice or references to the Internet Society or other
-Internet organizations, except as needed for the purpose of developing
-Internet standards in which case the procedures for copyrights defined
-in the Internet Standards process must be followed, or as required to
-translate it into languages other than English.
-
-The limited permissions granted above are perpetual and will not be
-revoked by the Internet Society or its successors or assigns.
-
-This document and the information contained herein is provided on an
-"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
-TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
-NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN
-WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE."
-
-
-.TC
+++ /dev/null
-
-
-Internet Engineering Task Force Michael Day
-INTERNET DRAFT IBM
- Ira McDonald
-[Target Category: Experimental] High North
-25 April 2003 Expires in Six Months
-
- Signature Extension for Service Location Protocol v2
- draft-day-svrloc-signature-00.txt
-
-
-
-
-
-
-Status of This Memo
- This document is an Internet-Draft and is subject to all provisions
- of Section 10 of RFC2026.
-
- Internet-Drafts are working documents of the Internet Engineering
- Task Force (IETF), its areas, and its working groups. Note that
- other groups may also distribute working documents as Internet-
- Drafts.
-
- Internet-Drafts are draft documents valid for a maximum of six months
- and may be updated, replaced, or obsoleted by other documents at any
- time. It is inappropriate to use Internet- Drafts as reference
- material or to cite them other than as "work in progress."
-
- The list of current Internet-Drafts can be accessed at
- http://www.ietf.org/1id-abstracts.html
-
- The list of Internet-Draft Shadow Directories can be accessed at
- http://www.ietf.org/shadow.html
-
- This document is an individual contribution to the Internet
- Engineering Task Force (IETF). Comments should be submitted to the
- srvloc@srvloc.org mailing list.
-
- Distribution of this memo is unlimited.
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day Expires: 25 August 2003 [Page i]
-\f
-Internet Draft SLP Signature Extension April 2003
-
- Table of Contents
-
-
- 1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
- 2 Applicability Statement . . . . . . . . . . . . . . . . . . . 2
- 2.1 Use with DAs . . . . . . . . . . . . . . . . . . . . . . . . 3
- 2.2 Use with SLP Messages . . . . . . . . . . . . . . . . . . . . 4
- 3 Signature Extension Format . . . . . . . . . . . . . . . . . . 4
- 3.1 Signature Extension Fields . . . . . . . . . . . . . . . . . 4
- 3.1.1 CMS signed-data Field . . . . . . . . . . . . . . . . . . . 4
- 3.1.2 Size of signed-data Field . . . . . . . . . . . . . . . . . 5
- 3.2 Contents of signed-data Field . . . . . . . . . . . . . . . . 5
- 3.3 Omission of eContent . . . . . . . . . . . . . . . . . . . . 5
- 4 Use of the Signature Extension . . . . . . . . . . . . . . . . 6
- 4.1 Input to signed-data Field . . . . . . . . . . . . . . . . . 6
- 4.1.1 Calculating the Length of a Signed SLP Message . . . . . . 6
- 4.2 Signature Generation Process . . . . . . . . . . . . . . . . 7
- 4.3 Signature Verification Process . . . . . . . . . . . . . . . 7
- 5 Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 8
- 6 References . . . . . . . . . . . . . . . . . . . . . . . . . . 8
- 7 Author's Contact Information . . . . . . . . . . . . . . . . . 9
- 8 Full Copyright Statement . . . . . . . . . . . . . . . . . . . 9
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day Expires: 25 August 2003 [Page 1]
-\f
-Internet Draft SLP Signature Extension April 2003
-
-
-1 Introduction
-
- The Service Location Protocol [rfc2608bis] provides a scalable
- framework for the discovery and selection of network services. Using
- this protocol, computers using the Internet need little or no static
- configuration of network services for network based applications.
-
- SLP recommends the use of IPSec Authentication Headers [AH] for
- authenticating service information. It also recommends the use of the
- IPSec Encapsulating Security Payload [ESP] for causing SLP exchanges
- to be private.
-
- An addition to [rfc2608bis], the internet-draft "Upgrading to TLS
- Within Service Location Protocol" (work in progress) [TLS] also
- specifies a method for upgrading TCP connections to be encrypted.
-
- The security discussion in section 15 of [rfcs608bis] enumerates the
- security implications of using SLP for the discovery and selection of
- network services. IPSec SHOULD be used in the manner described
- whenever possible.
-
- There are some situations where the use of IPSEC is not an option for
- SLP. These include
-
-
- 1. SLP is being transported by a protocol stack other than IP. This
- point includes the case where SLP is publishing information
- about a service that is accessible only via non-IP media.
-
- 2. The SLP agent is running on a platform for which IPSec has not
- been implemented, such as an embedded system.
-
- 3. SLP is being used within an application model that does not have
- an affinity with IPSec security associations, such as with a
- high-latency store-and-forward protocol or a many-to-one fanout
- engine.
-
- When using SLP in environments where IPSec AH is not avialable it is
- still desirable to provide a means to authenticate SLP messages. This
- document describes an optional SLP protocol extension for the generaÂ
- tion and verification of signatures of SLP messages. It uses the CryÂ
- tographic Message Syntax [CMS] as the signature format.
-
-
-2 Applicability Statement
-
- This extension SHOULD NOT be used with SLP when IPSec Authentication
- Headers [AH] are available for use. IPSec Authentication Headers
- SHOULD be used to authenticate SLP messages whenever possible, as
- outlined in [rfc2608bis].
-
-
-
-Day Expires: 25 August 2003 [Page 2]
-\f
-Internet Draft SLP Signature Extension April 2003
-
-
- When there is an acceptable mechanism for managing public keys in
- place and when IPSec Authentication Headers are not available for
- use, the signature extension MAY be used to authenticate SLP mesÂ
- sages.
-
- This extension is based upon the Cryptographic Message Syntax [CMS].
- CMS requires distribution of key material to occur but does not specÂ
- ify how keys should be distributed. CMS supports different Public Key
- algorithms and the use of Public Key Certificates. There are many
- ways to distribute Certificates and other key material, and [CMS]
- states that "The recipient MAY obtain the correct public key for the
- signer by any means." Further, [CMS] states:
-
- "[CMS] supports a wide variety of architectures for certificate-
- based key management, such as the one defined by the PKIX working
- group. [PROFILE]."
-
- The selection and implementation of a public-key infrastructure is
- beyond the scope of this document.
-
- Assuming private keys are secret, the signature extension can provide
- assurance that SLP messages originate from the purported host and
- that they have not been modified in transit to the receiving host.
-
-
-2.1 Use with DAs
-
- All SLP message are request-response tuples, even when using multiÂ
- cast or broadcast. The signature extension works for direct exchanges
- between two SLP agents. In such a case, the sender of an SLP message
- signs that message and the receiver verifies the signature.
-
- When using DAs, SLP transactions can involve three SLP agents and two
- request-response tuples. For example, an SA registers service inforÂ
- mation with a DA. Later, a UA requests that service information from
- the DA.
-
- In this case the UA and SA do not transact directly with each other
- and, therefore, cannot derive mutual trust through the direct
- exchange of signed messages. Instead, they communicate indirectly
- through the DA.
-
- Through administration of a public key infrastructure associative
- trust between the UA and SA may be achieved through the DA. For this
- to be achievable, the UA, SA, and DA must be configured with the same
- root certificate authority, and must also be configured to reject SLP
- signature extensions signed by a public key outside of the root of
- trust. When this is the case, a UA and SA can derive associative
- trust indirectly through signed messages via the DA.
-
-
-
-
-Day Expires: 25 August 2003 [Page 3]
-\f
-Internet Draft SLP Signature Extension April 2003
-
-
-2.2 Use with SLP Messages
-
- The signature extension MAY be used with any SLP message.
-
-
-3 Signature Extension Format
-
- The Signature Extension comprises an envelope for a Cryptographic
- Message Syntax signed-data content type. (See section 5.1 of [CMS].)
-
-
-3.1 Signature Extension Fields
-
- The Signature Extension has the following format:
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Extension ID = 0x000? |Next Ext. Offset (must be zero)|
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Offset, contd.| CMS signed-data \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-
-3.1.1 CMS signed-data Field
-
- The CMS signed-data field contains the signature of the SLP message
- and accompanying data. The format for the signed-data field is outÂ
- lined in section 5.1 of [CMS]. It is a BER-encoded [X.209-88] buffer
- that may include at least the following information:
-
-
- 1. Version of the CMS used to sign the message data.
-
- 2. Algorithms used to generate and sign the message digest.
-
- 3. Signed content, which includes a digest of the message data.
-
- 4.
- Optional Signer information, which may include Public-Key CerÂ
- tificates. Signer attributes are subject to additional encoding
- rules.
-
- The list above is generalized. For example, if the signed-data field
- contains variable-length attribute data that data must use special
- additional rules. See [CMS] for precise details.
-
-
-
-
-
-
-
-Day Expires: 25 August 2003 [Page 4]
-\f
-Internet Draft SLP Signature Extension April 2003
-
-
-3.1.2 Size of signed-data Field
-
- There is a paradox involving the size of the signed-data field and
- the generation of the signed message digest.
-
- The SLP header MUST be included in the input for the message digest
- contained in the signed-data field. Because the SLP Header includes a
- length field, the length of the message including the signature
- extension must be part of the input into the message digest contained
- in the signature extension.
-
- The message digest and the signature of the message digest are fixed-
- length fields and their length is known prior to generating the
- signed digest. This makes it straightforward to calculate the length
- of the SLP message, initialize the length field in the SLP header,
- and then generate the signed message digest.
-
-
-3.2 Contents of signed-data Field
-
- The CMS provides considerable flexibility when generating signed-data
- content. For example, it allows multiple signers and multiple signaÂ
- tures. It also allows a variable number and type of signer attributes
- including certificates.
-
- To be consistent with the goals of SLP UAs and SAs SHOULD keep the
- signed-data field as simple as possible when generating signature
- extensions. A simple signed-data field with only a message digest, a
- signature of the message digest, and a subject key identifier makes a
- prior calculation of the signed-data length simple and ensures that
- generating and verifying signatures of SLP messages requires the
- smallest possible overhead.
-
- A signed-data field that contains only a signed message digest and a
- subject key identifier can fit easily within the datagram MTU of most
- network environments and does not represent an unusual field size
- relative to other SLP fields. However, embellishing the signed-data
- with additional variable length attributes may quickly cause the SLP
- message to exceed the datagram MTU.
-
-
-3.3 Omission of eContent
-
- The CMS referrs to the data being signed for authentication as "eConÂ
- tent." In this case, the eContent is an SLP Message minus the signaÂ
- ture extension.
-
- The CMS allows signed content to be either encapsulated within a
- signed-data "envelope" or "external." The signature extension
- requires the eContent to be "external."
-
-
-
-Day Expires: 25 August 2003 [Page 5]
-\f
-Internet Draft SLP Signature Extension April 2003
-
-
- To quote from section 5.2 of [CMS]:
-
- The optional omission of the eContent within the EncapsulatedConÂ
- tentInfo field makes it possible to construct "external signaÂ
- tures." In the case of external signatures, the content being
- signed is absent from the EncapsulatedContentInfo value included in
- the signed-data content type. If the eContent value within EncapÂ
- sulatedContentInfo is absent, then the signatureValue is calculated
- and the eContentType is assigned as though the eContent value was
- present.
-
- In other words, the signed-data field will always contain a signed
- digest of the SLP message but not the SLP message itself.
-
-
-4 Use of the Signature Extension
-
- Subject to the applicability guidelines in section 2 above, the SigÂ
- nature extension can provide additional security to SLP by authentiÂ
- cating the content SLP messages, including other SLP extensions. It
- cannot provide privacy and it cannot authenticate the origin of IP
- messages. IPSec [AH] is required to authenticate IP headers.
-
-
-4.1 Input to signed-data Field
-
- When generating a signature extension for an SLP message, the followÂ
- ing data MUST be used as input to the message digest:
-
-
- 1. SLP Header and message.
-
- 2. Any SLP extension up to but not including the signature extenÂ
- sion.
-
- 3. The Signature extension MUST be the last extension present in an
- SLP message.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day Expires: 25 August 2003 [Page 6]
-\f
-Internet Draft SLP Signature Extension April 2003
-
-
-4.1.1 Calculating the Length of a Signed SLP Message
-
- The following steps should be used to calculate the length of an SLP
- message that includes the signature extension.
-
-
- 1. Determine the length of the signature extension. The signature
- extension will always be 6 bytes larger than the size of the CMS
- signed-data field. If the signed-data field will contain any
- variable length data such as signer attributes it will be necesÂ
- sary to encode the signed-data field using a dummy message
- digest and signature to obtain its length.
-
- 2. Determine the length of the SLP message, including the length of
- the signature extension and all preceeding extensions.
-
- 3. Initialize the SLP Header with the length of the message.
-
-
-4.2 Signature Generation Process
-
- The details of generating signatures for a CMS signed-data field are
- contained in [CMS] sections 5.4 and 5.5. The following is an overview
- for using CMS signed-data in the SLP signature extension. The details
- for performing the individual steps are covered in [CMS].
-
-
- 1. Generate a message digest of the SLP message beginning with the
- first byte of the SLP Header up to and including the last byte
- of the message and extensions not including the signature extenÂ
- sion. Note that if CMS signed attributes are to be included in
- the signed-data field they too must be input to the message
- digest. See [CMS] for details.
-
- 2. Generate a signature of the digest from step 1. The input to the
- signature is the digest and the signer's private key.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day Expires: 25 August 2003 [Page 7]
-\f
-Internet Draft SLP Signature Extension April 2003
-
-
-4.3 Signature Verification Process
-
- The details of verifying signatures for a CMS signed-data field are
- contained in [CMS] section 5.6. The following is an overview for verÂ
- ifying signatures in CMS signed-data fields within an SLP signature
- extension.
-
-
- 1. Generate a message digest exactly as in step [1] in section 4.2
- above.
-
- 2. The signer's public key must be obtained separately.
-
- 3. The input to the signature verification step is the digest genÂ
- erated in step 1 and the signers public key. The details depend
- upon the exact signature algorithm employed but generally
- include encrypting the locally generated digest with the signers
- public key and comparing the result to the signature contained
- in the message.
-
-
-5 Acknowledgements
-
- James Kempf was instrumental in the development of this document.
- Erik Guttman contributed the basic theory of using digital signatures
- with SLP and offered valuable insights during the preparation of this
- document.
-
-6 References
-
-
-[rfc2608bis]
- Guttman, E., Kempf, J., Service Location Protocol, Version 2 (work in
- progress). draft-guttman-svrloc-rfc2608bis-03.txt, August 2002.
-
-
-[TLS]
- McDonald, Ira, Kempf, J., Day, M., "Upgrading to TLS With Service
- Location Protocol", draft-mcdonald-svrloc-tls-00.txt (work in
- progress).
-
-
-[AH]
- Kent, S., and Atkinson, R., "IP Authentication Header," RFC 2402,
- November, 1998.
-
-[ESP]
- Kent, S., and Atkinson, R., "IP Encapsulating Security Payload
- (ESP)," RFC 2406, November, 1998.
-
-
-
-
-Day Expires: 25 August 2003 [Page 8]
-\f
-Internet Draft SLP Signature Extension April 2003
-
-
-[CMS]
- Housely, R., "Cryptographic Message Syntax", RFC 3369, August, 2002.
-
-
-[PROFILE]
- Housley, R., Polk, W., Ford, W. and D. Solo, "Internet X.509 Public
- Key Infrastructure: Certificate and CRL rofile", RFC 3280, April
- 2002.
-
-[X.209-88]
- CCITT. Recommendation X.209: Specification of Basic Encoding Rules
- for Abstract Syntax Notation One (ASN.1). 1988.
-
-
-7 Author's Contact Information
-
- Michael Day IBM 3039 Cornwallis Road Research Triangle Park, NC 27709
- USA Phone: +1 919 543-4283 Email: mdday@us.ibm.com
-
- Ira McDonald High North Inc 221 Ridge Ave Grand Marais, MI 49839 USA
- Phone: +1 906 494-2434 Email: imcdonald@sharplabs.com
-
-
-8 Full Copyright Statement
-
- Copyright (C) The Internet Society (2000-2002). All Rights Reserved.
-
- This document and translations of it may be copied and furnished to
- others, and derivative works that comment on or otherwise explain it
- or assist in its implementation may be prepared, copied, published
- and distributed, in whole or in part, without restriction of any
- kind, provided that the above copyright notice and this paragraph are
- included on all such copies and derivative works. However, this docÂ
- ument itself may not be modified in any way, such as by removing the
- copyright notice or references to the Internet Society or other
- Internet organizations, except as needed for the purpose of developÂ
- ing Internet standards in which case the procedures for copyrights
- defined in the Internet Standards process must be followed, or as
- required to translate it into languages other than English.
-
- The limited permissions granted above are perpetual and will not be
- revoked by the Internet Society or its successors or assigns.
-
- This document and the information contained herein is provided on an
- "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
- TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
- BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
- HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERÂ
- CHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE."
-
-
-
-
-Day Expires: 25 August 2003 [Page 9]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Day Expires: 25 August 2003 [Page 10]
+++ /dev/null
-.\"-----------------------------------------------------------------
-.\" Registers to store heading levels as variables
-.\"-----------------------------------------------------------------
-.nr head1 0 1
-.nr head2 0 1
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-
-.\"-----------------------------------------------------------------
-.\" Return to header level 1, 2, etc.
-.\" resets the level registers and indent
-.\"-----------------------------------------------------------------
-.de RETURN_HDR_1
-.nr head2 0 1
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_1 \\$1
-..
-
-.de RETURN_HDR_2
-.nr head3 0 1
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_2 \\$1
-..
-
-.de RETURN_HDR_3
-.nr head4 0 1
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_3 \\$1
-..
-
-.de RETURN_HDR_4
-.nr head5 0 1
-.nr head6 0 1
-.in 0
-\.HDR_4 \\$1
-..
-
-.de RETURN_HDR_5
-.nr head6 0 1
-.in 0
-\.HDR_5 \\$1
-..
-
-.\"-----------------------------------------------------------------
-.\" Create a level 1, 2, etc,. heading
-.\" resets indent, creates a TOC entry
-.\" Parameter is the title of the heading
-.\"-----------------------------------------------------------------
-.de HDR_1
-.sp 1
-.in 0
-\\n+[head1]\\ \\$1
-.XS
-\\n[head1]\\ \\$1
-.XE
-.in 3
-..
-
-
-.de HDR_2
-.sp 1
-.in 0
-\\n[head1]\\.\\n+[head2]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_3
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n+[head3]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_4
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n+[head4]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_5
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n+[head5]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\ \\$1
-.XE
-.in 3
-..
-
-.de HDR_6
-.sp 1
-.in 0
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\.\\n+[head6]\\ \\$1
-.XS
-\\n[head1]\\.\\n[head2]\\.\\n[head3]\\.\\n[head4]\\.\\n[head5]\\.\\n[head6]\\ \\$1
-.in 3
-.XE
-..
-
-.\"-----------------------------------------------------------------
-.\" END MACRO DEFINITIONS
-.\"-----------------------------------------------------------------
-
-.pl 58
-.po 0
-.ll 72
-.lt 72
-.ds LF Day
-.ds RF FORMFEED[Page %]^
-.ds CF
-.ds LH INTERNET DRAFT
-.ds CH SLP Signature Extension
-.ds RH Exp. July 2003
-.hy 0
-.ad l
-.in 0
-
-
-Internet Engineering Task Force Michael Day
-INTERNET DRAFT IBM
-23 February 2003 Expires in six months
-
-.ce 1000
-Signature Extension for Service Location Protocol v2
-draft-day-svrloc-svrloc-signature-01.txt
-.ce 0
-.sp 5
-
-.in 0
-Status of This Memo
-.in 3
-This document is an Internet-Draft and is subject to
-all provisions of Section 10 of RFC2026.
-
-Internet-Drafts are working documents of the Internet Engineering
-Task Force (IETF), its areas, and its working groups. Note that
-other groups may also distribute working documents as
-Internet-Drafts.
-
-Internet-Drafts are draft documents valid for a maximum of six
-months and may be updated, replaced, or obsoleted by other
-documents at any time. It is inappropriate to use Internet-
-Drafts as reference material or to cite them other than as
-"work in progress."
-
-The list of current Internet-Drafts can be accessed at
-http://www.ietf.org/1id-abstracts.html
-
-The list of Internet-Draft Shadow Directories can be accessed at
-http://www.ietf.org/shadow.html
-
-This document is an individual contribution to the Internet
-Engineering Task Force (IETF). Comments should be submitted to the
-srvloc@srvloc.org mailing list.
-
-Distribution of this memo is unlimited.
-
-.bp .HDR_1 Introduction
-
-The Service Location Protocol, Version 2 [rfc2608bis] provides a
-flexible and scalable framework for provisioning network nodes with
-information on the existence, location, and configuration of networked
-services.
-
-[rfc2608bis] recommends using [IPSEC] to provide authentication and
-privacy to SLP messages, transported either upon UDP or TCP. [IPSEC]
-SHOULD be used with SLP.
-
-This document outlines optional protocol extensions that MAY be used
-for authenticating SLP messages when [IPSEC] is not available in the
-environment.
-
-As with all SLP protocol extensions, support for the signature
-extension is OPTIONAL and cannot be assumed present in the
-computing environment.
-
-.HDR_2 Need\ for\ Authentication\ of\ SLP\ Messages
-
-[rfc2608] outlines the need for authentication of SLP messages in
-section 15.
-
-.KS
-.HDR_1 References
-
-.IP [rfc2608bis] 3
-Guttman, E., Kempf, J., "Service Location Protocol,
-Version 2", draft-guttman-svrloc-rfc2608bis-03.txt
-http://srvloc.sourceforge.net/new_drafts/draft-guttman-svrloc-rfc2608bis-03.txt
-
-.IP [IPSEC] 3
-Kent, S., and Atkinson, R., "Security Architecture for the
-Internet Protocol," RFC 2401, November, 1998.
-
-.KE
+++ /dev/null
-
-
-Internet Engineering Task Force Erik Guttman
-INTERNET DRAFT James Kempf
-Category: Standards Track
-Obsoletes: 2608
-August 4, 2002
-
-
- Service Location Protocol, Version 2
- <draft-guttman-svrloc-rfc2608bis-03.txt>
-
-Status of this Memo
-
- This document is an Internet-Draft and is in full conformance with
- all provisions of Section 10 of RFC2026.
-
- Comments on this document should be sent to the SLP discussion list,
- srvloc-discuss@lists.sourceforge.net.
-
- Internet-Drafts are draft documents of the Internet Engineering Task
- valid for a maximum of six months and may be updated, replaced, or
- obsoleted by other documents at any time. It is inappropriate to use
- Internet-Drafts as reference material or to cite them other than as
- "work in progress." See http://www.ietf.org/ietf/1id-abstracts.txt.
- Find shadow directories at http://www.ietf.org/shadow.html.
-
- Copyright (C) The Internet Society (2001). All Rights Reserved.
-
-Abstract
-
- The Service Location Protocol provides a scalable framework for the
- discovery and selection of network services. Using this protocol,
- computers using the Internet need little or no static configuration
- of network services for network based applications. This is
- especially important as computers become more portable, and users
- less tolerant or able to fulfill the demands of network system
- administration. This document updates SLPv2, adding clarifications
- and removing features which were neither widely implemented or deemed
- useful.
-
-Acknowledgements
-
- Authors of previous versions of SLP listed alphabetically are Mike
- Day, Erik Guttman, Scott Kaplan, Charles Perkins and John Veizades.
- Contributors to this version include (in alphabetical order) Kevin
- Arnold, Erik Guttman, Evan Hughes, Terry Lambert, Jim Mayer, Ira
- McDonald, Mikael Pahmp, Matt Peterson and Weibin Zhao.
-
-1. Introduction
-
- The Service Location Protocol (SLP) provides a flexible and scalable
- framework for provisioning network nodes with information on the
-
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 1]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- existence, location, and configuration of networked services. Users
- have had to manually configure the location of services by typing in
- their domain names or IP addresses. SLP eliminates this requirement:
- the user supplies the desired type of service and a set of attributes
- that describe the service. Based on that description, SLP returns
- all required information to communicate with the service.
-
- SLP is a dynamic configuration mechanism for applications in networks
- under a common administration. Client applications using SLP may
- find available services offered by hosts attached on any network
- within an enterprise.
-
- This document obsoletes SLPv2 [RFC2608], correcting protocol errors
- and removing some requirements. A separate SLPv2 applicability
- statement [SLPv2AS] describes both the protocol's domain of
- applicability as well as the interoperability of this specification
- with prior versions of the protocol.
-
-2. Terminology and Conventions used in this Document
-
- Attribute
- An Attribute consists of a tag and a list of typed values. An
- Attribute without a value list, called a "keyword" attribute, may
- also appear. Attributes are used to describe instances of a
- service type.
-
- Directory Agent (DA)
- A network element that collects and caches service advertisements.
- There can only be one DA present per host.
-
- Directory Agent (DA) Service Type
- The Directory Agent Service Type is the service type
- "service:directory-agent". It is used to discover DAs.
-
- Naming Authority
- The agency or group that catalogues Service Types and Attributes.
- The default Naming Authority is IANA. Except for the default
- Naming Authority, requires not describing string, a Naming
- Authority is described by a short string.
-
- Network Element
- A software process capable of network communication.
-
- Scope
- A named collection of service advertisements, making up a logical
- administrative group.
-
- Service Advertisement
- The set consisting of a Service Type, a Service URL, a list of
- Scopes, a Language Tag, a List of Attributes and a lifetime,
- indicating how long the advertisement is valid. This set serves to
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 2]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- describe the service and provide information on its location,
- availability, and language locale.
-
- Service Agent (SA)
- A network element working on the behalf of services to advertise
- them.
-
- Service Agent (SA) Service Type
- The Service Agent Service Type is the service type
- "service:service-agent". It is used to discover and advertise SAs.
-
- Service Template
- A structured description of a service, including the Service Type,
- Service URL, and Attributes. See [RFC2609].
-
- Service Type
- A short string describing the service. Each type of service has a
- unique Service Type string. The default service type for a
- 'generic' URI is its scheme name. For example, the service type
- string for "http://www.srvloc.org" is "http".
-
- Service URL
- A Service URL serves two functions in SLP. First, it is a handle
- to refer to a service advertisement, for purposes of registration,
- deregistration or requesting associated attributes. Second, the
- Service URL may indicate the location of a service. A service URL
- may be of the service: scheme [RFC2609] or any other scheme
- conforming to the URI standard [RFC2396].
-
- User Agent (UA)
- A network element working on the user's behalf to establish
- contact with some service. The UA retrieves service information
- from the Service Agents (SAs) or DAs.
-
- The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
- "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" and "OPTIONAL" in this
- document are to be interpreted as described in [RFC2119].
-
- In packet diagrams, an explicit length field may be followed by a
- variable length field. Variable length fields are terminated by a
- backslash ('\'). Fields are not aligned to 4 byte boundaries.
-
-3. Protocol Overview
-
- In SLP, service discovery support for a client application is
- provided by a UA. Service advertising support for a service is
- provided by an SA. A third network element, the DA, provides
- scalability to the protocol.
-
- To discover a service using SLP, the UA MUST issue a Service Request
- (SrvRqst) on behalf of a client application. The SrvRqst specifies
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 3]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- the characteristics of a service required by the client. The UA MUST
- receive one or more Service Reply (SrvRply) specifying the location
- of all services in the network that match the conditions supplied in
- the SrvRqst, if the request was successful.
-
- The SLP framework allows a UA to directly issue requests to SAs.
- Such requests SHOULD be multicast. A SA MUST unicast a reply to the
- UA, containing a Service URL and other information, if the SA
- advertises a service matching the request.
-
- +------------+ ----Multicast SrvRqst----> +---------------+
- | User Agent | | Service Agent |
- +------------+ <----Unicast SrvRply------ +---------------+
-
- In larger networks, one or more DAs are used. A DA functions as a
- cache. If DAs are in use, SAs MUST send Service Registration
- (SrvReg) messages, containing all the services they advertise to DAs.
- SAs MUST receive Service Acknowledgements (SrvAck) messages in reply.
- Advertisements registered with DAs MUST be refreshed or they will
- expire, since each advertisement has a finite lifetime. If DAs are
- in use, UAs MUST unicast requests to a DA instead of multicasting.
- Deploying DAs thereby helps reduce the amount of multicast datagrams
- in a network.
-
- +-------+ -Unicast SrvRqst-> +-----------+ <-Unicast SrvReg- +--------+
- | User | | Directory | |Service |
- | Agent | | Agent | | Agent |
- +-------+ <-Unicast SrvRply- +-----------+ -Unicast SrvAck-> +--------+
-
- There are three possible ways for UAs and SAs to discover DAs. In
- each case, the agent obtains a DA Advertisement (DAAdvert):
-
- 1) Issue a multicast SrvRqst for the DA Service Type when they start
- up, and receive a unicast advertisement in reply,
-
- 2) Listen for unsolicited advertisements that are sent periodically
- by Directory Agents,
-
- 3) Obtain Directory Agent addresses via DHCP or static
- configuration, issue a unicast SrvRqst for the Directory Agent
- Service Type, and receive a unicast DAAdvert in reply.
-
- +---------------+ --Multicast SrvRqst-> +-----------+
- | User or | <--Unicast DAAdvert-- | Directory |
- | Service Agent | | Agent |
- +---------------+ <-Multicast DAAdvert- +-----------+
-
- Service advertisements are grouped into named sets called 'scopes'.
- Scope names are expressed as strings. A scope can indicate a
- location, administrative grouping, proximity in a network topology or
- some other category. The mapping between service advertisements and
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 4]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- scopes is at the discretion of the network administrator. SAs and
- DAs MUST be configured with scopes.
-
- A UA MAY be assigned scopes, in which case the UA is only able to
- discover that particular grouping of services. This allows a network
- administrator to assign services to particular groups of users.
- Alternatively, the UA MAY be configured with no scope at all. In
- that case, the UA MUST discover all available scopes and a client
- application may issue requests for any service available on the
- network.
-
- In the following figure, the UA is configured with scopes X and Y. If
- a service is sought in scope X, the request MUST be multicast because
- no DA supports scope X. If a service is sought in scope Y, the
- request MUST be unicast to the DA. If the request is made in both
- scopes, the request MUST be both unicast and multicast.
-
- +---------+ Multicast +-----------+ Unicast +-----------+
- | Service | <--SrvRqst-- | User | --SrvRqst-> | Directory |
- | Agent | | Agent | | Agent |
- | Scope=X | Unicast | Scope=X,Y | Unicast | Scope=Y |
- +---------+ --SrvRply--> +-----------+ <-SrvRply-- +-----------+
-
-3.1 SLP Message Types
-
- Table 1 contains a brief summary of all SLP, along with the
- requirement level for the SLP agents. SAs MUST accept multicast and
- unicast SrvRqsts. SAs SHOULD accept Attribute Requests (AttrRqsts),
- see Appendix B. SAs MAY accept Service Type Requests (SrvTypeRqsts).
- SAs MUST listen for unsolicited multicast DA Advertisements. DAs MUST
- support all required and optional SLP message types in the table. In
- the absence of multicast routing support in a network, broadcast MAY
- be used.
-
-+----------------------+----+----+-----+-----+-------------------------+
-| Message |CODE| UA | SA | DA | Purpose |
-+----------------------+----+----+-----+-----+-------------------------+
-| Service Register | 3 | | MUST| MUST| Register a service (url,|
-| (SrvReg) | | NA | send| recv| attrs, etc.) with a DA. |
-+----------------------+----+----+-----+-----+-------------------------+
-| Service Deregister | 4 | | MAY | MUST| Deregisters a service |
-| (SrvDereg) | | NA | send| recv| from a DA. |
-+----------------------+----+----+-----+-----+-------------------------+
-| Service Acknowledge | 5 | | MUST| MUST| Contains a DA's response|
-| (SrvAck) | | NA | recv| send| to SrvReg and SrvDereg. |
-+----------------------+----+----+-----+-----+-------------------------+
-| Service Request | 1 |MUST| MUST| MUST| Requests services that |
-| (SrvRqst) | |send|s & r| recv| match query criteria. |
-+----------------------+----+----+-----+-----+-------------------------+
-| Service Reply | 2 |MUST| MUST| MUST| Returns services that |
-| (SrvRply) | |recv| send| send| match query criteria. |
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 5]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
-+----------------------+----+----+-----+-----+-------------------------+
-| DA Advertisement | 8 |MUST| MUST| MUST| Contains location, DA |
-| (DAAdvert) | |recv| recv| send| attributes and more. |
-+----------------------+----+----+-----+-----+-------------------------+
-| SA Advertisement | 11 |MAY | MUST| | Contains location, SA |
-| (SAAdvert) | |recv| send| NA | attributes and more. |
-+----------------------+----+----+-----+-----+-------------------------+
-| Service Type Request | 9 |MAY | MAY | MUST| Requests available |
-| (SrvTypeRqst) | |send| recv| recv| service types. |
-+----------------------+----+----+-----+-----+-------------------------+
-| Service Type Reply | 10 |MAY | MAY | MUST| Contains all available |
-| (SrvTypeRply) | |recv| send| send| service types. |
-+----------------------+----+----+-----+-----+-------------------------+
-| Attribute Request | 6 |MAY |SHOULD MUST| Requests attributes for |
-| (AttrRqst) | |send| recv| recv| a particular service. |
-+----------------------+----+----+-----+-----+-------------------------+
-| Attribute Reply | 7 |MAY |SHOULD MUST| Contains all attributes |
-| (AttrRply) | |recv| send| send| of a particular service.|
-+----------------------+----+----+-----+-----+-------------------------+
-
- Table 1 - Summary of Required and Optional SLP Message Types and
- Requirement Level
-
-4. Protocol Elements
-
-All integer fields in SLP messages MUST be in network byte order.
-
-4.1 Error Codes
-
-If the Error Code in a SLP reply message is nonzero, the rest of the
-message MAY be truncated. No data is necessarily transmitted or should
-be expected after the header and the error code, except if some optional
-extensions are sent to clarify the error.
-
-Errors MUST be return for unicast requests. Multicast requests that
-result in an error MUST BE silently discarded. A reply MUST NOT be sent
-if a multicast request results in an error.
-
-The following is a list of SLP error codes. Error codes marked with a
-'*' can be returned in response to any request message, all others are
-returned only for specific messages. Error codes returned for specific
-messages are described in the sections where the messages are specified.
-
-OK * 0 The request was successful.
-
-LANGUAGE_NOT_SUPPORTED 1 The request could not be processed
- due to the Language Lag. Resending
- the request SHOULD NOT fail if
- the default Language Tag 'en' is
- used.
-
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 6]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
-PARSE_ERROR * 2 The message fails to obey SLP syntax.
- The error may be due to misalignment
- in the binary format of the message, a
- missing header Language Tag, a syntax
- error in the header Language Tag, or a
- syntax error in a message-specific
- string such as a service query or
- scope string.
-
-INVALID_REGISTRATION 3 A problem occurred with the parameters
- of a SrvReg or SrvDereg message, other
- than with the syntax of string parameters.
-
-SCOPE_NOT_SUPPORTED * 4 The scope-list lacks a supported scope.
-
-VER_NOT_SUPPORTED * 9 The SLP version number is not supported.
-
-INTERNAL_ERROR * 10 The DA or SA failed for some reason.
-
-DA_BUSY_NOW * 11 The DA is currently busy processing other
- requests. The UA or SA SHOULD retry,
- using exponential back off.
-
-OPTION_NOT_UNDERSTOOD *12 The DA or SA received an unknown SLP
- option from the mandatory range.
-
-INVALID_UPDATE 13 A SrvReg was received without the
- FRESH bit set.
-
-MSG_NOT_SUPPORTED 14 The SA received an unsupported request.
-
-REFRESH_REJECTED 15 The SA sent a SrvReg with too low a lifetime.
- The SA SHOULD consult the DA's minimum
- refresh interval attribute (Section 9.4)
- for the minimum advertisement lifetime.
-
-4.2 SLP Message Header
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Version | Code | Length |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Length, contd.|O|F|R| Reserved |Next Ext Offset|
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Next Extension Offset, contd.| XID |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Language Tag Length | Language Tag \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
- All SLP messages begin with this header.
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 7]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- - Version:
- This field MUST be set to 2. Else, a VER_NOT_SUPPORTED error
- results.
-
- - Code:
- Identifies the messsage type, see Table 1. Any value outside
- those defined in Table 1 or standards track protocols extending
- SLP MUST be treated as a PARSE_ERROR result.
-
- - Length:
- Three byte unsigned integer containing the number of bytes in the
- SLP message including the header.
-
- - Flags:
- O Field is (0x80). "OVERFLOW" MUST be set to 1 when a message
- length exceeds the path MTU and the message contents doesn't
- fit into a datagram. See Section 5.1.3. Otherwise, MUST be
- 0.
-
- F Field is (0x40). "FRESH" MUST be set to 1 on every SrvReg.
- Otherwise, MUST be 0.
-
- R Field is (0x20). "REQUEST MCAST" MUST be set when
- multicasting or broadcasting requests. Otherwise, MUST be
- 0.
-
- Reserved
- This bits MUST be set to zero on transmission and ignored on
- reception. See Section 4.5.
-
- - Next Extension Offset:
- MUST be set to 0 unless the message has any extensions. If the
- message has extensions, MUST contain the offset from the beginning
- of the message, in bytes, to the first extension header.
- Extensions SHOULD come after the message body. See Section 7.1.
-
- - XID:
- The Transaction Identifier MUST be set to a unique value for each
- unique request. See Section 9 for the special case of unsolicited
- DAAdverts.
-
- - Lang Tag Length:
- Two byte unsigned integer giving the length in bytes of the
- Language Tag field. MUST NOT be zero.
-
- - Language Tag:
- MUST contain a variable length field, RFC 3066 [RFC3066] language
- local string. This specifies the language locale for all human
- readable strings in the message. See Section 14.
-
- A PARSE_ERROR results if the header is syntactically incorrect.
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 8]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
-4.3 Strings
-
- Strings in SLP messages MUST be encoded using UTF-8 [RFC2279].
- Strings MUST not be null terminated and MUST always be preceded by a
- two byte unsigned length field indicating the number of bytes that
- follow. Optional strings MAY be omitted. In this case, the Length
- field is set to zero and the string MUST be absent.
-
- The specifications for the syntax of string-based protocol elements
- in this document conform to ABNF [RFC2234].
-
-4.3.1 General String Comparisons
-
- String comparisons MUST NOT be case sensitive. For example "STRING1"
- is equal to "String1" and is also equal to "string1". This
- corresponds to the LDAPv3 string matching rule caseIgnoreMatch.
- [RFC2252]
-
- WARNING! SPECIAL CASE: caseIgnoreMatch specifies that leading and
- trailing spaces in strings are elided before string comparison is
- performed. This feature is not supported in SLPv2. White spaces in
- strings MUST NOT be elided for the purposes of string comparison.
- For example, "string1 " is not equal " string1" nor is it equal to
- "string1".
-
- In practice this means that (a) UTF-8 based strings are converted to
- Unicode, (b) comparisons are done on the basis of numerical magnitude
- ordering except that (c) case folding occurs according to specific
- code page rules. 'a' (0x0041) and 'A' (0x0061) are equivalent, as
- are "u umlaut" (0x00db) and "U umlaut" (0x00fb), both offset by 0x20.
- Note that on other code pages the offset is different - as Cyrillic
- "e accent aigue" (0x4400) and "E accent aigue" (0x4450) are offset by
- 0x50!
-
-4.3.2 Lists
-
- A List is a comma delimited set of strings, which can be of zero
- length. Since the list is comma delimited, the comma is a reserved
- character in string list items. A comma must be escaped to be
- considered as a data item. For example "a\2Cb,c\2Cd" is a string
- list with two items "a\2Cb" and "c\2Cd". These items include escaped
- commas; un-escaped they are "a,b" and "c,d" respectively.
-
-4.3.3 Previous Responder List
-
- The Previous Responder List (PR List) is a List of dotted decimal
- notation IPv4 addresses.
-
- When SLP messages are unicast, PR lists MUST be ignored. When SLP
- SrvRqst, SrvTypeRqst, and AttrRqst messages are multicast, they
- SHOULD contain a PR List (see Section 4.3.1) indicating all
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 9]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- responders from which the sender has received replies. Each
- responder's IP address (in dotted decimal form) SHOULD be added to
- form the new List before the request is multicast again.
-
- Any DA or SA that sees its address in the PR List SHOULD NOT respond
- to the request. PR Lists MUST NOT be used with unicast requests.
-
- A multicast request message with a PR List SHOULD be retransmitted
- until either: a) no further responses are elicited, b) the PR List
- and the request will not fit into a single datagram, or: c)
- CONFIG_MC_MAX seconds have elapsed.
-
- A syntax error in a PR List results in a PARSE_ERROR, and the
- response is suppressed because PR Lists are only be used with
- multicast requests.
-
-4.3.4 Service Type
-
- The Service Type is a string parameter in SrvRqst and SrvReg
- messages. The syntax of the Service Type is:
-
- service-type = generic-uri-scheme / service-scheme
- generic-uri-scheme = ALPHA *( alpha / digit / '+' / '-' / '.' )
- service-scheme = "service:" type ['.' na ] [':' type ]
- type = 1*(alpha / digit / '+' / '-' )
- na = 1*(alpha / digit / '+' / '-' )
- ; The naming authority field SHOULD have the
- ; form described in [vendorext]
-
- Service Types MUST match with case insensitive string comparison.
-
- WARNING! SPECIAL CASE: If the "service:" scheme [RFC2609] is used,
- special matching rules apply.
-
- A service type string which begins with "service:" is followed by
- either one or two "type" fields.
-
- The first type field after the "service:" scheme MAY have a naming
- authority string associated with it. If so, the type is considered
- unique. Example: "service:a" does not match "service:a.93439". This
- naming authority field allows for vendor extension and is NOT
- RECOMMENDED. [vendorext] The default Naming Authority is IANA. A
- Service Type that is registered with IANA MUST NOT contain a Naming
- Authority string.
-
- A service type string beginning with "service:" followed by one type
- field will match service type strings of that form, whether they have
- one or two type fields which follow. Example: "service:a" matches
- "service:a" and "service:a:b". And: "service:a.1234" matches
- "service:a.1234:b" but it does not match "service:a:b".
-
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 10]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- A syntax error in a Service Type name MUST result in the return of a
- PARSE ERROR to the sending agent, if the request was unicast.
-
-4.3.5 Scope List
-
- With two exceptions, all requests, service advertisement
- registrations, and service advertisement deregistrations MUST contain
- a Scope List. SLP messages that fail to contain a Scope list or that
- contain a Scope List having no Scopes for which the receiving agent
- is configured MUST BE either dropped, if the request was multicast,
- or result in a SCOPE_NOT_SUPPORTED error in reply, if the request was
- unicast.
-
- The two exceptions are SrvRqsts for the DA Service Type and for the
- SA Service Type. These MAY be transmitted without a Scope List if the
- transmitting agent is interested in obtaining a list of all
- configured Scopes supported by the replying DA or SA.
-
- Scope Lists in SLPv2 are a comma delimited list of scope strings.
- Scope strings have reserved characters which must be expressed as
- escape values if they are to be included in the scope name.
-
- reserved = '(' / ')' / ',' / '\' / '!' / '<' / '=' / '>' /
- '~' /CTL / ';' / '*' / '+'
- escape-val = '\' HEXDIG HEXDIG
-
- For example the scope name "ou=sales,o=examplecorp" would have to be
- represented "ou\3Dsales\2Co\3Dexamplecorp" to escape the "=" and ","
- characters in the name.
-
- If a syntax error in a Scope List or Scope name is encountered, the
- receiving agent MUST return a PARSE ERROR if the request was unicast.
-
- The default value for the Scope List is the Scope name "DEFAULT".
- Scope configuration rules are described in Section 8.0.
-
-4.3.6 Attribute List
-
- A service advertisement is often accompanied by Attributes. A UA
- formulates a service query containing Attributes in order to select
- particular service advertisements.
-
- A Service Type MAY specify allowable Attributes through a defined
- service template [RFC2609]. The allowable Attributes for such a
- service are defined in the service template. Services that are
- advertised according to a standard template SHOULD register all
- service Attributes required by the standard template. If no service
- template is available for a Service Type, then any Attributes are
- allowed. Support for service templates is optional.
-
- An Attribute List is a string encoding of the Attributes for a
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 11]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- service advertisement. The following grammar defines the Attribute
- list syntax:
-
- attr-list = attribute / attribute ',' attr-list
- attribute = '(' attr-tag '=' val-list ')' / attr-tag
- val-list = attr-val / attr-val ',' val-list
- attr-tag = 1*safe-tag / nonstd-tag
- nonstd-tag = "x-" enum '-' 1*safe-tag
- enum = 1*DIGIT
- ; The <enum> field corresponds to an Enterprise
- ; Number registered with IANA. [IANA] Using this
- ; prefix avoids collisions in interpretation of
- ; nonstandard attribute name.
- attr-val = intval / strval / boolval / opaque
- intval = [-]1*DIGIT
- strval = 1*safe-val
- boolval = "true" / "false"
- opaque = "\FF" 1*escape-val
- safe-val = ; Any character except reserved.
- safe-tag = ; Any character except reserved, '*' and bad-tag.
- reserved = '(' / ')' / ',' / '\' / '!' / '<' / '=' / '>' / '~' / CTL
- escape-val = '\' HEXDIG HEXDIG
- bad-tag = CR / LF / HTAB / '_'
-
- An Attribute List MUST be scanned prior to evaluation for all
- occurrences of the escape character '\'. Reserved characters MUST be
- escaped while other characters MAY be escaped. All escaped
- characters MUST be restored to their value before attempting string
- matching. Escaped Opaque values are converted into bytes, not into
- characters.
-
- The following list contains more detail on the various types of
- Attributes:
-
- Boolean A Boolean Attribute MUST have a value list that is
- one of the Boolean constants "true" or "false". A
- Boolean value list MUST only have a single value and
- MUST only be compared with '='. As with all
- strings, the Boolean constants are case insensitive.
-
- Integer An Integer Attribute MUST have a value list
- consisting of Integer constants. Integer constants
- MUST be strings that take the form [-] 1*DIGIT and
- fall in the range "-2147483648" to "2147483647",
- that is, the range of 32 bit signed integers.
- Integer values MUST be compared using integer
- comparison.
-
- Opaque An Opaque Attribute MUST have a value list
- consisting of opaque values. Opaque values are
- sequences of bytes. These MUST be distinguished
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 12]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- from strings since they begin with the sequence
- "\FF". Unescaping this sequence results in an
- illegal UTF-8 encoding, indicating that what follows
- is a sequence of escaped bytes and not a UTF-8
- string. For example, a '0' byte is encoded
- "\FF\00" and "\ff\00\00\30\39" is a
- bigendian representation of 12345. Opaque values
- MUST only be compared with '='.
-
- String All other string values are String type. String
- values MUST be matched using strict lexical
- ordering. Example of string values with
- escaped characters: "Hello\0a" (Hello with
- a newline) and "\48\65\6c\6c\6f\0a"
- (the same string, entirely escaped). To
- include reserved characters as string data
- they must be escaped. Example "a,b" is "a\40b".
- Illegal UTF-8 characters MUST NOT be included
- in Strings, ie. "a\ff" is illegal.
-
- Keyword A Keyword Attribute has only a tag. A Keyword
- Attribute MUST be designated by attr-tag in the
- Attribute List, and it MUST have no values.
-
- Syntax errors in the Attribute List MUST result in a PARSE ERROR,
- which is returned if the request was unicast.
-
- When values are advertised by a SA or are registered in a DA, they
- MUST take on implicit typing rules for matching incoming requests,
- according to the types described above. Stored value types in
- Attribute Lists MUST be consistent, i.e., x=4,true,sue,\ff\00\00 is
- in error. Inconsistent stored value types in a SrvReg MUST result in
- a PARSE ERROR returned to the SA.
-
- A DA MUST consolidate multiple instances of the same Attribute within
- an Attribute List before storing and an SA MUST consolidate multiple
- instances before sending the Attribute in an AttrRply. For example,
- if the Attribute List received by a DA is:
-
- "(x=5,6,7),(y=a,b,c),(x=6,7,8)"
-
- one Attribute, "x", is stored having value list "5,6,7,8".
-
- Embedded blanks in Attribute tags and value lists MUST be processed
- as part of the tags or values in which they appear, embedded blanks
- MUST NOT be ignored. For example, in the Attribute List "(attra =
- -345)", the Attribute tag is "attra " and the value is the String "
- -345". The value is not an Integer due to the embedded blank.
-
-
-
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 13]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
-4.3.7 Search Filter
-
- A SrvRqst message MAY include a LDAPv3 Search Filter [RFC2254], with
- certain restrictions. RFC 2254 describes the syntax of LDAPv3 Search
- Filters.
-
- A DA MUST accept any LDAPv3 query, excluding those with extensible
- matching rules. A SA MAY accept only simple queries; otherwise, it
- MUST accept service queries as a DA would. A UA SHOULD send only
- simple queries.
-
- The syntax for a simple query is:
-
- simple-query = conjoin / term
- conjoin = "(&" term-list ')'
- term-list = term term-list / term
- term = '(' tag querytype item ')' / '(' tag "=*)"
- ; The "=*" term tests if the Attribute is
- ; present.
- tag = 1*tag-safe
- querytype = '=' / "~=" / ">=" / "<="
- ; These correspond to equal, approx,
- ; greater than or equal, less than or
- ; equal.
- item = value / substring
- ; Only substring matching is supported.
- value = 1*val-safe
- substring = [ value ] any [ value ]
- any = '*' *(value "*")
- tag-unsafe = val-unsafe / CR / LF / HTAB / '_'
- tag-safe = ; All UTF-8 characters are included except
- ; those in tag-unsafe. Tag-unsafe must be
- ; escaped.
- val-unsafe = '(' / ')' / ',' / '´ / '!' / '<' / '=' /
- '>' / '~' / CTL
- val-safe = ; All UTF-8 characters are included
- ; except those in val-unsafe. Val-unsafe
- ; must be escaped.
- escaped = '´ HEXDIG HEXDIG
-
- Attribute tags and String values MUST be case-folded before
- performing string matching, as per Section 4.3.1. Matching rules
- for other types are as described in 4.3.6.
-
- If a Service Template [RFC2609] is available, the Service Template
- SHOULD be used to guide matching of types. If no Service Template is
- available, for ordered string matching, values MUST be matched using
- an implicit type system.
-
- If the Attribute in the query has been registered with multiple
- values, the query MUST be compared to each value and the results MUST
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 14]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- be combined with logical 'OR', i.e., "(x=\ff\00)" matches an
- advertisement of (x=\ff\33,\ff\00); "(Y<=0)" matches (y=0,-1).
- Keywords (i.e., Attributes without values) MUST be matched with a
- "presence" query, as in "(keyword=*)".
-
- WARNING! SPECIAL CASE: Ordering comparisons with strings and
- integers is subtle. Integer comparison is only used if both values
- are integers. Since implicit type matching is done, this can lead to
- unexpected results.
-
- Values of ['-']1*DIGIT MUST be treated as integers, so a service
- advertisement with Attribute List "(x=12),(y=-55)" would match the
- query "(&(x>=6)(y<=-44))". Note that integers MUST NOT match
- strings, for example, the search query "(x=34*)" matches an Attribute
- List "(x=34foo)", but not "(x=3432)" since the first value is a
- String while the second value is an Integer. Embedded blanks MUST NOT
- be ignored. For example, the query "(&(x= -345)(y=7))" matches the
- service advertisement with Attribute List "(x= -345)" but not the
- service advertisement with Attribute List "(x=-345)". See Section
-
- Examples: Given an attribute list "(a=12),(b=10,100),(c=100foo)", the
- query "(a<=16)" is a match. The query "(a<=100 )" is not a match,
- since "100 " is a string, so the value "12" must be treated as a
- string and "100 " is less than "12" by string ordering. The filter
- "(b<=20)" matches, because y can be 10, but "(b<= 1000)" does not
- match: " 1000" begins with a string and space (0x20) is less than
- "1", the first character of "10" and "100" values of b. The filter
- "(c<=2)" matches because c is a string, starting with "1".
-
- A syntax error in a service query results in a PARSE_ERROR.
-
-4.3.8 Attribute Tag List
-
- This is a List of Attribute tags, defined as attr-tag the grammar of
- Section 4.3.4 above. In addition, an member of the list may contain a
- wild-card according to the following grammar:
-
- wild-card = ['*'] attr-tag ['*']
-
-4.4 URL Entry
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Reserved | Lifetime | URL Length |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- |URL len, contd.| URL (variable length) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | BC-0 |
- +-+-+-+-+-+-+-+-+
-
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 15]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- SLP stores URLs in protocol elements called URL Entries, which
- associate a URL with a lifetime.
-
-Lifetime
- An unsigned two byte integer giving the lifetime during which the URL
- is valid (that is, may be cached), in seconds.
-
-URL Length, URL String
- The Length MUST NOT be zero, the URL MUST NOT be omitted.
-
-4.5 Reserved and Backward Compatibility
-
-Fields marked as Reserved in protocol messages MUST be set to zero on
-transmission and ignored on reception. Fields marked Backward
-Compatibility (or BC with a number) MUST be treated similarly, except
-where compatibility with previous specifications of SLP is being
-provided. [SLPv2AS] provides more details on backward compatibility.
-
-5. Required Features
-
-This section lists requirements for any conforming implementation of
-SLP. All requirements are identified by a letter (U, S or D, for UA, SA
-or DA requirement) and a number, throughout this specification.
-
-A minimal implementation may consist of either a UA or SA or both. A DA
-is not required for SLP to function, but if it is present, the UA and SA
-MUST interact with it as defined below.
-
-A UA MUST be able to [U1] issue SrvRqst messages and [U2] interpret
-SrvRply messages. These messages are transported via either [U3]
-unicast requests to DAs if one is available (in the desired Scope) using
-UDP or [U4] multicast requests if no DA is available (in the desired
-Scope). A UA MUST [U5] perform DA discovery initially, then either
-periodically or passively if no DA is known, interpreting DAAdvert
-messages. A UA MUST also [U6] be configurable with a Scope list and DA
-locations.
-
-A SA MUST be able to [S1] advertise a set of services, [S2] receive and
-process unicast and multicast SrvRqsts. A SA MUST process Search
-Filters unless it only ever advertises services without Attributes. A
-[S3] SrvRply message is sent in reply to all SrvRqst messages, except a
-[S4] SAAdvert is returned for requests for the SA Service Type. A SA
-MUST perform [S5] active DA discovery initially, then either
-periodically or passively, interpreting DAAdvert messages. A SA MUST
-[S6] register all currently advertised services with DAs as they are
-discovered, then periodically if appropriate, before they expire. A SA
-MUST be [S7] be configurable with a Scope List and DA locations.
-
-A DA MUST receive and process unicast requests [D1] SrvRqst, [D2]
-SrvTypeRqst and [D3] AttrRqst, for which they MUST send replies [D4]
-SrvRply, [D5] SrvTypeRply and [D6] AttrRply, respectively. The only
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 16]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
-exception is a SrvRqst for the DA Service Type, to which the DA responds
-with a [D7] DAAdvert. These same DAAdverts are [D8] multicast initially
-and periodically. A DA MUST [D9] process SrvReg messages and cache
-service advertisements registered, [D10] expire cached services when
-lifetimes expire and [D11] process SrvDereg messages to remove specified
-cached services. A DA MUST be [D12] configurable with a Scope List.
-
-5.1 Transport of SLP Messages
-
-SLP messages MUST be sent using one of four different transport
-algorithms:
-
-(1) Multicast requests soliciting unicast replies
-(2) Unicast UDP requests soliciting unicast UDP replies
-(3) TCP requests soliciting TCP replies
-(4) Multicast unsolicited announcements
-
-The reserved listening port for SLP is 427, for both UDP and TCP. This
-is the destination port for all SLP messages. SLP messages MAY be
-transmitted on an ephemeral port by UAs. DAs and SAs MUST send replies
-and acknowledgement messages from port 427 to the port from which the
-request was issued.
-
-The PR List SHOULD be used to provide a very limited form of reliable
-multicast. By default, the PR List is empty.
-
-Retransmitted requests use the same XID. This allows a DA or SA to
-briefly cache the reply to the original request and then send the cached
-reply again, should a duplicate request arrive. XIDs SHOULD be randomly
-chosen to avoid duplicate XIDs in requests if UAs restart frequently.
-
-5.1.1 UDP Message Transmission
-
-Requests sent using UDP MUST NOT exceed the maximum transmission unit.
-The default maximum transmission unit for UDP messages is 1400 bytes
-excluding UDP and other headers. If a SLP reply message does not fit
-into a UDP datagram it MUST be truncated to fit, and the OVERFLOW flag
-is set in the reply message.
-
-A UA receiving a truncated message MAY open a TCP connection (see
-section 5.1.3) with the DA or SA and retransmit the request, using the
-same XID. The UA MAY also attempt to make use of the truncated reply or
-it MAY reformulate a more restrictive request which will result in a
-smaller reply.
-
-UDP requests to a DA or SA SHOULD be retransmitted until either a
-response (which might be an error) has been obtained, or for
-CONFIG_RETRY_MAX seconds. The initial retransmission MUST occur after a
-CONFIG_RETRY wait period. Retransmissions MUST occur after
-exponentially increasing wait intervals; that is, by doubling the wait
-each time, or the range of a uniformly distributed random wait interval.
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 17]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
-5.1.1.1 Multicast UDP Transmission
-
-SLP messages are multicast to the administratively scoped SLP multicast
-[RFC 2365] address, which is 239.255.255.253. The default TTL to use
-for multicast is 255. In isolated networks, broadcasts MAY be used on
-the all hosts broadcast address, 255.255.255.255, in place of multicast.
-To that end, SAs SHOULD and DAs MUST listen for broadcast SLP messages
-at port 427.
-
-5.1.1.2 Multicast Requests
-
-Multicast requests MUST set the RQST Flag in the SLP header.
-
-Multicast requests are used in three cases:
-
- - Active DA Discovery (UAs and SAs MUST support this).
- - Active SA Discovery (UAs MAY support this).
- - Multicast Requests (UAs MUST be able to multicast SrvRqst messages to
- SAs, who MUST be prepared to receive and process them.)
-
-One or more replies MAY be returned via unicast UDP. Errors MUST NOT be
-returned in response to multicast messages, only non-error, non-zero
-results. The one exception to this is a multicast AttrRqst for a
-service registered without any Attributes. A multicast AttrRqst for
-such a service MUST result in a unicast AttrRply with a zero length
-Attribute List.
-
-SAs MUST accept both multicast requests and unicast requests, although
-UAs SHOULD use multicast when contacting SAs directly. The SA can
-distinguish between multicast and unicast requests by whether the
-REQUEST MCAST flag is set in the SLP message header. DAs MUST accept
-multicast requests as part of DA discovery (see Section 9); otherwise,
-DAs MUST ignore multicast requests.
-
-Multicast requests SHOULD be reissued over CONFIG_MC_MAX seconds until a
-result has been obtained. Retransmission is not required if the
-requesting agent is prepared to use the first reply instead of as many
-replies as possible within a bounded time interval. An initial
-retransmission MUST occur after a CONFIG_RETRY wait period.
-Retransmissions MUST be made with exponentially increasing wait
-intervals; that is,(doubling the wait each time, or the range of the
-uniformly distributed random wait interval.
-
-The message SHOULD be retransmitted until no further responses are
-elicited (see Section 4.3.1) or until CONFIG_MC_MAX seconds elapse.
-
-5.1.1.3 Unicast UDP Requests
-
-Unicast requests to a DA or SA SHOULD be retransmitted until either a
-response (which might be an error) has been obtained, or for
-CONFIG_RETRY_MAX seconds. An initial retransmission MUST occur after a
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 18]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
-CONFIG_RETRY wait period. Retransmissions MUST be made with
-exponentially increasing wait intervals, doubling the wait each time.
-
-5.1.2 TCP Requests
-
-If a SrvReg or SrvDeReg is too large to fit into a datagram, a TCP
-connection MUST be established by the SA to transmit the message. In
-addition, a UA MAY initiate a TCP connection with a DA or SA to send an
-initial request which is too large for a datagram or to resend a request
-if the return to a UDP or multicast transmitted request has the OVERFLOW
-flag set in the SLP header.
-
-DAs MUST be able to respond to UDP and TCP requests, as well as
-multicast DA Discovery SrvRqsts. SAs MUST be able to respond to TCP
-unless the SA will NEVER receive a request or send a reply which will
-exceed a datagram in size (e.g., some embedded systems).
-
-A TCP connection MAY be used for a single SLP transaction, or for
-multiple transactions. Since there are length fields in the message
-headers, SLP Agents can send multiple requests along a connection and
-read the return stream for acknowledgments and replies.
-
-The initiating agent SHOULD close the TCP connection. The DA SHOULD
-wait at least CONFIG_CLOSE_CONN seconds before closing an idle
-connection. DAs and SAs SHOULD close an idle TCP connection after
-CONFIG_CLOSE_CONN seconds to ensure robust operation, even when the
-initiating agent neglects to close it. See Section 13 for timing rules.
-
-To avoid the need to implement TCP in UAs and SAs, their implementations
-and deployment MUST be constrained such that:
-
- - UAs never issue requests larger than the Path MTU, so SAs never have
- to receive TCP requests longer than the path MTU.
-
- - UAs can accept replies with the 'OVERFLOW' flag set, and make use of
- the first result included, or reformulate the request for a smaller
- reply.
-
- - The SA can send all SrvRply, SrvReg, and SrvDeReg messages in a
- single datagram. This means limiting the size of URLs, and the
- length of Attribute Lists and Scope Lists transmitted.
-
-5.1.3 Multicast Announcement
-
-Unsolicited DAAdvert messages are sent initially and periodically sent
-by DAs via multicast to announce DA availability. The XID is set to 0.
-See Section 9.1.4.
-
-
-
-
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 19]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
-6. Required Messages
-
-6.1 Service Request
-
-This is the primary request message in SLP.
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location header (function = SrvRqst = 1) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <PRList> | <PRList> (Section 4.3.1) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <service-type> | <service-type> (Section 4.3.2)\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <scope-list> | <scope-list> (Section 4.3.3) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <filter> string | <filter> (Section 4.3.7) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | BC-1 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
- Length of PRList, PRList String
- The PRList SHOULD be included. See Section 4.3 if the PRList is
- omitted.
-
- Length of Service Type, Service Type String
- A Service Type String MUST be included.
-
- Length of Scope List, Scope List String
- A Scope List MUST be included, unless the Service Type String is
- either the DA or SA Service Type. In this case the Scope List MAY
- be omitted (see Section 4.3).
-
- Length of Filter, Filter String
- A Filter string is OPTIONAL (see Section 4.3 on omitted strings).
-
- Response messages differ depending on the Service Type field. If the
- Service Type field is set to DA Service Type, DAs MUST respond to the
- SrvRqst with a DAAdvert (see Section 9.2.1). If the Service Type
- field is set to the SA Service Type, SAs MUST respond with a SAAdvert
- (see Section 10). All other SrvRqst messages elicit a SrvRply (see
- Section 6.2).
-
- Requests that elicit a SrvRply are processed as follows. The Service
- Type field, Scope List field, and Language Tag field of the header
- MUST establish the base set of service advertisements over which the
- Filter is applied. If the Filter field is absent, the request MUST
- match all service advertisements having the indicated Service Type,
- Scopes, and language locale. If the Filter field is present, the
- Filter MUST be compared to each registered service, such that the
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 20]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- Language Tag of the request matches the the language locale of the
- advertised service. See Sections 4.2.6 and 4.2.7 for how to apply
- the Filter and Section 14 for how to apply Language Tags. Matching
- services are returned in the SrvRply message.
-
- Requests that elicit a DAAdvert response are processed as described
- in Section 9.2.1. Requests that elicit a SAAdvert response are
- processed as described in Section 10.
-
- Possible error results returned in SrvRply or DAAdvert, in addition
- to those listed in Section 4.1 with a '*' are:
-
- LANGUAGE_NOT_SUPPORTED
- Returned when the Service Type field and at least one Scope from
- the Scope List field match, the Filter field is not absent, but no
- services are advertised in the language specified in the Language
- Tag field of the header, though there are service advertisements
- registered under the default language locale, namely 'en'. MUST
- NOT be returned if there are no service advertisements for the
- Service Type advertised under the default language locale.
- MSG_NOT_SUPPORTED
- Returned when an SA that only accepts simple service queries
- receives a unicast SrvRqst including a complex search query.
-
-6.2 Service Reply
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location header (function = SrvRply = 2) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Error Code | URL Entry count |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | <URL Entry 1> ... <URL Entry N> \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
- Error Code
- Status Code of the message (see Section 4.1 and 6.1).
-
- URL Entry Count
- The number of URL entry blocks following. MAY be zero.
-
- URL Entry 1 ... URL Entry N
- The URL Entry blocks. MUST be absent if URL Entry Count is 0.
-
- The SrvRply contains zero or more URL Entries (see Section 4.4). A
- SrvRply with zero URL entries MUST be returned in response to a
- unicast Service Reply if no matching service advertisements are
- present.
-
- If a SrvRply is sent by UDP, a URL Entry MUST NOT be included unless
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 21]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- it fits entirely without truncation. If the reply overflows a
- datagram and the 'O' flag in the header is set, the UA MAY simply use
- the URL entries in the list.
-
- A URL obtained by SLP MUST NOT be cached longer than the number of
- seconds in the Lifetime field of the URL Entry.
-
-6.3 Service Registration
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location header (function = SrvReg = 3) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | <URL-Entry> (Section 4.3.4) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of service type string | <service-type> (Section 4.3.1)\
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <scope-list> | <scope-list> (Section 4.3.2) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of attr-list string | <attr-list> (Section 4.3.4) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | BC-2 |
- +-+-+-+-+-+-+-+-+
-
- URL-Entry
- A URL Entry corresponding to the service advertisement MUST be
- present.
-
- Length of Service Type, Service Type String
- The Service Type of the service advertisement MUST be present.
-
- Length of Scope List, Scope List
- The Scope List of the service advertisement MUST be present.
-
- Length of Attribute List, Attribute List
- The Attribute List of the service advertisement MAY be omitted.
- See Section 4.3 concerning omitted strings.
-
- The Lifetime field of the URL Entry defines how long a DA can
- cache the registration. SAs SHOULD reregister before this
- lifetime expires but SHOULD NOT reregister more often than once
- per second or more often than the maximum reregistration interval
- advertised by the DA (see Section 9.3). The lifetime MAY be set
- to any value between 0 and 0xffff (maximum, around 18 hours).
- Long-lived registrations remain stale longer if the service fails
- and the SA does not deregister the service.
-
- The Service Type defines the service type of the URL to be
- registered, regardless of the scheme of the URL. The Scope List
- MUST contain the names of all Scopes configured for the SA. If
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 22]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- the same URL is registered under different Service Types and/or
- with different Language Tags, the Scope List MUST be identical for
- all registrations so that deregistration functions properly, see
- Section 7.6; otherwise, if the Scope List differs from a prior
- registration for the same URL, a SCOPE_NOT_SUPPORTED error is
- returned.
-
- The Attribute List, if present, specifies the Attributes and
- values to be associated with the URL in the service advertisement.
-
- The header FRESH flag MUST be set on all registrations. A new
- registration received for an existing service advertisement in
- which the header Language Tag, URL, and Service Type, all match
- MUST replace the previous advertisement.
-
-6.4 Service Acknowledgment
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location header (function = SrvAck = 5) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Error Code |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
- Error Code
- Status code of the message.
-
- A DA MUST return a SrvAck to an SA after a SrvReg or SrvDereg. The
- SrvAck carries only a two byte Error Code.
-
- In addition to the errors listed in Section 4.1 with a '*', the
- following error codes apply to SrvReg and SrvDereg messages:
-
- REFRESH_REJECTED
- If the header FRESH flag is not set, or if the SrvReg lifetime is
- less than the DA's advertised minimum refresh interval (see
- Section 9.3), the DA MAY reject the advertisement. If a SrvDereg
- includes an Attribute tag list, the DA SHOULD reject it.
- INVALID_REGISTRATION
- Returned if the SrvReg has problems with a non-string parameter,
- like a zero URL Entry Lifetime field,, or if a SrvDereg was sent
- for a nonexisting service advertisement, or an attempt was made to
- delete a service advertisement and the SrvDereg Scope List
- contains only a partial list of the Scopes in which the
- advertisement is registered.
-
-6.5 DA Advertisement
-
- The DAAdvert is used for DA Discovery (see Section 9).
-
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 23]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location header (function = DAAdvert = 8) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Error Code | DA Stateless Boot Timestamp |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- |DA Stateless Boot Time, contd. | Length of URL |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | URL \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Length of <scope-list> | <scope-list> (Section 4.3.2) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Length of <attr-list> | <attr-list> (Section 4.3.4) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | BC-3 | BC-4 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
- Error Code
- Status code of the message. See Section 4.1 and 6.1 for values.
- The Error Code is set to 0 when the DAAdvert is multicast.
-
- DA Stateless Boot Timestamp
- Indicates DA boot time and state. See Section 9.2 for details.
-
- Length of URL, URL
- The DA URL MUST NOT be omitted.
-
- Length of Scope List, Scope List
- The Scope List string. MUST NOT be absent. This list contains
- the Scope List of the DA, though it MAY include only the Scope
- List present in the SrvRqst which solicited the DAAdvert. If
- multicast, the Scope List MUST be the DA's entire configured Scope
- List.
-
- Length of Attribute List, Attribute List
- The DA Attribute List string MAY be omitted. See Section 9.2 for
- possible DA Attributes.
-
- The returned URL is "service:directory-agent://"<addr> of the DA,
- where <addr> is the dotted decimal numeric IP address of the DA.
-
-6.6. SA Advertisement
-
- The SAAdvert is used by UAs to accumulate information about SAs, see
- Section 10. Since the SAAdvert is only returned in response to a
- multicast request, it contains no error code field because errors on
- multicast requests are silently dropped.
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 24]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location header (function = SAAdvert = 11) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Length of URL | URL \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Length of <scope-list> | <scope-list> \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Length of <attr-list> | <attr-list> \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | BC-5 |
- +-+-+-+-+-+-+-+-+
-
- Length of URL, URL
- The SA's URL MUST NOT be omitted.
-
- Length of Scope List, Scope List
- The SA's Scope List MUST NOT be omitted.
-
- Length of Attribute List, Attribute List
- The Attribute List MAY be omitted only if the SA advertises no
- services (see Section 10). On omitted strings, see Section 4.3.
-
- The SA responds only to multicast SA discovery requests which:
- - have an empty <scope-list> or the <scope-list> includes one of the
- SA's Scopes,
- - have <service-type> set to "service:service-agent".
- - if a <filter> is included in the request, the SA MUST match the
- Filter against the SA's Attributes.
-
- The SAAdvert MUST include a list of Attributes the SA supports. This
- Attribute List SHOULD be kept short so that the SAAdvert will not
- exceed the path MTU in size. The Attribute 'service-type' MUST be
- included in the Attribute List. The value of this Attribute is a
- list of string values, each value of which is a Service Type the SA
- is advertising (not including "service:service-agent").
-
- The URL is "service:service-agent://"<addr> of the SA, where <addr>
- is the dotted decimal numeric address of the SA.
-
-7. Optional Features
-
- A UA or SA can be fully compliant without implementing any features
- from this section. A SA SHOULD, however, support responding to
- AttrRqst unless the SA will never be used to advertise services with
- Attributes (see Appendix B).
-
-7.1 SLP Extensions
-
- SLP extensions provide growth capability to the basic set of SLP
- messages.
-
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 25]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Extension ID | Next Extension Offset |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Offset, contd.| Extension Data \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
- Extension ID
- The extension identifier.
-
- Next Extension Offset
- Number of bytes to the next extension as an offset from the
- beginning of the SLP message. If the Next Extension Offset field
- is zero, there are no extensions following the current extension,
- and the length of the current extension MUST be calculated by
- subtracting the offset of the current extension from the total
- length of the SLP message as given in the header.
-
- Extension Data
- The contents of the extension.
-
- If an extension offset is specified, and an extension is not included
- in the request, the receiver MUST respond with a PARSE_ERROR, if the
- request was unicast.
-
- Extension IDs are assigned in the following way:
-
- 0x0000-0x3FFF Standardized: Optional to implement.
- Ignore if unrecognized.
- 0x4000-0x7FFF Standardized: Mandatory to implement.
- A UA or SA which receives this option in a reply and does not
- understand it MUST silently discard the reply. A DA or SA which
- receives this option in a request and does not understand it MUST
- return an OPTION_NOT_UNDERSTOOD error.
- 0x8000-0x8FFF For private use: Optional to implement.
- Ignore if unrecognized.
- 0x9000-0xFFFF Reserved: Do not use.
-
- Section 13 defines procedures for specifying new SLP extensions.
-
-7.2 Service Type Request
-
- The Service Type Request (SrvTypeRqst) allows a UA to discover all
- types of services on a network.
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location header (function = SrvTypeRqst = 9) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 26]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- | length of PRList | <PRList> (Section 4.3.1) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of Naming Authority | <na> (Section 4.3.2) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <scope-list> | <scope-list> (Section 4.3.3) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
- Length of PRList, PRList
- The PRList MAY be omitted. See Section 4.3.3 and 4.3.
-
- Length of Naming Authority, Naming Authority
- The naming authority string MAY be zero length, in which case
- service types in the default naming authority (IANA) are returned.
-
- WARNING! SPECIAL CASE: If the length field is set to 0xFFFF: (1)
- the naming authority string is zero length, (2) all service types
- in all naming authorities are returned. THIS FIELD IS AN
- EXCEPTION TO HOW STRING LENGTHS ARE ENCODED IN SLP!
-
- Otherwise, if a naming authority string is included, only service
- types in that naming authority are returned.
-
- Length of Scope List, Scope List
- Only Service Types advertised in a Scope included in the Scope
- List are returned.
-
- The Naming Authority string determines which Service Types will be
- returned in the reply, as described above.
-
- Possible error returns, aside from those in Section 4.1 with a '*':
-
- MSG_NOT_SUPPORTED
- An SA that does not support SrvTypeRqst returns this error if a it
- receives a unicast SrvTypeRqst.
-
-7.3 Service Type Reply
-
- The return message for SrvTypeRqst is the SrvTypeRply.
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location header (function = SrvTypeRply = 10) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Error Code | length of <srvtype> List |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | <srvtype> List (Section 4.3.2) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
- Error Code
- Status code of the messages. See section 4.1 and 7.3.
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 27]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- Length of Service Type List, Service Type List
- The list of Service Types. The Service Type names MUST include
- the naming authority string, if any. This string MUST be absent
- if the Service Type List result is zero (see Section 4.3).
-
-7.4 Attribute Request
-
- The Attribute Request (AttrRqst) allows a UA to discover Attributes
- of a given service by supplying its URL. This information is also
- available by using the Attrlist Extension to the SrvRqst [RFC 3059].
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location header (function = AttrRqst = 6) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of PRList | <PRList> String \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of URL | URL \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <scope-list> | <scope-list> (Section 4.3.3) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | length of <tag-list> string | <tag-list> (Section 4.5) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | BC-6 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
- Length of PRList, PRList
- The PRList MAY be omitted. See Section 4.3.3 and 4.3.
-
- Length of URL, URL
- The URL of the service whose Attributes are being requested. MUST
- NOT be absent.
-
- Length of Scope List, Scope List
- The Scope List of the service whose Attributes are being
- requested. MUST NOT be absent.
-
- Length of Attribute Tag List, Attribute Tag List
- This string MAY be omitted, see Section 4.3. If present, only
- those Attributes whose tags are present in the list are returned
- in the AttrRply.
-
- The <tag-list> indicates the Attributes to return in the AttrRply.
- Wild card values in <tag-list> match Attributes any part of whose tag
- matches the <attr-val> part of the wild card.
-
- Possible error returns when the request is unicast, aside from those
- in Section 4.1 with a '*', are:
-
- LANGUAGE_NOT_SUPPORTED
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 28]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- Returned when the URL field and at least one Scope from the Scope
- List field match, but no services are advertised in the language
- specified in the Language Tag field of the header, though there is
- a service advertisements for the URL registered under the default
- language locale, namely 'en'. MUST NOT be returned if there is no
- service advertisement for the URL advertised under the default
- language locale.
-
- MSG_NOT_SUPPORTED
- Returned when a SA that does not support AttrRqst receives a
- unicast AttrRqst.
-
- INVALID_REGISTRATION
- The URL in the AttrRqst does not correspond to a service that the
- SA or DA is advertising.
-
-7.5 Attribute Reply
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location header (function = AttrRply = 7) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Error Code | length of <attr-list> |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | <attr-list> (Section 4.3.4) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | BC-7 |
- +-+-+-+-+-+-+-+-+
-
- Error Code
- Status code of the message. See section 4.1 and 7.5.
-
- Length of Attribute List, Attribute List
- The requested Attribute List. These field is omitted if the
- status code of the result is not 0 or the service advertisement
- has no Attributes associated with it.
-
- WARNING! SPECIAL CASE: A SA that supports AttrRqst MUST return an
- AttrRply in response to a multicast AttrRqst that matches a
- service advertisement with no Attributes. THIS IS UNLIKE
- SrvTypeRply AND SrvRply WHERE ONLY NONZERO RESULTS ARE RETURNED IN
- RESPONSE TO MULTICAST QUERIES.
-
- Attribute replies SHOULD be returned with the original case of
- registered string tags and values intact, in case they must be
- displayed to users.
-
- Only one copy of each Attribute tag or String value SHOULD be
- returned, arbitrarily choosing one version with respect to upper
- and lower case and white space internal to the strings. Duplicate
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 29]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- Attributes and values SHOULD be removed. An arbitrary version of
- the string value and tag name is chosen for the merge. For
- example: "(A=a a,b)" merged with "(a=A A,B)" may yield "(a=a
- a,B)".
-
-7.6 Service Deregistration
-
- A DA deletes a service registration when its lifetime expires.
- Services SHOULD be deregistered when they are no longer available,
- rather than leaving the registrations to time out.
-
- 0 1 2 3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Service Location header (function = SrvDeReg = 4) |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Length of <scope-list> | <scope-list> (Section 4.3.2) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | URL Entry (Section 4.4) \
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Length of <tag-list> = 0 |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
- Length of Scope List, Scope List
- MUST NOT be omitted.
-
- URL Entry
- The URL of the service to deregister. The URL in the entry MUST
- NOT be omitted. The lifetime in the URL Entry is ignored.
-
- Length of Attribute Tag List
- This field MUST be 0. See Section 4.3 on omitted strings.
-
- The URL indicates which service advertisement to deregister. The
- deregistration MUST remove all service advertisements associated with
- the URL, for all Scopes, language locales, and Service Types under
- which service advertisements for the URL were registered.
-
- The SA MUST issue the SrvDeReg with the same Scope List used to
- register the service. If this is not done, the DA MUST return a
- SCOPE_NOT_SUPPORTED error.
-
- The DA acknowledges a SrvDereg with a SrvAck. Once the SA receives
- an acknowledgment indicating success, the service is no longer
- advertised by the DA.
-
- Possible error codes beyond those in Section 4.1 marked with a '*':
-
- INVALID_REGISTRATION
- A DA sends this error if the SrvDeReg seeks to deregister a
- service that has not been registered with the DA.
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 30]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- INVALID_UPDATE
- A DA sends this error in response to a non-zero Attribute Tag List
- Length.
-
-8. Scope List Configuration
-
- The default Scope List configuration for any agent is the string
- "DEFAULT". The chart below contains a prioritized list of options
- for Scope List configuration. Higher priority options override lower
- priority options. For example, if a static Scope List exists, DHCP
- option 79 is ignored. All SLP Agents MUST support static
- configuration of a Scope List. Other mechanisms are optional.
-
- Preference Mechanism Requirement level
- (1) Static configuration of Scope List MUST
- (2) Static configuration of DAs * MUST
- (3) DHCP SLP Scope configuration SHOULD
- (4) DHCP SLP DA configuration * SHOULD
- (5) Dynamic discovery (DAAdverts) ** MAY
- (6) Dynamic discovery (SAAdverts) ** MAY
- (7) Use of the Scope "DEFAULT" MUST
-
- (2) A SA or UA with a static configured list of DAs will unicast DA
- Discovery messages (see Section 9) to the DAs on the list and create
- a list of all Scopes those DAs support. This forms the agent's Scope
- List.
-
- (3) DHCP option 79 can explicitly configure a UA or SA's Scope list.
- [RFC 2610]
-
- (4) DHCP option 78 can supply a list of DA locations. The UA or SA
- acquires their Scope List, as per (2), above. [RFC 2610]
-
- (5) A UA or SA can use active and passive DA Discovery (see Section
- 9) to acquire a list of DAs. The combined list of their Scopes forms
- the agent's Scope List.
-
- (6) A UA can use active SA discovery (see Section 10) to obtain
- SAAdverts from SAs on the network. The combined list becomes the
- UA's Scope List.
-
- UAs can issue requests with any subset of Scopes with which they are
- configured. It is left up to the implementor whether to allow UAs to
- synthesize Scope Lists by using DA and SA discovery or only to
- support static and DHCP discovery.
-
-9. DA Discovery
-
- UAs and SAs MUST attempt to discover DAs unless specifically
- configured not to do so. UAs and SAs MUST perform active DA
- discovery initially, upon initialization. SAs MUST and UAs SHOULD
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 31]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- perform passive DA discovery (UAs MAY instead periodically perform
- active DA discovery, for example, before requests are made, after
- [CONFIG_DA_FIND] seconds).
-
-9.1 Active DA discovery
-
- DAs are discovered by sending a SrvRqst with the Service Type set to
- the DA Service Type. If a Filter is included in the SrvRqst, the DA
- SHOULD respond only if the Filter matches the DA's Attributes.
-
- If the requesting UA or SA is configured with a Scope List, the
- request MUST contain all configured scopes in the list. If the UA or
- SA is not configured with a Scope List, however, the <scope-list>
- field of the SrvRqst used in active DA discovery MAY be empty. This
- allows the UA or SA to derive a Scope List from DAAdverts it
- receives.
-
-9.2 Passive DA discovery
-
- A DA MUST multicast (or broadcast) an unsolicited DAAdvert every
- CONFIG_DA_BEAT seconds. CONFIG_DA_BEAT SHOULD be specified to
- prevent DAAdverts from using more than 1% of the available network
- bandwidth. An unsolicited DAAdvert has an XID of 0.
-
- All UAs and SAs that receive the unsolicited DAAdvert SHOULD examine
- the DAAdvert DA Stateless Boot Timestamp. If the Stateless Boot
- Timestamp is zero, the DA is going down and no further messages
- should be sent to it.
-
- If a SA detects a DAAdvert with a nonzero DA Stateless Boot Timestamp
- but the SA has never encountered the DA before, the SA MUST send
- SrvRegs for all its advertised services if examination of the
- DAAdvert indicates that the SA must register. The SA MUST examine
- the DAAdvert's timestamp to determine if the DA has had a stateless
- reboot since the SA last registered with it. If so, and if the DA
- supports some set of Scopes with which the SA is configured, the SA
- registers with the DA. SAs MUST wait a random interval between 0 and
- CONFIG_REG_PASSIVE before beginning DA registration.
-
- If a UA with a configured scope list receives a DAAdvert that
- supports any Scope on its configured Scope List, it adds this DA to
- its list of DAs.
-
-9.3 DA Attributes
-
- DAs MAY advertise Attributes. One Attribute is defined by SLPv2, the
- 'min-refresh-interval' attribute.
-
- A potential scaling problem occurs in SLPv2 if SAs choose too low a
- lifetime. In this case, an onerous amount of reregistration occurs
- as more services are deployed. SLPv2 allows DAs to control the
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 32]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- frequency of registration by advertising the "min-refresh-interval"
- attribute. A DA MAY reissue a DAAdvert with a new set of Attributes
- at any time, to change the reregistration behavior of SAs. These
- apply only to subsequent registrations; existing service
- registrations with the DA retain their registered lifetimes.
-
- If the DAAdvert includes the Attribute 'min-refresh-interval' it MUST
- be set to a single Integer value indicating a number of seconds. If
- this Attribute is present SAs MUST NOT issue registrations with
- lifetimes less than this value or refresh any particular service
- advertisement more frequently than this value. If SrvReg or SrvDereg
- for a particular service is received more frequently than or with the
- lifetime less than the DA's advertised 'min-refresh-interval'
- attribute the DA SHOULD reject the message and return a
- REFRESH_REJECTED error in the SrvAck.
-
-10. SA Discovery
-
- A UA MAY, in the absence of knowledge of DAs, and other Scope list
- configuration, obtain SAAdverts from SAs on the network. This allows
- the UA to synthesize a Scope List it can use to issue requests.
-
- A SA MAY be configured with Attributes, and MUST support the
- Attribute 'service-type' whose value is all the Service Types of
- services represented by the SA. Further, SAs which support only
- simple Search Filters MUST include the Attribute definition "simple-
- query-only=true" in their Attribute List. A query for this Attribute
- can be included in the Filter to exclude SAs that do not accept
- simple queries.
-
- SAs MUST NOT respond if the SrvRqst Filter is not satisfied. For
- example, only SAs advertising 'nfs' services MUST respond with a
- SAAdvert to a SrvRqst for Service Type "service:service-agent" that
- includes a Filter "(service-type=nfs)".
-
-11. Protocol Timing Defaults
-
-Interval name Section Default Value Meaning
-------------------- ------- ------------- ------------------------
-CONFIG_MC_MAX 6.3 15 seconds Max time to wait for a
- complete multicast query
- response (all values.)
-CONFIG_START_WAIT 12.2.1 3 seconds Wait to perform DA
- discovery on reboot.
-CONFIG_RETRY 12.3 2 seconds Wait interval before
- initial retransmission
- of multicast or unicast
- requests.
-CONFIG_RETRY_MAX 12.3 15 seconds Give up on unicast
- request retransmission.
-CONFIG_DA_BEAT 12.2.2 3 hours DA Heartbeat, so that SAs
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 33]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- passively detect new DAs.
-CONFIG_DA_FIND 12.3 900 seconds Minimum interval to wait
- before repeating Active
- DA discovery.
-CONFIG_REG_PASSIVE 12.2 1-3 seconds Wait to register services
- on passive DA discovery.
-CONFIG_REG_ACTIVE 8.3 1-3 seconds Wait to register services
- on active DA discovery.
-CONFIG_CLOSE_CONN 6.2 5 minutes DAs and SAs close idle
- connections.
-
-12. Optional Configuration
-
- Broadcast Only
- Any SLP agent SHOULD be configurable to use broadcast only.
- Predefined DA
- A UA or SA SHOULD be configurable to use a predefined DA.
- No DA Discovery
- The UA or SA SHOULD be configurable to ONLY use predefined and
- DHCP-configured DAs and perform no active or passive DA discovery.
- Multicast TTL
- The default multicast TTL is 255. Agents SHOULD be configurable
- to use other values. A lower value may result in UAs obtaining
- different results for the identical requests depending on where
- they are connected to the network.
- Timing Values
- Time values in Section 11 MAY be configurable.
- Scopes
- The Scope List string MUST be configurable.
- DHCP Configuration
- DHCP options 78 and 79 MAY be used to configure SLP. [RFC 2610]
- Service Templates
- Service Template UAs and SAs MAY be configured by using Service
- Templates. These allow language translation, setting default
- values and API error checking.
-
-13. IANA Considerations
-
- SLP includes four sets of identifiers which may be registered with
- IANA. The policies for these registrations (See [RFC 2434]) are noted
- in each case.
-
- New SLP Extensions with types in the range 2-65535 may be registered
- following review by a Designated Expert.
-
- New error numbers in the range 15-65535 are assigned on the basis of
- a Standards Action.
-
- Protocol elements used with Service Location Protocol may also
- require IANA registration actions. SLP is used in conjunction with
- "service:" URLs and Service Templates [RFC 2609]. These are
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 34]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- standardized by review of a Designated Expert and a mailing list (See
- [RFC 2609].)
-
-14. Internationalization Considerations
-
- SLP supports service advertisements in multiple languages by
- providing a Language Tag field in the SLP message header (see Section
- 8).
-
- Services MAY be registered under multiple Language Tags. This
- provides Attributes so that users with different language skills can
- select services interactively. Services SHOULD be registered under
- the Language Tag 'en', the default Language Tag (English), to provide
- for a fallback in case the services are not registered under any
- another Language Tag. When processing requests, the Language Tag in
- the request MUST be compared using case insensitive equality to the
- Language Tag of the service advertisement. If the service
- advertisement's Language Tag doesn't match that in the request, the
- two MUST NOT match; otherwise, the two MUST match.
-
- A URL that is registered with multiple Language Tags may be queried
- under all Language Tags for which it is registered. The Language Tag
- of the SrvRqst or AttrRqst is used to perform the match. If the
- requested language is not supported, a LANGUAGE_NOT_SUPPORTED error
- MUST be returned for a SrvRqst if there are any service
- advertisements registered under the default Language Tag, or for an
- AttrRqst if there is an advertisement for the URL under the default
- Language Tag. If there is no advertisement registered under the
- default language tag, the LANGUAGE_NOT_SUPPORTED error MUST NOT be
- returned, and the request MUST be considered to have yielded no
- matches. SrvRply and AttrRply messages MUST contain the same Language
- Tag as that of the request.
-
- RFC 2609 [RFC 2609] provides more information about how language tags
- can be used in Service Templates.
-
-15. Security Considerations
-
- The threats posed to clients using SLP to locate services and to
- services that use SLP to advertise themselves are threefold.
-
- First, a UA may be prevented from discovering a service that is
- present and should, in fact, be discoverable. This is a denial of
- service attack. SLP is vulnerable to denial of service attacks by (a)
- an attacker posing as a DA that withholds normally available service
- information, (b) an attacker actively deregistering services with DAs
- that should otherwise be available at the DAs.
-
- Second, a UA may discover a service that is not 'trustworthy'
- according to some policy of trust in an administered network. This
- is a masquerading attack. A user could be fooled into revealing
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 35]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- confidential information in interactions with a service registered by
- an attacker.
-
- Third, by observing and issuing SLP queries, an attacker could use
- SLP to catalogue either clients or services on a network. The threat
- here is breach of confidentiality. An attacker can learn what
- services the user prefers and what services are present on the
- network. This information could be useful to an attacker, for
- example, to inform how to launch future attacks.
-
- Previous versions of SLP provided for authentication of service URLs
- and Attribute Lists [SLPv2AS]. This scheme was not adopted, as it
- required SLP-specific key management, and it has been deprecated in
- this version of SLP. Instead, SLP agents use IPsec security
- associations [IPSEC] for unicast messages to protect against the
- above threats. Multicast requests are considered to be insecure and
- SHOULD NOT be used if the above attacks are considered likely.
-
- The following policies protect unicast SLP traffic:
-
-1. Messages unicast from port 427 by SAs and DAs SHOULD initiate an
- IKE establishment of a security association [IKE] when:
- - An SA or DA responds to a UA request
- - An SA registers or deregisters with a DA
-
-2. Those hosts which receive unicast SLP messages from port 427 SHOULD
- have a policy requiring the initiation of a IPsec security
- association when:
- - A UA receives a reply from a DA or SA
- - A SA receives a SrvAck from a DA
- - A DA receives a SrvReg or SrvDereg from a SA
-
-3. IKE security association establishment MUST be
- predicated on possession of a certificate indicating that a host
- is a legitimate source of SLP messages. This requires
- distribution of certificates to all SLP agents, signed by a
- certificate authority operated by a trusted administration.
- During IKE security association establishment, certificates are
- verified versus the certificate authority's public key. If
- verified, the security association can be established and
- messages transmitted are
- be protected against the attacks listed above.
-
-4. SLP messages that cannot be validated against an IPsec
- Authentication Header [AH] SHOULD be silently discarded.
-
-5. For environments where confidentiality is desired, SLP messages
- MAY be protected by an IPsec Encapsulating Security Payload [ESP].
-
- The security provided by the above policy is no replacement for
- application level security. That is, even if SLP is protected
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 36]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- against the above list of threats, it is not a substitute for client-
- server protocol security appropriate to satisfy the application's own
- security requirements.
-
- SLP is useful as a bootstrap protocol. It may be used in
- environments in which no preconfiguration is possible. In such
- situations, a certain amount of "blind faith" is required: Without
- any prior configuration it is impossible to secure SLP.
-
-Appendix A: Changes to SLPv2 compared to RFC 2608
-
- [SLPv2AS] presents the details and backward compatibility issues
- concerning this specification compared to previous versions of SLP.
-
-Appendix B: SA support for Attributes
-
- Some special purpose SAs which will only ever advertise services
- without Attributes need not implement SrvRqst Search Filters or
- respond to AttrRqst with an AttrRply. All other SAs need to. This
- is the meaning of the statement SAs SHOULD reply to AttrRqst
- messages.
-
-Normative References
-
- [AH] Kent, S., and Atkinson, R., "IP Authentication Header," RFC
- 2402, November, 1998.
-
- [ESP] Kent, S., and Atkinson, R., "IP Encapsulating Security Payload
- (ESP)," RFC 2406, November, 1998.
-
- [IANA] http://www.iana.org/numbers.html
-
- [IPSEC] Kent, S., and Atkinson, R., "Security Architecture for the
- Internet Protocol," RFC 2401, November, 1998.
-
- [RFC 2119] Bradner, S., "Key words for use in RFCs to Indicate
- Requirement Levels", BCP 14, RFC 2119, March 1997.
-
- [RFC 2131] Droms, R., "Dynamic Host Configuration Protocol", RFC
- 2131, March 1997.
-
- [RFC 2234] Crocker, D. and P. Overell, "Augmented BNF for Syntax
- Specifications: ABNF", RFC 2234, November 1997.
-
- [RFC 2252] Wahl, M., et. al., "Lightweight Directory Access Protocol
- (v3): Attribute Syntax Definitions", RFC 2252, December 1997.
-
- [RFC 2254] Howes, T., "The String Representation of LDAP Search
- Filters", RFC 2254, December 1997.
-
- [RFC 2279] Yergeau, F., "UTF-8, a transformation format of unicode
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 37]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- and ISO 10646", RFC 2279, October 1998.
-
- [RFC 2365] Meyer, D., "Administratively Scoped IP Multicast", RFC
- 2365, July 1998.
-
- [RFC 2396] Berners-Lee, T., Fielding, R. and L. Masinter, "Uniform
- Resource Identifiers (URI): Generic Syntax", RFC 2396, August
- 1998.
-
- [RFC 2434] Narten, T. and H. Alvestrand, "Guidelines for Writing an
- IANA Considerations Section in RFCs, BCP 26, RFC 2434, October
- 1998.
-
- [RFC 2608] E. Guttman, C. Perkins, J. Veizades, and M. Day, "Service
- Location Protocol version 2", RFC 2608, July 1999.
-
- [RFC 2609] Guttman, E., Perkins, C. and J. Kempf, "Service Templates
- and service: Schemes", RFC 2609, June 1999.
-
- [RFC 2610] Guttman, E., "DHCP Options for Service Location", draft-
- guttman-svrloc-rfc2610bis-01.txt, September 2001. A work in
- progress.
-
- [RFC 3066] Alvestrand, H., "Tags for the Identification of
- Languages", RFC 1766, March 1995.
-
- [SLPv2AS] Guttman, E., "Applicability Statement for Service Location
- Protocol, Version 2," draft-guttman-svrloc-as-00.txt, a work in
- progress.
-
- [vendorext] Guttman, E., "Vendor Extensions for Service Location
- Protocol, Version 2", draft-guttman-svrloc-vendor-ext-04.txt, a
- work in progress.
-
-Editors' Contact Information
-
- Erik Guttman James Kempf
- Sun Microsystems, Inc. Docomo Labs, USA
- Phone: +49 172 865 5497 Phone: +1 408 451 4711
- Email: Erik.Guttman@Sun.Com Email: kempf@docomolabs-usa.com
-
-Full Copyright Statement
-
- Copyright (C) The Internet Society (2001). All Rights Reserved.
- This document and translations of it may be copied and furnished to
- others, and derivative works that comment on or otherwise explain it or
- assist in its implementation may be prepared, copied, published and
- distributed, in whole or in part, without restriction of any kind,
- provided that the above copyright notice and this paragraph are included
- on all such copies and derivative works. However, this document itself
- may not be modified in any way, such as by removing the copyright notice
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 38]
-\f
-Internet Draft SLPv2 Revision August 2002
-
-
- or references to the Internet Society or other Internet organizations,
- except as needed for the purpose of developing Internet standards in
- which case the procedures for copyrights defined in the Internet
- Standards process must be followed, or as required to translate it into
- languages other than English. The limited permissions granted above are
- perpetual and will not be revoked by the Internet Society or its
- successors or assigns. This document and the information contained
- herein is provided on an "AS IS" basis and THE INTERNET SOCIETY AND THE
- INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
- INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
- WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE."
-
-Table of Contents
-
- Abstract . . . . . . . . . . . 1 6.2 Service Reply . . . . . . 21
- Acknowledgements . . . . . . . 1 6.3 Service Registration . . . 22
- 1. Introduction . . . . . . . 1 6.4 Service Acknowledgment . . 23
- 2. Terminology and Conventions 2 6.5 DA Advertisement . . . . . 23
- 3. Protocol Overview . . . . . 3 6.6 SA Advertisement . . . . 24
- 3.1 SLP Message Types . . . . 5 7. Optional Features . . . . . 25
- 4. Protocol Elements . . . . . 6 7.1 SLP Extensions . . . . . . 25
- 4.1 SLP Message Header . . . . 6 7.2 Service Type Request . . . 26
- 4.2 Error Codes . . . . . . . 7 7.3 Service Type Reply . . . . 27
- 4.3 Strings . . . . . . . . . 9 7.4 Attribute Request . . . . 28
- 4.3.1 General String Comparison 9 7.5 Attribute Reply . . . . . 29
- 4.3.2 Lists . . . . . . . . . 9 7.6 Service Deregistration . . 30
- 4.3.3 Previous Responder List 9 8. Scope List Configuration . 31
- 4.3.4 Service Type String . . 10 9. DA Discovery . . . . . . . 31
- 4.3.5 Scope List . . . . . . . 11 9.1 Active Discovery . . . . . 32
- 4.3.6 Attribute List . . . . . 11 9.2 Passive Discovery . . . . 32
- 4.3.7 Search Filter . . . . . 14 9.3 DA Attributes . . . . . . 32
- 4.3.8 Attribute Tag List . . . 15 10. SA Discovery . . . . . . 33
- 4.3.9 SLP SPI . . . . . . . . 15 11. Protocol Timing Defaults . 33
- 4.4 URL Entry . . . . . . . . 15 12. Optional Configuration . . 34
- 4.5 Required and Backward 13. IANA Considerations . . . 34
- Compatibility . . . . . . 16 14. Internationalization
- 5. Required Features . . . . . 16 Considerations . . . . . . 35
- 5.1 Transport of SLP Messages 17 15. Security Considerations . 35
- 5.1.1 UDP Message Transmission 17 Appendix A: Changes to SLPv2
- 5.1.1.1 Multicast Transmission 18 compared to RFC 2608 . . . 37
- 5.1.1.2 Multicast Requests . . 18 Appendix B: SA support for
- 5.1.1.3 Unicast Requests . . . 18 Attributes . . . . . . . . 37
- 5.1.2 TCP Requests . . . . . . 19 Normative References . . . . . 37
- 5.1.3 Multicast Announcement . 19 Editors' Contact Information . 38
- 6. Required Messages . . . . . 20 Full Copyright Statement . . . 38
- 6.1 Service Request . . . . . 20
-
-
-
-
-
-
-Guttman & Kempf Expires: 3 February 2003 [Page 39]
+++ /dev/null
-#!/bin/bash
-
-#/*****************************************************************************
-# * Description: sample shell script to run SA in daemon mode
-# *
-# * Originated: May 16, 2003
-# * Original Author: Mike Day md@soft-hackle.net
-# * mdday@us.ibm.com
-# *
-# * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/scripts/Attic/sa_sample,v 1.1 2003/05/21 15:14:10 mday Exp $
-# *
-# * Copyright (c) 2003 IBM
-# * Copyright (c) 2003 Michael Day
-# *
-# * Permission is hereby granted, free of charge, to any person obtaining a
-# * copy of this software and associated documentation files (the "Software"),
-# * to deal in the Software without restriction, including without limitation
-# * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# * and/or sell copies of the Software, and to permit persons to whom the
-# * Software is furnished to do so, subject to the following conditions:
-# *
-# * The above copyright notice and this permission notice shall be included in
-# * all copies or substantial portions of the Software.
-# *
-# *
-# * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-# * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-# * DEALINGS IN THE SOFTWARE.
-# *
-# *****************************************************************************/
-
-
-
-## command line syntax for sa_srvreg
-#
-# slp_srvreg -- transmit an SLP Service Registration and print the results.
-# -------------------------------------------------------------------------
-# slp_srvreg --type=service-type-string
-# --url=url-string
-# --attributes=attribute-string
-# [--address=target-IP]
-# [--port=target-port]
-# [--scopes=scope-string]
-# [--lifetime=seconds]
-# [--interface=host-IP]
-# [--daemon=true]
-# [--use_da=true]
-# [--test]
-# [--spi=security-parameters-index] (not used)
-
-# All parameters must be a single string containing no spaces.
-# Always use the format of <parameter>=<value>.
-# Parameters enclosed in brackets are not optional.
-
-
-# number of urls we construct - translates into number of service adverts
-num_urls=0
-
-# array to hold each service:url
-urls[1]=""
-
-# service type string
-service="service:nothing:"
-
-# protocol part of the url
-protocol_part="//"
-
-# path part of the url
-path_part="/etc/nothing;version=1"
-
-# attribute string
-attributes="(version=1)"
-
-# collect all the ip interfaces on this host
-# rely on formatting of the linux ifconfig command.
-# this is a dirty hack
-IP_ADDRS=`/sbin/ifconfig | awk '/addr:/ {print $2}' | sed 's/addr://g'`
-
-
-# if slp_srvreg is already running in daemon mode, kill it
-killall slp_srvreg
-
-# loop on each ip address and use it to construct a service:url
-for arg in $IP_ADDRS ; do
- let num_urls="$num_urls + 1"
- urls[$num_urls]=$service
- temp_string=${urls[$num_urls]}${protocol_part}
- urls[$num_urls]=${temp_string}${arg}${path_part}
- echo ${urls[$num_urls]}
-
- if [ "$num_urls" -eq "1" ]
- then
- slp_srvreg --type="$service" \
- --url=${urls[$num_urls]} \
- --attributes="$attributes" \
- --daemon=true \
- --address="127.0.0.1" &
- else
- slp_srvreg --type="$service" \
- --url=${urls[$num_urls]} \
- --attributes="(version=2),(vendor=IBM)" \
- --address="127.0.0.1"
-
- fi
-
-done
+++ /dev/null
-#!/bin/bash
-
-#/*****************************************************************************
-# * Description: scripting shell for slp_client - generates an slp QUERY
-# *
-# * Originated: May 16, 2003
-# * Original Author: Mike Day md@soft-hackle.net
-# * mdday@us.ibm.com
-# *
-# * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/scripts/Attic/test_query,v 1.1 2003/05/21 15:14:10 mday Exp $
-# *
-# * Copyright (c) 2003 IBM
-# * Copyright (c) 2003 Michael Day
-# *
-# * Permission is hereby granted, free of charge, to any person obtaining a
-# * copy of this software and associated documentation files (the "Software"),
-# * to deal in the Software without restriction, including without limitation
-# * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# * and/or sell copies of the Software, and to permit persons to whom the
-# * Software is furnished to do so, subject to the following conditions:
-# *
-# * The above copyright notice and this permission notice shall be included in
-# * all copies or substantial portions of the Software.
-# *
-# *
-# * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-# * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-# * DEALINGS IN THE SOFTWARE.
-# *
-# *****************************************************************************/
-
-
-###########################################################################
-# This script shows how to use the slp_query command and tests the parameters
-# of a service request. Use it to verify your parameters are correct. To
-# do an actual slp query, omit the --test command line option from the
-# slp_query command below.
-#
-# Usage:
-#
-# test_query -t <type> [-p <predicate>] [-s <scopes>]
-#
-# type: a valid service type string. Service type strings
-# may contain wildcards. e.g., -t"*" will match any
-# service type. "*" and "?" are valid wildcards.
-#
-# predicate: an optional LDAP filter string. See
-# ftp://ftp.rfc-editor.org/in-notes/rfc2254.txt
-#
-# scopes: an optional SLP list string. It must be in the form
-# "scope1[, scope2[, scope n] ]. e.g., "admin, eng, account"
-#
-###########################################################################
-
-PREDICATE=""
-SCOPE=""
-TYPE=""
-while getopts ":t:p:s:" opt; do
- case $opt in
- t ) TYPE=$OPTARG ;;
- p ) PREDICATE=$OPTARG ;;
- s ) SCOPE=$OPTARG ;;
- \? ) echo 'usage: test_query -t<type> -p<predicate> -s<scope> '
- exit 1
- esac
-done
- shift $(($OPTIND - 1))
-
-echo "Testing a Service Request: "
-echo " Type: " "$TYPE"
-echo " Predicate: " "$PREDICATE"
-echo " Scopes: " "$SCOPE"
-
-slp_query --type="$TYPE" --predicate="$PREDICATE" --scopes="$SCOPES" --test
-
-case $? in
- 0 ) echo "Service Request is valid"
- exit 0;;
- 1) echo "Service Type string (and possibly other strings) is invalid"
- exit 1;;
- 2) echo "Predicate string (and possibly the scope string) is invalid"
- exit 1;;
- 3) echo "Scope string is invalid"
- exit 1;;
-esac
-
-
+++ /dev/null
-#!/bin/bash
-
-#/*****************************************************************************
-# * Description: scripting shell for slp_client - generates an SLP SRVREG
-# *
-# * Originated: May 20, 2003
-# * Original Author: Mike Day md@soft-hackle.net
-# * mdday@us.ibm.com
-# *
-# * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/scripts/Attic/test_reg,v 1.1 2003/05/21 15:14:10 mday Exp $
-# *
-# * Copyright (c) 2003 IBM
-# * Copyright (c) 2003 Michael Day
-# *
-# * Permission is hereby granted, free of charge, to any person obtaining a
-# * copy of this software and associated documentation files (the "Software"),
-# * to deal in the Software without restriction, including without limitation
-# * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# * and/or sell copies of the Software, and to permit persons to whom the
-# * Software is furnished to do so, subject to the following conditions:
-# *
-# * The above copyright notice and this permission notice shall be included in
-# * all copies or substantial portions of the Software.
-# *
-# *
-# * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-# * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-# * DEALINGS IN THE SOFTWARE.
-# *
-# *****************************************************************************/
-
-
-###########################################################################
-# This script shows how to use the slp_srvreg command and tests the parameters
-# of a service registration. Use it to verify your parameters are correct. To
-# do an actual slp registration, omit the --test command line option from the
-# slp_srvreg command below.
-#
-# Usage:
-#
-# test_reg -t<type> -u<url> -a<attributes> [-s<scopes>]
-#
-# type: a valid service type string. See
-# ftp://ftp.rfc-editor.org/in-notes/rfc2609.txt
-#
-# url: a valid service url. See
-# ftp://ftp.rfc-editor.org/in-notes/rfc2609.txt
-#
-# attribute: an SLP attriute string. See
-# ftp://ftp.rfc-editor.org/in-notes/rfc2608.txt
-#
-# scopes: an optional SLP list string. It must be in the form
-# "scope1[, scope2[, scope n] ]. e.g., "admin, eng, account"
-#
-###########################################################################
-
-TYPE=""
-URL=""
-ATTRS=""
-SCOPE=""
-
-while getopts ":t:u:a:s:" opt; do
- case $opt in
- t ) TYPE=$OPTARG ;;
- u ) URL=$OPTARG ;;
- a ) ATTRS=$OPTARG ;;
- s ) SCOPE=$OPTARG ;;
- \? ) echo 'test_reg -t<type> -u<url> -a<attributes> [-s<scopes>]'
- exit 1
- esac
-done
- shift $(($OPTIND - 1))
-
-echo "Testing a Service Registration: "
-echo " Type: " "$TYPE"
-echo " URL: " "$URL"
-echo " Attributes: " "$ATTRS"
-echo " Scopes: " "$SCOPE"
-
-slp_srvreg --type="$TYPE" --url="$URL" --attributes="$ATTRS" --scopes="$SCOPES" --test
-
-case $? in
- 0) echo "Service Registration is valid"
- exit 0;;
- 1) echo "Service Type string (and possibly other strings) is invalid"
- exit 1;;
- 2) echo "Url string (and possibly other strings) is invalid"
- exit 1;;
- 3) echo "Attribute string (and possibly the scope string) is invalid"
- exit 1;;
- 4) echo "Scope string is invalid"
- exit 1;;
-esac
-
-
+++ /dev/null
-#//%2005////////////////////////////////////////////////////////////////////////
-#//
-#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation, The Open Group.
-#// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; VERITAS Software Corporation; The Open Group.
-#//
-#// Permission is hereby granted, free of charge, to any person obtaining a copy
-#// of this software and associated documentation files (the "Software"), to
-#// deal in the Software without restriction, including without limitation the
-#// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-#// sell copies of the Software, and to permit persons to whom the Software is
-#// furnished to do so, subject to the following conditions:
-#//
-#// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-#// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-#// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-#// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-#// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-#// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-#// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#//
-#//==============================================================================
-COMPONENTS = all
-CLIENT = client
-CLEAN = clean
-INSTALL = install
-REMOVE = remove
-
-DIRS = $(SRC_DIR)/kernel \
- $(SRC_DIR)/cmd-utils
-
-all: $(COMPONENTS)
-.PHONY: all
-
-client: $(CLIENT)
-.PHONY: client
-
-clean: $(CLEAN)
-.PHONY: clean
-
-install: $(INSTALL)
-.PHONY: install
-
-REMOVE: $(REMOVE)
-.PHONY: remove
-
-
-$(COMPONENTS) $(INSTALL) $(REMOVE):
- $(foreach dir, $(DIRS), cd $(dir) && $(MAKE) $@;)
-$(CLEAN):
- $(foreach dir, $(DIRS), cd $(dir) && $(MAKE) -k $@;)
-$(CLIENT):
- cd $(SRC_DIR)/cmd-utils && $(MAKE)
+++ /dev/null
-#//%2005////////////////////////////////////////////////////////////////////////
-#//
-#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation, The Open Group.
-#// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; VERITAS Software Corporation; The Open Group.
-#//
-#// Permission is hereby granted, free of charge, to any person obtaining a copy
-#// of this software and associated documentation files (the "Software"), to
-#// deal in the Software without restriction, including without limitation the
-#// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-#// sell copies of the Software, and to permit persons to whom the Software is
-#// furnished to do so, subject to the following conditions:
-#//
-#// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-#// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-#// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-#// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-#// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-#// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-#// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#//
-#//==============================================================================
-
-DIRS = cmd-utils
-
-all clean:
- $(foreach dir, $(DIRS), cd $(dir) && $(MAKE) -f Makefile.nt $@;)
\ No newline at end of file
+++ /dev/null
-#//%2005////////////////////////////////////////////////////////////////////////
-#//
-#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation, The Open Group.
-#// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; VERITAS Software Corporation; The Open Group.
-#//
-#// Permission is hereby granted, free of charge, to any person obtaining a copy
-#// of this software and associated documentation files (the "Software"), to
-#// deal in the Software without restriction, including without limitation the
-#// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-#// sell copies of the Software, and to permit persons to whom the Software is
-#// furnished to do so, subject to the following conditions:
-#//
-#// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-#// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-#// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-#// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-#// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-#// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-#// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#//
-#//==============================================================================
-#/*****************************************************************************
-# *
-# * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/Attic/Makefile,v 1.2 2005/05/12 15:33:31 martin Exp $
-# *
-# * Copyright (c) 2001 - 2003 IBM
-# * Copyright (c) 2000 - 2003 Michael Day
-# *
-# * Permission is hereby granted, free of charge, to any person obtaining a
-# * copy of this software and associated documentation files (the "Software"),
-# * to deal in the Software without restriction, including without limitation
-# * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-# * and/or sell copies of the Software, and to permit persons to whom the
-# * Software is furnished to do so, subject to the following conditions:
-# *
-# * The above copyright notice and this permission notice shall be included in
-# * all copies or substantial portions of the Software.
-# *
-# *
-# * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-# * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-# * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-# * DEALINGS IN THE SOFTWARE.
-# *
-# *****************************************************************************/
-
-
-
-
-
-
-PROJECT = cmd-utils
-SRC_DIR := $(shell pwd)
-
-export OBJ_DIR := $(OBJ_DIR_CLIENT)
-COMPONENTS = all
-CLEAN = clean
-INSTALL = install
-
-export SRC_CMD_UTILS := $(SRC_DIR)
-export SRC_CLIENT := $(SRC_DIR)/slp_client
-export SRC_SRVREG := $(SRC_DIR)/slp_srvreg
-export SRC_QUERY := $(SRC_DIR)/slp_query
-
-
-SRC_DIRS := $(SRC_CLIENT) $(SRC_SRVREG) $(SRC_QUERY)
-
-all: $(COMPONENTS)
-.PHONY: all
-
-clean: $(CLEAN)
-.PHONY: clean
-
-install: $(INSTALL)
-.PHONY: install
-
-$(COMPONENTS) $(INSTALL):
- $(foreach dir, $(SRC_DIRS),cd $(dir) && $(MAKE) $@;)
-
-$(CLEAN) :
- $(IGNORE)$(LIBTOOL) $(RM) $(RM_FLAGS) *.o
- $(IGNORE)$(LIBTOOL) $(RM) $(RM_FLAGS) *.lo
- $(foreach dir, $(SRC_DIRS),cd $(dir) && $(MAKE) -k $@;)
+++ /dev/null
-#//%2005////////////////////////////////////////////////////////////////////////
-#//
-#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation, The Open Group.
-#// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; VERITAS Software Corporation; The Open Group.
-#//
-#// Permission is hereby granted, free of charge, to any person obtaining a copy
-#// of this software and associated documentation files (the "Software"), to
-#// deal in the Software without restriction, including without limitation the
-#// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-#// sell copies of the Software, and to permit persons to whom the Software is
-#// furnished to do so, subject to the following conditions:
-#//
-#// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-#// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-#// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-#// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-#// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-#// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-#// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#//
-#//==============================================================================
-#
-# Need to run vcvars32.bat and make sure bison 1.35 is in your path
-#
-# c:\progra~1\MICROS~1.NET\Vc7\bin\vcvars32
-# set path=%path%;C:\Program Files\GnuWin32\bin
-
-SRC_CLIENT=slp_client
-SRC_SRVREG=../slp_srvreg
-SRC_QUERY=../slp_query
-
-
-SRC_DIRS := $(SRC_CLIENT) $(SRC_SRVREG) $(SRC_QUERY)
-
-all clean:
- $(foreach dir, $(SRC_DIRS),cd $(dir) && $(MAKE) -f Makefile.nt $@;)
+++ /dev/null
-//%2005////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation, The Open Group.
-// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-// EMC Corporation; VERITAS Software Corporation; The Open Group.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//==============================================================================
-/*****************************************************************************
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/Attic/endian.h,v 1.5 2005/02/05 23:01:30 karl Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-
-#define __LITTLE_ENDIAN__ 1234
-#define __BIG_ENDIAN__ 4321
-#define __PDP_ENDIAN__ 3412
-
-#ifdef NUCLEUS
- #define __BYTE_ORDER__ __BIG_ENDIAN__
-#else
- #ifdef WORDS_BIGENDIAN
- #define __BYTE_ORDER__ __BIG_ENDIAN__
- #else
- #define __BYTE_ORDER__ __LITTLE_ENDIAN__
- #endif
-#endif
+++ /dev/null
-//%2005////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation, The Open Group.
-// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-// EMC Corporation; VERITAS Software Corporation; The Open Group.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//==============================================================================
-/*****************************************************************************
- * Description:
- *
- * Originated: December 20, 2001
- * Original Author: Mike Day md@soft-hackle.net
- * mdd@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/Attic/lslp-common-defs.h,v 1.5 2005/02/05 23:01:30 karl Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-
-#ifndef _LSLP_COMMON_INCLUDE_
-#define _LSLP_COMMON_INCLUDE_
-
-/* platform compatibility includes */
-#include "../../config.h"
-#include OS_PORT_INCLUDE
-
-#endif /* _LSLP_COMMON_INCLUDE_ */
+++ /dev/null
-/*****************************************************************************
- * Description:
- *
- * Originated: December 20, 2001
- * Original Author: Mike Day md@soft-hackle.net
- * mdd@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/Attic/lslp-linux.c,v 1.1 2003/05/21 15:14:08 mday Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <assert.h>
-#include "lslp-linux.h"
-
-void num_to_ascii(uint32 val, int8 *buf, int32 radix, BOOL is_neg)
-{
- int8 *p;
- int8 *firstdig;
- int8 temp;
- uint32 digval;
-
- assert(buf != NULL);
- p = buf;
- /* safeguard against a div by zero fault ! */
- if(val == 0){
- *p++ = '0';
- *p = 0x00;
- return;
- }
-
- /* default to a decimal radix */
- if (radix <= 0)
- radix = 10;
-
- /* negate two's complement, print a minus sign */
- if (is_neg == TRUE){
- *p++ = '-';
- val = (uint32)(-(int32)val);
- }
-
- firstdig = p;
-
- do {
- digval = (uint32) (val % radix);
- val /= radix;
- if(digval > 9)
- *p++ = (int8)(digval - 10 + 'a');
- else
- *p++ = (int8)(digval + '0');
- } while (val > 0);
-
- /* by getting the mod value before the div value, the digits are */
- /* reversed in the buffer */
- /* terminate the string */
- *p-- = '\0';
- do {
- temp = *p;
- *p = *firstdig;
- *firstdig = temp;
- --p;
- ++firstdig;
- }while(firstdig < p);
- return;
-}
-
-
-void hug_num_to_ascii(uint64 val, int8 *buf, int32 radix, BOOL is_neg)
-{
- int8 *p;
- int8 *firstdig;
- int8 temp;
- uint64 digval;
-
- assert(buf != NULL);
- p = buf;
- /* safeguard against a div by zero fault ! */
- if(val == 0){
- *p++ = '0';
- *p = 0x00;
- return;
- }
-
- /* default to a decimal radix */
- if (radix <= 0)
- radix = 10;
-
- /* negate two's complement, print a minus sign */
- if (is_neg == TRUE){
- *p++ = '-';
- val = (uint64)(-(int64)val);
- }
-
- firstdig = p;
-
- do {
- digval = (uint64)(val % radix);
- val /= radix;
- if(digval > 9)
- *p++ = (int8)(digval - 10 + 'a');
- else
- *p++ = (int8)(digval + '0');
- } while (val > 0);
-
- /* by getting the mod value before the div value, the digits are */
- /* reversed in the buffer */
- /* terminate the string */
- *p-- = '\0';
- do {
- temp = *p;
- *p = *firstdig;
- *firstdig = temp;
- --p;
- ++firstdig;
- }while(firstdig < p);
- return;
-}
-
-
-/* signal handler */
-void _lslp_term(int sig)
-{
- static int dieNow;
-
- if(dieNow)
- raise(sig); /* recurse into oblivion */
- dieNow = 1;
- /* kill threads */
- signal(sig, SIG_DFL);
- raise(sig);
-}
-
-
+++ /dev/null
-//%2005////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation, The Open Group.
-// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-// EMC Corporation; VERITAS Software Corporation; The Open Group.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//==============================================================================
-/*****************************************************************************
- * Description:
- *
- * Originated: March 15, 2000
- * Original Author: Mike Day md@soft-hackle.net
- * mdd@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/Attic/lslp-linux.h,v 1.7 2005/11/27 03:11:39 jim.wunderlich Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-
-#ifndef _LSLP_LINUX_INCLUDE_
-#define _LSLP_LINUX_INCLUDE_
-
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <unistd.h>
-#include <time.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <pthread.h>
-#include <semaphore.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include <errno.h>
-#include <Pegasus/Common/PegasusAssert.h>
-#include <memory.h>
-#include <string.h>
-#include <ctype.h>
-#include <net/if.h>
-typedef char int8;
-typedef unsigned char uint8;
-typedef uint8 byte;
-typedef short int16;
-typedef unsigned short uint16;
-typedef int int32;
-typedef unsigned int uint32;
-typedef long long int64;
-typedef unsigned long long uint64;
-typedef uint32 BOOL;
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void _lslp_term(int sig) ;
-void num_to_ascii(uint32 val, int8 *buf, int32 radix, BOOL is_neg);
-void hug_num_to_ascii(uint64 val, int8 *buf, int32 radix, BOOL is_neg);
-
- typedef int SOCKETD;
-
-
-#define LSLP_DEFAULT_WAIT 100
-#define LSLP_EXTRA_WAIT 250
-#define _LSLP_CREATE_MUTEX(h) ((sem_init((sem_t *)&(h), 0, 1)) ? -1 : 0)
-#define CREATE_MUTEX(h) _LSLP_CREATE_MUTEX((h))
-#define _LSLP_WAIT_MUTEX(h, i, c) lslp_linux_wait_mutex(((sem_t *)&(h)), (i), (c))
-#define WAIT_MUTEX(h, i, c) _LSLP_WAIT_MUTEX((h), (i), (c))
-#define _LSLP_CLOSE_MUTEX(h) sem_destroy((sem_t *)&(h))
-#define CLOSE_MUTEX(h) _LSLP_CLOSE_MUTEX((h))
-
-#define _LSLP_RELEASE_MUTEX(h) sem_post((sem_t *)&(h))
-#define RELEASE_MUTEX(h) _LSLP_RELEASE_MUTEX((h))
-#define _LSLP_DUP_MUTEX(h) ((sem_t *)&(h))
-
-#define _LSLP_CREATE_SEM(h, i) ((sem_init((sem_t *)&(h), 0, (i))) ? -1 : 0)
-#define _LSLP_WAIT_SEM _LSLP_WAIT_MUTEX
-#define _LSLP_SIGNAL_SEM _LSLP_RELEASE_MUTEX
-#define _LSLP_CLOSE_SEM _LSLP_CLOSE_MUTEX
-
-#define LSLP_WAIT_FAILED 0xffffffff
-#define WAIT_FAILED LSLP_WAIT_FAILED
-#define LSLP_WAIT_OK 0x00000000
-#define LSLP_WAIT_TIMEOUT 0xffffffff
-#define WAIT_TIMEOUT LSLP_WAIT_TIMEOUT
-#define LSLP_WAIT_ABANDONDED 0xffffffff
-
-#define _LSLP_SLEEP(m) \
- { if(m) { \
- struct timespec wait_time , actual_time; \
- wait_time.tv_sec = (m / 1000); ; wait_time.tv_nsec = (((m % 1000) * 1000) * 1000); \
- nanosleep(&wait_time, &actual_time); \
- } }
-
-
-#define INVALID_SOCKET -1
-#define SOCKET_ERROR -1
-#define SD_BOTH SHUT_RDWR
-
-#define FAR
-
-#define LSLP_SEM_T sem_t
-#define LSLP_THREAD_T pthread_t
-
-/** void *(*start)(void *), ustacksize, void *arg **/
-#define _LSLP_BEGINTHREAD(start, stacksize, arg) \
- lslp_linux_begin_thread((start),(stacksize),(arg))
-
-#define _LSLP_STRTOK(n, d, s) strtok_r((n), (d), (s))
-
-#define _LSLP_ENDTHREAD(handle, code) pthread_exit((handle))
-#define _LSLP_SIG_ACTION() _lslp_sig_action()
-#define _LSLP_SIG_ACTION_THREAD() _lslp_thread_sig_action()
-#define _LSLP_PUSH_HANDLER(a, b) pthread_cleanup_push((a), (b))
-#define _LSLP_POP_HANDLER(a) pthread_cleanup_pop((a))
-
-
-#define LSLP_MAXPATH FILENAME_MAX
-#define LSLP_NEWLINE \r
-
-#define SOCKADDR_IN struct sockaddr_in
-#define SOCKADDR struct sockaddr
-#define SOCKET int
-
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#define _ultoa(v, b, r) num_to_ascii((uint32)(v), (b), (r), FALSE)
-#define _itoa(v, b, r) num_to_ascii((uint32)(v), (b), (r), (((r) == 10) && ((v) < 0)))
-#define _ltoa(v, b, r) num_to_ascii((uint32)(v), (b), (r), (((r) == 10) && ((v) < 0)))
-#define _ul64toa(v, b, r) huge_num_to_ascii((uint64)(v), (b), (r), FALSE)
-#define _i64toa(v, b, r) huge_num_to_ascii((uint64)(v), (b), (r), (((r) == 10) && ((v) < 0)))
-
-
-
-#define LSLP_HEXDUMP(c) ((((c) > 31) && ((c) < 128)) ? (c) : '.')
-#define LSLP_MSG_STRINGS 4
-#define LSLP_STRINGS_HEXDUMP 1
-#define LSLP_STRINGS_WORKDUMP 2
-#define LSLP_STRINGS_NADUMP 3
-
-
-#define _LSLP_CLOSESOCKET close
-#define _LSLP_SOCKET(a, b, c) socket((int)(a), (int)(b), (int)(c))
-#define _LSLP_BIND(a, b, c) bind((int)(a), (const struct sockaddr *)(b), (socklen_t)(c))
-#define _LSLP_CONNECT(a, b, c) connect((int)(a), (const struct sockaddr *)(b), (socklen_t)(c))
-#define _LSLP_LISTEN(a, b) listen((int)(a), (int)(b))
-#define _LSLP_ACCEPT(a, b, c) accept((int)(a), (struct sockaddr *)(b), (socklen_t *)(c))
-#define _LSLP_SEND(a, b, c, d) send((int)(a), (const void *)(b), (size_t)(c), (int)(d))
-#define _LSLP_SENDTO(a, b, c, d, e, f) \
- sendto((int)(a), (const void *)(b), (size_t)(c), (int)(d), \
- (const struct sockaddr *)(e), (socklen_t)(f))
-#define _LSLP_RECV(a, b, c, d) recv((int)(a), (void *)(b), (size_t)(c), (int)(d))
-#define _LSLP_RECV_FROM(a, b, c, d, e, f) \
- recvfrom((int)(a), (void *)(b), (size_t)(c), (int)(d), \
- (struct sockaddr *)(e), (socklen_t *)(f))
-#define _LSLP_GETHOSTBYNAME(a) gethostbyname((const char *)(a))
-#define _LSLP_GETHOSTBYADDR(a, b, c) gethostbyaddr( (const void *)(a), (socklen_t)(b), (int)(c))
-#define _LSLP_SETSOCKOPT(a, b, c, d, e) \
- setsockopt((int)(a), (int)(b), (int)(c), (const void *)(d), (socklen_t)(e))
-#define _LSLP_GETSOCKOPT(a, b, c, d, e) \
- getsockopt((int)(a), (int)(b), (int)(c), (void *)(d), (socklen_t)(e))
-#define _LSLP_SET_TTL(s, t) setsockopt((s), IPPROTO_IP, IP_MULTICAST_TTL, (const char *)&(t), sizeof((t)))
-
-#define _LSLP_ABORT(a) { shutdown((int)(a), SHUT_RDWR) ; close((int)(a)); }
-#define LSLP_FD_SET fd_set
-
-#define _LSLP_SELECT(a, b, c, d, e) \
- select((int)(a), (fd_set *)(b), (fd_set *)(c), (fd_set *)(d), (struct timeval *)(e))
-#define _LSLP_FD_ISSET(a, b) FD_ISSET((int)(a), (fd_set *)(b))
-#define _LSLP_FD_SET(a, b) FD_SET((int)(a), (fd_set *)(b))
-#define _LSLP_FD_ZERO(a) FD_ZERO((fd_set *)(a))
-#define _LSLP_FD_CLR(a, b) FD_CLEAR((int)(a), (fd_set *)(b))
-
-#define _LSLP_IOCTLSOCKET ioctl
-#define _LSLP_GETLASTERROR() errno
-
-#define _LSLP_DEINIT_NETWORK()
-
-#define _LSLP_INIT_NETWORK()
-#define _LSLP_DEINIT_NETWORK()
-
-#define LSLP_MTU 1500
-
-/* ascii and char tests and conversions */
-
-#define _LSLP_ISASCII(a) isascii(a)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _LSLP_LINUX_INCLUDE_ */
+++ /dev/null
-/*****************************************************************************
- * Description: portability routines for nucleus RTOS
- *
- * Originated: December 19, 2001
- * Original Author: Mike Day md@soft-hackle.net
- * mdday@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/Attic/lslp-nucleus.c,v 1.1 2003/05/21 15:14:08 mday Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-
-#include "lslp-nucleus.h"
-
-unsigned int errno;
-
-
-NU_HOSTENT * nucleus_gethostbyname(const char *name) //jeb
-{
- static NU_HOSTENT name_host_entry;
-
- if (NU_SUCCESS == NU_Get_Host_By_Name((char*)name, &name_host_entry)) //jeb
- return &name_host_entry;
- return NULL;
-}
-
-NU_HOSTENT * nucleus_gethostbyaddr(const void *addr, int len, int type) //jeb
-{
- static NU_HOSTENT addr_host_entry;
-
- if ( type != NU_FAMILY_IP || len != 4 )
- return NULL;
- if(NU_SUCCESS == NU_Get_Host_By_Addr((char *)addr, len, type, &addr_host_entry))
- return &addr_host_entry;
- return NULL;
-}
-
-
-/************************************************************************
-*
-* FUNCTION
-*
-* inet_ntoa
-*
-* DESCRIPTION
-*
-* This function transforms a UINT32 IP address into a string of
-* the form xxx.xxx.xxx.xxx.
-*
-* INPUTS
-*
-* in The data structure containing the UINT32 IP address.
-*
-* OUTPUTS
-*
-* A pointer to the new string.
-*
-*************************************************************************/
-char *inet_ntoa(struct in_addr in)
-{
- static char b[18];
- register unsigned char *p;
- CHAR temp[3];
- INT i, j;
-
- memset(b, 0, 18);
- p = (UINT8 *)∈
-
- for (i = 0; i <= 3; i++)
- {
- if (p[i] == 0)
- {
- for (j = 0; j < 3; j++)
- strcat(b, (CHAR*)(NU_ITOA((INT)(p[j]), temp, 10)));
- }
- else
- strcat(b, (CHAR*)(NU_ITOA((INT)(p[i]), temp, 10)));
-
- if (i != 3)
- strcat(b, ".");
- }
-
- return (b);
-}
-
-/************************************************************************
-*
-* FUNCTION
-*
-* assert
-*
-*************************************************************************/
-//#ifdef SLPDBG
-//void assert(int expr)
-//{
-// if (!expr)
-// _system_info(TRUE,"ASSERT:%s/%d", __FILE__, __LINE__);
-////_system_info(TRUE,"ASSERT:%s/%d\n", __FILE__, __LINE__); HALT;}
-//}
-//#endif
+++ /dev/null
-//%2005////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation, The Open Group.
-// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-// EMC Corporation; VERITAS Software Corporation; The Open Group.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//==============================================================================
-/*****************************************************************************
- * Description: portability routines for nucleus RTOS
- *
- * Originated: December 17, 2001
- * Original Author: Mike Day md@soft-hackle.net
- * mdday@us.ibm.com
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/Attic/lslp-nucleus.h,v 1.6 2005/11/27 03:11:39 jim.wunderlich Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-
-
-#ifndef _LSLP_NUCLEUS_INCL_
-#define LSLP_NUCLEUS_INCL_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#include "time.h"
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "sp_cmn.hc"
-#include "tcpsprt.h" //define for net version
-#include "net\target.h"
-#include "net\inc\nu_net.h"
-#include "net\inc\arp.h"
-#include "net\inc\socketd.h"
-#include "net\inc\sockdefs.h"
-//#include "tcpst.hc"
-UINT32 tcpst_inet_addr(char *);
-
- /* DELETE these lines after you are ready to proceed ! */
-//jeb#error "Remember to define the correct BYTE ORDER in the file endian.h"
-//jeb#error "Check to ensure there is a nucleus implementation of inet_addr(char *) - I can write one if you need it"
-//jeb#error "Check to ensure there is a nucleus implementation of htons(short int) - I can write one if you need it"
-//jeb#error "Check to ensure there is a nucleus implementation of inet_ntoa(unsigned int) - I can write one if you need it"
-//jeb#error "Need a gethostname function (returns a string holding the hostname of the management module)"
-//jeb#error "prototype is int gethostname(char *buffer, int buffer_size) ; return zero upon success "
-//jeb#error "need to define _LSLP_STRTOK( char *string, char *delimitors, char **state), which is a thread-safe version of strtok"
-/* #error "errno is a global variable holding the code for the most recent failure" */
-
-/*** nucleus include files ***/
-
-/** below are posix include files that may or may not be appropriate to Nucleus ***/
-/*** modify to include the correct files for the nucleus runtimes ***/
-//jeb#include <signal.h>
-//jeb#include <stdio.h>
-//jeb#include <stdlib.h>
-//jeb#include <stdarg.h>
-//jeb#include <unistd.h>
-//jeb#include <time.h>
-//jeb#include <sys/types.h>
-//jeb#include <sys/time.h>
-//jeb#include <netinet/in.h>
-//jeb#include <arpa/inet.h>
-//jeb#include <sys/ioctl.h>
-//jeb#include <sys/socket.h>
-//jeb#include <sys/select.h>
-//jeb#include <netdb.h>
-//jeb#include <Pegasus/Common/PegasusAssert.h>
-//jeb#include <memory.h>
-//jeb#include <string.h>
-//jeb#include <ctype.h>
-
-
- /*** typedefs ***/
- typedef char int8;
- typedef CHAR int8;
- typedef INT8 int8;
-
-
- typedef unsigned char uint8;
- typedef unsigned char byte;
- typedef UINT8 uint8;
-
- typedef short int16;
- typedef INT16 int16;
-
- typedef unsigned short uint16;
- typedef UINT16 uint16;
-
- typedef int int32;
- typedef unsigned long uint32;
-
-//jeb chg typedef int INT;
- typedef int SOCKETD;
- typedef int SOCKET;
-
-
-/* ATTN << Thu Dec 20 11:35:36 2001 mdd >> */
-
-#ifdef BOOL //jeb
-#undef BOOL
- typedef uint32 BOOL;
-#endif
-
-
- /* ATTN << Tue Dec 18 09:40:43 2001 mdd >> */
- /* this is a variable structure that probably has an option
- id and then a variable sized buffer to hold the results */
-/* typedef unsigned int SCK_IOCTL_OPTION ; */
-
- /* probably don't need long longs */
- /** typedef __int64 int64; **/
- /** typedef unsigned __int64 uint64; **/ //jeb fix
-
- typedef int STATUS;
-
- struct in_addr
- {
- uint32 s_addr;
- };
-
- typedef struct sockaddr
- {
- uint8 sa_len;
- uint8 sa_family;
- char sa_data[14];
- } SOCKADDR ;
-
-
- typedef struct sockaddr_in
- {
-//jeb uint8 sin_len;
- int16 sin_family;
- uint16 sin_port;
- struct in_addr sin_addr;
- char *sin_zero;
-// char sin_zero[8];
- } SOCKADDR_IN ;
-
- struct hostent
- {
- char *h_name;
- char **h_alias;
- INT16 h_addrtype;
- INT16 h_length;
-// char *h_addr; //jeb
- char **h_addr_list;
- };
-
-//jeb extern NU_Host_Ent * nucleus_gethostbyname(const char *name);
-//jeb extern NU_Host_Ent * nucleus_gethostbyaddr( const void *addr, int len, int type);
- extern NU_HOSTENT * nucleus_gethostbyname(const char *name);
- extern NU_HOSTENT * nucleus_gethostbyaddr( const void *addr, int len, int type);
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-#define SOCK_DGRAM NU_TYPE_DGRAM
-#define SOCK_STREAM NU_TYPE_STREAM
-#define UNUSED_NU_PARM 0
-
-#define INVALID_SOCKET NU_INVALID_SOCKET
-#define SOCKET_ERROR NU_INVALID_SOCKET
-//jeb strt add
-#define AF_INET SK_FAM_IP
-#define INADDR_NONE 0
-#define INADDR_ANY INADDR_NONE
-//jeb end add
-
-/* ATTN need to define these error constants for nucleus << Tue Dec 18 16:22:28 2001 mdd >> */
-
-#define EINTR /* call was interrupted */
-#define ENOTSOCK INVALID_SOCKET
-#define EADDRNOTAVAIL
-#define EAFNOSUPPORT
-#define EISCONN
-#define ETIMEDOUT
-#define ECONNREFUSED
-#define ENETUNREACH
-#define EADDRINUSE
-#define EINPROGRESS
-#define EALREADY
-#define EWOULDBLOCK
-
-
- /*** function macros ***/
-
- /*** << Mon Dec 17 17:28:24 2001 mdd >>
-
- NOTE: Many of these calls require unused or null values for parameters.
- I've substituted (hardcoded) these parameters where I could find them.
- This is not very portable nor maintainable; perhaps you will find a better solution !
-
- ***/
-
-#define _LSLP_CLOSESOCKET(a) NU_Close_Socket((int)(a))
-#define _LSLP_SOCKET(a, b, c) NU_Socket( NU_FAMILY_IP, ((INT16)(b)), NU_NONE )
-//jeb
-#define _LSLP_BIND(a, b, c) \
- NU_Bind ((INT)(a),((struct addr_struct *)(b)),UNUSED_NU_PARM )
-#define _LSLP_CONNECT(a, b, c ) \
- NU_Connect ((INT)(a), \
- ((struct addr_struct *)(b)), \
- UNUSED_NU_PARM)
-#define _LSLP_LISTEN(a, b) NU_Listen ((INT)(a), (UINT16)(b))
-#define _LSLP_ACCEPT(a, b, c) \
- NU_Accept ((INT)(a), \
- ((struct addr_struct *)(b)), \
- UNUSED_NU_PARM )
-#define _LSLP_SEND(a, b, c, d) NU_Send ((INT)(a), (CHAR *)(b), (UINT16)(c), UNUSED_NU_PARM)
-#define _LSLP_SENDTO(a, b, c, d, e, f) \
- NU_Send_To ((INT)(a), (char *)(b), (UINT16)(c), (UNUSED_NU_PARM), \
- ((struct addr_struct *)(e)), \
- UNUSED_NU_PARM )
-#define _LSLP_RECV(a, b, c, d) NU_Recv ((INT)(a), (char *)(b), (UINT16)(c), UNUSED_NU_PARM )
-#define _LSLP_RECV_FROM(a, b, c, d, e, f) \
- NU_Recv_From ((INT)(a), (char *)(b), (INT16)(c), (UNUSED_NU_PARM), \
- ((struct addr_struct *)(e)), \
- UNUSED_NU_PARM)
-
-/* << Tue Dec 18 07:53:12 2001 mdd >> ATTN need to redefine these gethost functions */
-/* for all platforms */
-
-#define _LSLP_GETHOSTBYNAME(a) \
- (struct hostent *) nucleus_gethostbyname((const char *)(a))
-#define _LSLP_GETHOSTBYADDR(a, b, c ) \
- (struct hostent *) nucleus_gethostbyaddr( (const void *)(a), (int)(b), (int)(c))
-
-#define _LSLP_SETSOCKOPT(a, b, c, d, e) \
- NU_Setsockopt(((INT)(a)), ((INT)(b)), ((INT)(c)), ((void *)(d)), ((INT)(e)))
-#define _LSLP_GETSOCKOPT(a, b, c, d, e) \
- NU_Getsockopt(((INT)(a)), ((INT)(b)), ((INT)(c)), ((void *)(d)), ((INT *)(e)))
-
-#define _LSLP_SET_TTL(s, t) NU_Setsockopt((s), IPPROTO_IP, IP_MULTICAST_TTL, (void *)&(t), sizeof((t))) //jeb
-
-/* << Tue Dec 18 08:16:59 2001 mdd >> ATTN need to redefine abort to be shutdown & close */
-#define _LSLP_ABORT(a) NU_Abort(((INT)(a)))
-
-#define _LSLP_SLEEP(a) _sleep((int)(a))
-
-//jeb strtok
-#define _LSLP_STRTOK(s, d, x) strtok(((char*)(s)),((const char *)(d)))
-//jeb assert
-
-#define SLPDBG
-//#ifdef SLPDBG
-//void PEGASUS_ASSERT(int);
-#define assert(a) _system_info((!(a)),"ASSERT:%s/%d", __FILE__, __LINE__)
-//#else
-//#define assert(a) ((void)0)
-//#endif
-
-#define htons(x) INTSWAP((unsigned short)(x))
-#define ntohs(x) INTSWAP((unsigned short)(x))
-#define ntohl(x) LONGSWAP((unsigned long)(x))
-#define inet_addr(x) tcpst_inet_addr((char *)(x))
-
-#define _itoa(a,b,c) itoa(((int)(a)),((char*)(b)),((int)(c)))
-//end jeb
-
-/* << Tue Dec 18 09:54:25 2001 mdd >> ATTN the final parameter is a pointer on windows */
-/* and unix, but is an integer on Nucleus that specifies timer ticks */
-
- struct _lslp_timeval
- {
- uint32 tv_sec;
- uint32 tv_usec;
- } ;
-//jeb
- struct timeval
- {
- uint32 tv_sec;
- uint32 tv_usec;
- } ;
-//jeb
-
-//jeb typedef TIMEVAL timeval;
-
-#ifdef PLUS
-#define _LSLP_SELECT(a, b, c, d, e ) \
- NU_Select(((INT)(a)), ((FD_SET *)(b)), ((FD_SET *)(c)), ((FD_SET *)(d)), \
- ((UNSIGNED)(((struct _lslp_timeval *)(e))->tv_usec)))
-#else
-#define _LSLP_SELECT(a, b, c, d, e ) \
- NU_Select(((INT)(a)), ((FD_SET *)(b)), ((FD_SET *)(c)), ((FD_SET *)(d)), \
- (sint)((((struct _lslp_timeval *)(e))->tv_usec) & 0x7fffffff ) )
-#endif
-#define LSLP_FD_SET FD_SET
-#define _LSLP_FD_ISSET(a, b) NU_FD_Check(((INT)(a)), ((FD_SET *)(b)))
-#define _LSLP_FD_SET(a, b) NU_FD_Set(((INT)(a)), ((FD_SET *)(b)))
-#define _LSLP_FD_ZERO(a) NU_FD_Init(((FD_SET *)(a)))
-#define _LSLP_FD_CLR(a, b) NU_FD_Reset(((INT)(a)), ((FD_SET *)(b)))
-
-
-/* ATTN << Tue Dec 18 10:42:19 2001 mdd >> */
-
-//jeb #define _LSLP_IOCTLSOCKET(a, b, c) #error "See Nucleus NET Reference Manual for limitations on usage of ioctl\n"
-
-/* ATTN << Tue Dec 18 12:54:40 2001 mdd >> */
-#define _LSLP_GETLASTERROR()
-
-
- /*****
-
- We probably don't need these to be defined << Tue Dec 18 16:21:23 2001 mdd >>
-
- STATUS NU_Send_To_Raw(INT socketd, char *buff, UINT16 nbytes, INT16 flags,
- struct addr_struct *to, INT16 addrlen);
-
- INT16 NU_Get_IPRaw_PCB(INT socketd, struct sock_struct *);
-
- jeb start add
- STATUS NU_Recv_From_No_Suspend (INT16, char *, INT16, INT16, struct addr_struct *, INT16 *);
- STATUS NU_Find_Open_Sckts_For_Dev (UINT8 sck_type, INT skt, DV_DEVICE_ENTRY *dev_ptr);
- jeb end add
-
- STATUS NU_Recv_From_Raw (INT, char *, INT16, INT16, struct addr_struct *, INT16 *);
-
- STATUS NU_Push (INT);
- STATUS NU_Is_Connected (INT);
- INT16 NU_GetPnum (struct sock_struct *);
- INT16 NU_Get_UDP_Pnum (struct sock_struct *);
- STATUS NU_Fcntl (INT socketd, INT16 command, INT16 arguement);
- STATUS NU_Get_Peer_Name(INT, struct sockaddr_struct *, INT16 *);
-
- *****/
-
-//prototypes //jeb
-char *inet_ntoa(struct in_addr in);
-
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* nucleus include */
+++ /dev/null
-/*****************************************************************************
- * Description: portability routines for WINDOZE
- *
- * Originated: December 17, 2001
- * Original Author: Mike Day md@soft-hackle.net
- * mdday@us.ibm.com
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/Attic/lslp-windows.c,v 1.1 2003/05/21 15:14:08 mday Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-#include "lslp-windows.h"
-
-void WindowsStartNetwork(void)
-{
- WSADATA wsData;
- WSAStartup ( 0x0002, &wsData );
-}
-
-
-
+++ /dev/null
-//%2005////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation, The Open Group.
-// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-// EMC Corporation; VERITAS Software Corporation; The Open Group.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//==============================================================================
-/*****************************************************************************
- * Description: portability routines for WINDOZE
- *
- * Originated: December 31, 1999
- * Original Author: Mike Day md@soft-hackle.net
- * mdday@us.ibm.com
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/Attic/lslp-windows.h,v 1.7 2005/11/27 03:11:39 jim.wunderlich Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-
-#ifndef _LSLP_WINDOWS_INCL_
-#define _LSLP_WINDOWS_INCL_
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef _WIN32
-#ifndef _MT
-#define _MT
-#endif
-
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <process.h> /* _beginthread, _endthread */
-#include <winbase.h>
-#include <tchar.h>
-#include <sys/types.h>
-#include <sys/timeb.h>
-#include <Pegasus/Common/PegasusAssert.h>
-#include <errno.h>
-
-typedef char int8;
-typedef unsigned char uint8;
-typedef uint8 byte;
-typedef short int16;
-typedef unsigned short uint16;
-typedef int int32;
-typedef unsigned int uint32;
-typedef __int64 int64;
-typedef unsigned __int64 uint64;
-typedef SOCKET SOCKETD;
-
-typedef struct socket_address {
- struct sockaddr_in *address;
- int address_len;
-} socket_addr ;
-
-typedef struct socket_address_list {
- int count;
- socket_addr *list;
-} socket_addr_list;
-
-void WindowsStartNetwork(void);
-int32 gettimeofday(struct timeval *tv, struct timezone *tz);
-
-/* WIN 32 macros for mutex semaphore */
-#define _LSLP_CREATE_MUTEX(h) \
- (((h) = CreateMutex(NULL, FALSE, NULL)) ? 0 : -1)
-#define _LSLP_CLOSE_MUTEX(h) \
- if((h) != 0){ReleaseMutex((HANDLE)(h));CloseHandle((HANDLE)(h)); (h) = 0;}
-#define LSLP_DEFAULT_WAIT 100
-#define LSLP_EXTRA_WAIT 250
-/* h = handle, m = milliseconds, c = pointer to completion code */
-#define _LSLP_WAIT_MUTEX(h, m, c) \
- if((h) != 0){(*(c)) = WaitForSingleObject((HANDLE)(h), (m));}
-#define _LSLP_RELEASE_MUTEX(h) \
- if((h) != 0) {ReleaseMutex((HANDLE)(h));}
-#define _LSLP_DUP_MUTEX(h, n) \
- if ((h) != 0) \
- {DuplicateHandle(GetCurrentProcess(), (h), GetCurrentProcess(), (n), \
- 0, TRUE, DUPLICATE_SAME_ACCESS | MUTEX_ALL_ACCESS | SYNCHRONIZE);}
-#define _LSLP_CREATE_SEM(h, i) \
- (((h) = (uint32)CreateSemaphore(NULL, (i), 0x0000ffff, NULL)) ? 0 : -1)
-/* h = handle, m = milliseconds, c = pointer to completion code */
-#define _LSLP_WAIT_SEM(h, m, c) \
- if((h) != 0){(*(c)) = WaitForSingleObject((HANDLE)(h), (m));}
-#define _LSLP_SIGNAL_SEM(h) \
- ReleaseSemaphore((HANDLE)(h), 1, NULL)
-#define _LSLP_CLOSE_SEM(h) \
- {if((h) != 0){ReleaseSemaphore((HANDLE)(h), 0x0000fff0, NULL); CloseHandle((HANDLE)(h)); (h) = 0;}}
-
-#define LSLP_SEM_T HANDLE
-#define LSLP_THREAD_T HANDLE
-#define LSLP_WAIT_FAILED WAIT_FAILED
-#define LSLP_WAIT_OK WAIT_OBJECT_0
-#define LSLP_WAIT_TIMEOUT WAIT_TIMEOUT
-#define LSLP_WAIT_ABANDONDED WAIT_ABANDONED
-
-/* void SLEEP(int32 milliseconds) */
-#define _LSLP_SLEEP Sleep
-#define _LSLP_SET_TTL(s, t) setsockopt((s), IPPROTO_IP, IP_MULTICAST_TTL, (const char *)&(t), sizeof((t)))
-
-/* void *(*start)(void *), ustacksize, void *arg */
-#define _LSLP_BEGINTHREAD(start, stacksize, arg) _beginthread((start), (stacksize), (arg))
-#define _LSLP_ENDTHREAD _endthread
-
-#define _LSLP_STRTOK(n, d, s) strtok((n), (d) )
-#define _LSLP_SIG_ACTION()
-#define _LSLP_SIG_ACTION_THREAD()
-#define _LSLP_PUSH_HANDLER(a, b)
-#define _LSLP_POP_HANDLER(a, b)
-
-#define strncasecmp strnicmp
-
-/* maximum path length */
-#define LSLP_MAXPATH _MAX_PATH
-#define LSLP_NEWLINE \r\n
-#endif /* WIN 32 */
-
-
-#define ENOTSOCK WSAENOTSOCK
-#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
-#define EAFNOSUPPORT WSAEAFNOSUPPORT
-#define EISCONN WSAEISCONN
-#define ETIMEDOUT WSAETIMEDOUT
-#define ECONNREFUSED WSAECONNREFUSED
-#define ENETUNREACH WSAENETUNREACH
-#define EADDRINUSE WSAEADDRINUSE
-#define EINPROGRESS WSAEINPROGRESS
-#define EALREADY WSAEALREADY
-#define EWOULDBLOCK WSAEWOULDBLOCK
-
-#define _LSLP_GETLASTERROR() WSAGetLastError()
-
-#define _LSLP_INIT_NETWORK WindowsStartNetwork
-#define _LSLP_DEINIT_NETWORK WSACleanup
-
-#define _LSLP_SOCKET(a, b, c) socket(((int)(a)), ((int)(b)), ((int)(c)))
-#define _LSLP_CLOSESOCKET closesocket
-#define _LSLP_BIND(a, b, c) bind(((SOCKET)(a)), ((const struct sockaddr *)(b)), ((int)(c)))
-#define _LSLP_CONNECT(a, b, c) connect(((SOCKET)(a)), ((const struct sockaddr *)(b)), ((int)(c)))
-#define _LSLP_LISTEN(a, b) listen(((SOCKET)(a)), ((int)(b)))
-#define _LSLP_ACCEPT(a, b, c) accept(((SOCKET)(a)), ((struct sockaddr *)(b)), ((int *)(c)))
-#define _LSLP_SEND(a, b, c, d) send(((SOCKET)(a)), ((const char *)(b)), ((int)(c)), ((int)(d)))
-#define _LSLP_SENDTO(a, b, c, d, e, f) \
- sendto(((SOCKET)(a)), ((const char *)(b)), ((int)(c)), ((int)(d)), \
- ((const struct sockaddr *)(e)), ((int)(f)))
-#define _LSLP_RECV(a, b, c, d) recv(((SOCKET)(a)), ((const char *)(b)), ((int)(c)), ((int)(d)))
-#define _LSLP_RECV_FROM(a, b, c, d, e, f) \
- recvfrom(((SOCKET)(a)), ((char *)(b)), ((int)(c)), ((int)(d)), \
- ((struct sockaddr *)(e)), ((int *)(f)))
-
-#define _LSLP_GETHOSTBYNAME(a, b) /* ATTN << Tue Dec 18 13:26:09 2001 mdd >> */
-#define _LSLP_GETHOSTBYADDR(a, b, c, d) /* ATTN << Tue Dec 18 13:26:49 2001 mdd >> */
-
-#define _LSLP_SETSOCKOPT(a, b, c, d, e) \
- setsockopt(((SOCKET)(a)), ((int)(b)), ((int)(c)), ((const char *)(d)), ((int)(e)))
-#define _LSLP_GETSOCKOPT(a, b, c, d, e) \
- getsockopt(((SOCKET)(a)), ((int)(b)), ((int)(c)), ((char *)(d)), ((int *)(e)))
-#define _LSLP_ABORT(a) { shutdown(((SOCKET)(a)), SD_BOTH ) ; closesocket((SOCKET)(a)) }
-#define _LSLP_SELECT(a, b, c, d, e) \
- select(((int)(a)), ((fd_set *)(b)), ((fd_set *)(c)), \
- ((fd_set *)(d)), ((const struct timeval *)(e)))
-#define _LSLP_FD_ISSET(a, b) FD_ISSET(((SOCKET)(a)), ((fd_set *)(b)))
-#define _LSLP_FD_SET(a, b) FD_SET(((SOCKET)(a)), ((fd_set *)(b)))
-#define _LSLP_FD_ZERO(a) FD_ZERO((fd_set *)(a))
-#define _LSLP_FD_CLR(a, b) FD_CLR(((SOCKET)(a)), ((fd_set *)(b)))
-
-#define _LSLP_IOCTLSOCKET ioctlsocket
-#define LSLP_MTU 1400
-
-#define LSLP_FD_SET fd_set
-#define strcasecmp _stricmp
-
-
-/* ascii and char tests and conversions */
-
-#define _LSLP_ISASCII(a) __isascii(a)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*_LSLP_WINDOWS_INCL_*/
-
+++ /dev/null
-//%2005////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation, The Open Group.
-// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-// EMC Corporation; VERITAS Software Corporation; The Open Group.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//==============================================================================
-/*****************************************************************************
- * Description:
- *
- * Originated: December 20, 2001
- * Original Author: Mike Day md@soft-hackle.net
- * mdd@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/Attic/lslp.h,v 1.5 2005/02/05 23:01:30 karl Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-
-#ifndef _LSLPDEFS_INCLUDE
-#define _LSLPDEFS_INCLUDE
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef NUCLEUS //jeb
-#ifndef __linux__
-#pragma pack( push, lslp_defs )
-#pragma pack(1)
-#endif
-#endif
-#include "../../config.h"
-#include "endian.h"
-
-
-
- /******************** circular list macros *********************/
-
- /*---------------------------------------------------------------------**
- ** structures used with these macros MUST have the following elements: **
- ** struct type-name { **
- ** struct type-name *next; **
- ** struct type-name *prev; **
- ** BOOL isHead; **
- ** int count; **
- ** } **
- **---------------------------------------------------------------------*/
-
- /* is node x the head of the list? */
- /* BOOL IS_HEAD(node *x); */
-#define _LSLP_IS_HEAD(x) ((x)->isHead )
-
- /* where h is the head of the list */
- /* BOOL _LSLP_IS_EMPTY(head); */
-#define _LSLP_IS_EMPTY(h) \
- ((((h)->next == (h)) && ((h)->prev == (h)) ) ? TRUE : FALSE)
-
- /* where n is the new node, insert it immediately after node x */
- /* x can be the head of the list */
- /* void _LSLP_INSERT(new, after); */
-#define _LSLP_INSERT(n, x) \
- {(n)->prev = (x); \
- (n)->next = (x)->next; \
- (x)->next->prev = (n); \
- (x)->next = (n); }
-
-#define _LSLP_INSERT_AFTER _LSLP_INSERT
-#define _LSLP_INSERT_BEFORE(n, x) \
- {(n)->next = (x); \
- (n)->prev = (x)->prev; \
- (x)->prev->next = (n); \
- (x)->prev = (n); }
-
-#define _LSLP_INSERT_WORKNODE_LAST(n, x) \
- {gettimeofday(&((n)->timer)); \
- (n)->next = (x); \
- (n)->prev = (x)->prev; \
- (x)->prev->next = (n); \
- (x)->prev = (n); }
-
-#define _LSLP_INSERT_WORKNODE_FIRST(n, x) \
- {gettimeofday(&((n)->timer)); \
- (n)->prev = (x); \
- (n)->next = (x)->next; \
- (x)->next->prev = (n); \
- (x)->next = (n); }
-
- /* delete node x - harmless if list is empty */
- /* void _LSLP_DELETE_(x); */
-#define _LSLP_UNLINK(x) \
- {(x)->prev->next = (x)->next; \
- (x)->next->prev = (x)->prev;}
-
- /* given the head of the list h, determine if node x is the last node */
- /* BOOL _LSLP_IS_LAST(head, x); */
-#define _LSLP_IS_LAST(h, x) \
- (((x)->next == (h) && (h)->prev == (x)) ? TRUE : FALSE)
-
- /* given the head of the list h, determine if node x is the first node */
- /* BOOL _LSLP_IS_FIRST(head, x); */
-#define _LSLP_IS_FIRST(h, x) \
- (((x)->prev == (h) && (h)->next == (x)) ? TRUE : FALSE)
-
- /* given the head of the list h, determine if node x is the only node */
- /* BOOL _LSLP_IS_ONLY(head, x); */
-#define _LSLP_IS_ONLY(h, x) \
- (((x)->next == (h) && (h)->prev == (x)) ? TRUE : FALSE)
-
- /* void _LSLP_LINK_HEAD(dest, src); */
-#define _LSLP_LINK_HEAD(d, s) \
- {(d)->next = (s)->next; \
- (d)->prev = (s)->prev; \
- (s)->next->prev = (d); \
- (s)->prev->next = (d); \
- (s)->prev = (s)->next = (s) ; }
-
- /************* bit-set macros *********************************/
- /* how many dwords do we need to allocate to hold b bits ? */
-#define _LSLP_SIZEOF_BITARRAY(b) (((b) >> 5) + 1)
- /* operating on an array of dwords */
-#define _LSLP_IS_BIT_SET(b, a) (*((a) + ((b) >> 5)) & (1 << (((b)%32) - 1)))
-#define _LSLP_SET_BIT(b, a) (*((a) + ((b) >> 5)) |= (1 << (((b)%32) - 1)))
-#define _LSLP_CLEAR_BIT(b, a) (*((a) + ((b) >> 5)) ^= (1 << (((b)%32) - 1)))
-
- /* the usual */
-#define _LSLP_MIN(a, b) ((a) < (b) ? (a) : (b))
-#define _LSLP_MAX(a, b) ((a) > (b) ? (a) : (b))
-
- /********************** SLP V2 MACROS *************************/
- /**************************************************************/
-#define LSLP_PROTO_VER 2
-#define LSLP_PORT 427
-#define _LSLP_LOCAL_BCAST inet_addr("255.255.255.255")
-#define _LSLP_MCAST inet_addr("239.255.255.253")
- /* derive an address for a directed broadcast */
- /* a = uint32 addr, m = uint32 mask */
-#define _LSLP_DIR_BCAST(a, m) {(a) &= (m); (a) |= ~(m);}
-//jeb #define LSLP_EN_US "EN"
-#define LSLP_EN_US "en"
-#define LSLP_EN_US_LEN 2
- /* the absolute minimum hdr size */
-#define LSLP_MIN_HDR 14
-
- /* slp v2 message types */
-#define LSLP_SRVRQST 1
-#define LSLP_SRVRPLY 2
-#define LSLP_SRVREG 3
-#define LSLP_SRVDEREG 4
-#define LSLP_SRVACK 5
-#define LSLP_ATTRREQ 6
-#define LSLP_ATTRRPLY 7
-#define LSLP_DAADVERT 8
-#define LSLP_SRVTYPERQST 9
-#define LSLP_SRVTYPERPLY 10
-#define LSLP_SAADVERT 11
-
- /* slp error codes */
-#define LSLP_LANGUAGE_NOT_SUPPORTED 1
-#define LSLP_PARSE_ERROR 2
-#define LSLP_INVALID_REGISTRATION 3
-#define LSLP_SCOPE_NOT_SUPPORTED 4
-#define LSLP_AUTHENTICATION_UNKNOWN 5
-#define LSLP_AUTHENTICATION_ABSENT 6
-#define LSLP_AUTHENTICATION_FAILED 7
-#define LSLP_VERSION_NOT_SUPPORTED 9
-#define LSLP_INTERNAL_ERROR 10
-#define LSLP_DA_BUSY 11
-#define LSLP_OPTION_NOT_UNDERSTOOD 12
-#define LSLP_INVALID_UPDATE 13
-#define LSLP_MSG_NOT_SUPPORTED 14
-#define LSLP_REFRESH_REJECTED 15
-
- /* stream SLP error codes */
-#define LSLP_OK 0x00000000
-#define LSLPERR_BASE 0x00002000
-#define LSLPERR_INVALID_SEM LSLPERR_BASE + 0x00000001
-#define LSLP_NOT_INITIALIZED LSLPERR_BASE + 0x00000002
-#define LSLP_TIMEOUT LSLPERR_BASE + 0x00000003
-#define LSLP_MALLOC_ERROR LSLPERR_BASE + 0x00000004
-
-
- /* offsets into the SLPv2 header */
-#define LSLP_VERSION 0
-#define LSLP_FUNCTION 1
-#define LSLP_LENGTH 2
-#define LSLP_FLAGS 5
-#define LSLP_NEXT_EX 7
-#define LSLP_XID 10
-#define LSLP_LAN_LEN 12
-#define LSLP_LAN 14
-
-
- /* macros to gain access to SLP header fields */
- /* h = (uint8 *)slpHeader */
- /* o = int32 offset */
- /* i = int32 value */
-
-#if __BYTE_ORDER__ == __LITTLE_ENDIAN__
-#define _LSLP_GETBYTE(h, o) (0x00ff & *(uint8 *) &((h)[(o)]))
-#define _LSLP_GETSHORT(h, o) ((0xff00 & _LSLP_GETBYTE((h), (o)) << 8) + \
- (0x00ff & _LSLP_GETBYTE((h), (o) + 1)) )
-#define _LSLP_SETBYTE(h, i, o) ((h)[(o)] = (uint8)i)
-#define _LSLP_SETSHORT(h, i, o) { _LSLP_SETBYTE((h), (0xff & ((i) >> 8)), (o)); \
- _LSLP_SETBYTE((h), (0xff & (i)), (o) + 1); }
-#define _LSLP_GETLONG(h, o) ( (0xffff0000 & _LSLP_GETSHORT((h), (o)) << 16) + \
- (0x0000ffff & _LSLP_GETSHORT((h), (o) + 2)) )
-#define _LSLP_SETLONG(h, i, o) { _LSLP_SETSHORT((h), (0xffff & ((i) >> 16)), (o) ); \
- _LSLP_SETSHORT((h), (0xffff & (i)), (o) + 2); }
- /* length is a 3-byte value */
-#define _LSLP_GETLENGTH(h) ((0xff0000 & (*(uint8 *) &((h)[LSLP_LENGTH]) << 16)) + \
- (0x00ff00 & (*(uint8 *) &((h)[LSLP_LENGTH + 1]) << 8)) + \
- (0x0000ff & (*(uint8 *) &((h)[LSLP_LENGTH + 2]))))
-#define _LSLP_SETLENGTH(h, i) {_LSLP_SETSHORT( (h), (((i) & 0xffff00) >> 8), LSLP_LENGTH ); \
- _LSLP_SETBYTE((h), ((i) & 0x0000ff), LSLP_LENGTH + 2);}
- /* next option offset is a 3-byte value */
-#define _LSLP_GETNEXTEXT(h) ((0xff0000 & (*(uint8 *) &((h)[LSLP_NEXT_EX]) << 16)) + \
- (0x00ff00 & (*(uint8 *) &((h)[LSLP_NEXT_EX + 1]) << 8)) + \
- (0x0000ff & (*(uint8 *) &((h)[LSLP_NEXT_EX + 2]))))
-#define _LSLP_SETNEXTEXT(h, i) {_LSLP_SETSHORT((h), (((i) & 0xffff00) >> 8), LSLP_NEXT_EX ); \
- _LSLP_SETBYTE((h), ((i) & 0x0000ff), LSLP_NEXT_EX + 2);}
-#define _LSLP_SET3BYTES(h, i, o) {_LSLP_SETSHORT( (h), (((i) & 0xffff00) >> 8), (o) ); \
- _LSLP_SETBYTE((h), ((i) & 0x0000ff), (o) + 2);}
-#define _LSLP_GET3BYTES(h, o) ((0xff0000 & (*(uint8 *) &((h)[(o)]) << 16)) + \
- (0x00ff00 & (*(uint8 *) &((h)[(o) + 1]) << 8)) + \
- (0x0000ff & (*(uint8 *) &((h)[(o) + 2]))))
-
-#else /* BIG ENDIAN */
-
-#ifdef NUCLEUS //nucleus use some existing functions
-#define _LSLP_GETBYTE(h, o) GET8(h, o)
-#define _LSLP_GETSHORT(h, o) GET16(h, o)
-#define _LSLP_SETBYTE(h, i, o) PUT8(h, o, i) //buf,offset,value
-#define _LSLP_SETSHORT(h, i, o) PUT16(h, o, i) //buf,offset,value
-#define _LSLP_GETLONG(h, o) GET32(h, o)
-#define _LSLP_SETLONG(h, i, o) PUT32(h, o, i) //buf,offset,value
-
-
-#define _LSLP_GETLENGTH(h) ((0xff0000 & (GET8(h, LSLP_LENGTH) << 16)) + \
- (0x00ff00 & (GET8(h, LSLP_LENGTH+1) << 8)) + \
- (0x0000ff & (GET8(h, LSLP_LENGTH+2))) )
- /***********************
-#define _LSLP_SETLENGTH(h, i) ((PUT8((h), (LSLP_LENGTH), ((uint8)(((i)) >> 16)) )) + \
- (PUT8((h), (LSLP_LENGTH + 1), ((uint8)(((i)) >> 8)) )) + \
- (PUT8((h), (LSLP_LENGTH + 2), ((uint8)(i)) )))
- *****************************/
-#define _LSLP_SETLENGTH(h, i) ((PUT8((h), (LSLP_LENGTH), ((uint8)(((i)) >> 16)))) + (PUT8((h), (LSLP_LENGTH + 1), ((uint8)(((i)) >> 8)) )) + (PUT8((h), (LSLP_LENGTH + 2), ((uint8)(i)) )))
-
-#define _LSLP_GETNEXTEXT(h) ((0xff0000 & (GET8(h, LSLP_NEXT_EX) << 16)) + \
- (0x00ff00 & (GET8(h, (LSLP_NEXT_EX + 1)) << 8)) + \
- (0x0000ff & (GET8(h, (LSLP_NEXT_EX + 2)))))
-#define _LSLP_SETNEXTEXT(h, i) ((PUT8(h, (LSLP_NEXT_EX), ((uint8)((i) >> 16)))) + (PUT8(h, (LSLP_NEXT_EX + 1), ((uint8)((i) >> 8)))) + (PUT8(h, (LSLP_NEXT_EX + 2), ((uint8)(i)))))
- /*********************************
-#define _LSLP_SETNEXTEXT(h, i) ((PUT8((h), (LSLP_NEXT_EX), ((uint8)((i) >> 16)))) + \
- (PUT8((h), (LSLP_NEXT_EX + 1), ((uint8)((i) >> 8)))) + \
- (PUT8((h), (LSLP_NEXT_EX + 2), ((uint8)(i)))))
- ************************/
-
-#define _LSLP_GET3BYTES(h, o) ((0xff0000 & (GET8(h, o) << 16)) + \
- (0x00ff00 & (GET8(h, ((o) + 1)) << 8)) + \
- (0x0000ff & (GET8(h, ((o) + 2)))))
-
-
-//#define _LSLP_SET3BYTES(h, i, o) (PUT16((h),(o),(i))); (PUT8((h),((o)+2),(i)))
-#define _LSLP_SET3BYTES(h, i, o) ((PUT8((h), (o), ((uint8)((i) >> 16)))) + (PUT8((h), ((o) + 1), ((uint8)((i) >> 8)))) + (PUT8((h), ((o) + 2), ((uint8)(i)))))
-
-
-
-#else //big endian - not nucleus
-#define _LSLP_GETBYTE(h, o) (0x00ff & *((uint8 *) &((h)[(o)])))
-#define _LSLP_GETSHORT(h, o) ((0xff00 & _LSLP_GETBYTE((h), (o))) + \
- (0x00ff & _LSLP_GETBYTE((h), (o) + 1)))
-
-#define _LSLP_SETBYTE(h, i, o) ((h)[(o)] = (uint8)(i))
-#define _LSLP_SETSHORT(h, i, o) { _LSLP_SETBYTE((h), (0xff00 & (i)), (o)); \
- _LSLP_SETBYTE((h), (0x00ff & (i)), (o) + 1); }
-
-#define _LSLP_GETLONG(h, o) ((0xffff0000 & _LSLP_GETSHORT((h), (o))) + \
- (0x0000ffff & _LSLP_GETSHORT((h), (o) + 2)))
-
-#define _LSLP_SETLONG(h, i, o) { _LSLP_SETSHORT((h), (0xffff0000 & (i)), (o)); \
- _LSLP_SETSHORT((h), (0x0000ffff & (i)), (o) + 2); }
-
- /* length is a 3-byte value */
-
-#define _LSLP_GET3BYTES(h, o) ((0xff0000 & (_LSLP_GETBYTE((h), (o)) << 16)) + \
- (0x00ff00 & (_LSLP_GETBYTE((h), ((o) + 1)) << 8)) + \
- (0x0000ff & (_LSLP_GETBYTE((h), ((o) + 2)))))
-
-#define _LSLP_SET3BYTES(h, i, o) ((_LSLP_SETBYTE((h), (0xff & ((uint8)((i) >> 16))), (o)) + \
- (_LSLP_SETBYTE((h), (0xff & ((uint8)((i) >> 8))), ((o) + 1))) + \
- (_LSLP_SETBYTE((h), (0xff & ((uint8)((i)))), ((o) + 2)))
-
-#define _LSLP_GETLENGTH(h) _LSLP_GET3BYTES((h), LSLP_LENGTH)
-#define _LSLP_SETLENGTH(h, i) _LSLP_SET3BYTES((h), (i), LSLP_LENGTH)
-
-#define _LSLP_GETFIRSTEXT(h) _LSLP_GET3BYTES((h), LSLP_NEXT_EX)
-#define _LSLP_SETFIRSTEXT(h, i) _LSLP_SET3BYTES((h), (i), LSLP_NEXT_EX)
-
-#define _LSLP_GETNEXTEXT _LSLP_GET3BYTES
-#define _LSLP_SETNEXTEXT _LSLP_SET3BYTES
-
-#endif //#ifdef nucleus
-#endif /* ENDIAN definitions */
-
- /* macros to get and set header fields */
-#define _LSLP_GETVERSION(h) _LSLP_GETBYTE((h), LSLP_VERSION)
-#define _LSLP_SETVERSION(h, i) _LSLP_SETBYTE((h), (i), LSLP_VERSION)
-#define _LSLP_GETFUNCTION(h) _LSLP_GETBYTE((h), LSLP_FUNCTION)
-#define _LSLP_SETFUNCTION(h, i) _LSLP_SETBYTE((h), (i), LSLP_FUNCTION)
-#define _LSLP_GETFLAGS(h) _LSLP_GETBYTE((h), LSLP_FLAGS)
-#define _LSLP_SETFLAGS(h, i) _LSLP_SETBYTE((h), (i), LSLP_FLAGS)
-#define _LSLP_GETLANLEN(h) _LSLP_GETSHORT((h), LSLP_LAN_LEN)
-#define _LSLP_SETLANLEN(h, i) _LSLP_SETSHORT((h), (i), LSLP_LAN_LEN)
-#define _LSLP_SETLAN(h, s, l) \
-{ _LSLP_SETSHORT((h), (l), LSLP_LAN_LEN) ; \
- memcpy( &((h)[LSLP_LAN]), (s), (l)) ; }
-
-/* #define _LSLP_SETLAN(h, s) {_LSLP_SETSHORT((h),(_LSLP_MIN( (strlen((s)) + 2), 17)), LSLP_LAN_LEN); \ */
-/* memcpy(&(h)[LSLP_LAN],(s),(_LSLP_MIN( (strlen((s)) + 2) , 17)));} */
-#define _LSLP_GETXID(h) _LSLP_GETSHORT((h), LSLP_XID)
-#define _LSLP_SETXID(h, i) _LSLP_SETSHORT((h), (i), LSLP_XID)
-#define _LSLP_HDRLEN(h) (14 + _LSLP_GETLANLEN((h)))
- /* give (work *), how big is the msg header ? */
-#define _LSLP_HDRLEN_WORK(work) (14 + (work)->hdr.langLen )
- /* given (work *), how big is the data field ? */
-#define _LSLP_DATALEN_WORK(work) (((work)->hdr.len) - _LSLP_HDRLEN_WORK((work)))
-
-#define LSLP_FLAGS_OVERFLOW 0x80
-#define LSLP_FLAGS_FRESH 0x40
-#define LSLP_FLAGS_MCAST 0x20
-
- /* URL entry definitions */
-#define LSLP_URL_LIFE 1
-#define LSLP_URL_LEN 3
-#define _LSLP_GETURLLIFE(h) _LSLP_GETSHORT((h), LSLP_URL_LIFE)
-#define _LSLP_SETURLLIFE(h, i) _LSLP_SETSHORT((h), (i), LSLP_URL_LIFE)
-#define _LSLP_GETURLLEN(h) _LSLP_GETSHORT((h), LSLP_URL_LEN)
-#define _LSLP_SETURLLEN(h, i) _LSLP_SETSHORT((h), (i), LSLP_URL_LEN)
-
-
- /* simplified API definitions */
-
-#define LSLP_API_HDR_VERSION 1
-#define LSLP_API_SIGNATURE "legato slp stream interface\0"
-#define LSLP_API_SIGNATURE_SIZE 28
-#define LSLP_API_HDR_SIZE 38
-
-#define _LSLP_PERROR(a, b) fprintf(stderr, "%s: Error %s (%s).\n", (a), (b), strerror(errno))
-
-struct api_hdr {
- int32 version;
- int8 signature[28];
- int16 msgLen; /* including header */
- int16 errCode;
- int16 function_id;
-};
-
-#define LSLP_API_ACK 0x2000 /* with err code in first three bits */
-#define LSLP_SIMPLE_SRVREQ 0x1001
-#define LSLP_SIMPLE_SRVRPLY 0x1002
-#define LSLP_SIMPLE_SRVREG 0x1003
-#define LSLP_SIMPLE_SRVDEREG 0x1004
-
-#define _LSLP_FREE_DEINIT(a) if((a) != NULL) { free(a); a = NULL; }
-
-#ifdef NUCLEUS
-#define LSLP_MTU ETHERNT_MTU //jeb
-#endif
-
-
-#ifdef __cplusplus
-}
-#endif
-#ifndef NUCLEUS //jeb
-#ifndef __linux__
-#pragma pack( pop, lslp_defs )
-#endif
-#endif
-#endif /* _LSLPDEFS_INCLUDE */
+++ /dev/null
-//%2005////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation, The Open Group.
-// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-// EMC Corporation; VERITAS Software Corporation; The Open Group.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//==============================================================================
-#ifndef BISON__V_H
-# define BISON__V_H
-
-#ifndef YYSTYPE
-typedef union {
- int32 _i;
- int8 *_s;
- lslpAttrList *_atl;
-} yystype;
-# define YYSTYPE yystype
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-# define _TRUE 257
-# define _FALSE 258
-# define _MULTIVAL 259
-# define _INT 260
-# define _ESCAPED 261
-# define _TAG 262
-# define _STRING 263
-# define _OPAQUE 264
-
-
-extern YYSTYPE attrlval;
-
-#endif /* not BISON__V_H */
+++ /dev/null
-#//%2005////////////////////////////////////////////////////////////////////////
-#//
-#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation, The Open Group.
-#// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; VERITAS Software Corporation; The Open Group.
-#//
-#// Permission is hereby granted, free of charge, to any person obtaining a copy
-#// of this software and associated documentation files (the "Software"), to
-#// deal in the Software without restriction, including without limitation the
-#// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-#// sell copies of the Software, and to permit persons to whom the Software is
-#// furnished to do so, subject to the following conditions:
-#//
-#// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-#// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-#// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-#// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-#// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-#// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-#// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#//
-#//==============================================================================
-PROJECT = slp_client
-LFLAGS += -o$@
-YFLAGS += -o$@
-
-SOURCES = slp_client.c \
- $(SRC_DIR)/$(OS_PORT_SRC) \
- y_attr.c \
- l_attr.c \
- y_url.c \
- l_url.c \
- y_filter.c \
- l_filter.c
-
-OBJS = slp_client$(OBJ) \
- $(SRC_DIR)/$(OS_PORT_OBJ) \
- y_attr$(OBJ) \
- l_attr$(OBJ) \
- y_url$(OBJ) \
- l_url$(OBJ) \
- y_filter$(OBJ) \
- l_filter$(OBJ)
-
-VERSION = 1:0:0
-
-all: lib$(PROJECT).la
-.PHONY: all
-
-clean: $(CLEAN) clean.txt
-.PHONY: clean
-
-
-install: $(INSTALL) install.txt
-.PHONY: install
-
-remove: $(REMOVE) remove.txt
-.PHONY: remove
-
-lib$(PROJECT).la: $(OBJS)
- $(LIBTOOL) $(CC) $(LIB_PATH) /usr/local/lib -version-info $(VERSION) $(LDFLAGS) $(DLL_LIB_FLAG) $(OBJ_OUT) $@ $(OBJS) $(LIBS)
-
-%$(OBJ) : %.c
- $(LIBTOOL) $(CC) $(NO_LINK_FLAG) $(CFLAGS) $(DEFS) $<
-
-$(SRC_DIR)/$(OS_PORT_OBJ) : $(SRC_DIR)/$(OS_PORT_SRC)
- $(LIBTOOL) $(CC) $(NO_LINK_FLAG) $(CFLAGS) $(DEFS) $(OBJ_OUT) $@ $<
-
-l_attr.c : attr.l
- $(LEX) -p -v -o$@ -P$(basename $<) $<
-y_attr.c : attr.y
- $(YACC) -o$@ -p$(basename $<) -v -d $<
-l_url.c : url.l
- $(LEX) -p -v -o$@ -P$(basename $<) $<
-y_url.c : url.y
- $(YACC) -o$@ -p$(basename $<) -v -d $<
-l_filter.c : filter.l
- $(LEX) -p -v -o$@ -P$(basename $<) $<
-y_filter.c : filter.y
- $(YACC) -o$@ -p$(basename $<) -v -d $<
-
-clean.txt :
- $(IGNORE)$(LIBTOOL) $(RM) $(RM_FLAGS) .libs/*
- $(IGNORE)$(LIBTOOL) $(RM) $(RM_FLAGS) *.o
- $(IGNORE)$(LIBTOOL) $(RM) $(RM_FLAGS) l_*.c
- $(IGNORE)$(LIBTOOL) $(RM) $(RM_FLAGS) y_*.c
- $(IGNORE)$(LIBTOOL) $(RM) $(RM_FLAGS) *.lo
-install.txt:
- $(LIBTOOL) $(CP) $(CP_FLAGS) libslp_client.* /usr/local/lib
-
-remove.txt:
- $(LIBTOOL) $(RM) $(RM_FLAGS) /usr/local/lib/libslp_client.*
-
-
-
-
-
-
-
-
-
+++ /dev/null
-#//%2005////////////////////////////////////////////////////////////////////////
-#//
-#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation, The Open Group.
-#// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; VERITAS Software Corporation; The Open Group.
-#//
-#// Permission is hereby granted, free of charge, to any person obtaining a copy
-#// of this software and associated documentation files (the "Software"), to
-#// deal in the Software without restriction, including without limitation the
-#// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-#// sell copies of the Software, and to permit persons to whom the Software is
-#// furnished to do so, subject to the following conditions:
-#//
-#// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-#// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-#// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-#// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-#// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-#// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-#// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#//
-#//==============================================================================
-##############################################################
-# Requires GNU Bison 1.35 and bison.simple
-##############################################################
-export BISON_SIMPLE := bison.simple
-CC=cl.exe
-LINKER=link
-
-ifdef DEBUG
-CFLAGS=/nologo /Od /D "WIN32" /D "_DEBUG" /Gm /EHsc /RTC1 /MDd /W3 /c /Zi /TC
-LDFLAGS=/nologo /dll /debug
-else
-CFLAGS=/nologo /O2 /D "WIN32" /EHsc /MD /W3 /c /TC
-LDFLAGS=/nologo /dll
-endif
-
-LIBS=Ws2_32.lib
-LEX=flex
-YACC=bison
-
-all: slp_client.dll
-
-OBJECTS=slp_client.obj lslp-windows.obj l_attr.obj y_attr.obj l_url.obj y_url.obj l_filter.obj y_filter.obj
-
-##############################################################
-# 1. slp_client.c
-##############################################################
-slp_client.obj : slp_client.c
- $(CC) $(CFLAGS) $<
-
-##############################################################
-# 2. lslp-windows.c
-##############################################################
-lslp-windows.obj : ../lslp-windows.c
- $(CC) $(CFLAGS) $<
-
-##############################################################
-# 3. bison -oy_attr.c -pattr -v -d attr.y
-##############################################################
-y_attr.c : attr.y
- $(YACC) -o$@ -p$(basename $<) -v -d $<
-
-##############################################################
-# 4. y_attr.c
-##############################################################
-y_attr.obj : y_attr.c
- $(CC) $(CFLAGS) $<
-
-##############################################################
-# 5. flex -p -v -ol_attr.c -Pattr attr.l
-##############################################################
-l_attr.c : attr.l
- $(LEX) -p -v -o$@ -P$(basename $<) $<
-
-##############################################################
-# 6. l_attr.c
-##############################################################
-l_attr.obj : l_attr.c
- $(CC) $(CFLAGS) $<
-
-##############################################################
-# 7. bison -oy_url.c -purl -v -d url.y
-##############################################################
-y_url.c : url.y
- $(YACC) -o$@ -p$(basename $<) -v -d $<
-
-##############################################################
-# 8. y_url.c
-##############################################################
-y_url.obj : y_url.c
- $(CC) $(CFLAGS) $<
-
-##############################################################
-# 9. flex -p -v -ol_url.c -Pattr url.l
-##############################################################
-l_url.c : url.l
- $(LEX) -p -v -o$@ -P$(basename $<) $<
-
-##############################################################
-# 10. l_url.c
-##############################################################
-l_url.obj : l_url.c
- $(CC) $(CFLAGS) $<
-
-##############################################################
-# 11. bison -ol_filter.c -pfilter -v -d l_filter.y
-##############################################################
-y_filter.c : filter.y
- $(YACC) -o$@ -p$(basename $<) -v -d $<
-
-##############################################################
-# 12. l_filter.c
-##############################################################
-y_filter.obj : y_filter.c
- $(CC) $(CFLAGS) $<
-
-##############################################################
-# 13. flex -p -v -ol_filter.c -Pfilter filter.l
-##############################################################
-l_filter.c : filter.l
- $(LEX) -p -v -o$@ -P$(basename $<) $<
-
-##############################################################
-# 14. l_filter.c
-##############################################################
-l_filter.obj : l_filter.c
- $(CC) $(CFLAGS) $<
-
-##############################################################
-# 15. Link the library
-##############################################################
-slp_client.dll : $(OBJECTS)
- $(LINKER) $(LDFLAGS) -out:$@ $(OBJECTS) $(LIBS)
-
-clean:
- $(RM) l_attr.c y_attr.c l_url.c y_url.c l_filter.c y_filter.c *.dll $(OBJECTS) *.pdb *.idb *.ilk *.exp *.lib
-
+++ /dev/null
-/*****************************************************************************
- * Description: encode/decode attribute lists
- *
- * Originated: March 6, 2000
- * Original Author: Mike Day md@soft-hackle.net
- * mdd@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/slp_client/Attic/attr.l,v 1.1 2003/05/21 15:14:08 mday Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-
-%{
-
-#undef YYLMAX
-#define YYLMAX 2048
-#define YY_NEVER_INTERACTIVE 1
-#undef YY_INPUT
-#define YY_INPUT(b, r, m) abort()
-#define exit(i) abort()
-#define fread(a, b, c, d) abort()
-#undef ECHO
-#define ECHO attrerror(yytext)
-#include "slp_client.h"
-#include "y_attr.h"
-
-static int16 heapIndex;
-static int8 heap[2052];
-static int8 buf[2052];
-static int8 *_lslp_strdup(int8 *s);
-void attrerror(int8 *, ...);
-int32 attrwrap(void);
-int32 attrlex(void);
-void attr_close_lexer(uint32 handle);
-uint32 attr_init_lexer(int8 *s);
-
-%}
-
-/* {} */
-digit [0-9]
-hexdigit [0-9a-fA-F]
-escaped (\\([a-fA-F0-9]{2}))
-reserved [(),\\!<=>~\x00-\x1f]
-res_tag [(),\\!<>~\x00-\x1f*_\r\n\t]
-res_val [*_\r\n\t]
-tag [^(), \\!<=>~\x00-\x1f]
-val (("\\"([a-fA-F0-9]{2}))|[^(),!<=>~\x00-\x1f])
-
- /*
- this lexer cycles through three states. in the initial state,
- it is looking strictly for attribute tags. If, in the initial
- state it finds a '(' it anticipates an attribute-value pair
- and changes to ATTRIBUTE state .
-
- in the ATTRIBUTE state is is looking for either a closing ')'
- or a '='. If it sees a closing ')' it changes to the initial state.
- if it sees an '=' it changes to the VALUE state and looks for
- the attribute value. After seeing the attribute value, it looks
- for a either a ')' or a ','. If it sees a ')' it closes the attribute
- and returns to the initial state.
-
- if, during the VALUE state the lexer sees a ',' it decides it is
- looking at a multi-valued attribute and returns a special _MULTIVAL
- token to the parser. The parser uses this to construct additional
- attribute-value pairs for each value in the multi-val statement.
- */
-%option noyywrap prefix="attr"
-
-%x ATTR
-%x VALUE
-%%
-
-[ \t\v\f]* { ; }
-
-"," { attrlval._i = *attrtext; return(attrlval._i); }
-"(" { BEGIN ATTR; attrlval._i = *attrtext; return(attrlval._i); }
-{tag}+ {
- if (attrleng > 0) {
- if(NULL != (attrlval._s = _lslp_strdup(attrtext)))
- return(_TAG);
- else
- return(0L);
- }
- }
-
- /* anything else in the initial state is an error */
-. {attrerror("error in lexer - initial state\n");}
-
-<ATTR>[ \t\v\f]* { ; }
-<ATTR>"=" {BEGIN VALUE; attrlval._i = *attrtext; return(attrlval._i);}
-<ATTR>{tag}+ {
- if (attrleng > 0 ) {
- if(NULL != (attrlval._s = _lslp_strdup(attrtext)))
- return(_TAG);
- else
- return(0L);
- }
- }
-
- /* make it legal to have just an attr tag enclosed in parens */
-<ATTR>")" {BEGIN INITIAL; attrlval._i = *attrtext; return(attrlval._i); }
-
- /* anything else in the attribute state is an error */
-<ATTR>. {attrerror("error in lexer - attribute state\n");}
-
-<VALUE>[ \t\v\f]* { ; }
-<VALUE>"," {attrlval._i = *attrtext; return(_MULTIVAL);}
-
-<VALUE>[-+][0-9]+ |
-<VALUE>[-+]"0"[xX]{hexdigit}+ { attrlval._i = strtol(attrtext, (char **) 0, 0); return _INT ;};
-
-<VALUE>[0-9]+ |
-<VALUE>"0"[xX]{hexdigit}+ { attrlval._i = strtoul(attrtext, (char **)0, 0); return _INT; };
-
-
-<VALUE>[tT][rR][uU][eE] {return(_TRUE);}
-<VALUE>[fF][aA][lL][sS][eE] {return(_FALSE);}
-<VALUE>{val}+ {
- if (attrleng > 0) {
- if(NULL != (attrlval._s = _lslp_strdup(attrtext)))
- return(_STRING);
- else
- return(0L);
- }
- }
-
-<VALUE>")" {BEGIN INITIAL; attrlval._i = *attrtext; return(attrlval._i);}
-
- /* anything else in the value state is an error */
-<VALUE>. {BEGIN INITIAL;}
-
-%%
-
-static int8 *_lslp_strdup(int8 *s)
-{
- int8 *p = &heap[heapIndex];
- do { heap[heapIndex++] = *s; } while ((*s != 0x00) && (heapIndex < 2049) && (++s));
- return(p);
-}
-
-void attr_close_lexer(uint32 handle)
-{
- assert(handle != 0);
- attr_delete_buffer((YY_BUFFER_STATE)handle);
-}
-
-uint32 attr_init_lexer(int8 *s)
-{
- memset(&buf[0], 0x00, 2052);
- memset(&heap[0], 0x00, 2052);
- heapIndex = 0;
- strncpy(&buf[0], s, 2052);
- return((uint32)attr_scan_buffer(&buf[0], strlen(s) + 2));
-}
-
-
-void attrerror(int8 *s, ...)
-{
-
- /* (va, s);
- printf(s, va);
- return;
-*/
-}
-
-/*
-int main(int argc, char *argv[])
-{
-
-}
-
-*/
-
-
+++ /dev/null
-/* A Bison parser, made from attr.y
- by GNU bison 1.35. */
-
-#define YYBISON 1 /* Identify Bison output. */
-
-#define yyparse attrparse
-#define yylex attrlex
-#define yyerror attrerror
-#define yylval attrlval
-#define yychar attrchar
-#define yydebug attrdebug
-#define yynerrs attrnerrs
-# define _TRUE 257
-# define _FALSE 258
-# define _MULTIVAL 259
-# define _INT 260
-# define _ESCAPED 261
-# define _TAG 262
-# define _STRING 263
-# define _OPAQUE 264
-
-#line 35 "attr.y"
-
-#include "slp_client.h"
-void attrerror(int8 *, ...);
-int32 attrwrap(void);
-int32 attrlex(void);
-int32 attrparse(void);
-BOOL bt = TRUE, bf = FALSE;
-void attr_close_lexer(uint32 handle);
-uint32 attr_init_lexer(int8 *s);
-
-lslpAttrList attrHead =
-{
- &attrHead, &attrHead, TRUE
-};
-
-lslpAttrList inProcessAttr =
-{
- &inProcessAttr, &inProcessAttr, TRUE
-};
-
-lslpAttrList inProcessTag =
-{
- &inProcessTag, &inProcessTag, TRUE
-};
-
-
-
-#line 66 "attr.y"
-#ifndef YYSTYPE
-typedef union {
- int32 _i;
- int8 *_s;
- lslpAttrList *_atl;
-} yystype;
-# define YYSTYPE yystype
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-
-
-
-#define YYFINAL 22
-#define YYFLAG -32768
-#define YYNTBASE 15
-
-/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */
-#define YYTRANSLATE(x) ((unsigned)(x) <= 264 ? yytranslate[x] : 19)
-
-/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */
-static const char yytranslate[] =
-{
- 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 12, 13, 2, 2, 11, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 14, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 1, 3, 4, 5,
- 6, 7, 8, 9, 10
-};
-
-#if YYDEBUG
-static const short yyprhs[] =
-{
- 0, 0, 2, 6, 8, 12, 17, 23, 25, 29,
- 31, 33, 35, 37
-};
-static const short yyrhs[] =
-{
- 16, 0, 15, 11, 16, 0, 8, 0, 12, 8,
- 13, 0, 12, 8, 14, 13, 0, 12, 8, 14,
- 17, 13, 0, 18, 0, 17, 5, 18, 0, 3,
- 0, 4, 0, 7, 0, 9, 0, 6, 0
-};
-
-#endif
-
-#if YYDEBUG
-/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-static const short yyrline[] =
-{
- 0, 82, 92, 104, 111, 118, 126, 138, 145, 152,
- 155, 158, 161, 175
-};
-#endif
-
-
-#if (YYDEBUG) || defined YYERROR_VERBOSE
-
-/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */
-static const char *const yytname[] =
-{
- "$", "error", "$undefined.", "_TRUE", "_FALSE", "_MULTIVAL", "_INT",
- "_ESCAPED", "_TAG", "_STRING", "_OPAQUE", "','", "'('", "')'", "'='",
- "attr_list", "attr", "attr_val_list", "attr_val", 0
-};
-#endif
-
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-static const short yyr1[] =
-{
- 0, 15, 15, 16, 16, 16, 16, 17, 17, 18,
- 18, 18, 18, 18
-};
-
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-static const short yyr2[] =
-{
- 0, 1, 3, 1, 3, 4, 5, 1, 3, 1,
- 1, 1, 1, 1
-};
-
-/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
- doesn't specify something else to do. Zero means the default is an
- error. */
-static const short yydefact[] =
-{
- 0, 3, 0, 0, 1, 0, 0, 4, 0, 2,
- 9, 10, 13, 11, 12, 5, 0, 7, 0, 6,
- 8, 0, 0
-};
-
-static const short yydefgoto[] =
-{
- 3, 4, 16, 17
-};
-
-static const short yypact[] =
-{
- 12,-32768, 2, 0,-32768, 8, 12,-32768, -1,-32768,
- -32768,-32768,-32768,-32768,-32768,-32768, -4,-32768, 10,-32768,
- -32768, 4,-32768
-};
-
-static const short yypgoto[] =
-{
- -32768, 1,-32768, -3
-};
-
-
-#define YYLAST 24
-
-
-static const short yytable[] =
-{
- 21, 18, 10, 11, 22, 12, 13, 9, 14, 19,
- 5, 6, 15, 10, 11, 20, 12, 13, 0, 14,
- 1, 7, 8, 0, 2
-};
-
-static const short yycheck[] =
-{
- 0, 5, 3, 4, 0, 6, 7, 6, 9, 13,
- 8, 11, 13, 3, 4, 18, 6, 7, -1, 9,
- 8, 13, 14, -1, 12
-};
-/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
-#line 3 "/usr/share/bison/bison.simple"
-
-/* Skeleton output parser for bison,
-
- Copyright (C) 1984, 1989, 1990, 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. */
-
-/* As a special exception, when this file is copied by Bison into a
- Bison output file, you may use that output file without restriction.
- This special exception was added by the Free Software Foundation
- in version 1.24 of Bison. */
-
-/* This is the parser code that is written into each bison parser when
- the %semantic_parser declaration is not specified in the grammar.
- It was written by Richard Stallman by simplifying the hairy parser
- used when %semantic_parser is specified. */
-
-/* All symbols defined below should begin with yy or YY, to avoid
- infringing on user name space. This should be done even for local
- variables, as they might otherwise be expanded by user macros.
- There are some unavoidable exceptions within include files to
- define necessary library symbols; they are noted "INFRINGES ON
- USER NAME SPACE" below. */
-
-#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
-
-/* The parser invokes alloca or malloc; define the necessary symbols. */
-
-# if YYSTACK_USE_ALLOCA
-# define YYSTACK_ALLOC alloca
-# else
-# ifndef YYSTACK_USE_ALLOCA
-# if defined (alloca) || defined (_ALLOCA_H)
-# define YYSTACK_ALLOC alloca
-# else
-# ifdef __GNUC__
-# define YYSTACK_ALLOC __builtin_alloca
-# endif
-# endif
-# endif
-# endif
-
-# ifdef YYSTACK_ALLOC
- /* Pacify GCC's `empty if-body' warning. */
-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
-# else
-# if defined (__STDC__) || defined (__cplusplus)
-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
-# endif
-# define YYSTACK_ALLOC malloc
-# define YYSTACK_FREE free
-# endif
-#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
-
-
-#if (! defined (yyoverflow) \
- && (! defined (__cplusplus) \
- || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member. */
-union yyalloc
-{
- short yyss;
- YYSTYPE yyvs;
-# if YYLSP_NEEDED
- YYLTYPE yyls;
-# endif
-};
-
-/* The size of the maximum gap between one aligned stack and the next. */
-# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
- N elements. */
-# if YYLSP_NEEDED
-# define YYSTACK_BYTES(N) \
- ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
- + 2 * YYSTACK_GAP_MAX)
-# else
-# define YYSTACK_BYTES(N) \
- ((N) * (sizeof (short) + sizeof (YYSTYPE)) \
- + YYSTACK_GAP_MAX)
-# endif
-
-/* Copy COUNT objects from FROM to TO. The source and destination do
- not overlap. */
-# ifndef YYCOPY
-# if 1 < __GNUC__
-# define YYCOPY(To, From, Count) \
- __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-# else
-# define YYCOPY(To, From, Count) \
- do \
- { \
- register YYSIZE_T yyi; \
- for (yyi = 0; yyi < (Count); yyi++) \
- (To)[yyi] = (From)[yyi]; \
- } \
- while (0)
-# endif
-# endif
-
-/* Relocate STACK from its old location to the new one. The
- local variables YYSIZE and YYSTACKSIZE give the old and new number of
- elements in the stack, and YYPTR gives the new location of the
- stack. Advance YYPTR to a properly aligned location for the next
- stack. */
-# define YYSTACK_RELOCATE(Stack) \
- do \
- { \
- YYSIZE_T yynewbytes; \
- YYCOPY (&yyptr->Stack, Stack, yysize); \
- Stack = &yyptr->Stack; \
- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \
- yyptr += yynewbytes / sizeof (*yyptr); \
- } \
- while (0)
-
-#endif
-
-
-#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
-# define YYSIZE_T __SIZE_TYPE__
-#endif
-#if ! defined (YYSIZE_T) && defined (size_t)
-# define YYSIZE_T size_t
-#endif
-#if ! defined (YYSIZE_T)
-# if defined (__STDC__) || defined (__cplusplus)
-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
-# endif
-#endif
-#if ! defined (YYSIZE_T)
-# define YYSIZE_T unsigned int
-#endif
-
-#define yyerrok (yyerrstatus = 0)
-#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY -2
-#define YYEOF 0
-#define YYACCEPT goto yyacceptlab
-#define YYABORT goto yyabortlab
-#define YYERROR goto yyerrlab1
-/* Like YYERROR except do call yyerror. This remains here temporarily
- to ease the transition to the new meaning of YYERROR, for GCC.
- Once GCC version 2 has supplanted version 1, this can go. */
-#define YYFAIL goto yyerrlab
-#define YYRECOVERING() (!!yyerrstatus)
-#define YYBACKUP(Token, Value) \
-do \
- if (yychar == YYEMPTY && yylen == 1) \
- { \
- yychar = (Token); \
- yylval = (Value); \
- yychar1 = YYTRANSLATE (yychar); \
- YYPOPSTACK; \
- goto yybackup; \
- } \
- else \
- { \
- yyerror ("syntax error: cannot back up"); \
- YYERROR; \
- } \
-while (0)
-
-#define YYTERROR 1
-#define YYERRCODE 256
-
-
-/* YYLLOC_DEFAULT -- Compute the default location (before the actions
- are run).
-
- When YYLLOC_DEFAULT is run, CURRENT is set the location of the
- first token. By default, to implement support for ranges, extend
- its range to the last symbol. */
-
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N) \
- Current.last_line = Rhs[N].last_line; \
- Current.last_column = Rhs[N].last_column;
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments. */
-
-#if YYPURE
-# if YYLSP_NEEDED
-# ifdef YYLEX_PARAM
-# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM)
-# else
-# define YYLEX yylex (&yylval, &yylloc)
-# endif
-# else /* !YYLSP_NEEDED */
-# ifdef YYLEX_PARAM
-# define YYLEX yylex (&yylval, YYLEX_PARAM)
-# else
-# define YYLEX yylex (&yylval)
-# endif
-# endif /* !YYLSP_NEEDED */
-#else /* !YYPURE */
-# define YYLEX yylex ()
-#endif /* !YYPURE */
-
-
-/* Enable debugging if requested. */
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
-# define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args) \
-do { \
- if (yydebug) \
- YYFPRINTF Args; \
-} while (0)
-/* Nonzero means print parse trace. It is left uninitialized so that
- multiple parsers can coexist. */
-int yydebug;
-#else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-#endif /* !YYDEBUG */
-
-/* YYINITDEPTH -- initial size of the parser's stacks. */
-#ifndef YYINITDEPTH
-# define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
- if the built-in stack extension method is used).
-
- Do not make this value too large; the results are undefined if
- SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
- evaluated with infinite-precision integer arithmetic. */
-
-#if YYMAXDEPTH == 0
-# undef YYMAXDEPTH
-#endif
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH 10000
-#endif
-\f
-#ifdef YYERROR_VERBOSE
-
-# ifndef yystrlen
-# if defined (__GLIBC__) && defined (_STRING_H)
-# define yystrlen strlen
-# else
-/* Return the length of YYSTR. */
-static YYSIZE_T
-# if defined (__STDC__) || defined (__cplusplus)
-yystrlen (const char *yystr)
-# else
-yystrlen (yystr)
- const char *yystr;
-# endif
-{
- register const char *yys = yystr;
-
- while (*yys++ != '\0')
- continue;
-
- return yys - yystr - 1;
-}
-# endif
-# endif
-
-# ifndef yystpcpy
-# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
-# define yystpcpy stpcpy
-# else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
- YYDEST. */
-static char *
-# if defined (__STDC__) || defined (__cplusplus)
-yystpcpy (char *yydest, const char *yysrc)
-# else
-yystpcpy (yydest, yysrc)
- char *yydest;
- const char *yysrc;
-# endif
-{
- register char *yyd = yydest;
- register const char *yys = yysrc;
-
- while ((*yyd++ = *yys++) != '\0')
- continue;
-
- return yyd - 1;
-}
-# endif
-# endif
-#endif
-\f
-#line 315 "/usr/share/bison/bison.simple"
-
-
-/* The user can define YYPARSE_PARAM as the name of an argument to be passed
- into yyparse. The argument should have type void *.
- It should actually point to an object.
- Grammar actions can access the variable by casting it
- to the proper pointer type. */
-
-#ifdef YYPARSE_PARAM
-# if defined (__STDC__) || defined (__cplusplus)
-# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
-# define YYPARSE_PARAM_DECL
-# else
-# define YYPARSE_PARAM_ARG YYPARSE_PARAM
-# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
-# endif
-#else /* !YYPARSE_PARAM */
-# define YYPARSE_PARAM_ARG
-# define YYPARSE_PARAM_DECL
-#endif /* !YYPARSE_PARAM */
-
-/* Prevent warning if -Wstrict-prototypes. */
-#ifdef __GNUC__
-# ifdef YYPARSE_PARAM
-int yyparse (void *);
-# else
-int yyparse (void);
-# endif
-#endif
-
-/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
- variables are global, or local to YYPARSE. */
-
-#define YY_DECL_NON_LSP_VARIABLES \
-/* The lookahead symbol. */ \
-int yychar; \
- \
-/* The semantic value of the lookahead symbol. */ \
-YYSTYPE yylval; \
- \
-/* Number of parse errors so far. */ \
-int yynerrs;
-
-#if YYLSP_NEEDED
-# define YY_DECL_VARIABLES \
-YY_DECL_NON_LSP_VARIABLES \
- \
-/* Location data for the lookahead symbol. */ \
-YYLTYPE yylloc;
-#else
-# define YY_DECL_VARIABLES \
-YY_DECL_NON_LSP_VARIABLES
-#endif
-
-
-/* If nonreentrant, generate the variables here. */
-
-#if !YYPURE
-YY_DECL_VARIABLES
-#endif /* !YYPURE */
-
-int
-yyparse (YYPARSE_PARAM_ARG)
- YYPARSE_PARAM_DECL
-{
- /* If reentrant, generate the variables here. */
-#if YYPURE
- YY_DECL_VARIABLES
-#endif /* !YYPURE */
-
- register int yystate;
- register int yyn;
- int yyresult;
- /* Number of tokens to shift before error messages enabled. */
- int yyerrstatus;
- /* Lookahead token as an internal (translated) token number. */
- int yychar1 = 0;
-
- /* Three stacks and their tools:
- `yyss': related to states,
- `yyvs': related to semantic values,
- `yyls': related to locations.
-
- Refer to the stacks thru separate pointers, to allow yyoverflow
- to reallocate them elsewhere. */
-
- /* The state stack. */
- short yyssa[YYINITDEPTH];
- short *yyss = yyssa;
- register short *yyssp;
-
- /* The semantic value stack. */
- YYSTYPE yyvsa[YYINITDEPTH];
- YYSTYPE *yyvs = yyvsa;
- register YYSTYPE *yyvsp;
-
-#if YYLSP_NEEDED
- /* The location stack. */
- YYLTYPE yylsa[YYINITDEPTH];
- YYLTYPE *yyls = yylsa;
- YYLTYPE *yylsp;
-#endif
-
-#if YYLSP_NEEDED
-# define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
-#else
-# define YYPOPSTACK (yyvsp--, yyssp--)
-#endif
-
- YYSIZE_T yystacksize = YYINITDEPTH;
-
-
- /* The variables used to return semantic value and location from the
- action routines. */
- YYSTYPE yyval;
-#if YYLSP_NEEDED
- YYLTYPE yyloc;
-#endif
-
- /* When reducing, the number of symbols on the RHS of the reduced
- rule. */
- int yylen;
-
- YYDPRINTF ((stderr, "Starting parse\n"));
-
- yystate = 0;
- yyerrstatus = 0;
- yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
-
- /* Initialize stack pointers.
- Waste one element of value and location stack
- so that they stay on the same level as the state stack.
- The wasted elements are never initialized. */
-
- yyssp = yyss;
- yyvsp = yyvs;
-#if YYLSP_NEEDED
- yylsp = yyls;
-#endif
- goto yysetstate;
-
-/*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate. |
-`------------------------------------------------------------*/
- yynewstate:
- /* In all cases, when you get here, the value and location stacks
- have just been pushed. so pushing a state here evens the stacks.
- */
- yyssp++;
-
- yysetstate:
- *yyssp = yystate;
-
- if (yyssp >= yyss + yystacksize - 1)
- {
- /* Get the current used size of the three stacks, in elements. */
- YYSIZE_T yysize = yyssp - yyss + 1;
-
-#ifdef yyoverflow
- {
- /* Give user a chance to reallocate the stack. Use copies of
- these so that the &'s don't force the real ones into
- memory. */
- YYSTYPE *yyvs1 = yyvs;
- short *yyss1 = yyss;
-
- /* Each stack pointer address is followed by the size of the
- data in use in that stack, in bytes. */
-# if YYLSP_NEEDED
- YYLTYPE *yyls1 = yyls;
- /* This used to be a conditional around just the two extra args,
- but that might be undefined if yyoverflow is a macro. */
- yyoverflow ("parser stack overflow",
- &yyss1, yysize * sizeof (*yyssp),
- &yyvs1, yysize * sizeof (*yyvsp),
- &yyls1, yysize * sizeof (*yylsp),
- &yystacksize);
- yyls = yyls1;
-# else
- yyoverflow ("parser stack overflow",
- &yyss1, yysize * sizeof (*yyssp),
- &yyvs1, yysize * sizeof (*yyvsp),
- &yystacksize);
-# endif
- yyss = yyss1;
- yyvs = yyvs1;
- }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
- goto yyoverflowlab;
-# else
- /* Extend the stack our own way. */
- if (yystacksize >= YYMAXDEPTH)
- goto yyoverflowlab;
- yystacksize *= 2;
- if (yystacksize > YYMAXDEPTH)
- yystacksize = YYMAXDEPTH;
-
- {
- short *yyss1 = yyss;
- union yyalloc *yyptr =
- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
- if (! yyptr)
- goto yyoverflowlab;
- YYSTACK_RELOCATE (yyss);
- YYSTACK_RELOCATE (yyvs);
-# if YYLSP_NEEDED
- YYSTACK_RELOCATE (yyls);
-# endif
-# undef YYSTACK_RELOCATE
- if (yyss1 != yyssa)
- YYSTACK_FREE (yyss1);
- }
-# endif
-#endif /* no yyoverflow */
-
- yyssp = yyss + yysize - 1;
- yyvsp = yyvs + yysize - 1;
-#if YYLSP_NEEDED
- yylsp = yyls + yysize - 1;
-#endif
-
- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
- (unsigned long int) yystacksize));
-
- if (yyssp >= yyss + yystacksize - 1)
- YYABORT;
- }
-
- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-
- goto yybackup;
-
-
-/*-----------.
-| yybackup. |
-`-----------*/
-yybackup:
-
-/* Do appropriate processing given the current state. */
-/* Read a lookahead token if we need one and don't already have one. */
-/* yyresume: */
-
- /* First try to decide what to do without reference to lookahead token. */
-
- yyn = yypact[yystate];
- if (yyn == YYFLAG)
- goto yydefault;
-
- /* Not known => get a lookahead token if don't already have one. */
-
- /* yychar is either YYEMPTY or YYEOF
- or a valid token in external form. */
-
- if (yychar == YYEMPTY)
- {
- YYDPRINTF ((stderr, "Reading a token: "));
- yychar = YYLEX;
- }
-
- /* Convert token to internal form (in yychar1) for indexing tables with */
-
- if (yychar <= 0) /* This means end of input. */
- {
- yychar1 = 0;
- yychar = YYEOF; /* Don't call YYLEX any more */
-
- YYDPRINTF ((stderr, "Now at end of input.\n"));
- }
- else
- {
- yychar1 = YYTRANSLATE (yychar);
-
-#if YYDEBUG
- /* We have to keep this `#if YYDEBUG', since we use variables
- which are defined only if `YYDEBUG' is set. */
- if (yydebug)
- {
- YYFPRINTF (stderr, "Next token is %d (%s",
- yychar, yytname[yychar1]);
- /* Give the individual parser a way to print the precise
- meaning of a token, for further debugging info. */
-# ifdef YYPRINT
- YYPRINT (stderr, yychar, yylval);
-# endif
- YYFPRINTF (stderr, ")\n");
- }
-#endif
- }
-
- yyn += yychar1;
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
- goto yydefault;
-
- yyn = yytable[yyn];
-
- /* yyn is what to do for this token type in this state.
- Negative => reduce, -yyn is rule number.
- Positive => shift, yyn is new state.
- New state is final state => don't bother to shift,
- just return success.
- 0, or most negative number => error. */
-
- if (yyn < 0)
- {
- if (yyn == YYFLAG)
- goto yyerrlab;
- yyn = -yyn;
- goto yyreduce;
- }
- else if (yyn == 0)
- goto yyerrlab;
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- /* Shift the lookahead token. */
- YYDPRINTF ((stderr, "Shifting token %d (%s), ",
- yychar, yytname[yychar1]));
-
- /* Discard the token being shifted unless it is eof. */
- if (yychar != YYEOF)
- yychar = YYEMPTY;
-
- *++yyvsp = yylval;
-#if YYLSP_NEEDED
- *++yylsp = yylloc;
-#endif
-
- /* Count tokens shifted since error; after three, turn off error
- status. */
- if (yyerrstatus)
- yyerrstatus--;
-
- yystate = yyn;
- goto yynewstate;
-
-
-/*-----------------------------------------------------------.
-| yydefault -- do the default action for the current state. |
-`-----------------------------------------------------------*/
-yydefault:
- yyn = yydefact[yystate];
- if (yyn == 0)
- goto yyerrlab;
- goto yyreduce;
-
-
-/*-----------------------------.
-| yyreduce -- Do a reduction. |
-`-----------------------------*/
-yyreduce:
- /* yyn is the number of a rule to reduce with. */
- yylen = yyr2[yyn];
-
- /* If YYLEN is nonzero, implement the default value of the action:
- `$$ = $1'.
-
- Otherwise, the following line sets YYVAL to the semantic value of
- the lookahead token. This behavior is undocumented and Bison
- users should not rely upon it. Assigning to YYVAL
- unconditionally makes the parser a bit smaller, and it avoids a
- GCC warning that YYVAL may be used uninitialized. */
- yyval = yyvsp[1-yylen];
-
-#if YYLSP_NEEDED
- /* Similarly for the default location. Let the user run additional
- commands if for instance locations are ranges. */
- yyloc = yylsp[1-yylen];
- YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
-#endif
-
-#if YYDEBUG
- /* We have to keep this `#if YYDEBUG', since we use variables which
- are defined only if `YYDEBUG' is set. */
- if (yydebug)
- {
- int yyi;
-
- YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
- yyn, yyrline[yyn]);
-
- /* Print the symbols being reduced, and their result. */
- for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
- YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
- YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
- }
-#endif
-
- switch (yyn) {
-
-case 1:
-#line 82 "attr.y"
-{
- while (! _LSLP_IS_HEAD(inProcessAttr.next))
- {
- yyval._atl = inProcessAttr.next;
- _LSLP_UNLINK(yyval._atl);
- _LSLP_INSERT_BEFORE(yyval._atl, &attrHead);
- }
- /* all we really want to do here is link each attribute */
- /* to the global list head. */
- ;
- break;}
-case 2:
-#line 92 "attr.y"
-{
- /* both of these non-terminals are really lists */
- /* ignore the first non-terminal */
- while (! _LSLP_IS_HEAD(inProcessAttr.next))
- {
- yyval._atl = inProcessAttr.next;
- _LSLP_UNLINK(yyval._atl);
- _LSLP_INSERT_BEFORE(yyval._atl, &attrHead);
- }
- ;
- break;}
-case 3:
-#line 104 "attr.y"
-{
- yyval._atl = lslpAllocAttr(yyvsp[0]._s, tag, NULL, 0);
- if (NULL != yyval._atl)
- {
- _LSLP_INSERT_BEFORE(yyval._atl, &inProcessAttr);
- }
- ;
- break;}
-case 4:
-#line 111 "attr.y"
-{
- yyval._atl = lslpAllocAttr(yyvsp[-1]._s, tag, NULL, 0);
- if (NULL != yyval._atl)
- {
- _LSLP_INSERT_BEFORE(yyval._atl, &inProcessAttr);
- }
- ;
- break;}
-case 5:
-#line 118 "attr.y"
-{
- yyval._atl = lslpAllocAttr(yyvsp[-2]._s, tag, NULL, 0);
- if (NULL != yyval._atl)
- {
- _LSLP_INSERT_BEFORE(yyval._atl, &inProcessAttr);
- }
- ;
- break;}
-case 6:
-#line 126 "attr.y"
-{
- yyval._atl = inProcessTag.next;
- while (! _LSLP_IS_HEAD(yyval._atl))
- {
- yyval._atl->name = strdup(yyvsp[-3]._s);
- _LSLP_UNLINK(yyval._atl);
- _LSLP_INSERT_BEFORE(yyval._atl, &inProcessAttr);
- yyval._atl = inProcessTag.next;
- }
- ;
- break;}
-case 7:
-#line 138 "attr.y"
-{
-
- if(NULL != yyvsp[0]._atl)
- {
- _LSLP_INSERT(yyvsp[0]._atl, &inProcessTag);
- }
- ;
- break;}
-case 8:
-#line 145 "attr.y"
-{
- if (NULL != yyvsp[0]._atl)
- {
- _LSLP_INSERT_BEFORE(yyvsp[0]._atl, &inProcessTag);
- }
- ;
- break;}
-case 9:
-#line 152 "attr.y"
-{
- yyval._atl = lslpAllocAttr(NULL, bool_type, &bt, sizeof(BOOL));
- ;
- break;}
-case 10:
-#line 155 "attr.y"
-{
- yyval._atl = lslpAllocAttr(NULL, bool_type, &bf, sizeof(BOOL));
- ;
- break;}
-case 11:
-#line 158 "attr.y"
-{
- yyval._atl = lslpAllocAttr(NULL, opaque, yyvsp[0]._s, (int16)(strlen(yyvsp[0]._s) + 1));
- ;
- break;}
-case 12:
-#line 161 "attr.y"
-{
- if(strlen(yyvsp[0]._s) > 5 ) {
- if( *(yyvsp[0]._s) == '\\' && ((*(yyvsp[0]._s + 1) == 'f') || (*(yyvsp[0]._s + 1) == 'F')) && ((*(yyvsp[0]._s + 2) == 'f') || (*(yyvsp[0]._s + 2) == 'F'))) {
- yyval._atl = lslpAllocAttr(NULL, opaque, yyvsp[0]._s, (int16)(strlen(yyvsp[0]._s) + 1));
- } else {
- yyval._atl = lslpAllocAttr(NULL, string, yyvsp[0]._s, (int16)(strlen(yyvsp[0]._s) + 1));
- }
- }
- else {
-
- yyval._atl = lslpAllocAttr(NULL, string, yyvsp[0]._s, (int16)(strlen(yyvsp[0]._s) + 1));
- }
- ;
- break;}
-case 13:
-#line 175 "attr.y"
-{
- yyval._atl = lslpAllocAttr(NULL, integer, &(yyvsp[0]._i), sizeof(int32));
- ;
- break;}
-}
-
-#line 705 "/usr/share/bison/bison.simple"
-
-\f
- yyvsp -= yylen;
- yyssp -= yylen;
-#if YYLSP_NEEDED
- yylsp -= yylen;
-#endif
-
-#if YYDEBUG
- if (yydebug)
- {
- short *yyssp1 = yyss - 1;
- YYFPRINTF (stderr, "state stack now");
- while (yyssp1 != yyssp)
- YYFPRINTF (stderr, " %d", *++yyssp1);
- YYFPRINTF (stderr, "\n");
- }
-#endif
-
- *++yyvsp = yyval;
-#if YYLSP_NEEDED
- *++yylsp = yyloc;
-#endif
-
- /* Now `shift' the result of the reduction. Determine what state
- that goes to, based on the state we popped back to and the rule
- number reduced by. */
-
- yyn = yyr1[yyn];
-
- yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
- if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
- yystate = yytable[yystate];
- else
- yystate = yydefgoto[yyn - YYNTBASE];
-
- goto yynewstate;
-
-
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
-yyerrlab:
- /* If not already recovering from an error, report this error. */
- if (!yyerrstatus)
- {
- ++yynerrs;
-
-#ifdef YYERROR_VERBOSE
- yyn = yypact[yystate];
-
- if (yyn > YYFLAG && yyn < YYLAST)
- {
- YYSIZE_T yysize = 0;
- char *yymsg;
- int yyx, yycount;
-
- yycount = 0;
- /* Start YYX at -YYN if negative to avoid negative indexes in
- YYCHECK. */
- for (yyx = yyn < 0 ? -yyn : 0;
- yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
- if (yycheck[yyx + yyn] == yyx)
- yysize += yystrlen (yytname[yyx]) + 15, yycount++;
- yysize += yystrlen ("parse error, unexpected ") + 1;
- yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
- yymsg = (char *) YYSTACK_ALLOC (yysize);
- if (yymsg != 0)
- {
- char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
- yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
-
- if (yycount < 5)
- {
- yycount = 0;
- for (yyx = yyn < 0 ? -yyn : 0;
- yyx < (int) (sizeof (yytname) / sizeof (char *));
- yyx++)
- if (yycheck[yyx + yyn] == yyx)
- {
- const char *yyq = ! yycount ? ", expecting " : " or ";
- yyp = yystpcpy (yyp, yyq);
- yyp = yystpcpy (yyp, yytname[yyx]);
- yycount++;
- }
- }
- yyerror (yymsg);
- YYSTACK_FREE (yymsg);
- }
- else
- yyerror ("parse error; also virtual memory exhausted");
- }
- else
-#endif /* defined (YYERROR_VERBOSE) */
- yyerror ("parse error");
- }
- goto yyerrlab1;
-
-
-/*--------------------------------------------------.
-| yyerrlab1 -- error raised explicitly by an action |
-`--------------------------------------------------*/
-yyerrlab1:
- if (yyerrstatus == 3)
- {
- /* If just tried and failed to reuse lookahead token after an
- error, discard it. */
-
- /* return failure if at end of input */
- if (yychar == YYEOF)
- YYABORT;
- YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
- yychar, yytname[yychar1]));
- yychar = YYEMPTY;
- }
-
- /* Else will try to reuse lookahead token after shifting the error
- token. */
-
- yyerrstatus = 3; /* Each real token shifted decrements this */
-
- goto yyerrhandle;
-
-
-/*-------------------------------------------------------------------.
-| yyerrdefault -- current state does not do anything special for the |
-| error token. |
-`-------------------------------------------------------------------*/
-yyerrdefault:
-#if 0
- /* This is wrong; only states that explicitly want error tokens
- should shift them. */
-
- /* If its default is to accept any token, ok. Otherwise pop it. */
- yyn = yydefact[yystate];
- if (yyn)
- goto yydefault;
-#endif
-
-
-/*---------------------------------------------------------------.
-| yyerrpop -- pop the current state because it cannot handle the |
-| error token |
-`---------------------------------------------------------------*/
-yyerrpop:
- if (yyssp == yyss)
- YYABORT;
- yyvsp--;
- yystate = *--yyssp;
-#if YYLSP_NEEDED
- yylsp--;
-#endif
-
-#if YYDEBUG
- if (yydebug)
- {
- short *yyssp1 = yyss - 1;
- YYFPRINTF (stderr, "Error: state stack now");
- while (yyssp1 != yyssp)
- YYFPRINTF (stderr, " %d", *++yyssp1);
- YYFPRINTF (stderr, "\n");
- }
-#endif
-
-/*--------------.
-| yyerrhandle. |
-`--------------*/
-yyerrhandle:
- yyn = yypact[yystate];
- if (yyn == YYFLAG)
- goto yyerrdefault;
-
- yyn += YYTERROR;
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
- goto yyerrdefault;
-
- yyn = yytable[yyn];
- if (yyn < 0)
- {
- if (yyn == YYFLAG)
- goto yyerrpop;
- yyn = -yyn;
- goto yyreduce;
- }
- else if (yyn == 0)
- goto yyerrpop;
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- YYDPRINTF ((stderr, "Shifting error token, "));
-
- *++yyvsp = yylval;
-#if YYLSP_NEEDED
- *++yylsp = yylloc;
-#endif
-
- yystate = yyn;
- goto yynewstate;
-
-
-/*-------------------------------------.
-| yyacceptlab -- YYACCEPT comes here. |
-`-------------------------------------*/
-yyacceptlab:
- yyresult = 0;
- goto yyreturn;
-
-/*-----------------------------------.
-| yyabortlab -- YYABORT comes here. |
-`-----------------------------------*/
-yyabortlab:
- yyresult = 1;
- goto yyreturn;
-
-/*---------------------------------------------.
-| yyoverflowab -- parser overflow comes here. |
-`---------------------------------------------*/
-yyoverflowlab:
- yyerror ("parser stack overflow");
- yyresult = 2;
- /* Fall through. */
-
-yyreturn:
-#ifndef yyoverflow
- if (yyss != yyssa)
- YYSTACK_FREE (yyss);
-#endif
- return yyresult;
-}
-#line 180 "attr.y"
-
-
-void _lslpInitInternalAttrList(void)
-{
- attrHead.next = attrHead.prev = &attrHead;
- attrHead.isHead = TRUE;
- inProcessAttr.next = inProcessAttr.prev = &inProcessAttr;
- inProcessAttr.isHead = TRUE;
- inProcessTag.next = inProcessTag.prev = &inProcessTag;
- inProcessTag.isHead = TRUE;
- return;
-}
-
-lslpAttrList *_lslpDecodeAttrString(int8 *s)
-{
- uint32 lexer = 0;
- lslpAttrList *temp = NULL;
- assert(s != NULL);
- _lslpInitInternalAttrList();
- if (s != NULL) {
- if(NULL != (temp = lslpAllocAttrList())) {
- if ((0 != (lexer = attr_init_lexer( s))) && attrparse()) {
- lslpFreeAttrList(temp, TRUE);
- while (! _LSLP_IS_HEAD(inProcessTag.next)) {
- temp = inProcessTag.next;
- _LSLP_UNLINK(temp);
- lslpFreeAttr(temp);
- }
- while (! _LSLP_IS_HEAD(inProcessAttr.next)) {
- temp = inProcessAttr.next;
- _LSLP_UNLINK(temp);
- lslpFreeAttr(temp);
- }
- while (! _LSLP_IS_HEAD(attrHead.next)) {
- temp = attrHead.next;
- _LSLP_UNLINK(temp);
- lslpFreeAttr(temp);
- }
- attr_close_lexer(lexer);
- return(NULL);
- }
-
- if (! _LSLP_IS_EMPTY(&attrHead)) {
- temp->attr_string_len = strlen(s);
- temp->attr_string = (int8 *)malloc(temp->attr_string_len + 1);
- if(temp->attr_string != NULL) {
- memcpy(temp->attr_string, s, temp->attr_string_len);
- temp->attr_string[temp->attr_string_len] = 0x00;
- }
- _LSLP_LINK_HEAD(temp, &attrHead);
- }
- if(lexer != 0)
- attr_close_lexer(lexer);
- }
- }
-
- return(temp);
-}
-
-
-lslpAttrList *lslpAllocAttr(int8 *name, int8 type, void *val, int16 len)
-{
- lslpAttrList *attr;
- if (NULL != (attr = (lslpAttrList *)calloc(1, sizeof(lslpAttrList))))
- {
- if (name != NULL)
- {
- if (NULL == (attr->name = strdup(name)))
- {
- free(attr);
- return(NULL);
- }
- }
- attr->type = type;
- if (type == head) /* listhead */
- return(attr);
- if (val != NULL)
- {
- attr->attr_len = len;
- switch (type) {
- case string:
- if ( NULL != (attr->val.stringVal = strdup((int8 *)val)))
- return(attr);
- break;
- case integer:
- attr->val.intVal = *(uint32 *)val;
- break;
- case bool_type:
- attr->val.boolVal = *(BOOL *)val;
- break;
- case opaque:
- if ( NULL != (attr->val.opaqueVal = strdup((int8 *)val)))
- return(attr);
- break;
- default:
- break;
- }
- }
- }
- return(attr);
-}
-
-lslpAttrList *lslpAllocAttrList(void)
-{
- lslpAttrList *temp;
- if (NULL != (temp = lslpAllocAttr(NULL, head, NULL, 0)))
- {
- temp->next = temp->prev = temp;
- temp->isHead = TRUE;
- }
- return(temp);
-}
-
-/* attr MUST be unlinked from its list ! */
-void lslpFreeAttr(lslpAttrList *attr)
-{
- assert(attr != NULL);
- if (attr->name != NULL)
- free(attr->name);
- if(attr->attr_string != NULL)
- free(attr->attr_string);
- if (attr->type == string && attr->val.stringVal != NULL)
- free(attr->val.stringVal);
- else if (attr->type == opaque && attr->val.opaqueVal != NULL)
- free(attr->val.opaqueVal);
- free(attr);
-}
-
-void lslpFreeAttrList(lslpAttrList *list, BOOL staticFlag)
-{
- lslpAttrList *temp;
-
- assert(list != NULL);
- assert(_LSLP_IS_HEAD(list));
- while(! (_LSLP_IS_EMPTY(list)))
- {
- temp = list->next;
- _LSLP_UNLINK(temp);
- lslpFreeAttr(temp);
- }
- if(staticFlag == TRUE)
- lslpFreeAttr(list);
- return;
-
-}
-
-
+++ /dev/null
-//%2005////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation, The Open Group.
-// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-// EMC Corporation; VERITAS Software Corporation; The Open Group.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//==============================================================================
-#ifndef BISON_ATTR_TAB_H
-# define BISON_ATTR_TAB_H
-
-#ifndef YYSTYPE
-typedef union {
- int32 _i;
- int8 *_s;
- lslpAttrList *_atl;
-} yystype;
-# define YYSTYPE yystype
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-# define _TRUE 257
-# define _FALSE 258
-# define _MULTIVAL 259
-# define _INT 260
-# define _ESCAPED 261
-# define _TAG 262
-# define _STRING 263
-# define _OPAQUE 264
-
-
-extern YYSTYPE attrlval;
-
-#endif /* not BISON_ATTR_TAB_H */
+++ /dev/null
-/*****************************************************************************
- * Description: encode/decode attribute lists
- *
- * Originated: March 06, 2000
- * Original Author: Mike Day md@soft-hackle.net
- * mdd@us.ibm.com
-
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/slp_client/Attic/attr.y,v 1.1 2003/05/21 15:14:08 mday Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-%{
-#include "slp_client.h"
-void attrerror(int8 *, ...);
-int32 attrwrap(void);
-int32 attrlex(void);
-int32 attrparse(void);
-BOOL bt = TRUE, bf = FALSE;
-void attr_close_lexer(uint32 handle);
-uint32 attr_init_lexer(int8 *s);
-
-lslpAttrList attrHead =
-{
- &attrHead, &attrHead, TRUE
-};
-
-lslpAttrList inProcessAttr =
-{
- &inProcessAttr, &inProcessAttr, TRUE
-};
-
-lslpAttrList inProcessTag =
-{
- &inProcessTag, &inProcessTag, TRUE
-};
-
-
-%}
-
-/* definitions for ytab.h */
-%name-prefix="attr"
-
-%union {
- int32 _i;
- int8 *_s;
- lslpAttrList *_atl;
-}
-
-%token<_i> _TRUE _FALSE _MULTIVAL _INT
-%token<_s> _ESCAPED _TAG _STRING _OPAQUE
-
-/* typecast the non-terminals */
-
-/* %type <_i> */
-%type <_atl> attr_list attr attr_val_list attr_val
-
-%%
-
-attr_list: attr {
- while (! _LSLP_IS_HEAD(inProcessAttr.next))
- {
- $$ = inProcessAttr.next;
- _LSLP_UNLINK($$);
- _LSLP_INSERT_BEFORE($$, &attrHead);
- }
- /* all we really want to do here is link each attribute */
- /* to the global list head. */
- }
- | attr_list ',' attr {
- /* both of these non-terminals are really lists */
- /* ignore the first non-terminal */
- while (! _LSLP_IS_HEAD(inProcessAttr.next))
- {
- $$ = inProcessAttr.next;
- _LSLP_UNLINK($$);
- _LSLP_INSERT_BEFORE($$, &attrHead);
- }
- }
- ;
-
-attr: _TAG {
- $$ = lslpAllocAttr($1, tag, NULL, 0);
- if (NULL != $$)
- {
- _LSLP_INSERT_BEFORE($$, &inProcessAttr);
- }
- }
- | '(' _TAG ')' {
- $$ = lslpAllocAttr($2, tag, NULL, 0);
- if (NULL != $$)
- {
- _LSLP_INSERT_BEFORE($$, &inProcessAttr);
- }
- }
- | '(' _TAG '=' ')' {
- $$ = lslpAllocAttr($2, tag, NULL, 0);
- if (NULL != $$)
- {
- _LSLP_INSERT_BEFORE($$, &inProcessAttr);
- }
- }
-
- | '(' _TAG '=' attr_val_list ')' {
- $$ = inProcessTag.next;
- while (! _LSLP_IS_HEAD($$))
- {
- $$->name = strdup($2);
- _LSLP_UNLINK($$);
- _LSLP_INSERT_BEFORE($$, &inProcessAttr);
- $$ = inProcessTag.next;
- }
- }
- ;
-
-attr_val_list: attr_val {
-
- if(NULL != $1)
- {
- _LSLP_INSERT($1, &inProcessTag);
- }
- }
- | attr_val_list _MULTIVAL attr_val {
- if (NULL != $3)
- {
- _LSLP_INSERT_BEFORE($3, &inProcessTag);
- }
- }
- ;
-attr_val: _TRUE {
- $$ = lslpAllocAttr(NULL, bool_type, &bt, sizeof(BOOL));
- }
- | _FALSE {
- $$ = lslpAllocAttr(NULL, bool_type, &bf, sizeof(BOOL));
- }
- | _ESCAPED {
- $$ = lslpAllocAttr(NULL, opaque, $1, (int16)(strlen($1) + 1));
- }
- | _STRING {
- if(strlen($1) > 5 ) {
- if( *($1) == '\\' && ((*($1 + 1) == 'f') || (*($1 + 1) == 'F')) && ((*($1 + 2) == 'f') || (*($1 + 2) == 'F'))) {
- $$ = lslpAllocAttr(NULL, opaque, $1, (int16)(strlen($1) + 1));
- } else {
- $$ = lslpAllocAttr(NULL, string, $1, (int16)(strlen($1) + 1));
- }
- }
- else {
-
- $$ = lslpAllocAttr(NULL, string, $1, (int16)(strlen($1) + 1));
- }
- }
-
- | _INT {
- $$ = lslpAllocAttr(NULL, integer, &($1), sizeof(int32));
- }
- ;
-
-%%
-
-void _lslpInitInternalAttrList(void)
-{
- attrHead.next = attrHead.prev = &attrHead;
- attrHead.isHead = TRUE;
- inProcessAttr.next = inProcessAttr.prev = &inProcessAttr;
- inProcessAttr.isHead = TRUE;
- inProcessTag.next = inProcessTag.prev = &inProcessTag;
- inProcessTag.isHead = TRUE;
- return;
-}
-
-lslpAttrList *_lslpDecodeAttrString(int8 *s)
-{
- uint32 lexer = 0;
- lslpAttrList *temp = NULL;
- assert(s != NULL);
- _lslpInitInternalAttrList();
- if (s != NULL) {
- if(NULL != (temp = lslpAllocAttrList())) {
- if ((0 != (lexer = attr_init_lexer( s))) && attrparse()) {
- lslpFreeAttrList(temp, TRUE);
- while (! _LSLP_IS_HEAD(inProcessTag.next)) {
- temp = inProcessTag.next;
- _LSLP_UNLINK(temp);
- lslpFreeAttr(temp);
- }
- while (! _LSLP_IS_HEAD(inProcessAttr.next)) {
- temp = inProcessAttr.next;
- _LSLP_UNLINK(temp);
- lslpFreeAttr(temp);
- }
- while (! _LSLP_IS_HEAD(attrHead.next)) {
- temp = attrHead.next;
- _LSLP_UNLINK(temp);
- lslpFreeAttr(temp);
- }
- attr_close_lexer(lexer);
- return(NULL);
- }
-
- if (! _LSLP_IS_EMPTY(&attrHead)) {
- temp->attr_string_len = strlen(s);
- temp->attr_string = (int8 *)malloc(temp->attr_string_len + 1);
- if(temp->attr_string != NULL) {
- memcpy(temp->attr_string, s, temp->attr_string_len);
- temp->attr_string[temp->attr_string_len] = 0x00;
- }
- _LSLP_LINK_HEAD(temp, &attrHead);
- }
- if(lexer != 0)
- attr_close_lexer(lexer);
- }
- }
-
- return(temp);
-}
-
-
-lslpAttrList *lslpAllocAttr(int8 *name, int8 type, void *val, int16 len)
-{
- lslpAttrList *attr;
- if (NULL != (attr = (lslpAttrList *)calloc(1, sizeof(lslpAttrList))))
- {
- if (name != NULL)
- {
- if (NULL == (attr->name = strdup(name)))
- {
- free(attr);
- return(NULL);
- }
- }
- attr->type = type;
- if (type == head) /* listhead */
- return(attr);
- if (val != NULL)
- {
- attr->attr_len = len;
- switch (type) {
- case string:
- if ( NULL != (attr->val.stringVal = strdup((int8 *)val)))
- return(attr);
- break;
- case integer:
- attr->val.intVal = *(uint32 *)val;
- break;
- case bool_type:
- attr->val.boolVal = *(BOOL *)val;
- break;
- case opaque:
- if ( NULL != (attr->val.opaqueVal = strdup((int8 *)val)))
- return(attr);
- break;
- default:
- break;
- }
- }
- }
- return(attr);
-}
-
-lslpAttrList *lslpAllocAttrList(void)
-{
- lslpAttrList *temp;
- if (NULL != (temp = lslpAllocAttr(NULL, head, NULL, 0)))
- {
- temp->next = temp->prev = temp;
- temp->isHead = TRUE;
- }
- return(temp);
-}
-
-/* attr MUST be unlinked from its list ! */
-void lslpFreeAttr(lslpAttrList *attr)
-{
- assert(attr != NULL);
- if (attr->name != NULL)
- free(attr->name);
- if(attr->attr_string != NULL)
- free(attr->attr_string);
- if (attr->type == string && attr->val.stringVal != NULL)
- free(attr->val.stringVal);
- else if (attr->type == opaque && attr->val.opaqueVal != NULL)
- free(attr->val.opaqueVal);
- free(attr);
-}
-
-void lslpFreeAttrList(lslpAttrList *list, BOOL staticFlag)
-{
- lslpAttrList *temp;
-
- assert(list != NULL);
- assert(_LSLP_IS_HEAD(list));
- while(! (_LSLP_IS_EMPTY(list)))
- {
- temp = list->next;
- _LSLP_UNLINK(temp);
- lslpFreeAttr(temp);
- }
- if(staticFlag == TRUE)
- lslpFreeAttr(list);
- return;
-
-}
-
-
+++ /dev/null
-/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
-#line
-/* Skeleton output parser for bison,
-
- Copyright (C) 1984, 1989, 1990, 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. */
-
-/* As a special exception, when this file is copied by Bison into a
- Bison output file, you may use that output file without restriction.
- This special exception was added by the Free Software Foundation
- in version 1.24 of Bison. */
-
-/* This is the parser code that is written into each bison parser when
- the %semantic_parser declaration is not specified in the grammar.
- It was written by Richard Stallman by simplifying the hairy parser
- used when %semantic_parser is specified. */
-
-/* All symbols defined below should begin with yy or YY, to avoid
- infringing on user name space. This should be done even for local
- variables, as they might otherwise be expanded by user macros.
- There are some unavoidable exceptions within include files to
- define necessary library symbols; they are noted "INFRINGES ON
- USER NAME SPACE" below. */
-
-#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
-
-/* The parser invokes alloca or malloc; define the necessary symbols. */
-
-# if YYSTACK_USE_ALLOCA
-# define YYSTACK_ALLOC alloca
-# else
-# ifndef YYSTACK_USE_ALLOCA
-# if defined (alloca) || defined (_ALLOCA_H)
-# define YYSTACK_ALLOC alloca
-# else
-# ifdef __GNUC__
-# define YYSTACK_ALLOC __builtin_alloca
-# endif
-# endif
-# endif
-# endif
-
-# ifdef YYSTACK_ALLOC
- /* Pacify GCC's `empty if-body' warning. */
-# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
-# else
-# if defined (__STDC__) || defined (__cplusplus)
-# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
-# endif
-# define YYSTACK_ALLOC malloc
-# define YYSTACK_FREE free
-# endif
-#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
-
-
-#if (! defined (yyoverflow) \
- && (! defined (__cplusplus) \
- || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-
-/* A type that is properly aligned for any stack member. */
-union yyalloc
-{
- short yyss;
- YYSTYPE yyvs;
-# if YYLSP_NEEDED
- YYLTYPE yyls;
-# endif
-};
-
-/* The size of the maximum gap between one aligned stack and the next. */
-# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
-
-/* The size of an array large to enough to hold all stacks, each with
- N elements. */
-# if YYLSP_NEEDED
-# define YYSTACK_BYTES(N) \
- ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
- + 2 * YYSTACK_GAP_MAX)
-# else
-# define YYSTACK_BYTES(N) \
- ((N) * (sizeof (short) + sizeof (YYSTYPE)) \
- + YYSTACK_GAP_MAX)
-# endif
-
-/* Copy COUNT objects from FROM to TO. The source and destination do
- not overlap. */
-# ifndef YYCOPY
-# if 1 < __GNUC__
-# define YYCOPY(To, From, Count) \
- __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-# else
-# define YYCOPY(To, From, Count) \
- do \
- { \
- register YYSIZE_T yyi; \
- for (yyi = 0; yyi < (Count); yyi++) \
- (To)[yyi] = (From)[yyi]; \
- } \
- while (0)
-# endif
-# endif
-
-/* Relocate STACK from its old location to the new one. The
- local variables YYSIZE and YYSTACKSIZE give the old and new number of
- elements in the stack, and YYPTR gives the new location of the
- stack. Advance YYPTR to a properly aligned location for the next
- stack. */
-# define YYSTACK_RELOCATE(Stack) \
- do \
- { \
- YYSIZE_T yynewbytes; \
- YYCOPY (&yyptr->Stack, Stack, yysize); \
- Stack = &yyptr->Stack; \
- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \
- yyptr += yynewbytes / sizeof (*yyptr); \
- } \
- while (0)
-
-#endif
-
-
-#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
-# define YYSIZE_T __SIZE_TYPE__
-#endif
-#if ! defined (YYSIZE_T) && defined (size_t)
-# define YYSIZE_T size_t
-#endif
-#if ! defined (YYSIZE_T)
-# if defined (__STDC__) || defined (__cplusplus)
-# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
-# define YYSIZE_T size_t
-# endif
-#endif
-#if ! defined (YYSIZE_T)
-# define YYSIZE_T unsigned int
-#endif
-
-#define yyerrok (yyerrstatus = 0)
-#define yyclearin (yychar = YYEMPTY)
-#define YYEMPTY -2
-#define YYEOF 0
-#define YYACCEPT goto yyacceptlab
-#define YYABORT goto yyabortlab
-#define YYERROR goto yyerrlab1
-/* Like YYERROR except do call yyerror. This remains here temporarily
- to ease the transition to the new meaning of YYERROR, for GCC.
- Once GCC version 2 has supplanted version 1, this can go. */
-#define YYFAIL goto yyerrlab
-#define YYRECOVERING() (!!yyerrstatus)
-#define YYBACKUP(Token, Value) \
-do \
- if (yychar == YYEMPTY && yylen == 1) \
- { \
- yychar = (Token); \
- yylval = (Value); \
- yychar1 = YYTRANSLATE (yychar); \
- YYPOPSTACK; \
- goto yybackup; \
- } \
- else \
- { \
- yyerror ("syntax error: cannot back up"); \
- YYERROR; \
- } \
-while (0)
-
-#define YYTERROR 1
-#define YYERRCODE 256
-
-
-/* YYLLOC_DEFAULT -- Compute the default location (before the actions
- are run).
-
- When YYLLOC_DEFAULT is run, CURRENT is set the location of the
- first token. By default, to implement support for ranges, extend
- its range to the last symbol. */
-
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N) \
- Current.last_line = Rhs[N].last_line; \
- Current.last_column = Rhs[N].last_column;
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments. */
-
-#if YYPURE
-# if YYLSP_NEEDED
-# ifdef YYLEX_PARAM
-# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM)
-# else
-# define YYLEX yylex (&yylval, &yylloc)
-# endif
-# else /* !YYLSP_NEEDED */
-# ifdef YYLEX_PARAM
-# define YYLEX yylex (&yylval, YYLEX_PARAM)
-# else
-# define YYLEX yylex (&yylval)
-# endif
-# endif /* !YYLSP_NEEDED */
-#else /* !YYPURE */
-# define YYLEX yylex ()
-#endif /* !YYPURE */
-
-
-/* Enable debugging if requested. */
-#if YYDEBUG
-
-# ifndef YYFPRINTF
-# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
-# define YYFPRINTF fprintf
-# endif
-
-# define YYDPRINTF(Args) \
-do { \
- if (yydebug) \
- YYFPRINTF Args; \
-} while (0)
-/* Nonzero means print parse trace. It is left uninitialized so that
- multiple parsers can coexist. */
-int yydebug;
-#else /* !YYDEBUG */
-# define YYDPRINTF(Args)
-#endif /* !YYDEBUG */
-
-/* YYINITDEPTH -- initial size of the parser's stacks. */
-#ifndef YYINITDEPTH
-# define YYINITDEPTH 200
-#endif
-
-/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
- if the built-in stack extension method is used).
-
- Do not make this value too large; the results are undefined if
- SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
- evaluated with infinite-precision integer arithmetic. */
-
-#if YYMAXDEPTH == 0
-# undef YYMAXDEPTH
-#endif
-
-#ifndef YYMAXDEPTH
-# define YYMAXDEPTH 10000
-#endif
-\f
-#ifdef YYERROR_VERBOSE
-
-# ifndef yystrlen
-# if defined (__GLIBC__) && defined (_STRING_H)
-# define yystrlen strlen
-# else
-/* Return the length of YYSTR. */
-static YYSIZE_T
-# if defined (__STDC__) || defined (__cplusplus)
-yystrlen (const char *yystr)
-# else
-yystrlen (yystr)
- const char *yystr;
-# endif
-{
- register const char *yys = yystr;
-
- while (*yys++ != '\0')
- continue;
-
- return yys - yystr - 1;
-}
-# endif
-# endif
-
-# ifndef yystpcpy
-# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
-# define yystpcpy stpcpy
-# else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
- YYDEST. */
-static char *
-# if defined (__STDC__) || defined (__cplusplus)
-yystpcpy (char *yydest, const char *yysrc)
-# else
-yystpcpy (yydest, yysrc)
- char *yydest;
- const char *yysrc;
-# endif
-{
- register char *yyd = yydest;
- register const char *yys = yysrc;
-
- while ((*yyd++ = *yys++) != '\0')
- continue;
-
- return yyd - 1;
-}
-# endif
-# endif
-#endif
-\f
-#line
-
-/* The user can define YYPARSE_PARAM as the name of an argument to be passed
- into yyparse. The argument should have type void *.
- It should actually point to an object.
- Grammar actions can access the variable by casting it
- to the proper pointer type. */
-
-#ifdef YYPARSE_PARAM
-# if defined (__STDC__) || defined (__cplusplus)
-# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
-# define YYPARSE_PARAM_DECL
-# else
-# define YYPARSE_PARAM_ARG YYPARSE_PARAM
-# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
-# endif
-#else /* !YYPARSE_PARAM */
-# define YYPARSE_PARAM_ARG
-# define YYPARSE_PARAM_DECL
-#endif /* !YYPARSE_PARAM */
-
-/* Prevent warning if -Wstrict-prototypes. */
-#ifdef __GNUC__
-# ifdef YYPARSE_PARAM
-int yyparse (void *);
-# else
-int yyparse (void);
-# endif
-#endif
-
-/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
- variables are global, or local to YYPARSE. */
-
-#define YY_DECL_NON_LSP_VARIABLES \
-/* The lookahead symbol. */ \
-int yychar; \
- \
-/* The semantic value of the lookahead symbol. */ \
-YYSTYPE yylval; \
- \
-/* Number of parse errors so far. */ \
-int yynerrs;
-
-#if YYLSP_NEEDED
-# define YY_DECL_VARIABLES \
-YY_DECL_NON_LSP_VARIABLES \
- \
-/* Location data for the lookahead symbol. */ \
-YYLTYPE yylloc;
-#else
-# define YY_DECL_VARIABLES \
-YY_DECL_NON_LSP_VARIABLES
-#endif
-
-
-/* If nonreentrant, generate the variables here. */
-
-#if !YYPURE
-YY_DECL_VARIABLES
-#endif /* !YYPURE */
-
-int
-yyparse (YYPARSE_PARAM_ARG)
- YYPARSE_PARAM_DECL
-{
- /* If reentrant, generate the variables here. */
-#if YYPURE
- YY_DECL_VARIABLES
-#endif /* !YYPURE */
-
- register int yystate;
- register int yyn;
- int yyresult;
- /* Number of tokens to shift before error messages enabled. */
- int yyerrstatus;
- /* Lookahead token as an internal (translated) token number. */
- int yychar1 = 0;
-
- /* Three stacks and their tools:
- `yyss': related to states,
- `yyvs': related to semantic values,
- `yyls': related to locations.
-
- Refer to the stacks thru separate pointers, to allow yyoverflow
- to reallocate them elsewhere. */
-
- /* The state stack. */
- short yyssa[YYINITDEPTH];
- short *yyss = yyssa;
- register short *yyssp;
-
- /* The semantic value stack. */
- YYSTYPE yyvsa[YYINITDEPTH];
- YYSTYPE *yyvs = yyvsa;
- register YYSTYPE *yyvsp;
-
-#if YYLSP_NEEDED
- /* The location stack. */
- YYLTYPE yylsa[YYINITDEPTH];
- YYLTYPE *yyls = yylsa;
- YYLTYPE *yylsp;
-#endif
-
-#if YYLSP_NEEDED
-# define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
-#else
-# define YYPOPSTACK (yyvsp--, yyssp--)
-#endif
-
- YYSIZE_T yystacksize = YYINITDEPTH;
-
-
- /* The variables used to return semantic value and location from the
- action routines. */
- YYSTYPE yyval;
-#if YYLSP_NEEDED
- YYLTYPE yyloc;
-#endif
-
- /* When reducing, the number of symbols on the RHS of the reduced
- rule. */
- int yylen;
-
- YYDPRINTF ((stderr, "Starting parse\n"));
-
- yystate = 0;
- yyerrstatus = 0;
- yynerrs = 0;
- yychar = YYEMPTY; /* Cause a token to be read. */
-
- /* Initialize stack pointers.
- Waste one element of value and location stack
- so that they stay on the same level as the state stack.
- The wasted elements are never initialized. */
-
- yyssp = yyss;
- yyvsp = yyvs;
-#if YYLSP_NEEDED
- yylsp = yyls;
-#endif
- goto yysetstate;
-
-/*------------------------------------------------------------.
-| yynewstate -- Push a new state, which is found in yystate. |
-`------------------------------------------------------------*/
- yynewstate:
- /* In all cases, when you get here, the value and location stacks
- have just been pushed. so pushing a state here evens the stacks.
- */
- yyssp++;
-
- yysetstate:
- *yyssp = yystate;
-
- if (yyssp >= yyss + yystacksize - 1)
- {
- /* Get the current used size of the three stacks, in elements. */
- YYSIZE_T yysize = yyssp - yyss + 1;
-
-#ifdef yyoverflow
- {
- /* Give user a chance to reallocate the stack. Use copies of
- these so that the &'s don't force the real ones into
- memory. */
- YYSTYPE *yyvs1 = yyvs;
- short *yyss1 = yyss;
-
- /* Each stack pointer address is followed by the size of the
- data in use in that stack, in bytes. */
-# if YYLSP_NEEDED
- YYLTYPE *yyls1 = yyls;
- /* This used to be a conditional around just the two extra args,
- but that might be undefined if yyoverflow is a macro. */
- yyoverflow ("parser stack overflow",
- &yyss1, yysize * sizeof (*yyssp),
- &yyvs1, yysize * sizeof (*yyvsp),
- &yyls1, yysize * sizeof (*yylsp),
- &yystacksize);
- yyls = yyls1;
-# else
- yyoverflow ("parser stack overflow",
- &yyss1, yysize * sizeof (*yyssp),
- &yyvs1, yysize * sizeof (*yyvsp),
- &yystacksize);
-# endif
- yyss = yyss1;
- yyvs = yyvs1;
- }
-#else /* no yyoverflow */
-# ifndef YYSTACK_RELOCATE
- goto yyoverflowlab;
-# else
- /* Extend the stack our own way. */
- if (yystacksize >= YYMAXDEPTH)
- goto yyoverflowlab;
- yystacksize *= 2;
- if (yystacksize > YYMAXDEPTH)
- yystacksize = YYMAXDEPTH;
-
- {
- short *yyss1 = yyss;
- union yyalloc *yyptr =
- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
- if (! yyptr)
- goto yyoverflowlab;
- YYSTACK_RELOCATE (yyss);
- YYSTACK_RELOCATE (yyvs);
-# if YYLSP_NEEDED
- YYSTACK_RELOCATE (yyls);
-# endif
-# undef YYSTACK_RELOCATE
- if (yyss1 != yyssa)
- YYSTACK_FREE (yyss1);
- }
-# endif
-#endif /* no yyoverflow */
-
- yyssp = yyss + yysize - 1;
- yyvsp = yyvs + yysize - 1;
-#if YYLSP_NEEDED
- yylsp = yyls + yysize - 1;
-#endif
-
- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
- (unsigned long int) yystacksize));
-
- if (yyssp >= yyss + yystacksize - 1)
- YYABORT;
- }
-
- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-
- goto yybackup;
-
-
-/*-----------.
-| yybackup. |
-`-----------*/
-yybackup:
-
-/* Do appropriate processing given the current state. */
-/* Read a lookahead token if we need one and don't already have one. */
-/* yyresume: */
-
- /* First try to decide what to do without reference to lookahead token. */
-
- yyn = yypact[yystate];
- if (yyn == YYFLAG)
- goto yydefault;
-
- /* Not known => get a lookahead token if don't already have one. */
-
- /* yychar is either YYEMPTY or YYEOF
- or a valid token in external form. */
-
- if (yychar == YYEMPTY)
- {
- YYDPRINTF ((stderr, "Reading a token: "));
- yychar = YYLEX;
- }
-
- /* Convert token to internal form (in yychar1) for indexing tables with */
-
- if (yychar <= 0) /* This means end of input. */
- {
- yychar1 = 0;
- yychar = YYEOF; /* Don't call YYLEX any more */
-
- YYDPRINTF ((stderr, "Now at end of input.\n"));
- }
- else
- {
- yychar1 = YYTRANSLATE (yychar);
-
-#if YYDEBUG
- /* We have to keep this `#if YYDEBUG', since we use variables
- which are defined only if `YYDEBUG' is set. */
- if (yydebug)
- {
- YYFPRINTF (stderr, "Next token is %d (%s",
- yychar, yytname[yychar1]);
- /* Give the individual parser a way to print the precise
- meaning of a token, for further debugging info. */
-# ifdef YYPRINT
- YYPRINT (stderr, yychar, yylval);
-# endif
- YYFPRINTF (stderr, ")\n");
- }
-#endif
- }
-
- yyn += yychar1;
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
- goto yydefault;
-
- yyn = yytable[yyn];
-
- /* yyn is what to do for this token type in this state.
- Negative => reduce, -yyn is rule number.
- Positive => shift, yyn is new state.
- New state is final state => don't bother to shift,
- just return success.
- 0, or most negative number => error. */
-
- if (yyn < 0)
- {
- if (yyn == YYFLAG)
- goto yyerrlab;
- yyn = -yyn;
- goto yyreduce;
- }
- else if (yyn == 0)
- goto yyerrlab;
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- /* Shift the lookahead token. */
- YYDPRINTF ((stderr, "Shifting token %d (%s), ",
- yychar, yytname[yychar1]));
-
- /* Discard the token being shifted unless it is eof. */
- if (yychar != YYEOF)
- yychar = YYEMPTY;
-
- *++yyvsp = yylval;
-#if YYLSP_NEEDED
- *++yylsp = yylloc;
-#endif
-
- /* Count tokens shifted since error; after three, turn off error
- status. */
- if (yyerrstatus)
- yyerrstatus--;
-
- yystate = yyn;
- goto yynewstate;
-
-
-/*-----------------------------------------------------------.
-| yydefault -- do the default action for the current state. |
-`-----------------------------------------------------------*/
-yydefault:
- yyn = yydefact[yystate];
- if (yyn == 0)
- goto yyerrlab;
- goto yyreduce;
-
-
-/*-----------------------------.
-| yyreduce -- Do a reduction. |
-`-----------------------------*/
-yyreduce:
- /* yyn is the number of a rule to reduce with. */
- yylen = yyr2[yyn];
-
- /* If YYLEN is nonzero, implement the default value of the action:
- `$$ = $1'.
-
- Otherwise, the following line sets YYVAL to the semantic value of
- the lookahead token. This behavior is undocumented and Bison
- users should not rely upon it. Assigning to YYVAL
- unconditionally makes the parser a bit smaller, and it avoids a
- GCC warning that YYVAL may be used uninitialized. */
- yyval = yyvsp[1-yylen];
-
-#if YYLSP_NEEDED
- /* Similarly for the default location. Let the user run additional
- commands if for instance locations are ranges. */
- yyloc = yylsp[1-yylen];
- YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
-#endif
-
-#if YYDEBUG
- /* We have to keep this `#if YYDEBUG', since we use variables which
- are defined only if `YYDEBUG' is set. */
- if (yydebug)
- {
- int yyi;
-
- YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
- yyn, yyrline[yyn]);
-
- /* Print the symbols being reduced, and their result. */
- for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
- YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
- YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
- }
-#endif
-%% actions /* The action file replaces this line. */
-#line
-\f
- yyvsp -= yylen;
- yyssp -= yylen;
-#if YYLSP_NEEDED
- yylsp -= yylen;
-#endif
-
-#if YYDEBUG
- if (yydebug)
- {
- short *yyssp1 = yyss - 1;
- YYFPRINTF (stderr, "state stack now");
- while (yyssp1 != yyssp)
- YYFPRINTF (stderr, " %d", *++yyssp1);
- YYFPRINTF (stderr, "\n");
- }
-#endif
-
- *++yyvsp = yyval;
-#if YYLSP_NEEDED
- *++yylsp = yyloc;
-#endif
-
- /* Now `shift' the result of the reduction. Determine what state
- that goes to, based on the state we popped back to and the rule
- number reduced by. */
-
- yyn = yyr1[yyn];
-
- yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
- if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
- yystate = yytable[yystate];
- else
- yystate = yydefgoto[yyn - YYNTBASE];
-
- goto yynewstate;
-
-
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
-yyerrlab:
- /* If not already recovering from an error, report this error. */
- if (!yyerrstatus)
- {
- ++yynerrs;
-
-#ifdef YYERROR_VERBOSE
- yyn = yypact[yystate];
-
- if (yyn > YYFLAG && yyn < YYLAST)
- {
- YYSIZE_T yysize = 0;
- char *yymsg;
- int yyx, yycount;
-
- yycount = 0;
- /* Start YYX at -YYN if negative to avoid negative indexes in
- YYCHECK. */
- for (yyx = yyn < 0 ? -yyn : 0;
- yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
- if (yycheck[yyx + yyn] == yyx)
- yysize += yystrlen (yytname[yyx]) + 15, yycount++;
- yysize += yystrlen ("parse error, unexpected ") + 1;
- yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
- yymsg = (char *) YYSTACK_ALLOC (yysize);
- if (yymsg != 0)
- {
- char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
- yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
-
- if (yycount < 5)
- {
- yycount = 0;
- for (yyx = yyn < 0 ? -yyn : 0;
- yyx < (int) (sizeof (yytname) / sizeof (char *));
- yyx++)
- if (yycheck[yyx + yyn] == yyx)
- {
- const char *yyq = ! yycount ? ", expecting " : " or ";
- yyp = yystpcpy (yyp, yyq);
- yyp = yystpcpy (yyp, yytname[yyx]);
- yycount++;
- }
- }
- yyerror (yymsg);
- YYSTACK_FREE (yymsg);
- }
- else
- yyerror ("parse error; also virtual memory exhausted");
- }
- else
-#endif /* defined (YYERROR_VERBOSE) */
- yyerror ("parse error");
- }
- goto yyerrlab1;
-
-
-/*--------------------------------------------------.
-| yyerrlab1 -- error raised explicitly by an action |
-`--------------------------------------------------*/
-yyerrlab1:
- if (yyerrstatus == 3)
- {
- /* If just tried and failed to reuse lookahead token after an
- error, discard it. */
-
- /* return failure if at end of input */
- if (yychar == YYEOF)
- YYABORT;
- YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
- yychar, yytname[yychar1]));
- yychar = YYEMPTY;
- }
-
- /* Else will try to reuse lookahead token after shifting the error
- token. */
-
- yyerrstatus = 3; /* Each real token shifted decrements this */
-
- goto yyerrhandle;
-
-
-/*-------------------------------------------------------------------.
-| yyerrdefault -- current state does not do anything special for the |
-| error token. |
-`-------------------------------------------------------------------*/
-yyerrdefault:
-#if 0
- /* This is wrong; only states that explicitly want error tokens
- should shift them. */
-
- /* If its default is to accept any token, ok. Otherwise pop it. */
- yyn = yydefact[yystate];
- if (yyn)
- goto yydefault;
-#endif
-
-
-/*---------------------------------------------------------------.
-| yyerrpop -- pop the current state because it cannot handle the |
-| error token |
-`---------------------------------------------------------------*/
-yyerrpop:
- if (yyssp == yyss)
- YYABORT;
- yyvsp--;
- yystate = *--yyssp;
-#if YYLSP_NEEDED
- yylsp--;
-#endif
-
-#if YYDEBUG
- if (yydebug)
- {
- short *yyssp1 = yyss - 1;
- YYFPRINTF (stderr, "Error: state stack now");
- while (yyssp1 != yyssp)
- YYFPRINTF (stderr, " %d", *++yyssp1);
- YYFPRINTF (stderr, "\n");
- }
-#endif
-
-/*--------------.
-| yyerrhandle. |
-`--------------*/
-yyerrhandle:
- yyn = yypact[yystate];
- if (yyn == YYFLAG)
- goto yyerrdefault;
-
- yyn += YYTERROR;
- if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
- goto yyerrdefault;
-
- yyn = yytable[yyn];
- if (yyn < 0)
- {
- if (yyn == YYFLAG)
- goto yyerrpop;
- yyn = -yyn;
- goto yyreduce;
- }
- else if (yyn == 0)
- goto yyerrpop;
-
- if (yyn == YYFINAL)
- YYACCEPT;
-
- YYDPRINTF ((stderr, "Shifting error token, "));
-
- *++yyvsp = yylval;
-#if YYLSP_NEEDED
- *++yylsp = yylloc;
-#endif
-
- yystate = yyn;
- goto yynewstate;
-
-
-/*-------------------------------------.
-| yyacceptlab -- YYACCEPT comes here. |
-`-------------------------------------*/
-yyacceptlab:
- yyresult = 0;
- goto yyreturn;
-
-/*-----------------------------------.
-| yyabortlab -- YYABORT comes here. |
-`-----------------------------------*/
-yyabortlab:
- yyresult = 1;
- goto yyreturn;
-
-/*---------------------------------------------.
-| yyoverflowab -- parser overflow comes here. |
-`---------------------------------------------*/
-yyoverflowlab:
- yyerror ("parser stack overflow");
- yyresult = 2;
- /* Fall through. */
-
-yyreturn:
-#ifndef yyoverflow
- if (yyss != yyssa)
- YYSTACK_FREE (yyss);
-#endif
- return yyresult;
-}
+++ /dev/null
-/*****************************************************************************
- * Description: encode/decode/eval LDAP Filters
- *
- * Originated: April 04, 2002
- * Original Author: Mike Day md@soft-hackle.net
- * mdd@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/slp_client/Attic/filter.l,v 1.1 2003/05/21 15:14:08 mday Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-%{
-
-#undef YYLMAX
-#define YYLMAX 2048
-#define YY_NEVER_INTERACTIVE 1
-#undef YY_INPUT
-#define YY_INPUT(b, r, m) abort()
-#undef ECHO
-#define ECHO filtererror(yytext)
-#define exit(i) abort()
-#include "slp_client.h"
-#include "y_filter.h"
-#include <stdarg.h>
-
-#define filterless yyless
-void filtererror(int8 *, ...);
-
-/*
-extern char *lslp_logPath;
-
-#define yyerror(s) _lslpMsgOut(lslp_logPath, lslpPrintSem, LSLP_LOG_ERRORS, NULL, 0, (s), __FILE__, __LINE__);
-*/
-static int16 heapIndex;
-static int8 heap[2052];
-static int8 buf[2052];
-
-static int8 *_lslp_strdup(int8 *s);
-void filter_close_lexer(uint32 handle);
-uint32 filter_init_lexer(int8 *s);
-
-
-%}
-
-/* regex macros for the lexer */
-hexdigit [0-9a-fA-F]
-reserved [()\&|!=<>~\n] /* newline in reserved set for convinience */
-not_reserved [^()\&|!=<>~\n]
-
-
-/* special lexer states */
-%x QUOTED_STRING
-
-/* table size directives */
-
-%option noyywrap prefix="filter"
-%%
-
-"\"" { BEGIN QUOTED_STRING; filterless(0); }
-<QUOTED_STRING>[^()\&|!=<>~\n]+ {
- BEGIN INITIAL;
- if(NULL != (filterlval.filter_string = _lslp_strdup(filtertext)))
- return(OPERAND) ;
- else
- return(0L) ;
- }
-
-
-[ \t\v\f]* { ; }
-"(" { filterlval.filter_int = L_PAREN; return L_PAREN ; }
-")" { filterlval.filter_int = R_PAREN; return R_PAREN ; }
-"&" { filterlval.filter_int = OP_AND; return OP_AND ; }
-"|" { filterlval.filter_int = OP_OR; return OP_OR ; }
-"!" { filterlval.filter_int = OP_NOT; return OP_NOT ; }
-"=" { filterlval.filter_int = OP_EQU; return OP_EQU ; }
-">=" { filterlval.filter_int = OP_GT; return OP_GT ; }
-"<=" { filterlval.filter_int = OP_LT; return OP_LT ; }
-"=*" { filterlval.filter_int = OP_PRESENT; return OP_PRESENT ; }
-"~=" { filterlval.filter_int = OP_APPROX; return OP_APPROX ; }
-
-
-[-+][0-9]+ |
-[-+]"0"[xX]{hexdigit}+ {
- filterlval.filter_int = strtol(filtertext, (char **) 0, 0) ;
- return VAL_INT;
- }
-
-[0-9]+ |
-"0"[xX]{hexdigit}+ {
- filterlval.filter_int = strtoul(filtertext, (char **) 0, 0);
- return VAL_INT;
- }
-
-[tT][rR][uU][eE] {
- filterlval.filter_int = 1; return VAL_BOOL;
- }
-
-
-[fF][aA][lL][sS][eE] {
- filterlval.filter_int = 0; return VAL_BOOL;
- }
-
-
-[^()\&|!=<>~ \t\v\f]+ {
- if(NULL != (filterlval.filter_string = _lslp_strdup(filtertext)))
- return(OPERAND) ;
- else
- return(0L) ;
- }
-
-
-
-%%
-
-void filter_close_lexer(uint32 handle)
-{
- assert(handle != 0);
- filter_delete_buffer((YY_BUFFER_STATE)handle);
-}
-
-
-uint32 filter_init_lexer(int8 *s)
-{
- memset(&buf[0], 0x00, 2052);
- memset(&heap[0], 0x00, 2052);
- heapIndex = 0;
- strncpy(&buf[0], s, 2048);
- return((uint32)filter_scan_buffer(&buf[0], strlen(s) + 2));
-}
-
-
-static int8 *_lslp_strdup(int8 *s)
-{
- int8 *p = &heap[heapIndex];
- do { heap[heapIndex++] = *s; } while ((*s != 0x00) && (heapIndex < 2049) && (++s));
- return(p);
-}
-
-/*****
-static int8 *_lslp_strdup_strip_quotes(int8 *s)
-{
- int8 *p = &heap[heapIndex];
- do { if(*s != '"') heap[heapIndex++] = *s; } while ((*s != 0x00) && (heapIndex < 2049) && (++s));
- return(p);
-}
-
-******/
-
-void filtererror(int8 *s, ...)
-{
- return;
-}
-
-/*
-int main(int argc, char *argv[])
-{
-
-}
-
-*/
-
+++ /dev/null
-/*****************************************************************************
- * Description: encode/decode/eval LDAP Filters
- *
- * Originated: April 04, 2002
- * Original Author: Mike Day md@soft-hackle.net
- * mdd@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/slp_client/Attic/filter.y,v 1.2 2003/05/21 19:05:50 mday Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-%{
-
-#include "slp_client.h"
-
-/* prototypes and globals go here */
- void filtererror(int8 *, ...);
-
- int32 filterlex(void);
-
-int32 filterparse(void);
-void filter_close_lexer(uint32 handle);
-uint32 filter_init_lexer(int8 *s);
-
-/* have a place to put attributes and the filter while the parser is working */
-/* on them makes it easier to recover from parser errors - all the memory we */
-/* need to free is available from the list heads below. */
-
-/* listhead for reduced filters until the parser is finished */
- filterHead reducedFilters = { &reducedFilters, &reducedFilters, TRUE } ;
- int nesting_level;
-
-%}
-
-%name-prefix="filter"
-/* definitions for ytab.h */
-
-%union {
- int32 filter_int;
- int8 *filter_string;
- lslpLDAPFilter *filter_filter;
-}
-
-
-%token<filter_int> L_PAREN R_PAREN OP_AND OP_OR OP_NOT OP_EQU OP_GT OP_LT OP_PRESENT OP_APPROX
-%token<filter_int> VAL_INT VAL_BOOL
-%token<filter_string> OPERAND
-
-/* typecast the non-terminals */
-
-%type <filter_filter> filter filter_list expression
-%type <filter_int> exp_operator filter_op filter_open filter_close
-%%
-
-/* grammar */
-
-filter_list: filter
- | filter_list filter
- ;
-
-filter: filter_open filter_op filter_list filter_close {
- if(NULL != ($$ = lslpAllocFilter($2))) {
- $$->nestingLevel = nesting_level;
- if(! _LSLP_IS_EMPTY(&reducedFilters) ) {
- lslpLDAPFilter *temp = (lslpLDAPFilter *)reducedFilters.next;
- while(! _LSLP_IS_HEAD(temp)) {
- if(temp->nestingLevel == nesting_level + 1) {
- lslpLDAPFilter *nest = temp;
- temp = temp->next;
- _LSLP_UNLINK(nest);
- _LSLP_INSERT_BEFORE(nest, (lslpLDAPFilter *)&($$->children)) ;
- } else {temp = temp->next; }
- }
- _LSLP_INSERT_BEFORE( (filterHead *)$$, &reducedFilters);
- } else { lslpFreeFilter($$) ; $$ = NULL ; }
- }
- }
-
- | filter_open expression filter_close {
- $$ = $2;
- if($2 != NULL) {
- $2->nestingLevel = nesting_level;
- _LSLP_INSERT_BEFORE((filterHead *)$2, &reducedFilters) ;
- }
- }
- ;
-
-filter_open: L_PAREN { nesting_level++; }
- ;
-
-filter_close: R_PAREN { nesting_level--; }
- ;
-
-filter_op: OP_AND
- | OP_OR
- | OP_NOT
- { $$ = filterlval.filter_int; }
-
- ;
-
-expression: OPERAND OP_PRESENT { /* presence test binds to single operand */
- if(NULL != ($$ = lslpAllocFilter(expr_present))) {
- lslpAttrList *attr = lslpAllocAttr($1, string, "*", (int16)strlen("*") + 1);
- if(attr != NULL) {
- _LSLP_INSERT(attr, &($$->attrs));
- } else { lslpFreeFilter($$); $$ = NULL; }
- }
- }
-
- | OPERAND exp_operator VAL_INT { /* must be an int or a bool */
- /* remember to touch up the token values to match the enum in lslp.h */
- if(NULL != ($$ = lslpAllocFilter($2))) {
- lslpAttrList *attr = lslpAllocAttr($1, integer, &($3), sizeof($3));
- if(attr != NULL) {
- _LSLP_INSERT(attr, &($$->attrs));
- } else { lslpFreeFilter($$); $$ = NULL ; }
- }
- }
-
- | OPERAND exp_operator VAL_BOOL { /* must be an int or a bool */
- /* remember to touch up the token values to match the enum in lslp.h */
- if(NULL != ($$ = lslpAllocFilter($2))) {
- lslpAttrList *attr = lslpAllocAttr($1, bool_type, &($3), sizeof($3));
- if(attr != NULL) {
- _LSLP_INSERT(attr, &($$->attrs));
- } else { lslpFreeFilter($$); $$ = NULL ; }
- }
- }
-
- | OPERAND exp_operator OPERAND { /* both operands are strings */
- if(NULL != ($$ = lslpAllocFilter($2))) {
- lslpAttrList *attr = lslpAllocAttr($1, string, $3, (int16)strlen($3) + 1 );
- if(attr != NULL) {
- _LSLP_INSERT(attr, &($$->attrs));
- } else { lslpFreeFilter($$); $$ = NULL ; }
- }
- }
-
- ;
-
-exp_operator: OP_EQU
- | OP_GT
- | OP_LT
- | OP_APPROX
- { $$ = filterlval.filter_int; }
- ;
-
-%%
-
-
-lslpLDAPFilter *lslpAllocFilter(int operator)
-{
- lslpLDAPFilter *filter = (lslpLDAPFilter *)calloc(1, sizeof(lslpLDAPFilter));
- if(filter != NULL) {
- filter->next = filter->prev = filter;
- if(operator == head) {
- filter->isHead = TRUE;
- } else {
- filter->children.next = filter->children.prev = &(filter->children);
- filter->children.isHead = 1;
- filter->attrs.next = filter->attrs.prev = &(filter->attrs);
- filter->attrs.isHead = 1;
- filter->_operator = operator;
- }
- }
- return(filter);
-}
-
-
-void lslpFreeFilter(lslpLDAPFilter *filter)
-{
- if(filter->children.next != NULL) {
- while(! (_LSLP_IS_EMPTY((lslpLDAPFilter *)&(filter->children)))) {
- lslpLDAPFilter *child = (lslpLDAPFilter *)filter->children.next;
- _LSLP_UNLINK(child);
- lslpFreeFilter(child);
- }
- }
- if(filter->attrs.next != NULL) {
- while(! (_LSLP_IS_EMPTY(&(filter->attrs)))) {
- lslpAttrList *attrs = filter->attrs.next;
- _LSLP_UNLINK(attrs);
- lslpFreeAttr(attrs);
- }
- }
-}
-
-void lslpFreeFilterList(lslpLDAPFilter *head, BOOL static_flag)
-{
- assert((head != NULL) && (_LSLP_IS_HEAD(head)));
- while(! (_LSLP_IS_EMPTY(head))) {
- lslpLDAPFilter *temp = head->next;
- _LSLP_UNLINK(temp);
- lslpFreeFilter(temp);
- }
-
- if( static_flag == TRUE)
- lslpFreeFilter(head);
- return;
-}
-
-void lslpInitFilterList(void )
-{
- reducedFilters.next = reducedFilters.prev = &reducedFilters;
- reducedFilters.isHead = TRUE;
- return;
-}
-
-void lslpCleanUpFilterList(void)
-{
- lslpFreeFilterList( (lslpLDAPFilter *)&reducedFilters, FALSE);
-}
-
-lslpLDAPFilter *_lslpDecodeLDAPFilter(int8 *filter)
-{
-
- lslpLDAPFilter *temp = NULL;
- uint32 lexer = 0;
- assert(filter != NULL && strlen(filter));
- lslpInitFilterList();
- nesting_level = 1;
- if(0 != (lexer = filter_init_lexer(filter))) {
- if(filterparse()) { lslpCleanUpFilterList(); }
- filter_close_lexer(lexer);
- }
- if (! _LSLP_IS_EMPTY(&reducedFilters)) {
- if(NULL != (temp = lslpAllocFilter(ldap_and))) {
- _LSLP_LINK_HEAD(&(temp->children), &reducedFilters);
- }
- }
- lslpCleanUpFilterList();
-
- return(temp);
-}
+++ /dev/null
-# libslp_client.la - a libtool library file
-# Generated by ltmain.sh - GNU libtool 1.4.2 (1.922.2.54 2001/09/11 03:33:37)
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='libslp_client.so.1'
-
-# Names of this library.
-library_names='libslp_client.so.1.0.0 libslp_client.so.1 libslp_client.so'
-
-# The name of the static archive.
-old_library='libslp_client.a'
-
-# Libraries that this one depends upon.
-dependency_libs=''
-
-# Version information for libslp_client.
-current=1
-age=0
-revision=0
-
-# Is this an already installed library?
-installed=no
-
-# Files to dlopen/dlpreopen
-dlopen=''
-dlpreopen=''
-
-# Directory that this library needs to be installed in:
-libdir='/usr/local/lib'
+++ /dev/null
-/*****************************************************************************
- * Description:
- *
- * Originated: December 20, 2001
- * Original Author: Mike Day md@soft-hackle.net
- * mdday@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/slp_client/Attic/slp_client.c,v 1.4 2003/11/17 21:37:27 tony Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-
-/* make pattern matching work with a length parameter, like strncmp(a,b) */
-/* <<< Wed Aug 7 20:37:13 2002 mdd >>> */
-
-/* make all direct calls static (hidden), public calls to be exposed through client->() */
-/* << Mon Sep 16 14:00:36 2002 mdd >> */
-
-#include "slp_client.h"
-
-#ifdef _WIN32
- int _winsock_count = 0;
- WSADATA _wsa_data ;
-#include <time.h>
-#endif
-
-struct da_list *alloc_da_node(BOOL head)
-{
- struct da_list *node = (struct da_list *)calloc(1, sizeof(struct da_list));
- if(node != NULL && head == TRUE){
- node->isHead = TRUE;
- node->next = node->prev = node;
- }
- return node;
-}
-
-struct da_list *da_node_exists(struct da_list *head, const void *key)
-{
-
- if(head != NULL && _LSLP_IS_HEAD(head) && key != NULL) {
- struct da_list *temp = head->next;
- while( ! _LSLP_IS_HEAD(temp)){
- if(! strcmp(temp->url, (int8 *)key))
- return temp;
- temp = temp->next;
- }
- }
- return NULL;
-}
-
-
-void free_da_list_members(struct da_list *da)
-{
- assert( ! _LSLP_IS_HEAD(da));
- if(da->url != NULL)
- free(da->url);
- if(da->scope != NULL)
- free(da->scope);
- if(da->attr != NULL)
- free(da->attr);
- if(da->spi != NULL)
- free(da->spi);
- if(da->auth != NULL)
- free(da->auth);
-}
-
-void free_da_list_node(struct da_list *da)
-{
- assert( ! _LSLP_IS_HEAD(da));
- free_da_list_members(da);
- free(da);
-}
-
-
-/* DOES NOT free the list head ! */
-void free_da_list(struct da_list *list)
-{
- struct da_list *temp;
- assert(_LSLP_IS_HEAD(list));
- temp = list->next;
- while( ! _LSLP_IS_HEAD(temp)) {
- _LSLP_UNLINK(temp);
- free_da_list_node(temp);
- temp = list->next;
- }
-}
-
-struct rply_list *alloc_rply_list(BOOL head)
-{
- struct rply_list *node = (struct rply_list *)calloc(1, sizeof(struct rply_list));
- if(node != NULL && head == TRUE){
- node->isHead = TRUE;
- node->next = node->prev = node;
- }
- return node;
-}
-
-
-struct rply_list *rpl_node_exists(struct rply_list *head, const void *key)
-{
- if(head != NULL && _LSLP_IS_HEAD(head) && key != NULL){
- struct rply_list *temp = head->next;
- while( ! _LSLP_IS_HEAD(temp)){
- if( ! strcmp(temp->url, (int8 *)key))
- return temp;
- temp = temp->next;
- }
- }
- return NULL;
-}
-
-void free_rply_list_members(struct rply_list *rply)
-{
- assert(! _LSLP_IS_HEAD(rply));
- if(rply->url != NULL)
- free(rply->url);
- if(rply->auth != NULL)
- free(rply->auth);
-}
-
-void free_rply_list_node(struct rply_list *rply)
-{
- assert(! _LSLP_IS_HEAD(rply));
- free_rply_list_members(rply);
- free(rply);
-}
-
-/* DOES NOT free the list head ! */
-void free_rply_list(struct rply_list *list)
-{
- struct rply_list *temp;
- assert(_LSLP_IS_HEAD(list));
- temp = list->next;
- while( ! _LSLP_IS_HEAD(temp)){
- _LSLP_UNLINK(temp);
- free_rply_list_node(temp);
- temp = list->next;
- }
-}
-
-struct reg_list *alloc_reg_list(BOOL head)
-{
- struct reg_list *node = (struct reg_list *)calloc(1, sizeof(struct reg_list));
- if( node != NULL && head == TRUE){
- node->isHead = TRUE;
- node->next = node->prev = node;
- }
- return node;
-}
-
-struct reg_list *reg_node_exists(struct reg_list *head, const void *key)
-{
- if(head != NULL && _LSLP_IS_HEAD(head) && key != NULL){
- struct reg_list *temp = head->next;
- while( ! _LSLP_IS_HEAD(temp)){
- if( ! strcmp(temp->url, (int8 *)key))
- return temp;
- temp = temp->next;
- }
- }
- return NULL;
-}
-
-void free_reg_list_members(struct reg_list *reg)
-{
- assert(! _LSLP_IS_HEAD(reg));
- if(reg->url != NULL)
- free(reg->url);
- if(reg->attributes != NULL)
- free(reg->attributes);
- if(reg->service_type != NULL)
- free(reg->service_type);
- if(reg->scopes != NULL)
- free(reg->scopes);
-}
-
-void free_reg_list_node(struct reg_list *reg)
-{
- assert(! _LSLP_IS_HEAD(reg));
- free_reg_list_members(reg);
- free(reg);
-}
-
-/* DOES NOT free the list head ! */
-void free_reg_list(struct reg_list *list)
-{
- struct reg_list *temp;
- assert( _LSLP_IS_HEAD(list));
- temp = list->next;
- while(! _LSLP_IS_HEAD(temp)) {
- _LSLP_UNLINK(temp);
- free_reg_list_node(temp);
- temp = list->next;
- }
-}
-
-struct url_entry *alloc_url_entry(BOOL head)
-{
- struct url_entry *node = (struct url_entry *)calloc(1, sizeof(struct url_entry));
- if(node != NULL && head == TRUE){
- node->isHead = TRUE;
- node->next = node->prev = node;
- }
- return node;
-}
-
-struct url_entry *url_node_exists(struct url_entry *head, const void *key)
-{
- if(head != NULL && _LSLP_IS_HEAD(head) && key != NULL){
- struct url_entry *temp = head->next;
- while( ! _LSLP_IS_HEAD(temp)){
- if( ! strcmp(temp->url, (int8 *)key))
- return temp;
- temp = temp->next;
- }
- }
- return NULL;
-}
-
-void free_url_entry_members(struct url_entry *url)
-{
- assert(! _LSLP_IS_HEAD(url));
- if(url->url != NULL)
- free(url->url);
- if(url->auth_blocks != NULL)
- free(url->auth_blocks);
-}
-
-void free_url_node(struct url_entry *node)
-{
- assert(! _LSLP_IS_HEAD(node));
- free_url_entry_members(node);
- free(node);
-}
-
-/* DOES NOT free the list head ! */
-void free_url_list(struct url_entry *list)
-{
- struct url_entry *temp;
- assert( _LSLP_IS_HEAD(list));
- temp = list->next;
- while(! _LSLP_IS_HEAD(temp)) {
- _LSLP_UNLINK(temp);
- free_url_node(temp);
- temp = list->next;
- }
-}
-
-#if defined( _WIN32 )
- int gethostbyname_r(const char *name,
- struct hostent *resultbuf,
- char *buf,
- size_t bufsize,
- struct hostent **result,
- int *errnop)
-{
- name = name;
- resultbuf = resultbuf;
- buf = buf;
- bufsize = bufsize;
-
- if(NULL == (*result = gethostbyname(name))) {
- *errnop = WSAGetLastError();
- return(-1);
- }
- return(0);
-}
-
-#endif
-
-#if defined( NUCLEUS ) //jeb
-
- int gethostbyname_r(const char *name,
- struct hostent *resultbuf,
- char *buf,
- size_t bufsize,
- struct hostent **result,
- int *errnop)
-{
- name = name;
- resultbuf = resultbuf;
- buf = buf;
- bufsize = bufsize;
-
- if(NULL == (*result = _LSLP_GETHOSTBYNAME(name))) {
-#ifdef NUCLEUS
- *errnop = -2;
-#else
- *errnop = h_errno;
-#endif
- return(-1);
- }
- return(0);
-}
-
-#endif
-
-char *slp_get_addr_string_from_url(const char *url, char *addr, int addr_len)
-{
- char name[255];
- SOCKADDR_IN a;
-
- if(addr == NULL || addr_len < 1 )
- return NULL;
-
- if( get_addr_from_url( url, &a, NULL) ) {
-#if defined ( _WIN32 )
- _snprintf(name, 254, "%s:%d", inet_ntoa(a.sin_addr), ntohs(a.sin_port) );
-#elif defined (NUCLEUS) //jeb
- sprintf(name, "%s:%d", inet_ntoa(a.sin_addr), a.sin_port ); //jeb
-#else //jeb
- snprintf(name, 254, "%s:%d", inet_ntoa(a.sin_addr), ntohs(a.sin_port) );
-#endif
-
- memset(addr, 0x00, addr_len);
- strncpy(addr, name, addr_len - 1 );
- return addr;
- }
- return NULL;
-}
-
-char *slp_get_host_string_from_url(const char *url, char *host, int host_len)
-{
- char *s;
- SOCKADDR_IN addr;
-
- if ( host == NULL || host_len < 1 )
- return NULL;
-
- if (TRUE == get_addr_from_url(url, &addr, &s )) {
- memset(host, 0x00, host_len);
- strncpy(host, s, host_len - 1);
- return host;
- }
-
- return NULL;
-}
-
-BOOL get_addr_from_url(const int8 *url, SOCKADDR_IN *addr, int8 **host)
-
-{
- int8 *bptr, *url_dup;
- BOOL ccode = FALSE;
-
- // isolate the host field
- bptr = (url_dup = strdup(url));
- if(bptr == NULL)
- return( FALSE );
-
- while( (*bptr != '/') && (*bptr != 0x00) )
- bptr++;
-
- if(*bptr == '/' && *(bptr + 1) == '/') {
- int8 *endptr, *portptr;
- endptr = bptr + 2;
- while (*endptr != 0x00 && *endptr != '/' && *endptr != ';')
- endptr++;
- *endptr = 0x00;
- portptr = (endptr - 1) ;
-
- while( ( portptr > ( bptr + 2 ) ) && ( *portptr != ':' ) )
- portptr--;
-
- if( *portptr == ':') {
- *portptr = 0x00;
- portptr++;
- } else { portptr = NULL; }
-
- // bptr points to the host name or address
- // portptr points to the port or is null
-
- bptr += 2;
-
- if(host != NULL) {
- *host = (int8 *)malloc(strlen(bptr) + strlen(portptr) + 3);
- strcpy(*host, bptr);
- strcat(*host, ":");
- strcat(*host, portptr);
- }
- if (portptr != NULL)
- addr->sin_port = htons( (int16)strtoul(portptr, NULL, 0) );
- else
- addr->sin_port = 0x0000;
- addr->sin_family = AF_INET;
-
- addr->sin_addr.s_addr = inet_addr(bptr);
- if(addr->sin_addr.s_addr == INADDR_NONE) {
- struct hostent *host;
- struct hostent hostbuf;
- uint8 *temp ;
- uint32 result, err;
- size_t hostbuflen = 256;
-
- // hopefully a hostname because dotted decimal notation was invalid
- // look for the user@hostname production
- int8 *userptr;
- userptr = bptr;
- while( (*userptr != 0x00 ) && (*userptr != '@' ) )
- userptr++;
- if( *userptr == '@' )
- bptr = userptr + 1;
-
- temp = (uint8 *)malloc(hostbuflen);
- if(temp != NULL) {
- host = NULL;
- while(temp != NULL && (result = gethostbyname_r(bptr, &hostbuf,
- (char *)temp,
- hostbuflen,
-#ifdef NUCLEUS
- &host, (int *)&err)) == -1){
-#else
- &host, (int *)&err)) == ERANGE){ //
-#endif
- hostbuflen *= 2;
- temp = (uint8 *)realloc(temp, hostbuflen);
- }
- if(host != NULL) {
- struct in_addr *ptr;
- if (((ptr = (struct in_addr *)*(host->h_addr_list)) != NULL ) ) {
- addr->sin_addr.s_addr = ptr->s_addr;
- ccode = TRUE;
- }
- }
- free(temp);
- } /* we allocated the temp buffer for gethostbyname */
- } else {
- ccode = TRUE ;
- } /* host field is not in a valid dotted decimal form */
- } /* isolated the host field in the url */
- return(ccode);
-}
-
-
-/*** effectively reallocates *list -- FREES MEMORY ***/
-int slp_get_local_interfaces(uint32 **list)
-{
- SOCKETD sock; //jeb
- int interfaces = 0;
-#if defined ( _WIN32 )
- int buf_size = 256;
-#endif
- if( list == NULL )
- return 0;
- if ( *list != NULL )
- free( *list );
-
-#if defined ( _WIN32 )
-
- if ( INVALID_SOCKET != ( sock = WSASocket(AF_INET,
- SOCK_RAW, 0, NULL, 0, 0) ) ) {
- int bytes_returned;
- char *output_buf = (char *)malloc(buf_size);
- if (output_buf == NULL)
- return 0;
-
- if ( 0 == WSAIoctl( sock, SIO_ADDRESS_LIST_QUERY, NULL, 0,
- output_buf, buf_size, &bytes_returned, NULL, NULL) ) {
- socket_addr_list *addr_list;
- socket_addr *addr;
- uint32 *intp;
- struct sockaddr_in *sin;
- addr_list = (socket_addr_list *)output_buf;
- *list = (uint32 *) malloc(sizeof(socket_addr) * addr_list->count + 1) ;
- addr = addr_list->list;
-
- for( interfaces = 0, intp = *list, sin = (struct sockaddr_in *)addr ;
- interfaces < addr_list->count;
- interfaces++ , intp++ ) {
- *intp = sin->sin_addr.s_addr;
- addr++;
- sin = (struct sockaddr_in *)addr;
- }
- *intp = INADDR_ANY;
- }
- free(output_buf);
- _LSLP_CLOSESOCKET(sock);
- }
-
-
-#elif defined ( NUCLEUS ) //jeb
- /* only one interface do the following: */
- *list = (uint32 *)malloc(sizeof(uint32));
-
- //get name of external ethernet
- NU_IOCTL_OPTION option;
- option.s_optval = (unsigned char *)ETHER0;
-
- //get IP address
- if (NU_Ioctl(IOCTL_GETIFADDR, &option, sizeof(option)) == NU_SUCCESS)
- {
- //get IP address
- memcpy(*list, option.s_ret.s_ipaddr, 4);
- interfaces = 1;
- }
- else // no interfaces
- interfaces = 0;
-
- *list = (uint32 *)malloc(sizeof uint32);
- *list[0] = inet_addr(" address of interface ");
- interfaces = 1;
-
-#else
- if( -1 < (sock = socket(AF_INET, SOCK_DGRAM, 0) ) ) {
- struct ifconf conf;
- uint32 *this_addr;
-
- conf.ifc_buf = (char *)malloc( 128 * sizeof(struct ifreq ) );
- conf.ifc_len = 128 * sizeof( struct ifreq ) ;
- if( -1 < ioctl(sock, SIOCGIFCONF, &conf ) ) {
- // count the interfaces
-
- struct ifreq *r = conf.ifc_req;
- SOCKADDR_IN *addr ;
- addr = (SOCKADDR_IN *)&r->ifr_addr;
- while( addr->sin_addr.s_addr != 0 ) {
- interfaces++;
- r++;
- addr = (SOCKADDR_IN *)&r->ifr_addr;
- }
-
- // now store the addresses
-
- *list = (uint32 *)malloc( sizeof(uint32) * interfaces + 1 );
- this_addr = *list;
- r = conf.ifc_req;
- addr = (SOCKADDR_IN *)&r->ifr_addr;
- while( addr->sin_addr.s_addr != 0 ) {
- *this_addr = addr->sin_addr.s_addr;
- r++;
- this_addr++;
- addr = (SOCKADDR_IN *)&r->ifr_addr;
- }
- *this_addr = INADDR_ANY;
- } // did the ioctl
- free(conf.ifc_buf);
- _LSLP_CLOSESOCKET(sock);
- } // opened the socket
-
-#endif
- // failsafe if the ioctl doesn't work
- if( interfaces == 0 ) {
- *list = (uint32 *)malloc(sizeof(uint32)) ;
- *list[0] = INADDR_ANY;
- }
-
- return(interfaces);
-}
-
-BOOL slp_join_multicast(SOCKETD sock, uint32 addr) //jeb
-{
-
-#if defined(NUCLEUS ) //jeb
- //don't support for now
- return(FALSE); //jeb
-
-#else
- struct ip_mreq mreq;
- // don't join on the loopback interface
- if (addr == inet_addr("127.0.0.1") )
- return(FALSE);
-
-
- mreq.imr_multiaddr.s_addr = inet_addr("239.255.255.253");
- mreq.imr_interface.s_addr = addr;
-
- if(SOCKET_ERROR == setsockopt(sock,IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char *)&mreq, sizeof(mreq)))
- return(FALSE);
-
- return(TRUE); //jeb
-#endif
-}
-
-
-
-int slp_join_multicast_all(SOCKETD sock)
-{
-
- uint32 *list = NULL , *lptr = NULL;
- int num_interfaces = slp_get_local_interfaces(&list);
- lptr = list;
- while ( *lptr != INADDR_ANY ) {
- slp_join_multicast(sock, *lptr) ;
- lptr++;
- }
- free(list);
- return(num_interfaces);
-}
-
-
-SOCKETD slp_open_listen_sock( void ) //jeb
-{
- SOCKADDR_IN local;
- SOCKETD sock = _LSLP_SOCKET(AF_INET, SOCK_DGRAM, 0) ; //jeb
- int err = 1;
-
-#ifndef NUCLEUS //jeb not supported
- _LSLP_SETSOCKOPT(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&err, sizeof(err));
-#endif
- local.sin_family = AF_INET;
- local.sin_port = htons(427);
- local.sin_addr.s_addr = INADDR_ANY;
- if( 0 == _LSLP_BIND(sock, (struct sockaddr *)&local, sizeof(local)) )
- slp_join_multicast_all(sock);
- return(sock);
-}
-
-
-void prepare_pr_buf(struct slp_client *client, const int8 *address)
-{
- if(address == NULL || client == NULL )
- return;;
- if(client->_pr_buf_len > 0)
- client->_pr_buf[client->_pr_buf_len - 1] = ',';
- do {
- client->_pr_buf[client->_pr_buf_len] = *address;
- address++;
- (client->_pr_buf_len)++;
- }while((*address != 0x00) && (client->_pr_buf_len < LSLP_MTU - 1));
- (client->_pr_buf_len)++;
-}
-
-/** attn need to role change to getflags line into nucleus **/
-void make_srv_ack(struct slp_client *client, SOCKADDR_IN *remote, int8 response, int16 code )
-{
- int8 *bptr;
- if(TRUE == ( ((_LSLP_GETFLAGS( client->_rcv_buf )) & (LSLP_FLAGS_MCAST) ) ? FALSE : TRUE ) ) {
- SOCKETD sock; //jeb
-
- memset(client->_msg_buf, 0x00, LSLP_MTU);
- bptr = client->_msg_buf;
- _LSLP_SETVERSION(bptr, LSLP_PROTO_VER);
- _LSLP_SETFUNCTION(bptr, response);
-
- _LSLP_SETFLAGS(bptr, 0);
- _LSLP_SETXID(bptr, _LSLP_GETXID(client->_rcv_buf));
- _LSLP_SETLAN(bptr, LSLP_EN_US, LSLP_EN_US_LEN);
- bptr += _LSLP_HDRLEN(bptr) ;
- _LSLP_SETSHORT(bptr, code, 0 );
- bptr += 2;
- _LSLP_SETLENGTH(client->_msg_buf, bptr - client->_msg_buf);
- if(INVALID_SOCKET != (sock = _LSLP_SOCKET(AF_INET, SOCK_DGRAM, 0))) {
- SOCKADDR_IN local;
- int err = 1;
-#ifndef NUCLEUS
- _LSLP_SETSOCKOPT(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&err, sizeof(err) );
-#endif
- local.sin_family = AF_INET;
- local.sin_port = client->_target_port ;
- local.sin_addr.s_addr = client->_local_addr;
- if(SOCKET_ERROR != _LSLP_BIND(sock, &local, sizeof(local))) {
- _LSLP_SENDTO(sock, client->_msg_buf, _LSLP_GETLENGTH(client->_msg_buf), 0,
- remote, sizeof(SOCKADDR_IN )) ;
- } // successfully bound this socket
- _LSLP_CLOSESOCKET(sock);
- } // successfully opened this socket
- }
-}
-
-
-BOOL prepare_query( struct slp_client *client,
- uint16 xid,
- const int8 *service_type,
- const int8 *scopes,
- const int8 *predicate )
-{
- int16 len, total_len, buf_len;
- int8 *bptr, *bptrSave;
- if(xid != client->_xid) {
- /* this is a new request */
- memset(client->_pr_buf, 0x00, LSLP_MTU);
- client->_pr_buf_len = 0;
- client->_xid = xid;
- }
- memset(client->_msg_buf, 0x00, LSLP_MTU);
- bptr = client->_msg_buf;
- _LSLP_SETVERSION(bptr, LSLP_PROTO_VER);
- _LSLP_SETFUNCTION(bptr, LSLP_SRVRQST);
- /* we don't know the length yet */
- _LSLP_SETFLAGS(bptr, 0);
- _LSLP_SETXID(bptr, xid);
- _LSLP_SETLAN(bptr, LSLP_EN_US, LSLP_EN_US_LEN);
- bptr += ( total_len = _LSLP_HDRLEN(bptr) ) ;
- if(client->_pr_buf_len + total_len < LSLP_MTU) {
- /* set the pr list length */
- _LSLP_SETSHORT(bptr, (len = client->_pr_buf_len), 0);
- if(len)
- memcpy(bptr + 2, client->_pr_buf, len);
- total_len += ( 2 + len );
- bptr += (2 + len);
- if(service_type == NULL)
- len = DA_SRVTYPELEN;
- else
- len = (int16)strlen(service_type) ;
- if(total_len + 2 + len < LSLP_MTU) {
- /* set the service type string length */
- _LSLP_SETSHORT(bptr, len, 0);
- if(service_type != NULL)
- memcpy(bptr + 2, service_type, len);
- else
- memcpy(bptr + 2, DA_SRVTYPE, len);
-
- total_len += (2 + len);
- bptr += (2 + len);
- /* set the scope len and scope type, advance the buffer */
-
- if(scopes == NULL)
- len = DA_SCOPELEN;
- else
- len = (int16)strlen(scopes);
- if( total_len + 2 + len < LSLP_MTU) {
- _LSLP_SETSHORT(bptr, len, 0);
- if(scopes != NULL)
- memcpy(bptr + 2, scopes, len);
- else
- memcpy(bptr + 2, DA_SCOPE, DA_SCOPELEN);
-
- total_len += ( 2 + len);
- bptr += (2 + len);
- /* stuff the predicate if there is one */
- if(predicate == NULL)
- len = 0;
- else
- len = (int16)strlen(predicate) ;
- if( total_len + 2 + len < LSLP_MTU) {
- _LSLP_SETSHORT(bptr, len, 0);
- if(predicate != NULL)
- memcpy(bptr + 2, predicate, len);
-
- total_len += (2 + len);
- bptrSave = (bptr += (2 + len));
- /* stuff the spi */
- buf_len = LSLP_MTU - total_len;
- lslpStuffSPIList(&bptr, &buf_len, client->_spi);
-
- /* read back the length of the spi */
- total_len += (2 + _LSLP_GETSHORT(bptrSave, 0));
- assert(total_len == bptr - client->_msg_buf);
- /* always add an attr extension to an srvrq if there is room */
- if(total_len + 9 <= LSLP_MTU ) {
- _LSLP_SETNEXTEXT(client->_msg_buf, total_len);
- _LSLP_SETSHORT(bptr, 0x0002, 0);
- _LSLP_SET3BYTES(bptr, 0x00000000, 2);
- _LSLP_SETSHORT(bptr, 0x0000, 5);
- _LSLP_SETSHORT(bptr, 0x0000, 7);
- _LSLP_SETBYTE(bptr, 0x00, 9);
- total_len += 10;
- }
- /* now go back and set the length for the entire message */
- _LSLP_SETLENGTH(client->_msg_buf, total_len );
- return(TRUE);
-
- } /* room for predicate */
- } /* room for the scope */
- } /* room for the service type */
- } /* room for the pr list */
- return(FALSE);
-}
-
-
-lslpMsg *get_response( struct slp_client *client, lslpMsg *head)
-{
- assert(head != NULL && _LSLP_IS_HEAD(head));
- if( _LSLP_IS_EMPTY(&(client->replies)))
- return NULL;
-
- _LSLP_LINK_HEAD(head, &(client->replies));
- return(head);
-}
-
-
-int find_das(struct slp_client *client,
- const int8 *predicate,
- const int8 *scopes)
-{
- converge_srv_req(client, NULL, predicate, scopes);
- time(&(client->_last_da_cycle));
- if( ! _LSLP_IS_EMPTY(&(client->das)))
- client->_use_das = TRUE;
- else
- client->_use_das = FALSE;
- return((int) client->_use_das );
-}
-
-
-/* smart interface to slp discovery. uses das if they are present, */
-/* convergence otherwise. */
-/* periodically forces an active da discovery cycle */
-
-void discovery_cycle ( struct slp_client *client,
- const int8 *type,
- const int8 *predicate,
- const int8 *scopes)
-{
- // see if we have built a cache of directory agents
- if( _LSLP_IS_EMPTY(&(client->das)) ) {
- // we don't know of any directory agents - see if we need to do active da discovery
- if( ((time(NULL)) - client->_last_da_cycle ) > (60 * 5) )
- find_das(client, NULL, scopes) ;
- }
-
- // if there are das, unicast a srvreq to each da
-
- if( ! _LSLP_IS_EMPTY(&(client->das))) {
- struct da_list *da = client->das.next;
- SOCKADDR_IN addr;
- while( ! _LSLP_IS_HEAD(da) ) {
- addr.sin_port = htons(427);
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = inet_addr(da->remote);
- unicast_srv_req(client, type, predicate, scopes, &addr);
- da = da->next;
- }
- } else {
- // do a convergence request because we don't have any das to use
- converge_srv_req(client, type, predicate, scopes );
- }
- return;
-}
-
-/* this request MUST be retried <_convergence> times on EACH interface */
-/* regardless of how many responses we have received */
-/* it can be VERY time consuming but is the most thorough */
-/* discovery method */
-
-void converge_srv_req(struct slp_client *client,
- const int8 *type,
- const int8 *predicate,
- const int8 *scopes)
-{
- uint32 old_local_addr;
- uint32 *p_addr ;
- uint16 convergence;
- uint32 loopback ;
-
-
- // old_target_addr = client->_target_addr;
- old_local_addr = client->_local_addr;
- // client->_target_addr = inet_addr( "239.255.255.253" ) ;
-
- p_addr = client->_local_addr_list;
- loopback = inet_addr("127.0.0.1");
-
- do {
- if( *p_addr == loopback ) {
- p_addr++;
- continue;
- }
- client->_local_addr = *p_addr;
- convergence = client->_convergence;
- if(convergence == 0)
- convergence = 1;
-
- if(prepare_query( client, client->_xid + 1, type, scopes, predicate)) {
- _LSLP_SETFLAGS(client->_msg_buf, LSLP_FLAGS_MCAST) ;
- send_rcv_udp( client );
- }
-
- while(--convergence > 0) {
- if(prepare_query( client, client->_xid, type, scopes, predicate)) {
- _LSLP_SETFLAGS(client->_msg_buf, LSLP_FLAGS_MCAST) ;
- send_rcv_udp( client );
- }
- }
- p_addr++;
- } while( *p_addr != INADDR_ANY ) ;
-
-
- // always try a local request
- local_srv_req(client, type, predicate, scopes);
-
- // client->_target_addr = old_target_addr;
- client->_local_addr = old_local_addr;
- return ;
-}
-
-// this request will be retried MAX <_retries> times
-// but will always end when the first response is received
-// This request is best when using a directory agent
-void unicast_srv_req( struct slp_client *client,
- const int8 *type,
- const int8 *predicate,
- const int8 *scopes,
- SOCKADDR_IN *addr )
-{
-
- uint32 target_addr_save, local_addr_save;
- uint16 target_port_save;
- struct timeval tv_save;
- int retries ;
-
- target_addr_save = client->_target_addr;
- local_addr_save = client->_local_addr;
- target_port_save = client->_target_port;
-
- tv_save.tv_sec = client->_tv.tv_sec;
- client->_tv.tv_sec = 1;
-
- // let the host decide which interface to use
- client->_local_addr = INADDR_ANY;
- client->_target_addr = addr->sin_addr.s_addr;
- client->_target_port = addr->sin_port;
-
- retries = client->_retries;
-
- srv_req(client, type, predicate, scopes, FALSE) ;
-
- while( retries && _LSLP_IS_EMPTY(&(client->replies))) {
- printf("retry\n");
-
- srv_req(client, type, predicate, scopes, FALSE);
- retries--;
- }
- client->_target_addr = target_addr_save;
- client->_local_addr = local_addr_save;
- client->_target_port = target_port_save;
- client->_tv.tv_sec = tv_save.tv_sec;
- return;
-}
-
-// this request is targeted to the loopback interface,
-// and has a tiny wait timer. It should be resolved quickly.
-// It will never be retried.
-void local_srv_req( struct slp_client *client,
- const int8 *type,
- const int8 *predicate,
- const int8 *scopes )
-
-
-{
-
- uint32 target_addr_save, local_addr_save;
- uint16 target_port_save;
-
- struct timeval tv_save;
-
- target_addr_save = client->_target_addr;
- target_port_save = client->_target_port;
- local_addr_save = client->_local_addr;
-
- tv_save.tv_sec = client->_tv.tv_sec;
- tv_save.tv_usec = client->_tv.tv_usec;
- client->_tv.tv_sec = 0;
-#ifdef NUCLEUS //jeb
- client->_tv.tv_usec = 2*TICKS_PER_SECOND; //socket call with timer UINT32
-#else
- client->_tv.tv_usec = 10000;
-#endif
- // let the host decide which interface to use
- client->_local_addr = INADDR_ANY;
- client->_target_addr = inet_addr("127.0.0.1");
- client->_target_port = htons(427);
-
- srv_req(client, type, predicate, scopes, FALSE) ;
-
- client->_target_addr = target_addr_save;
- client->_target_port = target_port_save;
- client->_local_addr = local_addr_save;
- client->_tv.tv_sec = tv_save.tv_sec;
-
- client->_tv.tv_sec = tv_save.tv_sec;
- client->_tv.tv_usec = tv_save.tv_usec;
-
- return;
-}
-
-
-// workhorse request function
-void srv_req( struct slp_client *client,
- const int8 *type,
- const int8 *predicate,
- const int8 *scopes,
- BOOL retry )
-{
- if ((TRUE == prepare_query(client, (retry == TRUE) ? client->_xid : client->_xid + 1,
- type,
- scopes,
- predicate ))) {
- send_rcv_udp( client ) ;
- } /* prepared query */
- return ;
-}
-
-void decode_msg( struct slp_client *client,
- SOCKADDR_IN *remote )
-{
- int8 function, response;
-
- if( client->_xid == _LSLP_GETXID( client->_rcv_buf ))
- prepare_pr_buf( client, inet_ntoa(remote->sin_addr) );
-
- function = _LSLP_GETFUNCTION( client->_rcv_buf );
-
- // <<< Fri Dec 21 15:47:06 2001 mdd >>>
- // increment the correct function counters
-
- switch(function) {
- case LSLP_DAADVERT:
- decode_daadvert( client, remote );
- return;
- case LSLP_SRVRQST:
- decode_srvreq( client, remote );
- return;
- case LSLP_SRVRPLY:
- decode_srvrply( client, remote );
- return;
- case LSLP_SRVACK:
- return;
- case LSLP_ATTRREQ:
- response = LSLP_ATTRRPLY;
- break;
- case LSLP_SRVTYPERQST:
- response = LSLP_SRVTYPERPLY;
- break;
- case LSLP_SRVREG:
- decode_srvreg(client, remote);
- return;
- case LSLP_SRVDEREG:
- default:
- response = LSLP_SRVACK;
- break;
- }
- make_srv_ack(client, remote, response, LSLP_MSG_NOT_SUPPORTED);
- return;
-}
-
-
-
-/* this is a hack. but it will be consistent with the changes I envision */
-/* for auth blocks and authenticated url entries */
-void decode_srvreg(struct slp_client *client,
- SOCKADDR_IN *remote)
-{
- int8 *bptr, *url_string, *attr_string, *type_string, *scopes;
- uint16 lifetime ;
- int32 total_len, purported_len;
- BOOL mcast;
- int16 str_len;
-
- mcast = ( ((_LSLP_GETFLAGS( client->_rcv_buf )) & (LSLP_FLAGS_MCAST) ) ? TRUE : FALSE ) ;
- bptr = client->_rcv_buf;
- purported_len = _LSLP_GETLENGTH(bptr);
-
- bptr += (total_len = _LSLP_HDRLEN(bptr));
- if(purported_len < LSLP_MTU && (total_len < purported_len)) {
- lslpURL *decoded_url;
- int16 diff, err;
- diff = purported_len - total_len;
-
- /* decode the url entry */
- if(NULL != (decoded_url = lslpUnstuffURL(&bptr, &diff, &err))) {
- url_string = decoded_url->url;
- lifetime = (uint16)decoded_url->lifetime;
-
- /* adjust pointers and size variables */
- /* bptr already adjusted by call to lslpUnstuffURL */
- total_len += ((purported_len - total_len) - diff);
-
- /* decode the service type string */
- if((total_len + 2 + (str_len = _LSLP_GETSHORT(bptr, 0))) < purported_len) {
- if(NULL != (type_string = (int8 *)malloc(str_len + 1))) {
- memcpy(type_string, bptr + 2, str_len);
- *(type_string + str_len) = 0x00;
-
- /* adjust pointers and size variables */
- bptr += (2 + str_len);
- total_len += (2 + str_len);
-
- /* decode the scope list */
- if((total_len + 2 + (str_len = _LSLP_GETSHORT(bptr, 0))) < purported_len) {
- if(NULL != (scopes = (int8 *)malloc(str_len + 1))) {
- memcpy(scopes, bptr + 2, str_len);
- *(scopes + str_len) = 0x00;
-
- /* adjust pointers and size variables */
- bptr += (2 + str_len);
- total_len += (2 + str_len);
-
- /* decode the attr list */
- if((total_len + 2 + (str_len = _LSLP_GETSHORT(bptr, 0))) < purported_len) {
- if(NULL != (attr_string = (int8 *)malloc(str_len + 1))) {
- memcpy(attr_string, bptr + 2, str_len);
- *(attr_string + str_len) = 0x00;
- /* adjust pointers and size variables */
- bptr += (2 + str_len);
- total_len += (2 + str_len);
-
- /* decode the auth block list */
- /* lslpUnstuffAuthList( ) */
- __srv_reg_local(client, url_string, attr_string, type_string, scopes, lifetime);
- make_srv_ack(client, remote, LSLP_SRVACK, 0);
- free(attr_string);
- free(scopes);
- free(type_string);
- lslpFreeURL(decoded_url);
- return;
- } /* malloced attr_string */
- } /* attr string sanity check */
- free(scopes);
- } /* malloced scopes string */
- } /* scope list sanity check */
- free(type_string);
- } /* malloced srv type string */
- } /* srv type sanity check */
- lslpFreeURL(decoded_url);
- make_srv_ack(client, remote, LSLP_SRVACK, LSLP_INTERNAL_ERROR);
- return;
- } /* decoded the url entry */
- } /* initial length sanity check OK */
- make_srv_ack(client, remote, LSLP_SRVACK, LSLP_PARSE_ERROR);
- return;
-}
-
-
-void decode_srvrply( struct slp_client *client,
- SOCKADDR_IN *remote )
-{
- int8 *bptr, *xtptr, *xtn_limit;
- lslpMsg *reply;
-
- int16 err, count, buf_len;
- int32 total_len, purported_len;
-
- bptr = client->_rcv_buf;
- purported_len = _LSLP_GETLENGTH(bptr);
-
- /* marshall the header data */
- reply = alloc_slp_msg(FALSE);
- if(reply == NULL) abort();
- reply->hdr.ver = _LSLP_GETVERSION(bptr);
- reply->type = reply->hdr.msgid = _LSLP_GETFUNCTION(bptr);
- reply->hdr.len = purported_len;
- reply->hdr.flags = _LSLP_GETFLAGS(bptr);
- reply->hdr.nextExt = _LSLP_GETNEXTEXT(bptr);
- reply->hdr.xid = _LSLP_GETXID(bptr);
-
- if((reply->hdr.nextExt != 0x00000000) && (reply->hdr.nextExt < reply->hdr.len )) {
- xtptr = client->_rcv_buf + reply->hdr.nextExt;
- xtn_limit = xtptr + reply->hdr.len;
- }
- else { xtptr = NULL; }
-
- reply->hdr.langLen = _LSLP_GETLANLEN(bptr);
- memcpy(reply->hdr.lang, bptr + LSLP_LAN_LEN + 2, (_LSLP_MIN(reply->hdr.langLen, 19)));
- bptr += (total_len = _LSLP_HDRLEN(bptr));
- if(total_len < purported_len) {
- int32 next_ext = 0;
-
- /* process the srvrply */
- reply->hdr.errCode = reply->msg.srvRply.errCode = _LSLP_GETSHORT(bptr, 0);
- reply->msg.srvRply.urlCount = (count = _LSLP_GETSHORT(bptr, 2));
- bptr += 4;
- total_len += 4;
- if( count ){
- lslpURL *url;
- if( NULL == (reply->msg.srvRply.urlList = lslpAllocURLList()))
- abort();
- if(NULL != xtptr) {
- if( NULL == (reply->msg.srvRply.attr_list = lslpAllocAtomList()))
- abort();
- }
-
- buf_len = LSLP_MTU - total_len;
- /* get the urls */
- while(count-- && buf_len > 0 ) {
- url = lslpUnstuffURL(&bptr, &buf_len, &err);
- if( NULL != url ){
- reply->msg.srvRply.urlLen = url->len;
- _LSLP_INSERT(url, reply->msg.srvRply.urlList);
- }
- }
-
- /* get the attributes if they are present */
-
-/* 0 1 2 3 */
-/* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Extension ID = 0x0002 | Next Extension Offset | */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Offset, contd.| Service URL Length | Service URL / */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Attribute List Length | Attribute List / */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* |# of AttrAuths |(if present) Attribute Authentication Blocks.../ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-
- while((NULL != xtptr) && (xtptr + 9 < xtn_limit )) {
- next_ext = _LSLP_GET3BYTES(xtptr, 2);
- if(0x0002 == _LSLP_GETSHORT(xtptr, 0)) {
-
- //BOOL lslp_pattern_match(const int8 *string, const int8 *pattern, BOOL case_sensitive)
- /* find the correct url to associate this attribute extension. */
- lslpURL *rply_url = reply->msg.srvRply.urlList;
- if(rply_url != 0 && ! _LSLP_IS_HEAD(rply_url->next)){
- int8 *url_buf;
- int16 url_len = _LSLP_GETSHORT(xtptr, 5);
- rply_url = rply_url->next;
- url_buf = (int8 *)calloc(1, url_len + 1);
- if(url_buf == 0 ) abort();
- memcpy(url_buf, xtptr + 7, url_len);
- while(! _LSLP_IS_HEAD(rply_url)) {
- if(TRUE == lslp_pattern_match(url_buf, rply_url->url, FALSE)) {
- /* this is the correct url to associate with the next attribute */
- int16 attr_len;
- int32 attr_offset = 7 + _LSLP_GETSHORT(xtptr, 5);
- attr_len = _LSLP_GETSHORT(xtptr, attr_offset);
- attr_offset += 2;
- if( (xtptr + attr_offset + attr_len) < xtn_limit) {
- lslpAtomList *temp = lslpAllocAtom();
- if(temp != NULL){
- temp->str = (int8 *)malloc(attr_len + 1);
- if(temp->str != NULL) {
- memcpy(temp->str, xtptr + attr_offset, attr_len);
- temp->str[attr_len] = 0x00;
- /* allocate an attr list head */
- if(rply_url->attrs == NULL)
- rply_url->attrs = lslpAllocAtomList();
- if(rply_url->attrs != NULL){
- _LSLP_INSERT(temp, rply_url->attrs);
- }
- } else { lslpFreeAtom(temp); }
- } /* alloced atom */
- } /* sanity check */
- } /* if we found the right url */
- else {
- }
- rply_url = rply_url->next;
- } /* while traversing urls in the reply */
- free(url_buf);
- } /* if the reply contains urls */
- } /* correct extension */
- if( next_ext == 0 )
- break;
- xtptr = client->_rcv_buf + next_ext;
- } /* traversing extensions */
- }
- /* link the response to the client */
- _LSLP_INSERT(reply, &(client->replies));
- }
- return;
-}
-
-void decode_daadvert(struct slp_client *client, SOCKADDR_IN *remote)
-{
- int8 *bptr;
- int16 str_len;
- int32 total_len, purported_len;
-
- bptr = client->_rcv_buf;
- purported_len = _LSLP_GETLENGTH(bptr);
- bptr += (total_len = _LSLP_HDRLEN(bptr));
- if(total_len < purported_len) {
- struct da_list *adv = alloc_da_node(FALSE);
- if(adv == NULL) abort();
- adv->function = LSLP_DAADVERT;
- adv->err = _LSLP_GETSHORT(bptr, 0);
- adv->stateless_boot = _LSLP_GETLONG(bptr, 2);
- total_len += (8 + (str_len = _LSLP_GETSHORT(bptr, 6)));
- if(total_len < purported_len) {
- /* decode and capture the url - note: this is a string, not a url-entry structure */
- if(NULL == (adv->url = (int8 *)malloc(str_len + 1)))
- abort();
- memcpy(adv->url, bptr + 8, str_len);
- *((adv->url) + str_len) = 0x00;
- /* advance the pointer past the url string */
- bptr += (str_len + 8);
- total_len += (2 + (str_len = _LSLP_GETSHORT(bptr, 0)));
- if(total_len < purported_len) {
- if(str_len > 0) {
- if(NULL == (adv->scope = (int8 *)malloc(str_len + 1)))
- abort();
- memcpy(adv->scope, bptr + 2, str_len);
- *((adv->scope) + str_len) = 0x00;
- }
- /* advance the pointer past the scope string */
- bptr += (str_len + 2);
- total_len += (2 + (str_len = _LSLP_GETSHORT(bptr, 0)));
- if(total_len < purported_len) {
- if(str_len > 0) {
- if(NULL == (adv->attr = (int8 *)malloc(str_len + 1)))
- abort();
- memcpy(adv->attr, bptr + 2, str_len);
- *((adv->attr) + str_len) = 0x00;
- }
- /* advance the pointer past the attr string */
- bptr += (str_len + 2);
- total_len += (2 + (str_len = _LSLP_GETSHORT(bptr, 0)));
- if(total_len < purported_len) {
- struct da_list * exists;
-
- if(str_len > 0 ) {
- if(NULL == (adv->spi = (int8 *)malloc(str_len + 1)))
- abort();
- memcpy(adv->spi, bptr + 2, str_len);
- *((adv->spi) + str_len) = 0x00;
- } /* if there is an spi */
-
- /* advance the pointer past the spi string */
- bptr += (str_len + 2);
- adv->auth_blocks = _LSLP_GETBYTE(bptr, 0);
-
- // if we already know about this da, remove the existing
- // entry from our cache and insert this new entry
- // maybe the stateless boot field changed or the da
- // supports new scopes, etc.
- exists = da_node_exists(&(client->das), adv->url);
- if(NULL != exists){
- _LSLP_UNLINK(exists);
- free_da_list_node(exists);
- }
- /* need code here to handle authenticated urls */
- strcpy(&(adv->remote[0]), inet_ntoa(remote->sin_addr)) ;
- _LSLP_INSERT(adv, &(client->das))
- return;
- } /* spi length field is consistent with hdr */
- } /* attr length field is consistent with hdr */
- } /* scope length field is consistent with hdr */
- }
- free_da_list_node(adv);
- }
- return;
-}
-
-
-void decode_srvreq(struct slp_client *client, SOCKADDR_IN *remote )
-{
-
- int8 *bptr, *bptrSave;
- int32 total_len, purported_len;
- BOOL mcast;
- struct lslp_srv_rply_out *rp_out = NULL;
- struct lslp_srv_req *rq = NULL;
- int16 str_len, buf_len, err = LSLP_PARSE_ERROR ;
-
- mcast = ( ((_LSLP_GETFLAGS( client->_rcv_buf )) & (LSLP_FLAGS_MCAST) ) ? TRUE : FALSE ) ;
- bptr = client->_rcv_buf;
- purported_len = _LSLP_GETLENGTH(bptr);
-
- bptr += (total_len = _LSLP_HDRLEN(bptr));
- if(purported_len < LSLP_MTU && (total_len < purported_len)) {
- if( ! _LSLP_IS_EMPTY((lslpSrvRegList *)&(client->regs))) {
- // advance past the slp v2 header
- // get the previous responder list
- str_len = _LSLP_GETSHORT(bptr, 0);
- if ((str_len + total_len + 2) < purported_len ) {
- if( FALSE == slp_previous_responder( client, (str_len ? bptr + 2 : NULL ) )) {
- rq = (struct lslp_srv_req *)calloc(1, sizeof(struct lslp_srv_req));
- if( NULL != rq) {
- bptr += 2 + str_len;
- total_len += 2 + str_len;
- // extract the service type string
- rq->srvcTypeLen = (str_len = _LSLP_GETSHORT(bptr, 0));
- if(str_len && (str_len + total_len + 2 < purported_len )) {
- rq->srvcType = (int8 *)malloc(str_len + 1);
- if(rq->srvcType == NULL) {
- free(rq);
- return ;
- }
- memcpy(rq->srvcType, bptr + 2, str_len);
- *(rq->srvcType + str_len) = 0x00;
- bptr += 2 + str_len;
- total_len += 2 + str_len;
-
- bptrSave = bptr;
- buf_len = LSLP_MTU - total_len;
- rq->scopeList = lslpUnstuffScopeList(&bptr, &buf_len, &err);
- total_len += _LSLP_GETSHORT(bptrSave, 0);
- if (TRUE == lslp_scope_intersection(client->_scopes, rq->scopeList) ) {
- /* continue marshalling data */
-
- if(total_len < LSLP_MTU - 2){
- /* get the predicate */
- rq->predicateLen = (str_len = _LSLP_GETSHORT(bptr, 0));
- if( str_len && (str_len + total_len + 2) < LSLP_MTU ){
- rq->predicate = (int8 *)malloc(str_len + 1);
- if(rq->predicate != NULL){
- memcpy(rq->predicate, bptr + 2, str_len);
- *(rq->predicate + str_len) = 0x00;
- }
- } /* predicate */
-
- bptr += str_len + 2;
- total_len += str_len + 2;
- /* get the spi list */
- buf_len = LSLP_MTU - total_len ;
- rq->spiList = lslpUnstuffSPIList(&bptr, &buf_len, &err);
-
- /* check for an extension */
- rq->next_ext = lslp_get_next_ext(client->_rcv_buf);
- if(rq->next_ext) {
- /* derive the offset limit for the next extension and do a sanity check */
- rq->ext_limit = (int8 *)(purported_len + client->_rcv_buf);
- if(rq->ext_limit < rq->next_ext) {
- rq->next_ext = NULL;
- }
- }
- /* initialize the scratch buffer before processing the srvrq */
- /* that way we can know if there are extensions if the first 5 bytes changed */
- _LSLP_SETSHORT(client->_scratch, 0x0000, 0);
- _LSLP_SET3BYTES(client->_scratch, 0x00000000, 2);
- rp_out = _lslpProcessSrvReq(client, rq, 0);
- } /* sanity check on remaining buffer */
- } /* my scopes intersect */
- } /* service type sanity check */
- } /* allocated req struct */
- } /* not a previous responder */
- } /* pr list sanity check */
- } /* we have regs */
-
- if(mcast == FALSE || (rp_out != NULL && rp_out->urlCount > 0 )) {
- SOCKETD sock; //jeb
- int8 *extptr, *next_extptr, *next_extptr_save;
- int32 ext_offset;
-
- // we need to respond to this message
- _LSLP_SETVERSION(client->_msg_buf, LSLP_PROTO_VER);
- _LSLP_SETFUNCTION(client->_msg_buf, LSLP_SRVRPLY);
- // skip the length for now
- _LSLP_SETFLAGS(client->_msg_buf, 0);
-
- _LSLP_SETNEXTEXT(client->_msg_buf, 0);
- _LSLP_SETXID( client->_msg_buf, ( _LSLP_GETXID(client->_rcv_buf)));
- _LSLP_SETLAN(client->_msg_buf, LSLP_EN_US, LSLP_EN_US_LEN);
- total_len = _LSLP_HDRLEN(client->_msg_buf);
- bptr = client->_msg_buf + total_len;
- if(rp_out != NULL) {
- if( rp_out->urlLen < (LSLP_MTU - total_len)) {
- memcpy(bptr, rp_out->urlList, rp_out->urlLen);
- bptr += rp_out->urlLen;
- total_len += rp_out->urlLen;
- }
- else {
- _LSLP_SETSHORT( bptr, 0, 0 );
- _LSLP_SETFLAGS(client->_msg_buf, LSLP_FLAGS_OVERFLOW);
- total_len += 2;
- bptr += 2;
- /* clear the extension ptr, we don't have room for it. */
- rq->next_ext = NULL;
- }
- } else {
- /* set the error code */
- _LSLP_SETSHORT(bptr, 0, 0);
- /* set the url count */
- _LSLP_SETSHORT(bptr, 0, 2);
- bptr += 4;
- total_len += 4;
- }
- extptr = client->_scratch;
- next_extptr = client->_msg_buf + LSLP_NEXT_EX;
- ext_offset = (int32)(bptr - client->_msg_buf);
-
- if ( 0x0002 == (_LSLP_GETSHORT(extptr, 0))) {
- /* set the next extension field in the header */
- _LSLP_SET3BYTES(next_extptr, ext_offset, 0);
- while( 0x0002 == (_LSLP_GETSHORT(extptr, 0))) {
- /* check see if it fits */
- int16 ext_len = 5;
- /* accumulate url len */
- ext_len += (2 + _LSLP_GETSHORT(extptr, ext_len));
- /* accumulate attr len */
- ext_len += (2 + _LSLP_GETSHORT(extptr, ext_len));
- /* add the auths byte */
- ext_len++;
- if((ext_len + total_len) < LSLP_MTU) {
- /* set the next extension pointer to be the third byte of the first extension */
- next_extptr = client->_msg_buf + ext_offset + 2;
-
- /* copy the extension */
- memcpy(client->_msg_buf + ext_offset, extptr, ext_len);
- bptr += ext_len;
- total_len += ext_len;
-
- /* set the offset of the next extension */
- _LSLP_SET3BYTES((next_extptr_save = next_extptr), ext_offset + ext_len, 0);
- extptr += ext_len;
-
- /* adjust the pointers */
- ext_offset += ext_len;
- next_extptr = client->_msg_buf + ext_offset + 2;
-
- /* minimum length of attr extension is 10 bytes - see if we should continue */
- if(total_len + 10 >= LSLP_MTU) {
- /* no room, set next ext field in this extension to zero */
- _LSLP_SET3BYTES(next_extptr_save, 0x00000000, 0);
- /* if there is another extension, set the truncated flag */
- if ( 0x0002 == (_LSLP_GETSHORT(extptr, 0))) {
- _LSLP_SETFLAGS(client->_msg_buf, LSLP_FLAGS_OVERFLOW);
- }
- break;
- } /* no more room */
- } else {
- _LSLP_SET3BYTES(next_extptr_save, 0x00000000, 0);
- }
- } /* while there are extensions */
- /* terminate the last extension */
- _LSLP_SET3BYTES(next_extptr_save, 0x00000000, 0);
- } /* if there is at least one extension */
-
- // ok, now we can set the length
- _LSLP_SETLENGTH(client->_msg_buf, total_len );
-
- _LSLP_SETSHORT(client->_scratch, 0x0000, 0);
- _LSLP_SET3BYTES(client->_scratch, 0x00000000, 2);
- // client->_msg_buf is stuffed with the service reply. now we need
- // to allocate a socket and send it back to the requesting node
-
- if(INVALID_SOCKET != (sock = _LSLP_SOCKET(AF_INET, SOCK_DGRAM, 0))) {
- SOCKADDR_IN local;
- int err = 1;
-#ifndef NUCLEUS
- _LSLP_SETSOCKOPT(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&err, sizeof(err) );
-#endif
- local.sin_family = AF_INET;
- local.sin_port = client->_target_port ;
- local.sin_addr.s_addr = client->_local_addr;
- if(SOCKET_ERROR != _LSLP_BIND(sock, &local, sizeof(local))) {
- if(mcast == TRUE ) {
- _LSLP_SLEEP(rand() % 30 );
- }
- _LSLP_SENDTO(sock, client->_msg_buf, total_len , 0,
- remote, sizeof(SOCKADDR_IN )) ;
- } // successfully bound this socket
- _LSLP_CLOSESOCKET(sock);
- } // successfully opened this socket
- } // we must respond to this request
-
- /* free resources */
- if(rq != NULL){
- if(rq->prList != NULL)
- free(rq->prList);
- if(rq->srvcType != NULL)
- free(rq->srvcType);
- if(rq->scopeList != NULL)
- lslpFreeScopeList(rq->scopeList);
- if(rq->predicate != NULL)
- free(rq->predicate);
- if(rq->spiList != NULL)
- lslpFreeSPIList(rq->spiList);
- free(rq);
- }
- if(rp_out != NULL){
- if(rp_out->urlList != NULL)
- free(rp_out->urlList);
- free(rp_out);
- }
- } /* header sanity check */
-}
-
-BOOL srv_reg(struct slp_client *client,
- const int8 *url,
- const int8 *attributes,
- const int8 *service_type,
- const int8 *scopes,
- int16 lifetime)
-{
- int32 len;
- int16 str_len, buf_len;
- int8 *bptr;
- lslpURL *url_entry = NULL;
-
- /* this is always a new request */
- memset( client->_pr_buf, 0x00, LSLP_MTU);
- client->_pr_buf_len = 0;
- client->_xid++ ;
-
- memset(client->_msg_buf, 0x00, LSLP_MTU);
- bptr = client->_msg_buf;
- _LSLP_SETVERSION(bptr, LSLP_PROTO_VER);
- _LSLP_SETFUNCTION(bptr, LSLP_SRVREG);
- /* we don't know the length yet */
- _LSLP_SETXID(bptr, client->_xid);
- _LSLP_SETLAN(bptr, LSLP_EN_US, LSLP_EN_US_LEN);
- bptr += (len = _LSLP_HDRLEN(bptr) ) ;
-
- /* construct a url-entry */
-
- url_entry = (lslpURL *)calloc(1, sizeof(lslpURL));
- if(url_entry == NULL)
- return FALSE;
- url_entry->lifetime = lifetime + time(NULL);
- url_entry->len = (uint16)strlen(url);
- url_entry->url = strdup(url);
- url_entry->auths = 0;
- buf_len = LSLP_MTU - len;
-
- if( TRUE == lslpStuffURL(&bptr, &buf_len, url_entry )) {
- len = LSLP_MTU - buf_len ;
- /* stuff the service type string */
-
- /* stuff the service type */
- str_len = (int16)strlen(service_type) ;
- if(len + 2 + str_len < LSLP_MTU) {
- int retries;
- _LSLP_SETSHORT(bptr, str_len, 0);
- memcpy(bptr + 2, service_type, str_len);
- bptr += (2 + str_len);
- len += (2 + str_len);
- /* stuff the scope list if there is one */
- if(scopes == NULL)
- str_len = 0;
- else
- str_len = (int16)strlen(scopes);
- if(len + 2 + str_len < LSLP_MTU) {
- _LSLP_SETSHORT(bptr, str_len, 0);
- if(str_len)
- memcpy(bptr + 2, scopes, str_len);
- len += (2 + str_len);
- bptr += (2 + str_len);
- /* stuff the attribute string if there is one */
- if(attributes == NULL)
- str_len = 0;
- else
- str_len = (int16)strlen(attributes);
- if(len + 2 + str_len < LSLP_MTU) {
- _LSLP_SETSHORT(bptr, str_len, 0);
- if(str_len)
- memcpy(bptr + 2, attributes, str_len);
-
- len += ( 2 + str_len);
- bptr += (2 + str_len);
-
- /* no attribute auths for now */
- if(len + 1 < LSLP_MTU) {
- _LSLP_SETBYTE(bptr, 0x00, 0);
- }
- len += 1;
- /* set the length field in the header */
- _LSLP_SETLENGTH( client->_msg_buf, len );
-
- retries = client->_retries;
- while( --retries ) {
- if(TRUE == send_rcv_udp(client)) {
- if(LSLP_SRVACK == _LSLP_GETFUNCTION( client->_rcv_buf )) {
- if(0x0000 == _LSLP_GETSHORT( client->_rcv_buf, (_LSLP_HDRLEN( client->_rcv_buf )))) {
- memset(client->_msg_buf, 0x00, LSLP_MTU);
- if(url_entry != NULL)
- lslpFreeURL(url_entry);
- return(TRUE);
- }
- }
- } // received a response
- } // retrying the unicast
- } /* attribute string fits into buffer */
- } /* scope string fits into buffer */
- } /* service type fits into buffer */
- } /* url fits into buffer */
- memset( client->_msg_buf, 0x00, LSLP_MTU);
- if(url_entry != NULL)
- lslpFreeURL(url_entry);
- return(FALSE);
-}
-
-
-
-BOOL send_rcv_udp( struct slp_client *client )
-{
- SOCKETD sock; //jeb
- SOCKADDR_IN target, local;
- BOOL ccode = FALSE;
- if(INVALID_SOCKET != (sock = _LSLP_SOCKET(AF_INET, SOCK_DGRAM, 0))) {
- int err = 1;
-#ifndef NUCLEUS //jeb
- _LSLP_SETSOCKOPT(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&err, sizeof(err) );
- local.sin_port = 0;
-#else
- local.sin_port = 427; for loopback to work the first time client inits
-#endif
- local.sin_family = AF_INET;
-
-//jeb
- local.sin_addr.s_addr = client->_local_addr;
- if(SOCKET_ERROR != _LSLP_BIND(sock, &local, sizeof(local))) {
- int bcast = ( (_LSLP_GETFLAGS(client->_msg_buf)) & LSLP_FLAGS_MCAST) ? 1 : 0 ;
- if(bcast) {
- if( (SOCKET_ERROR == _LSLP_SET_TTL(sock, client->_ttl) ) ||
- (SOCKET_ERROR == _LSLP_SETSOCKOPT(sock, SOL_SOCKET, SO_BROADCAST, (const int8 *)&bcast, sizeof(bcast)))) {
- _LSLP_CLOSESOCKET(sock);
- return(FALSE);
- }
- if(client->_local_addr != INADDR_ANY ) {
- SOCKADDR_IN ma;
- memset(&ma, 0x00, sizeof(ma));
- ma.sin_addr.s_addr = client->_local_addr;
- if( (SOCKET_ERROR == _LSLP_SETSOCKOPT(sock, IPPROTO_IP, IP_MULTICAST_IF, (const char *)&ma, sizeof(SOCKADDR_IN))) ) {
- _LSLP_CLOSESOCKET(sock);
- return(FALSE);
- }
- }
- }
- target.sin_family = AF_INET;
- target.sin_port = client->_target_port;
- target.sin_addr.s_addr = client->_target_addr;
-
-
- if(SOCKET_ERROR == (err = _LSLP_SENDTO(sock,
- client->_msg_buf,
- _LSLP_GETLENGTH(client->_msg_buf),
- 0,
- &target, sizeof(target) ))) {
- _LSLP_CLOSESOCKET(sock);
- return(FALSE);
- } /* oops - error sending data */
-
- while ( 0 < __service_listener(client, sock ) ) { ccode = TRUE; }
- } // bound the socket
- _LSLP_CLOSESOCKET(sock);
- } /* got the socket */
- return(ccode);
-}
-
-
-int32 service_listener_wait(struct slp_client *client,
- time_t wait,
- SOCKETD extra_sock,
- BOOL one_only,
- lslpMsg *list)
-{
- int32 ccode = 0;
-
- if(list != NULL) {
- list->isHead = TRUE;
- list->prev = list->next = list;
- ccode = __service_listener_wait(client, wait, extra_sock, one_only);
- get_response(client, list);
- }
- return(ccode);
-}
-
-
-int32 __service_listener_wait(struct slp_client *client, time_t wait, SOCKETD extra_sock, BOOL one_only) //jeb
-{
- int32 rcv = 0;
- time_t now;
- time_t start = time(NULL);
-
- while( time(&now) && ((now - wait ) <= start ) ) {
- rcv += __service_listener(client, extra_sock);
- if(rcv > 0)
- if(one_only == TRUE)
- return(rcv);
-
- _LSLP_SLEEP(10);
- }
- rcv += __service_listener(client, extra_sock);
- return(rcv);
-}
-
-
-int32 service_listener(struct slp_client *client, SOCKETD extra_sock, lslpMsg *list)
-{
- int32 ccode = 0;
-
- if(list != NULL ) {
- list->isHead = TRUE;
- list->prev = list->next = list;
-
- ccode = __service_listener(client, extra_sock);
- get_response(client, list);
- }
- return(ccode);
-}
-
-
-int32 __service_listener(struct slp_client *client, SOCKETD extra_sock ) //jeb
-{
-
- struct timeval tv;
- int32 err;
- LSLP_FD_SET fds;
- _LSLP_FD_ZERO(&fds);
- if(client->_rcv_sock != INVALID_SOCKET) {
- _LSLP_FD_SET(client->_rcv_sock, &fds);
- }
- if(extra_sock)
- _LSLP_FD_SET( extra_sock, &fds);
-
-#ifdef NUCLEUS
- const char fun_name[] = "service_listener";
- err = -1;
- tv.tv_sec = client->_tv.tv_sec;
- tv.tv_usec = client->_tv.tv_usec;
- err = _LSLP_SELECT(((client->_rcv_sock != INVALID_SOCKET) &&
- (client->_rcv_sock > extra_sock)) ?
- client->_rcv_sock + 1: extra_sock + 1, &fds, NULL, NULL, &tv);
-
- // was there some data?
- if (err == NU_SUCCESS)
- { //yes
- SOCKADDR_IN remote;
- int size = sizeof(SOCKADDR_IN);
-
- if (client->_rcv_sock != INVALID_SOCKET)
- {
- if (_LSLP_FD_ISSET(client->_rcv_sock, &fds))
- {
- err = _LSLP_RECV_FROM(client->_rcv_sock, client->_rcv_buf, LSLP_MTU, 0, &remote, &size);
- }
- }
- //did we receive data or invalid socket
- if (err > 0 )
- {
- //go decode the inbound message
- decode_msg( client, &remote );
- return(err);
- }
- else //error on receive or invalid socket
- {
- _system_info(TRUE,"%s:Receive error=%d,skt=%d",fun_name, err, client->_rcv_sock);
- //close our socket
- _LSLP_CLOSESOCKET(client->_rcv_sock );
-
- //go check if the interface is still up
- if ((slp_get_local_interfaces( &(client->_local_addr_list))) > 0 )
- {
- if(client->_rcv_sock != INVALID_SOCKET)
- client->_rcv_sock = slp_open_listen_sock();
- }
-
- return(err);
- }
- }
- //was it just no data yet
- else if (err == NU_NO_DATA)
- {
- //This is OK just return to retry select again later
- return(err);
- }
- //see if other than we time-out with no data
- else
- {
- _system_info(TRUE,"%s:Select:sck error=%d,sck=%d",fun_name, err,client->_rcv_sock);
-
- // our interfaces could be disconnected or we could be a laptop that
- // just got pulled from the network, etc.
- //close our socket
- _LSLP_CLOSESOCKET(client->_rcv_sock );
-
- //go check if the interface is still up
- if ((slp_get_local_interfaces( &(client->_local_addr_list))) > 0 )
- {
- if(client->_rcv_sock != INVALID_SOCKET)
- client->_rcv_sock = slp_open_listen_sock();
- }
- }
-
- return(err);
-
-#else //all other OS's
-
- do {
- tv.tv_sec = client->_tv.tv_sec;
- tv.tv_usec = client->_tv.tv_usec;
- err = _LSLP_SELECT(((client->_rcv_sock != INVALID_SOCKET) &&
- (client->_rcv_sock > extra_sock)) ?
- client->_rcv_sock + 1: extra_sock + 1, &fds, NULL, NULL, &tv);
- } while ( (err < 0 )&& (errno == EINTR)) ;
-
-
- if( 0 < err ) {
- SOCKADDR_IN remote;
- int size = sizeof(SOCKADDR_IN);
- if(client->_rcv_sock != INVALID_SOCKET) {
- if(_LSLP_FD_ISSET(client->_rcv_sock, &fds)) {
- err = _LSLP_RECV_FROM(client->_rcv_sock, client->_rcv_buf, LSLP_MTU, 0, &remote, &size);
- decode_msg( client, &remote );
- }
- }
-
- if(extra_sock && _LSLP_FD_ISSET(extra_sock, &fds) ) {
- err = _LSLP_RECV_FROM(extra_sock, client->_rcv_buf, LSLP_MTU, 0, &remote, &size);
- decode_msg( client, &remote );
- }
- }
-
- if (err == SOCKET_ERROR) {
- // our interfaces could be disconnected or we could be a laptop that
- // just got pulled from the network, etc.
- _LSLP_CLOSESOCKET(client->_rcv_sock );
- if( 0 < slp_get_local_interfaces( &(client->_local_addr_list) ) ) {
- if(client->_rcv_sock != INVALID_SOCKET)
- client->_rcv_sock = slp_open_listen_sock();
- }
- }
- return(err);
-#endif
-
-}
-
-int srv_reg_all( struct slp_client *client,
- const int8 *url,
- const int8 *attributes,
- const int8 *service_type,
- const int8 *scopes,
- int16 lifetime)
-{
- uint32 target_addr_save;
- int convergence_save;
-
- // keep track of how many times we register
- int registrations = 0;
-
- assert(client != NULL && url != NULL && attributes != NULL && service_type != NULL && scopes != NULL);
- if(client == NULL || url == NULL || attributes == NULL || service_type == NULL || scopes == NULL )
- return(0);
-
- // save target and convergence parameters
- target_addr_save = client->_target_addr;
- convergence_save = client->_convergence;
- client->_convergence = 0;
-
- if( client->_use_das == TRUE ) {
- find_das(client, NULL, scopes) ;
- if( ! _LSLP_IS_EMPTY(&(client->das)) ) {
- struct da_list *da = client->das.next;
- while( ! _LSLP_IS_HEAD(da) ) {
- client->_target_addr = inet_addr(da->remote);
- if( TRUE == srv_reg( client, url, attributes, service_type, scopes, lifetime) )
- registrations++;
- da = da->next;;
- }
- }
- }
- // restore parameters
- client->_convergence = convergence_save;
- client->_target_addr = target_addr_save;
- /* do a unicast srvreg if we have the target set */
- if(client->_target_addr != _LSLP_MCAST) {
- if( TRUE == srv_reg( client, url, attributes, service_type, scopes, lifetime) )
- registrations++;
- }
- return(registrations);
-}
-
-int srv_reg_local(struct slp_client *client,
- const int8 *url,
- const int8 *attributes,
- const int8 *service_type,
- const int8 *scopes,
- uint16 lifetime)
-
-{
- int count = 0;
-
- uint32 target_addr_save;
- int convergence_save;
- assert(client != NULL && url != NULL && attributes != NULL && service_type != NULL && scopes != NULL);
- if(client == NULL || url == NULL || attributes == NULL || service_type == NULL || scopes == NULL )
- return 0;
-
- target_addr_save = client->_target_addr;
- convergence_save = client->_convergence;
- client->_convergence = 0;
- client->_target_addr = inet_addr("127.0.0.1");
- if(TRUE == srv_reg(client, url, attributes, service_type, scopes, lifetime))
- count = 1;
-
- client->_convergence = convergence_save;
- client->_target_addr = target_addr_save;
- return count;
-
-}
-
-/* Note: this is how srv_reg_local will look with authentication support */
-
-/* void srv_reg_local(struct slp_client *client, */
-/* const int8 *url, */
-/* int url_auth_count, */
-/* void *url_auth_blob, */
-/* const int8 *attributes, */
-/* const int8 *service_type, */
-/* const int8 *scopes, */
-/* uint16 lifetime, */
-/* int attr_auth_count, */
-/* void *attr_auth_blob) */
-/* { */
-/* } */
-
-
-void __srv_reg_local ( struct slp_client *client,
- const int8 *url,
- const int8 *attributes,
- const int8 *service_type,
- const int8 *scopes,
- uint16 lifetime) //jeb int16 to uint16
-{
-
- int8 *url_copy;
- lslpSrvRegList *reg;
-
- assert(client != NULL && url != NULL && attributes != NULL && \
- service_type != NULL && scopes != NULL);
-
- url_copy = strdup(url);
- if(url_copy == NULL)
- abort();
-
- /* update the attributes if an existing registration */
- reg = client->regs.next;
- while(! _LSLP_IS_HEAD(reg)) {
- if ( 0 == lslp_string_compare(url_copy, reg->url->url)){
- free(url_copy);
- reg->directoryTime = lifetime + time(NULL);
- reg->url->lifetime = lifetime + time(NULL);
- if(reg->attrList != NULL)
- lslpFreeAttrList(reg->attrList, LSLP_DESTRUCTOR_DYNAMIC);
- reg->attrList = _lslpDecodeAttrString((int8 *)attributes);
- return;
- }
- reg = reg->next;
- }
- reg = (lslpSrvRegList *)calloc(1, sizeof(lslpSrvRegList));
- if(reg != NULL){
- int16 len;
- int8 *scope_copy = strdup(scopes);
- if(scope_copy == NULL)
- return;
- if(NULL == (reg->url = lslpAllocURL()))
- abort();
- reg->directoryTime = lifetime + time(NULL);
- reg->url->atomized = _lslpDecodeURLs(&url_copy, 1);
- reg->url->url = url_copy;
- reg->url->lifetime = lifetime + time(NULL);
- reg->url->auths = 0;
- reg->url->len = (uint16)strlen(url_copy);
- reg->srvType = strdup(service_type);
- len = (int16)strlen(scopes) + 1;
- reg->scopeList = lslpScopeStringToList(scope_copy, len);
- len = (int16)strlen(attributes);
- reg->attrList = _lslpDecodeAttrString((int8 *)attributes);
- _LSLP_INSERT(reg, (lslpSrvRegList *)&(client->regs));
- }
- return;
-}
-
-BOOL slp_previous_responder(struct slp_client *client, int8 *pr_list)
-{
-
- int8 *a, *s = NULL;
- uint32 addr, *list_addr;
- if(pr_list == NULL || 0 == strlen(pr_list))
- return(FALSE);
-
- a = _LSLP_STRTOK(pr_list, ",", &s);
- while(NULL != a ) {
- if(INADDR_NONE != (addr = inet_addr(a))) {
- list_addr = client->_local_addr_list;
- while( INADDR_ANY != *list_addr ) {
- if(*list_addr == addr)
- return(TRUE);
- list_addr++;
- }
- }
- a = _LSLP_STRTOK(NULL, ",", &s);
- }
- return(FALSE);
-}
-
-struct slp_client *create_slp_client(const int8 *target_addr,
- const int8 *local_interface,
- uint16 target_port,
- const int8 *spi,
- const int8 *scopes,
- BOOL should_listen,
- BOOL use_das)
-{
- int16 len;
- struct slp_client *client;
- int8 *scope_copy;
-
-
- if(spi == NULL || scopes == NULL )
- return NULL;
-
- client = (struct slp_client *)calloc(1, sizeof(struct slp_client)); //jeb
- if(client == NULL)
- return NULL;
-
-#ifdef _WIN32
- WindowsStartNetwork();
-#endif
-
- /* initialize the random number generator for randomizing the
- timing of multicast responses */
- srand(time(NULL));
-
- client->_buf_len = LSLP_MTU;
- client->_version = 1;
- client->_xid = 1;
- client->_target_port = htons(target_port);
- if( target_addr == NULL)
- client->_target_addr = inet_addr("239.255.255.253");
- else
- client->_target_addr = inet_addr(target_addr);
- if(local_interface == NULL)
- client->_local_addr = INADDR_ANY;
- else
- client->_local_addr = inet_addr(local_interface);
- scope_copy = strdup(spi);
- if(scope_copy == NULL){
- free(client);
- return NULL;
- }
-
- len = (int16)strlen(scope_copy) + 1;
- client->_spi = lslpScopeStringToList(scope_copy, len);
- free(scope_copy);
- scope_copy = strdup(scopes);
- if(scope_copy == NULL){
- free(client);
- return NULL;
- }
- len = (int16)strlen(scope_copy) + 1;
- client->_scopes = lslpScopeStringToList(scope_copy, len);
- free(scope_copy);
-#ifdef NUCLEUS //jeb
- client->_tv.tv_usec = TICKS_PER_SECOND; //socket call with timer UINT32
-#else
- client->_tv.tv_usec = 200000; //.2 sec
-#endif
-
- client->_use_das = use_das;
- client->_retries = 3;
- client->_ttl = 255;
- client->_convergence = 5;
-
- client->das.isHead = TRUE;
- client->das.next = client->das.prev = &(client->das);
-
- client->replies.isHead = TRUE;
- client->replies.next = client->replies.prev = &(client->replies);
-
- client->regs.isHead = TRUE;
- client->regs.next = client->regs.prev = (lslpSrvRegList *)&(client->regs);
-
- client->_local_addr_list = NULL;
- slp_get_local_interfaces(&(client->_local_addr_list));
-
- /* see if we can use a local DA. If not, open up the listen socket */
- client->_rcv_sock = INVALID_SOCKET;
- if(should_listen == TRUE ){
- client->_rcv_sock = slp_open_listen_sock();
- }
- if(client->_use_das == TRUE) {
- local_srv_req(client, NULL, NULL, "DEFAULT");
- if( ! _LSLP_IS_EMPTY(&(client->das))) {
- client->_rcv_sock = INVALID_SOCKET;
- client->_use_das = TRUE;
- client->_da_target_port = htons(427);
- client->_da_target_addr = inet_addr("127.0.0.1");
- }
- }
-
- client->get_response = get_response;
- client->find_das = find_das;
- client->discovery_cycle = discovery_cycle;
- client->converge_srv_req = converge_srv_req;
- client->unicast_srv_req = unicast_srv_req;
- client->local_srv_req = local_srv_req;
- client->srv_req = srv_req;
- client->srv_reg = srv_reg;
- client->srv_reg_all = srv_reg_all;
- client->srv_reg_local = srv_reg_local;
- client->service_listener = service_listener;
- client->prepare_pr_buf = prepare_pr_buf;
- client->decode_msg = decode_msg;
- client->decode_srvreq = decode_srvreq;
- client->decode_srvrply = decode_srvrply;
- client->decode_daadvert = decode_daadvert;
- client->send_rcv_udp = send_rcv_udp;
- client->service_listener_wait = service_listener_wait;
- client->slp_previous_responder = slp_previous_responder;
-
- return client;
-}
-
-void destroy_slp_client(struct slp_client *client)
-{
-
- if(client == NULL)
- return;
-
- _LSLP_CLOSESOCKET(client->_rcv_sock);
- _LSLP_FREE_DEINIT(client->_local_addr_list);
- lslpFreeScopeList((lslpScopeList *)(client->_spi));
- lslpFreeScopeList(client->_scopes);
- _LSLP_FREE_DEINIT(client->_crypto_context);
- free(client);
- return;
-}
-
-/* returns a length-preceded escaped string compliant with an slp opaque value */
-/* length is encoded as two-byte value at the beginning of the string */
-/* size of returned buffer will be ((3 * length) + 3 + 2) */
-int8 *encode_opaque(void *buffer, int16 length)
-{
- static int8 transcode[16] =
- {
- '0', '1', '2', '3', '4', '5', '6', '7',
- '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
- };
-
- int8 *bptr, *srcptr, *buf;
- int32 encoded_length;
-
- if(buffer == NULL || length == 0)
- return(NULL);
-
- encoded_length = (length * 3) + 5;
- /* see if the encoded length will overflow the max size of an slp string */
- if( 0xffff0000 & encoded_length )
- return NULL;
-
- buf = malloc(encoded_length);
- if(buf == NULL)
- return NULL;
- bptr = buf;
-
- /* encode the length */
- _LSLP_SETSHORT(bptr, (int16)encoded_length, 0);
- bptr += 2;
- srcptr = (int8 *)buffer;
- *bptr = 0x5c; *(bptr + 1) = 0x66; *(bptr + 2) = 0x66;
- bptr += 3;
-
- while(length){
- *bptr = 0x5c;
- *(bptr + 1) = transcode[((*srcptr) & 0xf0) >> 4];
- *(bptr + 2) = transcode[(*srcptr) & 0x0f];
- bptr += 3;
- srcptr++;
- length--;
- }
- return buf;
-}
-
-/* returns an opaque buffer. size of opaque buffer will be */
-/* ((size of escaped opaque string - 2) / 3) - 1 */
-void *decode_opaque(int8 *buffer)
-{
-
- int16 encoded_length, alloc_length;
- int8 *bptr, *srcptr, *retptr;
-
- if(buffer == NULL)
- return NULL;
-
- srcptr = buffer;
- retptr = bptr = NULL;
- /* get the length */
- encoded_length = _LSLP_GETSHORT(srcptr, 0);
- if(0 == encoded_length || 0 > encoded_length)
- return NULL;
- alloc_length = (encoded_length / 3) - 1;
-
- srcptr += 2;
- encoded_length -= 2;
-
- /* check the header */
- if( *srcptr == 0x5c ){
- if( (*(srcptr + 1) == 0x46) || (*(srcptr + 1) == 0x66 ) ) {
- if( (*(srcptr + 2) == 0x46) || (*(srcptr + 2) == 0x66 ) ) {
- retptr = (bptr = malloc(alloc_length));
- if(bptr == NULL)
- return NULL;
- /* adjust the encoded length to reflect that we consumed the header */
- encoded_length -= 3;
- srcptr += 3;
-
- while(encoded_length && alloc_length){
- int8 accumulator = 0;
- if(*srcptr == 0x5c){
- /* encode the high nibble */
- if( *(srcptr + 1) < 0x3a && *(srcptr + 1) > 0x2f){
- /* asci decimal char */
- accumulator = (*(srcptr + 1) - 0x30) * 0x10;
- }
- else if( *(srcptr + 1) < 0x47 && *(srcptr + 1) > 0x40){
- accumulator = (*(srcptr + 1) - 0x37) * 0x10;
- }
- else if( *(srcptr + 1) < 0x67 && *(srcptr + 1) > 0x60){
- accumulator = (*(srcptr + 1) - 0x57) * 0x10;
- }
- /* encode the low nibble */
- if( *(srcptr + 2) < 0x3a && *(srcptr + 2) > 0x2f){
- /* asci decimal char */
- accumulator += *(srcptr + 2) - 0x30;
- }
- else if( *(srcptr + 2) < 0x47 && *(srcptr + 2) > 0x40){
- accumulator += *(srcptr + 2) - 0x37;
- }
- else if( *(srcptr + 2) < 0x67 && *(srcptr + 2) > 0x60){
- accumulator += *(srcptr + 2) - 0x57;
- }
- /* store the byte */
- *bptr = accumulator;
- }
- else
- break;
-
- /* update pointers and counters */
- srcptr += 3;
- bptr++;
- encoded_length -= 3;
- alloc_length--;
- }
- if( alloc_length || encoded_length) {
- free(retptr);
- retptr = NULL;
- }
- }
- }
- }
- return (void *)retptr;
-}
-
-
-
-/* right now we don't support the attr request unless it specifies a complete url. */
-
-void decode_attrreq(struct slp_client *client, SOCKADDR_IN *remote)
-{
- int8 *bptr;
- lslpURL *url;
- lslpScopeList *scopes;
- lslpAttrList *attr_tags, *attr_return;
- lslpSrvRegList *regs;
-
- int16 str_len, buf_len, err = LSLP_PARSE_ERROR;
- int32 total_len, purported_len;
-
- /* read the length from the slp header */
- bptr = client->_rcv_buf;
- purported_len = _LSLP_GETLENGTH(bptr);
- if(purported_len > LSLP_MTU )
- return;
-
- bptr += (total_len = _LSLP_HDRLEN(bptr));
-
- /* use total_len as a running count of the msg length, ensure it is */
- /* consistent with the purported length to protect against overflow */
- if(total_len < purported_len){
- /* get the length of the PR list and look at it */
- str_len = _LSLP_GETSHORT(bptr, 0);
- if( (str_len + total_len + 2) < purported_len) {
- if(FALSE == slp_previous_responder(client, (str_len ? bptr + 2 : NULL))){
- bptr += str_len + 2;
- total_len += str_len + 2;
-
- /* decode the url */
- str_len = _LSLP_GETSHORT(bptr, 0);
- if( (str_len + total_len + 2) < purported_len ) {
- if(NULL != (url = lslpAllocURL())) {
- if(NULL != (url->url = (int8 *)malloc(str_len + 1))) {
- memcpy(url->url, bptr, str_len);
- *(bptr + str_len) = 0x00;
- url->atomized = _lslpDecodeURLs( (int8 **)&(url->url), 1);
- bptr += str_len + 2;
- total_len += str_len + 2;
- buf_len = LSLP_MTU - total_len;
- str_len = _LSLP_GETSHORT(bptr, 0);
- scopes = lslpUnstuffScopeList(&bptr, &buf_len, &err);
- total_len += str_len + 2;
- /* see if we even support the scopes */
- if( NULL != url->atomized && TRUE == lslp_scope_intersection(client->_scopes, scopes)) {
- /* decode the attribute tags */
- int8 *bptrSave;
- SOCKETD sock; //jeb
- str_len = _LSLP_GETSHORT(bptr, 0 );
- attr_tags = lslpUnstuffAttr(&bptr, &buf_len, &err);
- total_len += str_len + 2;
- /* see if we have url match */
-
- regs = client->regs.next;
- attr_return = NULL;
-
- while(! _LSLP_IS_HEAD(regs) ){
- if( ! lslp_string_compare(regs->url->url, url->url)) {
- /* we have a hit on the url, see if the scopes intersect */
- if( TRUE == lslp_scope_intersection(regs->scopeList, scopes)){
- attr_return = regs->attrList;
- break;
- }
- }
- regs = regs->next;
- }
-
- /* stuff the attribute reply */
-
- _LSLP_SETVERSION(client->_msg_buf, LSLP_PROTO_VER);
- _LSLP_SETFUNCTION(client->_msg_buf, LSLP_ATTRRPLY);
- // skip the length for now
- _LSLP_SETFLAGS(client->_msg_buf, 0);
- _LSLP_SETNEXTEXT(client->_msg_buf, 0);
- _LSLP_SETXID( client->_msg_buf, ( _LSLP_GETXID(client->_rcv_buf)));
- _LSLP_SETLAN(client->_msg_buf, LSLP_EN_US, LSLP_EN_US_LEN);
- total_len = _LSLP_HDRLEN(client->_msg_buf);
-
-
- bptr = client->_msg_buf + total_len;
- _LSLP_SETSHORT(bptr, err, 0);
- bptr += 2;
- total_len += 2;
-
- buf_len = LSLP_MTU - (total_len + 1);
- bptrSave = bptr;
-
- /* stuff the attr list */
-
- if( FALSE == lslpStuffAttrList(&bptr, &buf_len, attr_return, attr_tags)){
- /* overflow, set the flag, stuff a zero attr list */
- _LSLP_SETFLAGS(client->_msg_buf, LSLP_FLAGS_OVERFLOW);
- buf_len = LSLP_MTU - total_len;
- bptr = bptrSave;
- lslpStuffAttrList(&bptr, &buf_len, NULL, NULL);
- }
- /* for now don't support auth blocks */
-
- _LSLP_SETBYTE(bptr, 0, 0);
-
- /* to calculate the length, re-read the attr list length */
- total_len +=(2 + _LSLP_GETSHORT(bptrSave, 0));
- /* add the length of the auth block (zero plus the number of auths) */
- total_len += 1;
-
- // ok, now we can set the length
- _LSLP_SETLENGTH(client->_msg_buf, total_len );
-
-/* client->_msg_buf is stuffed with the attr reply. now we need */
-/* to allocate a socket and send it back to the requesting node */
-
- if(INVALID_SOCKET != (sock = _LSLP_SOCKET(AF_INET, SOCK_DGRAM, 0))) {
- SOCKADDR_IN local;
- int err = 1;
-#ifndef NUCLEUS
- _LSLP_SETSOCKOPT(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&err, sizeof(err) );
-#endif
- local.sin_family = AF_INET;
- local.sin_port = client->_target_port ;
- local.sin_addr.s_addr = client->_local_addr;
- if(SOCKET_ERROR != _LSLP_BIND(sock, &local, sizeof(local))) {
- _LSLP_SENDTO(sock, client->_msg_buf, total_len , 0,
- (remote), sizeof(SOCKADDR_IN )) ;
- } /* successfully bound this socket */
- _LSLP_CLOSESOCKET(sock);
- } /* successfully opened this socket */
- if(attr_tags)
- lslpFreeAttrList(attr_tags, TRUE);
- } /* scopes intersect */
- if(scopes)
- lslpFreeScopeList(scopes);
-
- } /* url string allocated */
- if(url)
- lslpFreeURL(url);
- } /* url allocated */
- }
- } /* not on the pr list */
- }
- }
-}
-
-
-/* folds extra whitespace out of the string - in place */
-/* destroys parameter ! */
-int8 *lslp_foldString(int8 *s)
- {
- int8 *src, *dst;
- assert(s != 0);
- src = s;
- while(isspace(*src))
- src++;
- if(*src == 0x00) {
- /* return a string of exactly one space */
- *s = 0x20;
- *(s + 1) = 0x00;
- return(s);
- }
- dst = s;
- while(*src != 0x00) {
- *dst = *src;
- dst++;
- src++;
- if(isspace(*src)) {
- *dst = *src;
- dst++;
- src++;
- while(isspace(*src))
- src++;
- }
- }
- *dst = 0x00;
- if(isspace(*(dst - 1)))
- *(dst - 1) = 0x00;
- return(s);
-}
-
-BOOL lslpStuffAttrList(int8 **buf, int16 *len, lslpAttrList *list, lslpAttrList *include)
-{
-
- lslpAttrList *attrs, *included;
- int16 attrLen = 0, lenSave;
- int8 *bptr;
- BOOL ccode = FALSE, hit = TRUE;
- assert(buf != NULL);
- assert(len != NULL && *len > 3);
-/* assert(list != NULL); */
- if (buf == NULL || len == NULL || *len < 3 )
- return(FALSE);
- /* always return TRUE on an empty list so we can continue to build the */
- /* msg buffer - an empty list is not an error! */
- if (list == NULL || _LSLP_IS_EMPTY(list)) {
- _LSLP_SETSHORT((*buf), 0, 0);
- (*buf) += 2;
- (*len) -= 2;
- return(TRUE);
- }
- /* attr list */
- lenSave = *len;
- attrs = list->next;
- bptr = *buf;
- memset(bptr, 0x00, *len);
- (*buf) += 2; /* reserve space for the attrlist length short */
- (*len) -= 2;
- while (! _LSLP_IS_HEAD(attrs) && attrLen + 1 < *len) {
- assert(attrs->type != head);
- if(include != NULL && _LSLP_IS_HEAD(include) && (! _LSLP_IS_EMPTY(include))) {
- included = include->next;
- hit = FALSE;
-
- while(! _LSLP_IS_HEAD(included)){
- if( ! lslp_string_compare(attrs->name, included->name)){
- hit = TRUE;
- break;
- }
- included = included->next;
- }
- }
-
- if(hit == FALSE){
- attrs = attrs->next;
- continue;
- }
-
- if (attrLen + (int16)strlen(attrs->name) + 3 < *len)
- {
- if (attrs->type != tag)
- {
- **buf = '(';
- (*buf)++;
- attrLen++;
- (*len)--;
- }
- strcpy(*buf, attrs->name);
- (*buf) += strlen(attrs->name);
- attrLen += (int16)strlen(attrs->name);
- (*len) -= (int16)strlen(attrs->name);
- if (attrs->type != tag)
- {
- **buf = '=';
- (*buf)++;
- attrLen++;
- (*len)--;
- }
- switch (attrs->type)
- {
- case tag:
- break;
- case string:
- if (attrLen + (int16)strlen(attrs->val.stringVal) + 2 < *len)
- {
- strcpy(*buf, (attrs->val.stringVal));
- (*buf) += strlen(attrs->val.stringVal);
- attrLen += (int16)strlen(attrs->val.stringVal);
- (*len) -= (int16)strlen(attrs->val.stringVal);
- ccode = TRUE;
- }
- else
- ccode = FALSE;
- break;
- case integer:
- if (attrLen + 33 + 2 < *len)
- {
- _itoa( attrs->val.intVal, *buf, 10 );
- attrLen += (int16)strlen(*buf);
- (*buf) += strlen(*buf);
- (*len) -= (int16)strlen(*buf);
- ccode = TRUE;
- }
- else
- ccode = FALSE;
- break;
- case bool_type:
- if (attrLen + 6 + 2 < *len)
- {
- if (attrs->val.boolVal)
- strcpy(*buf, "TRUE");
- else
- strcpy(*buf, "FALSE");
- attrLen += (int16)strlen(*buf);
- (*buf) += strlen(*buf);
- (*len) -= (int16)strlen(*buf);
- ccode = TRUE;
- }
- else
- ccode = FALSE;
- break;
- case opaque:
- {
- int16 opLen;
- opLen = (_LSLP_GETSHORT(((int8 *)attrs->val.opaqueVal), 0));
- if (attrLen + opLen + 3 < *len)
- {
- memcpy(*buf, (((int8 *)attrs->val.opaqueVal) + 2), opLen);
- (*buf) += opLen;
- attrLen += opLen;
- (*len) -= opLen;
- ccode = TRUE;
- }
- else
- ccode = FALSE;
- break;
- }
- default:
- ccode = FALSE;
- break;
- }
- if (ccode == TRUE && attrLen + 2 < *len && attrs->type != tag)
- {
- **buf = ')';
- (*buf)++;
- attrLen++;
- (*len)--;
- }
- if (ccode == TRUE && ! _LSLP_IS_HEAD(attrs->next) && attrLen + 1 < *len)
- {
- **buf = ',';
- (*buf)++;
- attrLen++;
- (*len)--;
- }
- } /* if room for the attr name */
- else
- {
- ccode = FALSE;
- break;
- }
- attrs = attrs->next;
- } /* while we are traversing the attr list */
- /* set the length short */
- if (ccode == TRUE)
- {
- _LSLP_SETSHORT(bptr, attrLen, 0);
- }
- else
- {
- (*buf) = bptr;
- (*len) = lenSave;
- memset(*buf, 0x00, *len);
- }
- return(ccode);
-}
-
-
-lslpAttrList *lslpUnstuffAttr(int8 **buf, int16 *len, int16 *err)
-{
- int16 tempLen;
- lslpAttrList *temp = NULL;
- assert(buf != NULL && *buf != NULL);
- assert(len != NULL);
- assert(err != NULL);
- *err = 0;
- tempLen = _LSLP_GETSHORT(*buf, 0);
- if(tempLen > 0) {
- (*buf) += sizeof(int16);
- (*len) -= sizeof(int16);
- if(*len >= tempLen) {
- if(NULL != (temp = _lslpDecodeAttrString(*buf))) {
- (*buf) += tempLen;
- (*len) -= tempLen;
- } else {*err = LSLP_PARSE_ERROR; }
- } else {*err = LSLP_INTERNAL_ERROR; }
- }
- return(temp);
-}
-
-
-
-lslpURL *lslpAllocURL(void)
-{
- lslpURL *url = (lslpURL *)calloc(1, sizeof(lslpURL));
-
- return(url);
-}
-
-lslpURL *lslpAllocURLList(void)
-{
- lslpURL *head;
- if (NULL != (head = lslpAllocURL()))
- {
- head->next = head->prev = head;
- head->isHead = TRUE;
- return(head);
- }
- return(NULL);
-}
-
-/* url MUST be unlinked from list */
-void lslpFreeURL(lslpURL *url)
-{
- assert(url != NULL);
- if (url->url != NULL)
- free(url->url);
- if ( url->authBlocks != NULL)
- lslpFreeAuthList(url->authBlocks);
- if(url->atomized != NULL)
- lslpFreeAtomizedURLList(url->atomized, TRUE);
- if(url->attrs)
- lslpFreeAtomList(url->attrs, LSLP_DESTRUCTOR_DYNAMIC);
- free(url);
- return;
-}
-
-void lslpFreeURLList(lslpURL *list)
-{
- lslpURL *temp;
-
- assert(list != NULL);
- assert(_LSLP_IS_HEAD(list));
- while(! (_LSLP_IS_EMPTY(list)))
- {
- temp = list->next;
- _LSLP_UNLINK(temp);
- lslpFreeURL(temp);
- }
- lslpFreeURL(list);
- return;
-}
-
-
-/* for protected scopes, we need to change stuff URL so that it */
-/* only stuffs url auth blocks that match spis in the srv req */
-
-
-/* this routine may return FALSE AND alter the buffer and length */
-BOOL lslpStuffURL(int8 **buf, int16 *len, lslpURL *url)
-{
- assert((buf != NULL) && (*buf != NULL));
- assert((len != NULL) && (*len > 8));
- assert((url != NULL) && (! _LSLP_IS_HEAD(url)));
- if(_LSLP_IS_HEAD(url))
- return(FALSE);
- memset(*buf, 0x00, *len);
- /* advanced past the reserved portion */
- (*buf) += sizeof(int8);
- _LSLP_SETSHORT(*buf, url->lifetime - time(NULL), 0);
- (*buf) += sizeof(int16);
- url->len = (uint16)strlen(url->url);
- /* url->url is a null terminated string, but we only stuff the non-null bytes */
- _LSLP_SETSHORT(*buf, url->len, 0);
-
- (*buf) += sizeof(int16);
- (*len) -= 5;
- if(*len < url->len - 1)
- return(FALSE);
- memcpy(*buf, url->url, url->len);
- (*buf) += url->len;
- (*len) -= url->len;
- return(lslpStuffAuthList(buf, len, url->authBlocks));
-}
-
-/* this routine may return FALSE AND alter the buffer and length */
-BOOL lslpStuffURLList(int8 **buf, int16 *len, lslpURL *list)
-{
- BOOL ccode = TRUE;
- assert((buf != NULL) && (*buf != NULL));
- assert((len != NULL) && (*len > 8));
- assert((list != NULL) && (_LSLP_IS_HEAD(list)));
- if(! _LSLP_IS_HEAD(list))
- return(FALSE);
- while((ccode == TRUE) && (! _LSLP_IS_HEAD(list->next))) {
- list = list->next;
- ccode = lslpStuffURL(buf, len, list);
- }
- return(ccode);
-}
-
-lslpURL *lslpUnstuffURL(int8 **buf, int16 *len, int16 *err)
-{
-
- int8 *tempurl;
- lslpURL *temp;
- assert(buf != NULL && *buf != NULL);
- assert(len != NULL && *len > 8);
- assert(err != NULL);
- *err = 0;
- if(NULL != (temp = lslpAllocURL())) {
- temp->lifetime = _LSLP_GETSHORT((*buf), 1);
- temp->len = _LSLP_GETSHORT((*buf), 3);
- (*buf) += 5;
- (*len) -= 5;
- if(*len >= temp->len) {
- if (NULL != (temp->url = (int8 *)calloc(1, temp->len + 1))) {
- memcpy(temp->url, *buf, temp->len);
- *((temp->url) + temp->len) = 0x00;
- tempurl = temp->url;
- temp->atomized = _lslpDecodeURLs((int8 **)&tempurl, 1);
- (*buf) += temp->len;
- (*len) -= temp->len;
- if(temp->atomized != NULL)
- temp->authBlocks = lslpUnstuffAuthList(buf, len, err);
- } else {*err = LSLP_INTERNAL_ERROR;}
- } else {*err = LSLP_PARSE_ERROR; }
- } else {*err = LSLP_INTERNAL_ERROR;}
- if(*err != 0 && temp != NULL) {
- lslpFreeURL(temp);
- temp = NULL;
- }
- return(temp);
-}
-
-
-void lslpFreeFilterTree(lslpLDAPFilter *root)
-{
- assert(root != NULL);
- if( ! _LSLP_IS_EMPTY( &(root->children) ) ) {
- lslpFreeFilterTree((lslpLDAPFilter *)root->children.next);
- }
- if( ! (_LSLP_IS_HEAD(root->next)) && (! _LSLP_IS_EMPTY(root->next)) )
- lslpFreeFilterTree(root->next);
-
- if(root->attrs.next != NULL) {
- while(! (_LSLP_IS_EMPTY(&(root->attrs)))) {
- lslpAttrList *attrs = root->attrs.next;
- _LSLP_UNLINK(attrs);
- lslpFreeAttr(attrs);
- }
- }
-}
-
-
-BOOL lslpEvaluateOperation(int compare_result, int operation)
-{
- switch(operation) {
- case expr_eq:
- if(compare_result == 0) /* a == b */
- return(TRUE);
- break;
- case expr_gt:
- if(compare_result >= 0) /* a >= b */
- return(TRUE);
- break;
-
- case expr_lt: /* a <= b */
- if(compare_result <= 0)
- return(TRUE);
- break;
- case expr_present:
- case expr_approx:
- default:
- return(TRUE);
- break;
- }
- return(FALSE);
-}
-
-/* evaluates attr values, not names */
-BOOL lslpEvaluateAttributes(const lslpAttrList *filter, const lslpAttrList *registered, int op)
-{
- assert(filter != NULL && registered != NULL && (! _LSLP_IS_HEAD(filter)) && (! _LSLP_IS_HEAD(registered))) ;
- /* first ensure they are the same type */
- switch(filter->type) {
- case opaque:
- case string:
- if(registered->type != string && registered->type != opaque)
- return(FALSE);
-
- if( registered->type == opaque || filter->type == opaque) {
- return(lslpEvaluateOperation(memcmp(registered->val.stringVal,
- filter->val.stringVal,
- _LSLP_MIN(registered->attr_len,
- (int32)strlen(filter->val.stringVal))), op));
- } else {
- if( TRUE == lslp_pattern_match(registered->val.stringVal,
- filter->val.stringVal,
- FALSE)) {
- return( lslpEvaluateOperation(0, op)) ;
- } else {
- return (lslpEvaluateOperation(1, op));
- }
- }
- break;
- case integer:
- return( lslpEvaluateOperation( filter->val.intVal - registered->val.intVal, op));
- case tag: /* equivalent to a presence test */
- return(TRUE);
- case bool_type:
- if((filter->val.boolVal != 0) && (registered->val.boolVal != 0))
- return(TRUE);
- if((filter->val.boolVal == 0) && (registered->val.boolVal == 0))
- return(TRUE);
- break;
- default:
- break;
- }
- return(FALSE);
-}
-
-/* filter is a filter tree, attrs is ptr to an attr listhead */
-
-BOOL lslpEvaluateFilterTree(lslpLDAPFilter *filter, const lslpAttrList *attrs)
-{
- assert(filter != NULL);
- assert(attrs != NULL);
- assert(! _LSLP_IS_HEAD(filter));
- if(filter == NULL || (_LSLP_IS_HEAD(filter)) || attrs == NULL)
- return FALSE;
-
- if(! _LSLP_IS_HEAD(filter->children.next) ) {
- lslpEvaluateFilterTree((lslpLDAPFilter *)filter->children.next, attrs);
- }
- if( ! (_LSLP_IS_HEAD(filter->next)) && (! _LSLP_IS_EMPTY(filter->next)) ) {
- lslpEvaluateFilterTree(filter->next, attrs);
- }
- if(filter->_operator == ldap_and || filter->_operator == ldap_or || filter->_operator == ldap_not) {
- /* evaluate ldap logical _operators by evaluating filter->children as a list of filters */
- lslpLDAPFilter *child_list = (lslpLDAPFilter *)filter->children.next;
- /* initialize the filter's logical value to TRUE */
- if(filter->_operator == ldap_or)
- filter->logical_value = FALSE;
- else
- filter->logical_value = TRUE;
- while(! _LSLP_IS_HEAD(child_list)) {
- if(child_list->logical_value == TRUE) {
- if(filter->_operator == ldap_or) {
- filter->logical_value = TRUE;
- break;
- }
- if(filter->_operator == ldap_not) {
- filter->logical_value = FALSE;
- break;
- }
- /* for an & _operator keep going */
- } else {
- /* child is FALSE */
- if(filter->_operator == ldap_and) {
- filter->logical_value = FALSE;
- break;
- }
- }
- child_list = child_list->next;
- }
- } else {
- /* find the first matching attribute and set the logical value */
- filter->logical_value = FALSE;
- if(! _LSLP_IS_HEAD(filter->attrs.next) ) {
- attrs = attrs->next;
- while( (! _LSLP_IS_HEAD(attrs )) &&
- ( FALSE == lslp_pattern_match(filter->attrs.next->name, attrs->name, FALSE)) ) {
- attrs = attrs->next ;
- }
- /* either we have traversed the list or found the first matching attribute */
- if( ! _LSLP_IS_HEAD(attrs) ) {
- /* we found the first matching attribute, now do the comparison */
- if (filter->_operator == expr_present || filter->_operator == expr_approx)
- filter->logical_value = TRUE;
- else
- filter->logical_value = lslpEvaluateAttributes(filter->attrs.next, attrs, filter->_operator );
- }
- }
- }
- return(filter->logical_value);
-}
-
-lslpScopeList *lslpScopeStringToList(int8 *s, int16 len)
-{
- int8 *p, *saveP, *t;
- lslpScopeList *h, *temp;
- if(s == NULL)
- return(lslpAllocScopeList());
- if(NULL != (h = lslpAllocScopeList())) {
- saveP = (p = (int8 *)malloc(len + 1));
- if( p == NULL)
- return NULL;
- memcpy(p, s, len);
- *(p + len) = 0x00;
-
- while(NULL != (t = strchr(p, ','))) {
- *t = 0x00;
- t++;
- p = lslp_foldString(p);
- if((lslp_islegal_scope(p)) && (NULL != (temp = lslpAllocScope()))) {
- if(NULL != (temp->scope = strdup(p))) {
- _LSLP_INSERT(temp, h);
- }
- }
- p = t;
- }
- p = lslp_foldString(p);
- if((lslp_islegal_scope(p)) && (NULL != (temp = lslpAllocScope()))) {
- if(NULL != (temp->scope = strdup(p))) {
- _LSLP_INSERT(temp, h);
- }
- }
- free(saveP);
- }
- return(h);
-}
-
-BOOL lslpStuffScopeList(int8 **buf, int16 *len, lslpScopeList *list)
-{
- lslpScopeList *scopes;
- int16 scopeLen = 0, lenSave;
- int8 *bptr;
- BOOL ccode = FALSE;
- assert(buf != NULL);
- assert(len != NULL && *len > 3);
- assert(list != NULL);
- if (buf == NULL || len == NULL || *len < 3 || list == NULL)
- return(FALSE);
- /* always return TRUE on an empty list so we can continue to build the */
- /* msg buffer - an empty list is not an error! */
- if (_LSLP_IS_EMPTY(list))
- return(TRUE);
- /* scope list */
- lenSave = *len;
- scopes = list->next;
- bptr = *buf;
- memset(*buf, 0x00, *len);
- (*buf) += 2; /* reserve space for the scopelist length short */
- (*len) -= 2;
- while (! _LSLP_IS_HEAD(scopes) && scopeLen + 1 < *len)
- {
- if (scopeLen + (int16)strlen(scopes->scope) < *len)
- {
- ccode = TRUE;
- strcpy(*buf, scopes->scope);
- (*buf) += strlen(scopes->scope);
- scopeLen += (int16)strlen(scopes->scope) ;
- if (! _LSLP_IS_HEAD(scopes->next) )
- {
- **buf = ',';
- (*buf)++;
- scopeLen++;
- }
- } /* if room for the attr name */
- else
- {
- ccode = FALSE;
- break;
- }
- scopes = scopes->next;
- } /* while we are traversing the attr list */
- /* set the length short */
- if (ccode == TRUE)
- {
- // **buf = 0x00;
- // (*buf)++;
- // scopeLen++;
- // << Thu May 30 16:18:57 2002 mdd >>
- (*len) -= scopeLen;
- _LSLP_SETSHORT(bptr, scopeLen, 0);
- }
- else
- {
- *len = lenSave;
- *buf = bptr;
- memset(*buf, 0x00, *len);
- }
- return(ccode);
-
-}
-
-
-lslpScopeList *lslpUnstuffScopeList(int8 **buf, int16 *len, int16 *err)
-{
- int16 tempLen;
- lslpScopeList *temp = NULL;
- assert(buf != NULL && *buf != NULL);
- assert(len != NULL);
- assert(err != NULL);
- *err = 0;
- tempLen = _LSLP_GETSHORT(*buf, 0);
- (*buf += 2);
- (*len -= 2);
- if(tempLen != 0) {
- if (tempLen <= *len ) {
- if(NULL != (temp = lslpScopeStringToList(*buf, tempLen))) {
- (*buf) += tempLen;
- (*len) -= tempLen;
- } else{*err = LSLP_INTERNAL_ERROR;}
- } else {*err = LSLP_PARSE_ERROR;}
- }
- return(temp);
-}
-
-
-lslpSPIList *lslpUnstuffSPIList(int8 **buf, int16 *len, int16 *err)
-{
- return((lslpSPIList *)lslpUnstuffScopeList(buf, len, err));
-}
-
-
-BOOL lslpStuffSPIList(int8 **buf, int16 *len, lslpSPIList *list)
-{
- return(lslpStuffScopeList(buf, len, (lslpScopeList *)list));
-}
-
-
-BOOL lslp_scope_intersection(lslpScopeList *a, lslpScopeList *b)
-{
- if((a == NULL) || (b == NULL))
- return(TRUE);
-
- assert(_LSLP_IS_HEAD(a));
- assert(_LSLP_IS_HEAD(b));
- if((_LSLP_IS_EMPTY(a)) || (_LSLP_IS_EMPTY(b))) {
- return(FALSE);
- }
- while(! (_LSLP_IS_HEAD(a->next))) {
- a = a->next;
- while(!(_LSLP_IS_HEAD(b->next))) {
- b = b->next;
- assert((a->scope != NULL) && (b->scope != NULL));
- if(! strcasecmp(a->scope, b->scope)) {
- return(TRUE);
- }
- }
- /* reset b */
- b = b->next;
- }
- return(FALSE);
-}
-
-/* caseless compare that folds whitespace */
-int lslp_string_compare(int8 *s1, int8 *s2)
-{
- assert(s1 != NULL);
- assert(s2 != NULL);
- lslp_foldString(s1);
- lslp_foldString(s2);
- if( TRUE == lslp_pattern_match(s1, s2, FALSE))
- return 0;
- return -1;
-}
-
-/* return 1 if char is legal for scope value, 0 otherwise */
-int lslp_isscope(int c)
-{
- int i;
- static int8 scope_reserved[] = { '(', ')', ',', 0x5c, '!', '<', '=', '>', '~', ';', '*', '+', 0x7f };
-
- if(! _LSLP_ISASCII(c))
- return 0;
-
- if(c < 0x20)
- return(0);
- for(i = 0; i < 13; i++) {
- if(c == scope_reserved[i])
- return(0);
- }
- return(1);
-}
-
-BOOL lslp_islegal_scope(int8 *s)
-{
- int8 *temp;
- assert(s != NULL);
- if(! strlen(s)) {
- return(FALSE);
- }
- temp = s;
- while(*temp != 0x00) {
- if(! lslp_isscope(*temp)) {
- return(FALSE);
- }
- temp++;
- }
- return(TRUE);
-}
-
-BOOL lslp_srvtype_match(const int8 *s, int8 *r)
-{
- int8 *sp;
- assert(s != NULL);
- assert(r != NULL);
- /* check to see if search is for an abstract service type */
- sp = (int8 *)r;
- while(*sp != 0x00) { sp++; }
- /* if this is a search for an abstract service type, use a wildcard */
- /* to collect all concrete registrations under this type */
- if(*(sp - 1) == ':') {*(sp - 1) = '*'; }
- /* check for a dangling semicolon and kill it */
- else if ( *(sp - 1) == ';') { *(sp - 1) = 0x00 ; }
-
- return(lslp_pattern_match(s, r, FALSE));
-}
-
-
-lslpScopeList *lslpAllocScope(void)
-{
- return((lslpScopeList *)calloc(1, sizeof(lslpScopeList)));
-}
-
-lslpScopeList *lslpAllocScopeList(void)
-{
- lslpScopeList *head;
- if (NULL != (head = lslpAllocScope()))
- {
- head->next = head->prev = head;
- head->isHead = TRUE;
- }
- return(head);
-}
-
-void lslpFreeScope(lslpScopeList *s)
-{
- assert(s != NULL);
- if (s->scope != NULL)
- free(s->scope);
- free(s);
-}
-
-void lslpFreeScopeList(lslpScopeList *head)
-{
- lslpScopeList *temp;
- assert(head != NULL);
- assert(_LSLP_IS_HEAD(head));
- while (! (_LSLP_IS_EMPTY(head)))
- {
- temp = head->next;
- _LSLP_UNLINK(temp);
- lslpFreeScope(temp);
- }
- lslpFreeScope(head);
- return;
-}
-
-
-
-lslpSrvRegList *lslpAllocSrvReg(void)
-{
- lslpSrvRegList *l;
- if (NULL != (l = (lslpSrvRegList *)calloc(1, sizeof(lslpSrvRegList)))) {
- if(NULL != (l->url = lslpAllocURL())) {
- if ( NULL != (l->scopeList = lslpAllocScopeList())) {
- if ( NULL != (l->attrList = lslpAllocAttrList())) {
- if (NULL != (l->authList = lslpAllocAuthList())) {
- return(l);
- }
- lslpFreeAttrList(l->attrList, TRUE);
- }
- lslpFreeScopeList(l->scopeList);
- }
- lslpFreeURL(l->url);
- }
- free(l);
- }
- return(NULL);
-}
-
-lslpSrvRegHead *lslpAllocSrvRegList(void)
-{
- lslpSrvRegHead *head;
- if (NULL != (head = (lslpSrvRegHead *)calloc(1, sizeof(lslpSrvRegHead)))) {
- head->next = head->prev = (struct lslp_srv_reg_instance *)head;
- head->isHead = TRUE;
- return(head);
- }
- return(NULL);
-}
-
-void lslpFreeSrvReg(lslpSrvRegList *s)
-{
- assert(s != NULL);
- if(s->url != NULL)
- lslpFreeURL(s->url);
- if (s->srvType != NULL)
- free(s->srvType);
- if (s->scopeList != NULL)
- lslpFreeScopeList(s->scopeList);
- if (s->attrList != NULL)
- lslpFreeAttrList(s->attrList, TRUE);
- if(s->authList != NULL)
- lslpFreeAuthList(s->authList);
- free(s);
-}
-
-void lslpFreeSrvRegList(lslpSrvRegHead *head)
-{
- lslpSrvRegList *temp;
- assert(head != NULL);
- assert(_LSLP_IS_HEAD(head));
- while (! (_LSLP_IS_EMPTY((struct lslp_srv_reg_instance *)head)))
- {
- temp = head->next;
- _LSLP_UNLINK(temp);
- lslpFreeSrvReg(temp);
- }
- free(head);
-}
-
-
-lslpAuthBlock *lslpAllocAuthBlock(void)
-{
- return((lslpAuthBlock *)calloc(1, sizeof(lslpAuthBlock)));
-}
-
-lslpAuthBlock *lslpAllocAuthList(void)
-{
- lslpAuthBlock *head;
- if (NULL != (head = lslpAllocAuthBlock()))
- {
- head->next = head->prev = head;
- head->isHead = TRUE;
- return(head);
- }
- return(NULL);
-}
-
-
-/* NOTE: be CERTAIN block is not linked to a list !!! */
-void lslpFreeAuthBlock(lslpAuthBlock *auth)
-{
- if (auth->spi != NULL)
- free(auth->spi);
- if (auth->block != NULL)
- free(auth->block);
- free(auth);
- return;
-}
-
-void lslpFreeAuthList(lslpAuthBlock *list)
-{
- lslpAuthBlock *temp;
-
- assert(list != NULL);
- assert(_LSLP_IS_HEAD(list));
- while(! (_LSLP_IS_EMPTY(list)))
- {
- temp = list->next;
- _LSLP_UNLINK(temp);
- lslpFreeAuthBlock(temp);
- }
- lslpFreeAuthBlock(list);
- return;
-}
-
-/* for protected scopes, we need to change this routine (or add another one) */
-/* that uses an SPI list as an input and stuffs only auth only stuffs auth blocks*/
-/* that match spis in the input list */
-
-/* this routine will return FALSE AND alter the buffer and length */
-BOOL lslpStuffAuthList(int8 **buf, int16 *len, lslpAuthBlock *list)
-{
- int8 *bptr;
- int16 numAuths = 0;
- lslpAuthBlock *auths;
- BOOL ccode = TRUE;
- assert(buf != NULL);
- assert(len != NULL);
- /* assert(list != NULL); */
- if (buf == NULL || *buf == NULL || len == NULL )
- return(FALSE);
- /* always return true on an empty list so we can continue to build the */
- /* msg buffer - an empty list is not an error! */
- bptr = *buf;
- _LSLP_SETBYTE(bptr, numAuths, 0);
-
- (*buf)+= 1;
- (*len) -= 1;
- if(list == NULL || _LSLP_IS_EMPTY(list))
- return(TRUE);
- /* auth list */
- auths = list->next;
- memset(*buf, 0x00, *len);
- while (! _LSLP_IS_HEAD(auths) && auths->len <= *len)
- {
- /* store the auth bsd */
- _LSLP_SETSHORT(*buf, auths->descriptor, 0);
- /* store the the bsd size */
- _LSLP_SETSHORT(*buf, auths->len, 2);
- /* store the timestamp */
- _LSLP_SETLONG(*buf, auths->timestamp, 4);
- /* store spi string length */
- _LSLP_SETSHORT(*buf, auths->spiLen, 8);
- assert(strlen(auths->spi) + 1 == auths->spiLen );
- /* store the spi string */
- strcpy((*buf) + 10, auths->spi);
- /* store the authentication block */
- if (auths->block != NULL && (auths->len - (auths->spiLen + 10) ) > 0 )
- memcpy(((*buf) + 10 + auths->spiLen), auths->block, (auths->len - (auths->spiLen + 10)));
- (*buf) += auths->len;
- (*len) -= auths->len;
- numAuths++;
- auths = auths->next;
- } /* while we are traversing the attr list */
- if (! _LSLP_IS_HEAD(auths))
- {
- /* we terminated the loop before copying all the auth blocks */
- ccode = FALSE;
- }
- else
- {
- _LSLP_SETBYTE(bptr, numAuths, 0);
- }
- return(ccode);
-}
-
-lslpAuthBlock *lslpUnstuffAuthList(int8 **buf, int16 *len, int16 *err)
-{
- int16 tempLen;
- lslpAuthBlock *list = NULL, *temp;
- assert(buf != NULL && *buf != NULL);
- assert(len != NULL);
- assert(err != NULL);
- *err = 0;
- tempLen = _LSLP_GETBYTE(*buf, 0); /* get the number of auth-blocks */
- (*buf) += 1; /* advance to the auth blocks */
- (*len) -= 1;
- if((tempLen == 0) || (NULL != (list = lslpAllocAuthList()))) {
- if(list != NULL) {
- while((tempLen > 0) && (*len > 10) && (*err == 0)) {
- if(NULL != (temp = lslpAllocAuthBlock())) {
- temp->descriptor = _LSLP_GETSHORT(*buf, 0); /* get the block structure descriptor */
- (*buf) += 2; /* advance to the block length */
- temp->len = _LSLP_GETSHORT(*buf, 0); /* get the block length */
- (*buf) += 2; /* advance to the timestamp */
- temp->timestamp = _LSLP_GETLONG(*buf, 0); /* get the timestamp */
- (*buf) += 4; /* advance to the spi length */
- temp->spiLen = _LSLP_GETSHORT(*buf, 0); /* get the spi length */
- (*buf) += 2; /* advance to the spi */
- *len -= 10;
- if(*len >= (temp->spiLen)) {
- if(NULL != (temp->spi = (uint8 *)calloc(temp->spiLen + 1, sizeof(uint8)))) {
- memcpy(temp->spi, *buf, temp->spiLen); /* copy the spi */
- (*buf) += temp->spiLen; /* advance to the next block */
- (*len) -= temp->spiLen;
- if(*len >= (temp->len - (10 + temp->spiLen))) {
- if (NULL != (temp->block =
- (uint8 *)calloc((temp->len - (10 + temp->spiLen)) + 1,
- sizeof(uint8)))) {
- memcpy(temp->block, *buf, (temp->len - (10 + temp->spiLen)) );
- _LSLP_INSERT(temp, list); /* insert the auth block into the list */
- (*buf) += (temp->len - (10 + temp->spiLen));
- (*len) -= (temp->len - (10 + temp->spiLen));
- temp = NULL;
- } else {*err = LSLP_INTERNAL_ERROR; } /* if we alloced the auth block buffer */
- } else { *err = LSLP_PARSE_ERROR;}
- } else { *err = LSLP_INTERNAL_ERROR ;}/* if we alloced the spi buffer */
- } else { *err = LSLP_PARSE_ERROR;}
- }else { *err = LSLP_INTERNAL_ERROR; } /* if we alloced the auth block */
- tempLen--; /* decrement the number of auth blocks */
- } /* while there is room and there are auth blocks to process */
- } else {
- if(tempLen == 0)
- *err = 0;
- else
- *err = LSLP_INTERNAL_ERROR ;
- }
- }
- if(*err != 0 && list != NULL) {
- lslpFreeAuthList(list);
- list = NULL;
- }
- return(list);
-}
-
-
-uint32 lslpCheckSum(int8 *s, int16 l)
-{
- uint32 c;
- BOOL pad = 0;
- uint16 a = 0, b = 0, *p;
- assert(s != NULL);
- if (l == 1)
- return(0);
- assert(l > 1);
- if (l & 0x01)
- pad = TRUE;
- p = (uint16 *)s;
- while (l > 1)
- {
- a += *p++;
- b += a;
- l -= 2;
- }
- /* "pad" the string with a zero word */
- if (pad == TRUE)
- b += a;
- /* return the value as a dword with containing two shorts in */
- /* network order -- ab */
- _LSLP_SETSHORT((uint8 *)&c, a, 0 );
- _LSLP_SETSHORT((uint8 *)&c, a, 2 );
- return(c);
-}
-
-
-lslpHdr * lslpAllocHdr(void)
-{
- return((lslpHdr *)calloc(1, sizeof(lslpHdr)));
-}
-
-void lslpFreeHdr(lslpHdr *hdr)
-{
- assert(hdr != NULL);
- if (hdr->data != NULL)
- free(hdr->data);
- free(hdr);
-}
-
-void lslpDestroySrvReq(struct lslp_srv_req *r, int8 flag)
-{
- assert(r != NULL);
- if (r->prList != NULL)
- free(r->prList);
- if (r->srvcType != NULL)
- free(r->srvcType);
- if (r->scopeList != NULL)
- lslpFreeScopeList(r->scopeList);
- if (r->predicate != NULL)
- free(r->predicate);
- if(r->spiList != NULL)
- lslpFreeSPIList(r->spiList);
- if (flag == LSLP_DESTRUCTOR_DYNAMIC)
- free(r);
-}
-
-void lslpDestroySrvRply(struct lslp_srv_rply *r, int8 flag)
-{
- assert(r != NULL);
- if (r->urlList != NULL)
- lslpFreeURLList(r->urlList);
- if(r->attr_list != NULL)
- lslpFreeAtomList(r->attr_list, LSLP_DESTRUCTOR_DYNAMIC);
- if (flag == LSLP_DESTRUCTOR_DYNAMIC)
- free(r);
-}
-
-void lslpDestroySrvReg(struct lslp_srv_reg *r, int8 flag)
-{
- assert(r != NULL);
- if (r->url != NULL)
- lslpFreeURLList(r->url);
- if (r->srvType != NULL)
- free(r->srvType);
- if (r->scopeList != NULL)
- lslpFreeScopeList(r->scopeList);
- if (r->attrList != NULL)
- lslpFreeAttrList(r->attrList, TRUE);
- if (r->attrAuthList != NULL)
- lslpFreeAuthList(r->attrAuthList);
- if (flag == LSLP_DESTRUCTOR_DYNAMIC)
- free(r);
-}
-
-void lslpDestroySrvAck(struct lslp_srv_ack *r, int8 flag)
-{
- assert(r != NULL);
- if (flag == LSLP_DESTRUCTOR_DYNAMIC)
- free(r);
-}
-
-void lslpDestroyDAAdvert(struct lslp_da_advert *r, int8 flag)
-{
- assert(r != NULL);
- if (r->url != NULL)
- free(r->url);
- if (r->scopeList != NULL)
- free(r->scopeList);
- if (r->attrList != NULL)
- free(r->attrList);
- if (r->spiList != NULL)
- free(r->spiList);
- if (r->authBlocks != NULL)
- lslpFreeAuthList(r->authBlocks);
- if (flag == LSLP_DESTRUCTOR_DYNAMIC)
- free(r);
-}
-
-void lslpDestroySAAdvert(struct lslp_sa_advert *r, int8 flag)
-{
- assert(r != NULL);
- if (r->url != NULL)
- free(r->url);
- if (r->scopeList != NULL)
- free(r->scopeList);
- if (r->attrList != NULL)
- free(r->attrList);
- if (r->authBlocks != NULL)
- lslpFreeAuthList(r->authBlocks);
- if (flag == LSLP_DESTRUCTOR_DYNAMIC)
- free(r);
-}
-
-void lslpDestroySrvTypeReq(struct lslp_srvtype_req *r, int8 flag)
-{
- assert(r != NULL);
- if (r->prList != NULL)
- free(r->prList);
- if (r->nameAuth != NULL)
- free(r->nameAuth);
- if (r->scopeList != NULL)
- lslpFreeScopeList(r->scopeList);
- if (flag == LSLP_DESTRUCTOR_DYNAMIC)
- free(r);
- return;
-}
-
-void lslpDestroySrvTypeReply(struct lslp_srvtype_rep *r, int8 flag)
-{
- assert(r != NULL);
- if (r->srvTypeList != NULL)
- free(r->srvTypeList);
- if (flag == LSLP_DESTRUCTOR_DYNAMIC)
- free(r);
- return;
-}
-
-void lslpDestroyAttrReq(struct lslp_attr_req *r, int8 flag)
-{
- assert(r != NULL);
- if (r->prList != NULL)
- free(r->prList);
- if (r->url != NULL)
- free(r->url);
- if (r->scopeList != NULL)
- free(r->scopeList);
- if (r->tagList != NULL)
- free(r->tagList);
- if (r->spiList != NULL)
- lslpFreeSPIList(r->spiList);
- if (flag == LSLP_DESTRUCTOR_DYNAMIC)
- free(r);
- return;
-}
-
-void lslpDestroyAttrReply(struct lslp_attr_rep *r, int8 flag)
-{
- assert(r != NULL);
- if (r->attrList != NULL)
- free(r->attrList);
- if (r->authBlocks != NULL)
- lslpFreeAuthList(r->authBlocks);
- if (flag == LSLP_DESTRUCTOR_DYNAMIC)
- free(r);
- return;
-
-}
-
-void lslpDestroySrvDeReg(struct lslp_srv_dereg *r, int8 flag)
-{
- assert(r != NULL);
- if (r->scopeList != NULL)
- free(r->scopeList);
- if (r->urlList != NULL)
- lslpFreeURLList(r->urlList);
- if (r->tagList != NULL)
- free(r->tagList);
- if (flag == LSLP_DESTRUCTOR_DYNAMIC)
- free(r);
- return;
-}
-
-
-lslpMsg *alloc_slp_msg(BOOL head)
-{
- lslpMsg *ret = (lslpMsg *)calloc(1, sizeof(lslpMsg));
- if(ret != NULL ) {
- ret->dynamic = LSLP_DESTRUCTOR_DYNAMIC;
- if( head == TRUE ){
- ret->next = ret->prev = ret;
- ret->isHead = TRUE;
- }
- }
- return ret;
-}
-
-
-void lslpDestroySLPMsg(lslpMsg *msg, int8 flag)
-{
- assert(msg != NULL);
- switch (msg->type)
- {
- case srvReq:
- lslpDestroySrvReq(&(msg->msg.srvReq), LSLP_DESTRUCTOR_STATIC);
- break;
- case srvRply:
- lslpDestroySrvRply(&(msg->msg.srvRply), LSLP_DESTRUCTOR_STATIC);
- break;
- case srvReg:
- lslpDestroySrvReg(&(msg->msg.srvReg), LSLP_DESTRUCTOR_STATIC);
- break;
- case srvAck:
- lslpDestroySrvAck(&(msg->msg.srvAck), LSLP_DESTRUCTOR_STATIC);
- break;
- case daAdvert:
- lslpDestroyDAAdvert(&(msg->msg.daAdvert), LSLP_DESTRUCTOR_STATIC);
- break;
- case saAdvert:
- lslpDestroySAAdvert(&(msg->msg.saAdvert), LSLP_DESTRUCTOR_STATIC);
- break;
- case srvTypeReq:
- lslpDestroySrvTypeReq(&(msg->msg.srvTypeReq), LSLP_DESTRUCTOR_STATIC);
- break;
- case srvTypeRep:
- lslpDestroySrvTypeReply(&(msg->msg.srvTypeRep), LSLP_DESTRUCTOR_STATIC);
- break;
- case attrReq:
- lslpDestroyAttrReq(&(msg->msg.attrReq), LSLP_DESTRUCTOR_STATIC);
- break;
- case attrRep:
- lslpDestroyAttrReply(&(msg->msg.attrRep), LSLP_DESTRUCTOR_STATIC);
- break;
- case srvDereg:
- lslpDestroySrvDeReg(&(msg->msg.srvDereg), LSLP_DESTRUCTOR_STATIC);
- break;
- default:
- break;
- }
- if (msg->dynamic == LSLP_DESTRUCTOR_DYNAMIC)
- free(msg);
- return;
-}
-
-/* a is an attribute list, while b is a string representation of an ldap filter */
-BOOL lslp_predicate_match(lslpAttrList *a, int8 *b)
-{
- BOOL ccode;
- lslpLDAPFilter *ftree;
- if(a == NULL)
- return FALSE;
- assert(_LSLP_IS_HEAD(a));
- if(b == NULL || ! strlen(b))
- return(TRUE); /* no predicate - aways tests TRUE */
- if(NULL != (ftree = _lslpDecodeLDAPFilter(b))) {
- ccode = lslpEvaluateFilterTree(ftree, a);
- lslpFreeFilterTree(ftree);
- return(ccode);
- }
- return(FALSE);
-}
-
-struct lslp_srv_rply_out *_lslpProcessSrvReq(struct slp_client *client,
- struct lslp_srv_req *msg,
- int16 errCode)
-{
- int8 *buf;
- int16 bufLen, avail;
- lslpSrvRegList *reg;
- int16 ext_offset;
- int8 *extptr, *next_extptr;
- BOOL pile_up_attrs = FALSE;
-
- struct lslp_srv_rply_out *temp_rply =
- (struct lslp_srv_rply_out *)calloc(1, sizeof(struct lslp_srv_rply_out));
- assert(msg != NULL);
- if(msg != NULL && temp_rply != NULL) {
- if((temp_rply->errCode = errCode) == 0) {
- buf = (int8 *)calloc(LSLP_MTU, sizeof(int8));
- if(buf != NULL) {
- bufLen = LSLP_MTU;
- temp_rply->urlList = buf;
- buf += 4;
- avail = LSLP_MTU - 4;
-
- /* check for the attr list extension */
- /* remember to subtract 5 bytes from the limit for each extension we traverse */
- if(msg->next_ext != NULL) {
- /* we are looking for extension ID 0x0002 */
- extptr = msg->next_ext;
- while(extptr && extptr < msg->ext_limit) {
- if( 0x0002 == _LSLP_GETSHORT(extptr, 0)) {
- /* make sure it doesn't overflow */
- if (extptr + 9 > msg->ext_limit) {
- break;
- }
- /* got our extension */
- /* do a sanity check offset five should be 0x0000, */
- /* offset 7 should be 0x0000*/
- if( (0x0000 == _LSLP_GETSHORT(extptr, 5)) &&
- (0x0000 == _LSLP_GETSHORT(extptr, 7)) ) {
- /* ok, accumulate attribute data */
- pile_up_attrs = TRUE;
- }
- break;
- }
- /* see if there are any more extensions */
- extptr += _LSLP_GET3BYTES(extptr, 2);
- } /* while traversing extensions */
- } /* if there is an extension */
-
-
- reg = client->regs.next;
- extptr = client->_scratch;
- next_extptr = extptr + 2;
- ext_offset = 0;
- while(! _LSLP_IS_HEAD(reg)) {
- if(time(NULL) > reg->directoryTime) {
- /* the lifetime for this registration has expired */
- /* unlink and free it */
- lslpSrvRegList *temp_reg = reg;
- reg = reg->next;
- _LSLP_UNLINK(temp_reg);
- lslpFreeSrvReg(temp_reg);
- continue;
- }
- if(TRUE == lslp_srvtype_match(reg->srvType, msg->srvcType)) {
- /* we need to check for the special case - of a srvreq with service type directory-agent */
- /* - it is allowed to omit scopes */
- if((msg->scopeList == NULL) ||
- (_LSLP_IS_EMPTY(msg->scopeList) && (! strncasecmp(msg->srvcType, DA_SRVTYPE, DA_SRVTYPELEN ))) ||
- (TRUE == lslp_scope_intersection(reg->scopeList, msg->scopeList))) {
- if(TRUE == lslp_predicate_match(reg->attrList, msg->predicate)) {
- /* we have a match */
- /* for protected scopes, we need to change stuff URL so that it */
- /* only stuffs url auth blocks that match spis in the srv req */
- if(TRUE == lslpStuffURL(&buf, &avail, reg->url)) {
- if(TRUE == pile_up_attrs && ((reg->url->len + ext_offset + 2) < LSLP_MTU)) {
- /* use the scratch buffer as temporary storage for the attribute extensions */
- /* go back and set the length of the next extension in prev extension */
- _LSLP_SET3BYTES(next_extptr, ext_offset, 0);
- next_extptr = extptr + 2;
- /* set the extension id */
- _LSLP_SETSHORT(extptr, 0x0002, 0);
- /* init the next ext to zero */
- _LSLP_SET3BYTES(next_extptr, 0x00000000, 0);
- /* length of url string */
- _LSLP_SETSHORT(extptr, reg->url->len, 5);
- memcpy(extptr + 7, reg->url->url, reg->url->len);
- ext_offset += (7 + reg->url->len);
- extptr += (7 + reg->url->len);
- /* attr list length */
- if( ext_offset + 2 + reg->attrList->attr_string_len < LSLP_MTU) {
- _LSLP_SETSHORT(extptr, reg->attrList->attr_string_len, 0);
- memcpy(extptr + 2, reg->attrList->attr_string, reg->attrList->attr_string_len);
- ext_offset += (2 + reg->attrList->attr_string_len);
- extptr += (2 + reg->attrList->attr_string_len);
- if( ext_offset + 1 < LSLP_MTU) {
- /* set the number of attr auths to zero */
-//jeb attrib set to 1?? _LSLP_SETBYTE(extptr, 1, 0);
- _LSLP_SETBYTE(extptr, 0, 0);
- extptr += 1;
- ext_offset += 1;
- } else { pile_up_attrs = FALSE; _LSLP_SETSHORT(client->_scratch, 0x0000, 0);}
- } else { pile_up_attrs = FALSE; _LSLP_SETSHORT(client->_scratch, 0x0000, 0);}
- } else { pile_up_attrs = FALSE; _LSLP_SETSHORT(client->_scratch, 0x0000, 0);}
- temp_rply->urlCount++;
- }else {
- temp_rply->errCode = LSLP_INTERNAL_ERROR;
- return(temp_rply);
- }
- } /* if we have a match */
- } /* if we found a scope intersection */
- } /* if the types match */
- reg = reg->next;
- } /* while we are traversing the reg list for this da */
- /* stuff the error code and url count */
- _LSLP_SETSHORT(temp_rply->urlList, temp_rply->errCode, 0);
- _LSLP_SETSHORT(temp_rply->urlList, temp_rply->urlCount, 2);
- /* resize to the actual size needed */
- temp_rply->urlLen = (uint16)(buf - temp_rply->urlList) ;
- } /* if we alloced our buffer */
- } /* if we need to look for matches */
- else {
- if(NULL != (temp_rply->urlList = (int8 *)calloc(8, sizeof(int8)))) { //jeb
- _LSLP_SETSHORT(temp_rply->urlList, temp_rply->errCode, 0);
- }
- } /* error reply */
- if(temp_rply->urlList == NULL) {
- free(temp_rply);
- temp_rply = NULL;
- }
- } /* if we alloced our reply structure */
- return(temp_rply);
-}
-
-
-#define lslp_to_lower(c) (((c) > 0x40 && (c) < 0x5b) ? ((c) + 0x20) : (c))
-/* based upon TclStringCaseMatch */
-#define MAX_RECURSION 10
-BOOL lslp_pattern_match(const int8 *string, const int8 *pattern, BOOL case_sensitive)
-{
-
- int8 s, p;
- static int recursion_level;
- if(recursion_level == MAX_RECURSION) {
- return FALSE;
- }
- recursion_level++;
-
- assert(string != NULL && pattern != NULL);
-
- while(1) {
- p = *pattern;
- if( p == '\0' ) {
- recursion_level--;
- if (*string == '\0') //jeb
- return TRUE;
- else
- return FALSE;
-//jeb return (*string == '\0');
- }
-
- if((*string == '\0') && (p != '*')) {
- recursion_level--;
- return FALSE;
- }
-
- if(p == '*') {
- while(*(++pattern) == '*') { ; }
- p = *pattern;
- if( p == '\0') {
- recursion_level--;
- return TRUE;
- }
- while(1) {
- if((p != '[') && (p != '?') && (p != '\\')) {
- /* advance the string until there is a match */
- while(*string) {
- s = *string;
- if(case_sensitive == FALSE) {
- p = lslp_to_lower(p);
- s = lslp_to_lower(s);
- }
- if(s == p)
- break;
- string++;
- }
- }
- if(TRUE == lslp_pattern_match(string, pattern, case_sensitive)) {
- recursion_level--;
- return TRUE;
- }
- if(*string == '\0') {
- recursion_level--;
- return FALSE;
- }
- string++;
- }
- }
- if(p == '?') {
- pattern++;
- string++;
- continue;
- }
-
- if(p == '[') {
- int8 start, end;
- pattern++;
- s = *(string++);
- if(case_sensitive == FALSE) {
- s = lslp_to_lower(s);
- }
- while(1) {
- if(*pattern == ']' || *pattern == '\0') {
- recursion_level--;
- return FALSE ;
- }
- start = *(pattern++);
- if(case_sensitive == FALSE){
- start = lslp_to_lower(start);
- }
- if(*pattern == '-') {
- pattern++;
- if(*pattern == '\0') {
- recursion_level--;
- return FALSE;
- }
- end = *(pattern++);
- if(case_sensitive == FALSE) {
- end = lslp_to_lower(end);
- }
- if(((start <= s) && (s <= end )) || ((end <= s) && (s <= start))) {
- break;
- }
- } else if (start == s) {
-
- break;
- }
- }
- while(*pattern != ']') {
- if(*pattern == '\0') {
- pattern--;
- break;
- }
- pattern++;
- }
- pattern++;
- continue;
- }
-
- if (p == '\\') {
- pattern++;
- if (*pattern == '\0') {
- recursion_level--;
- return FALSE;
-//jeb return 0;
- }
- }
- s = *(string++);
- p = *(pattern++);
- if(case_sensitive == FALSE) {
- p = lslp_to_lower(p);
- s = lslp_to_lower(s);
- }
- if(s == p) {
- continue;
- }
- recursion_level--;
- return FALSE;
- }
-}
-
-
-int8 * lslp_get_next_ext(int8 *hdr_buf)
-{
- int32 len;
- assert(hdr_buf != NULL);
- if( 0 != _LSLP_GETNEXTEXT(hdr_buf)) {
- len = _LSLP_GETLENGTH(hdr_buf);
- if(len > _LSLP_GETNEXTEXT(hdr_buf)) {
- return( hdr_buf + _LSLP_GETNEXTEXT(hdr_buf));
- }
- }
- return NULL;
-}
-
-
-/** uses a newline as the field separator, two consecutive newlines as the record separator **/
-void lslp_print_srv_rply(lslpMsg *srvrply)
-{
- lslpURL *url_list;
- if(srvrply != NULL && srvrply->type == srvRply) {
- /* output errCode, urlCount, urlLen */
- printf("%d\n%d\n%d\n", srvrply->msg.srvRply.errCode,
- srvrply->msg.srvRply.urlCount,
- srvrply->msg.srvRply.urlLen );
- if((NULL != srvrply->msg.srvRply.urlList) &&
- (! _LSLP_IS_EMPTY( srvrply->msg.srvRply.urlList))) {
-
- url_list = srvrply->msg.srvRply.urlList->next;
- while( ! _LSLP_IS_HEAD(url_list)){
-
- if(NULL != url_list->url)
- printf("URL: %s\n", url_list->url);
- else
- printf("URL: \n");
-
- /* see if there are attributes to print */
- if(NULL != url_list->attrs && ! _LSLP_IS_HEAD(url_list->attrs->next)){
- lslpAtomList *attrs = url_list->attrs->next;
- while(! _LSLP_IS_HEAD(attrs)){
- printf("ATTR: %s\n", attrs->str);
- attrs = attrs->next;
- } /* while traversing attr list */
- } /* if attr list */
- url_list = url_list->next;
-
- } /* while traversing url list */
- } /* if there are urls to print */
- /* print the record separator */
- printf("\n\n");
- }
-}
-
-/* string must not be null and must start with "service:" */
-SLP_STORAGE_DECL BOOL test_service_type(int8 *type)
-{
- int8 * temp;
- BOOL ccode;
- temp = strdup(type);
- if(type == NULL || ! strlen(type))
- return FALSE;
- if(temp == NULL) abort();
- ccode = lslp_pattern_match( "service:*", temp, FALSE);
- free(temp);
- return ccode;
-}
-
-
-SLP_STORAGE_DECL BOOL test_service_type_reg(int8 *type)
-{
- int8 * temp;
- BOOL ccode;
-
- if(type == NULL || ! strlen(type))
- return FALSE;
- temp = strdup(type);
- if(temp == NULL) abort();
- ccode = lslp_pattern_match(temp, "service:*", FALSE);
- free(temp);
- return ccode;
-}
-
-
-SLP_STORAGE_DECL BOOL test_url(int8 *url)
-{
-
- int8 *temp;
- lslpAtomizedURL *aurl;
-
- if(url == NULL)
- return FALSE;
- temp = strdup(url);
- if(temp == NULL) abort();
- aurl = _lslpDecodeURLs(&temp, 1);
- free(temp);
- if(aurl != NULL){
- lslpFreeAtomizedURLList(aurl, TRUE);
- return TRUE;
- }
- return FALSE;
-}
-
-SLP_STORAGE_DECL BOOL test_attribute(int8 *attr)
-{
- int8 *temp;
- lslpAttrList *attr_list;
-
- if(attr == NULL)
- return FALSE;
- if(! strlen(attr))
- return TRUE;
-
- temp = strdup(attr);
- if(temp == NULL) abort();
-
- attr_list = _lslpDecodeAttrString(temp);
- free(temp);
-
- if(attr_list != NULL){
- lslpFreeAttrList(attr_list, TRUE);
- return TRUE;
- }
- return FALSE;
-
-}
-
-SLP_STORAGE_DECL BOOL test_scopes(int8 *scopes)
-{
- BOOL ccode;
- int8 *temp;
-
- if(scopes == 0 ){
- return FALSE;
- }
-
- if(! strlen(scopes))
- return TRUE;
-
- temp = strdup(scopes);
- if(temp == 0 ) abort();
- ccode = lslp_islegal_scope(temp);
- free(temp);
-
-
- return ccode;
-}
-
-SLP_STORAGE_DECL BOOL test_predicate(int8 *predicate)
-{
- int8 * temp;
- lslpLDAPFilter *filter;
-
- if(predicate == 0)
- return FALSE;
- if(! strlen(predicate))
- return TRUE;
-
- temp = strdup(predicate);
- if(temp == 0) abort();
- filter = _lslpDecodeLDAPFilter(temp);
- free(temp);
- if(filter != NULL) {
- lslpFreeFilter(filter);
- return TRUE;
- }
- return FALSE;
-}
-
-
-SLP_STORAGE_DECL uint32 test_srv_reg(int8 *type,
- int8 *url,
- int8 *attr,
- int8 *scopes)
-{
-
- /* it is legal for the scope string and attribute list to be empty */
- if(type == NULL || 0 == strlen(type) || FALSE == test_service_type_reg(type))
- return 1;
- if(url == NULL || 0 == strlen(url) || FALSE == test_url(url) )
- return 2;
- if(attr != NULL && FALSE == test_attribute(attr))
- return 3;
- if(scopes != NULL && FALSE == test_scopes(scopes))
- return 4;
- return 0;
-}
-
-
-
-SLP_STORAGE_DECL uint32 test_query(int8 *type,
- int8 *predicate,
- int8 *scopes)
-{
- /* it is legal for predicate and scopes to be empty */
-
- if(type == NULL || 0 == strlen(type) || FALSE == test_service_type(type))
- return 1;
-
- if(predicate != NULL && FALSE == test_predicate(predicate))
- return 2;
-
- if(scopes != NULL && FALSE == test_scopes(scopes))
- return 3;
-
- return 0;
-}
-
-
-
+++ /dev/null
-//%2005////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation, The Open Group.
-// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-// EMC Corporation; VERITAS Software Corporation; The Open Group.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//==============================================================================
-/*****************************************************************************
- * Description:
- *
- * Originated: December 20, 2001
- * Original Author: Mike Day md@soft-hackle.net
- * mdday@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/slp_client/Attic/slp_client.h,v 1.7 2005/02/05 23:01:30 karl Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-#ifndef SLP_CLIENT_INC
-#define SLP_CLIENT_INC
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef NUCLEUS
-#include "../lslp-common-defs.h"
-#include "../lslp.h"
-#endif
-
-#define DA_SRVTYPE "service:directory-agent"
-#define DA_SRVTYPELEN 23
-#define DA_SCOPE "DEFAULT"
-#define DA_SCOPELEN 7
-
-#define SA_SRVTYPE "service:service-agent"
-#define SA_SRVTYPELEN 21
-#define SA_SCOPE "DEFAULT"
-#define SA_SCOPELEN 7
-
-#define TYPE_UNKKNOWN 0
-#define TYPE_DA_LIST 1
-#define TYPE_RPLY_LIST 2
-//#define LSLP_MTU ETHERNT_MTU //jeb
-#undef LSLP_WAIT_OK
-#define LSLP_WAIT_OK 0
-
-#define slp_safe_free(a) if(a != NULL) {free(a);}
-
-#ifdef SLP_LIB_IMPORT
-#define SLP_STORAGE_DECL DLL_IMPORT
-#else
-#define SLP_STORAGE_DECL DLL_EXPORT
-#endif
-
-
-
- typedef struct lslp_auth_block {
- struct lslp_auth_block *next;
- struct lslp_auth_block *prev;
- BOOL isHead;
- uint16 descriptor;
- uint16 len;
- time_t timestamp;
- uint16 spiLen;
- int8 *spi;
- int8 *block;
- }lslpAuthBlock;
-
-
- typedef struct lslp_atom_list {
- struct lslp_atom_list *next;
- struct lslp_atom_list *prev;
- BOOL isHead;
- int8 *str;
- uint32 hash;
- }lslpAtomList;
-
- typedef struct lslp_atomized_url {
- struct lslp_atomized_url *next;
- struct lslp_atomized_url *prev;
- BOOL isHead;
- int8 *url;
- uint32 urlHash;
- lslpAtomList srvcs;
- lslpAtomList site;
- lslpAtomList path;
- lslpAtomList attrs;
- }lslpAtomizedURL;
-
-
- typedef struct lslp_url_entry {
- struct lslp_url_entry *next;
- struct lslp_url_entry *prev;
- BOOL isHead;
- time_t lifetime;
- uint16 len;
- int8 *url;
- uint8 auths;
- lslpAuthBlock *authBlocks;
- lslpAtomizedURL *atomized;
- lslpAtomList *attrs;
-
- }lslpURL ;
-
- typedef struct lslp_ext {
- uint16 id;
- uint32 nextOffset;
- void *data;
- }lslpExt;
-
- enum attrTypes {
- head = -1,
- string,
- integer,
- bool_type,
- opaque,
- tag
- }lslpTypes;
-
- /* opaque vals should always have the first four bytes */
- /* contain the length of the value */
- typedef union lslp_attr_value {
- int8 *stringVal;
- uint32 intVal;
- int32 boolVal;
- void *opaqueVal;
- }lslpAttrVal;
-
- typedef struct lslp_attr_list {
- struct lslp_attr_list *next;
- struct lslp_attr_list *prev;
- BOOL isHead;
- int16 attr_string_len;
- int8 *attr_string;
- int8 *name;
- int8 type;
- int32 attr_len;
- lslpAttrVal val;
- }lslpAttrList;
-
- enum ldap_operator_types{
- ldap_and = 259, /* to match token values assigned in y_filter.h */
- ldap_or,
- ldap_not,
- expr_eq,
- expr_gt,
- expr_lt,
- expr_present,
- expr_approx
- } ;
-
- struct ldap_filter_struct ;
- typedef struct ldap_filter_struct_head {
- struct ldap_filter_struct_head *next;
- struct ldap_filter_struct_head *prev;
- BOOL isHead;
- int _operator;
- } filterHead;
-
- typedef struct ldap_filter_struct {
- struct ldap_filter_struct *next;
- struct ldap_filter_struct *prev;
- BOOL isHead;
- int _operator;
- int nestingLevel;
- BOOL logical_value;
- filterHead children ;
- lslpAttrList attrs;
- } lslpLDAPFilter ;
-
- typedef struct lslp_scope_list {
- struct lslp_scope_list *next;
- struct lslp_scope_list *prev;
- BOOL isHead;
- BOOL isProtected;
- int8 *scope;
- }lslpScopeList;
-
- typedef lslpScopeList lslpSPIList;
-
- typedef struct lslp_srv_reg_instance {
- struct lslp_srv_reg_instance *next;
- struct lslp_srv_reg_instance *prev;
- BOOL isHead;
- lslpURL *url; /* includes url auth block */
- int8 *srvType;
- lslpScopeList *scopeList;
- lslpAttrList *attrList;
- lslpAuthBlock *authList; /* signature(s) for attribute list */
- time_t directoryTime;
- }lslpSrvRegList;
-
- typedef struct lslp_srv_reg_head {
- struct lslp_srv_reg_instance *next;
- struct lslp_srv_reg_instance *prev;
- BOOL isHead;
- }lslpSrvRegHead; /* holds the auth blocks for all attrs in the list */
-
-
-
-
-
- /******** internal slp message definitions ********/
-
- /* URL entry definitions */
-#define LSLP_URL_LIFE 1
-#define LSLP_URL_LEN 3
-#define _LSLP_GETURLLIFE(h) _LSLP_GETSHORT((h), LSLP_URL_LIFE)
-#define _LSLP_SETURLLIFE(h, i) _LSLP_SETSHORT((h), (i), LSLP_URL_LIFE)
-#define _LSLP_GETURLLEN(h) _LSLP_GETSHORT((h), LSLP_URL_LEN)
-#define _LSLP_SETURLLEN(h, i) _LSLP_SETSHORT((h), (i), LSLP_URL_LEN)
-
-/* 0 1 2 3 */
-/* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Service Location header (function = SrvRqst = 1) | */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | length of <PRList> | <PRList> String \ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | length of <service-type> | <service-type> String \ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | length of <scope-list> | <scope-list> String \ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | length of predicate string | Service Request <predicate> \ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | length of <SLP SPI> string | <SLP SPI> String \ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-
- /* ----- service request ------ */
- struct lslp_srv_req {
- uint16 prListLen;
- int8 *prList;
- uint16 srvcTypeLen;
- int8 *srvcType;
- lslpScopeList *scopeList;
- uint16 predicateLen;
- int8 *predicate;
- lslpSPIList *spiList;
- int8 *next_ext;
- int8 *ext_limit;
- };
-
- /* ----- service reply ------ */
- struct lslp_srv_rply {
- uint16 errCode;
- uint16 urlCount;
- uint16 urlLen;
- lslpURL *urlList;
- lslpAtomList *attr_list;
- };
-
-
-/* SLP messages all begin with the following header: */
-
-/* 0 1 2 3 */
-/* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Version | Function-ID | Length | */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Length, contd.|O|F|R| reserved |Next Ext Offset| */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Next Extension Offset, contd.| XID | */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Language Tag Length | Language Tag \ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-
-/* 4.3. URL Entries */
-
-/* 0 1 2 3 */
-/* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Reserved | Lifetime | URL Length | */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* |URL len, contd.| URL (variable length) \ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* |# of URL auths | Auth. blocks (if any) \ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-
-
-
-/* 8.2. Service Reply */
-
-/* 0 1 2 3 */
-/* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Service Location header (function = SrvRply = 2) | */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Error Code | URL Entry count | */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | <URL Entry 1> ... <URL Entry N> \ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-
- struct lslp_srv_rply_out
- {
- uint16 errCode;
- uint16 urlCount;
- uint16 urlLen;
- int8 *urlList;
- };
-
-
-/* The format of the Attribute List Extension is as follows: */
-
-/* 0 1 2 3 */
-/* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Extension ID = 0x0002 | Next Extension Offset | */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Offset, contd.| Service URL Length | Service URL / */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Attribute List Length | Attribute List / */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* |# of AttrAuths |(if present) Attribute Authentication Blocks.../ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-
-
-/* 0 1 2 3 */
-/* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | Service Location header (function = SrvReg = 3) | */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | <URL-Entry> \ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | length of service type string | <service-type> \ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | length of <scope-list> | <scope-list> \ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* | length of attr-list string | <attr-list> \ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-/* |# of AttrAuths |(if present) Attribute Authentication Blocks...\ */
-/* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-
-
- /* ----- service registration ------ */
- struct lslp_srv_reg {
- lslpURL *url; /* includes url auth block */
- uint16 srvTypeLen;
- int8 *srvType;
- lslpScopeList *scopeList;
- lslpAttrList *attrList;
- lslpAuthBlock *attrAuthList;
- };
-
- /* ----- service acknowledgement ----- */
- struct lslp_srv_ack {
- uint16 errCode;
- };
-
- /* ----- da advertisement ----- */
- struct lslp_da_advert {
- uint16 errCode;
- uint32 statelessBootTimestamp;
- uint16 urlLen;
- int8 *url; /* not a url-entry - merely a url string */
- uint16 scopeListLen;
- int8 *scopeList;
- uint16 attrListLen;
- int8 *attrList;
- uint16 spiListLen;
- int8 *spiList; /* comma separated values - see 6.4.1*/
- uint8 auths;
- lslpAuthBlock *authBlocks;
- };
-
- /* -----sa advertisement ----- */
-
- struct lslp_sa_advert {
- uint16 urlLen;
- int8 *url; /* not a url-entry - merely a url string */
- uint16 scopeListLen;
- int8 *scopeList;
- uint16 attrListLen;
- int8 *attrList;
- uint8 auths;
- lslpAuthBlock *authBlocks;
- };
-
- /* ----- srv type request ----- */
-
- struct lslp_srvtype_req {
- uint16 prListLen;
- int8 *prList;
- uint16 nameAuthLen;
- int8 *nameAuth;
- lslpScopeList *scopeList;
- };
-
- /* ----- srv type reply ----- */
- struct lslp_srvtype_rep {
- uint16 errCode;
- uint16 srvTypeListLen;
- int8 *srvTypeList; /* see 4.1 for srvtype-string; this is a string-list */
- };
-
- /* ----- attr request ----- */
- struct lslp_attr_req {
- uint16 prListLen;
- int8 *prList;
- uint16 urlLen;
- int8 *url; /* not a url-entry - merely a url string */
- lslpScopeList *scopeList;
- uint16 tagListLen;
- int8 *tagList;
- lslpSPIList *spiList;
- };
-
- /* ----- attr reply ----- */
- struct lslp_attr_rep {
- uint16 errCode;
- uint16 attrListLen;
- int8 *attrList;
- uint8 auths;
- lslpAuthBlock *authBlocks;
- };
-
- /* ----- srv deregistration ----- */
- struct lslp_srv_dereg {
- uint16 scopeListLen;
- int8 *scopeList;
- lslpURL *urlList;
- uint16 tagListLen;
- int8 *tagList;
- };
-
- /* general internal representation of all slp msgs */
- union lslp_msg_u{
- struct lslp_srv_req srvReq;
- struct lslp_srv_rply srvRply;
- struct lslp_srv_reg srvReg;
- struct lslp_srv_ack srvAck;
- struct lslp_da_advert daAdvert;
- struct lslp_sa_advert saAdvert;
- struct lslp_srvtype_req srvTypeReq;
- struct lslp_srvtype_rep srvTypeRep;
- struct lslp_attr_req attrReq;
- struct lslp_attr_rep attrRep;
- struct lslp_srv_dereg srvDereg;
- };
-
- enum msg_types {
- srvReq = 1,
- srvRply,
- srvReg,
- srvDereg,
- srvAck,
- attrReq,
- attrRep,
- daAdvert,
- srvTypeReq,
- srvTypeRep,
- saAdvert
- };
-
- typedef enum msg_types msgTypes;
-
- typedef struct lslp_hdr{
- uint8 ver;
- uint8 msgid;
- uint32 len;
- uint16 flags;
- uint32 nextExt;
- uint16 xid;
- uint32 errCode;
- uint16 langLen;
- uint8 lang[19];
- void *data;
- }lslpHdr;
-
- typedef struct lslp_msg {
- struct lslp_msg *next;
- struct lslp_msg *prev;
- BOOL isHead;
- msgTypes type;
- lslpHdr hdr;
- int8 dynamic;
- union lslp_msg_u msg;
- }lslpMsg;
-
- struct da_list
- {
- struct da_list *next;
- struct da_list *prev;
- BOOL isHead;
-
-
- int8 function;
- uint16 err;
- uint32 stateless_boot;
- int8 *url;
- int8 *scope;
- int8 *attr;
- int8 *spi;
- int8 auth_blocks;
- int8 *auth;
- int8 remote[16];
- } ;
-
- struct rply_list
- {
- struct rply_list *next;
- struct rply_list *prev;
- BOOL isHead;
-
- int8 function;
- uint16 err;
- uint16 lifetime;
- int8 *url;
- int8 auth_blocks;
- int8 *auth;
- int8 remote[16];
- } ;
-
- struct reg_list
- {
- struct reg_list *next;
- struct reg_list *prev;
- BOOL isHead;
-
- int8 *url;
- int8 *attributes;
- int8 *service_type;
- int8 *scopes;
- time_t lifetime;
- } ;
-
- struct url_entry
- {
- struct url_entry *next;
- struct url_entry *prev;
- BOOL isHead;
-
- uint16 lifetime;
- int16 len;
- int8 *url;
- uint8 num_auths;
- int8 *auth_blocks;
- };
-
- struct slp_client
- {
- uint16 _pr_buf_len;
- uint16 _buf_len;
- int8 _version;
- uint16 _xid;
- uint16 _target_port;
- uint32 _target_addr;
- uint32 _local_addr;
- uint32 *_local_addr_list;
- uint32 _msg_counts[12];
- lslpSPIList *_spi;
- lslpScopeList *_scopes;
- int8 _pr_buf[LSLP_MTU];
- int8 _msg_buf[LSLP_MTU];
- int8 _rcv_buf[LSLP_MTU];
- int8 _scratch[LSLP_MTU];
- int8 _err_buf[255];
-
- BOOL _use_das;
- uint16 _da_target_port;
- uint32 _da_target_addr;
-
- time_t _last_da_cycle;
- struct timeval _tv;
- int _retries;
- int _ttl;
- int _convergence;
- void *_crypto_context;
- SOCKETD _rcv_sock; //jeb
-#ifdef _WIN32
- int _winsock_count ;
- WSADATA _wsa_data;
-#endif
- struct da_list das;
- lslpMsg replies;
- lslpSrvRegHead regs;
- lslpMsg *(*get_response) (struct slp_client *,
- lslpMsg *);
- int (*find_das)(struct slp_client *,
- const int8 *,
- const int8 *);
- void (*discovery_cycle) (struct slp_client *,
- const int8 *,
- const int8 *,
- const int8 *);
- void (*converge_srv_req)(struct slp_client *,
- const int8 *,
- const int8 *,
- const int8 *);
- void (*unicast_srv_req)(struct slp_client *,
- const int8 *,
- const int8 *,
- const int8 *,
- SOCKADDR_IN *);
- void (*local_srv_req)(struct slp_client *,
- const int8 *,
- const int8 *,
- const int8 *);
- void (*srv_req)( struct slp_client *,
- const int8 *,
- const int8 *,
- const int8 *,
- BOOL);
- BOOL (*srv_reg)(struct slp_client *,
- const int8 *,
- const int8 *,
- const int8 *,
- const int8 *,
- int16 );
- int (*srv_reg_all)(struct slp_client *,
- const int8 *,
- const int8 *,
- const int8 *,
- const int8 *,
- int16 lifetime );
- int (*srv_reg_local) (struct slp_client *,
- const int8 *,
- const int8 *,
- const int8 *,
- const int8 *,
- uint16 lifetime ); //jeb int16 to uint16
-
- int32 (*service_listener)( struct slp_client *,
- SOCKETD, lslpMsg * ) ; //jeb
-
- void (*prepare_pr_buf)(struct slp_client *,
- const int8 *);
- BOOL (*prepare_query)( struct slp_client *,
- uint16,
- const int8 *,
- const int8 *,
- const int8 *);
- void (*decode_msg)( struct slp_client *client,
- SOCKADDR_IN *remote );
- void (*decode_srvreq)(struct slp_client *,
- SOCKADDR_IN *);
- void (*decode_srvrply)(struct slp_client *,
- SOCKADDR_IN *);
- void (*decode_daadvert)( struct slp_client *,
- SOCKADDR_IN *);
- BOOL (*send_rcv_udp)(struct slp_client *) ;
- int32 (*service_listener_wait)(struct slp_client *,
- time_t,
- SOCKETD extra,
- BOOL,
- lslpMsg *) ;
- BOOL (*slp_previous_responder)(struct slp_client *,
- int8 *);
-
- };
-
-
- /*----------------------------- prototypes -----------------------------------*/
-
-#define LSLP_DESTRUCTOR_DYNAMIC 1
-#define LSLP_DESTRUCTOR_STATIC 0
-struct da_list *alloc_da_node(BOOL head);
-struct da_list *da_node_exists(struct da_list *head, const void *key);
-void free_da_list_members(struct da_list *da);
-void free_da_list_node(struct da_list *da);
-void free_da_list(struct da_list *list);
-struct rply_list *alloc_rply_list(BOOL head);
-struct rply_list *rpl_node_exists(struct rply_list *head, const void *key);
-void free_rply_list_members(struct rply_list *rply);
-void free_rply_list_node(struct rply_list *rply);
-void free_rply_list(struct rply_list *list);
-struct reg_list *alloc_reg_list(BOOL head);
-struct reg_list *reg_node_exists(struct reg_list *head, const void *key);
-void free_reg_list_members(struct reg_list *reg);
-void free_reg_list_node(struct reg_list *reg);
-void free_reg_list(struct reg_list *list);
-struct url_entry *alloc_url_entry(BOOL head);
-struct url_entry *url_node_exists(struct url_entry *head, const void *key);
-void free_url_entry_members(struct url_entry *url);
-void free_url_node(struct url_entry *node);
-void free_url_list(struct url_entry *list);
-char *slp_get_host_name( char *buf, int buf_size );
-#if defined( _WIN32 )
- int gethostbyname_r(const char *name,
- struct hostent *resultbuf,
- char *buf,
- size_t bufsize,
- struct hostent **result,
- int *errnop) ;
-#endif
-
-
-#if defined( _NUCLEUS )
-
- int gethostbyname_r(const char *name,
- struct hostent *resultbuf,
- char *buf,
- size_t bufsize,
- struct hostent **result,
- int *errnop) ;
-#endif
- char *slp_get_addr_string_from_url(const char *url, char *addr, int addr_len) ;
- char *slp_get_host_string_from_url(const char *url, char *host, int host_len) ;
- BOOL get_addr_from_url(const int8 *url, SOCKADDR_IN *addr, int8 **host);
- int slp_get_local_interfaces(uint32 **list);
- BOOL slp_join_multicast(SOCKETD sock, uint32 addr) ; //jeb
- int slp_join_multicast_all(SOCKETD sock); //jeb
- SOCKETD slp_open_listen_sock( void ); //jeb
- void make_srv_ack(struct slp_client *client, SOCKADDR_IN *remote, int8 response, int16 code );
- void prepare_pr_buf(struct slp_client *client, const int8 *address);
- BOOL prepare_query( struct slp_client *client,
- uint16 xid,
- const int8 *service_type,
- const int8 *scopes,
- const int8 *predicate) ;
- lslpMsg *get_response( struct slp_client *client , lslpMsg *head);
- int find_das(struct slp_client *client,
- const int8 *predicate,
- const int8 *scopes);
- void discovery_cycle ( struct slp_client *client,
- const int8 *type,
- const int8 *predicate,
- const int8 *scopes) ;
-
- void converge_srv_req(struct slp_client *client,
- const int8 *type,
- const int8 *predicate,
- const int8 *scopes);
- void unicast_srv_req( struct slp_client *client,
- const int8 *type,
- const int8 *predicate,
- const int8 *scopes,
- SOCKADDR_IN *addr );
- void local_srv_req( struct slp_client *client,
- const int8 *type,
- const int8 *predicate,
- const int8 *scopes );
- void srv_req( struct slp_client *client,
- const int8 *type,
- const int8 *predicate,
- const int8 *scopes,
- BOOL retry );
- void decode_srvreg(struct slp_client *client, SOCKADDR_IN *remote);
-
- void decode_msg( struct slp_client *client,
- SOCKADDR_IN *remote );
- void decode_srvrply( struct slp_client *client,
- SOCKADDR_IN *remote );
- void decode_daadvert(struct slp_client *client,
- SOCKADDR_IN *remote);
- void decode_srvreq(struct slp_client *client,
- SOCKADDR_IN *remote );
- BOOL srv_reg(struct slp_client *client,
- const int8 *url,
- const int8 *attributes,
- const int8 *service_type,
- const int8 *scopes,
- int16 lifetime) ;
- BOOL send_rcv_udp( struct slp_client *client );
-
- int32 __service_listener_wait(struct slp_client *client,
- time_t wait,
- SOCKETD extra_sock, //jeb
- BOOL one_only);
-
-
- int32 service_listener_wait(struct slp_client *client,
- time_t wait,
- SOCKETD extra_sock, //jeb
- BOOL one_only,
- lslpMsg *);
-
- int32 __service_listener(struct slp_client *client,
- SOCKETD extra_sock ); //jeb
- int32 service_listener(struct slp_client *client,
- SOCKETD extra_sock,
- lslpMsg *); //jeb
-
- int srv_reg_all( struct slp_client *client,
- const int8 *url,
- const int8 *attributes,
- const int8 *service_type,
- const int8 *scopes,
- int16 lifetime);
-
- int srv_reg_local ( struct slp_client *client,
- const int8 *url,
- const int8 *attributes,
- const int8 *service_type,
- const int8 *scopes,
- uint16 lifetime); //jeb int16 to uint16
- void __srv_reg_local ( struct slp_client *client,
- const int8 *url,
- const int8 *attributes,
- const int8 *service_type,
- const int8 *scopes,
- uint16 lifetime); //jeb int16 to uint16
-
- BOOL slp_previous_responder(struct slp_client *client,
- int8 *pr_list);
-
-
-
- /* attribute and attribute parser */
- lslpAttrList *_lslpDecodeAttrString(int8 *s);
- lslpAttrList *lslpAllocAttr(int8 *name, int8 type, void *val, int16 len);
- lslpAttrList *lslpAllocAttrList(void);
- void lslpFreeAttr(lslpAttrList *attr);
- void lslpFreeAttrList(lslpAttrList *list, BOOL staticFlag);
-
- BOOL lslpStuffAttrList(int8 **buf, int16 *len, lslpAttrList *list, lslpAttrList *include);
- lslpAttrList *lslpUnstuffAttr(int8 **buf, int16 *len, int16 *err) ;
-
-
- /* url and url parser */
- lslpURL *lslpAllocURL(void);
- lslpURL *lslpAllocURLList(void);
- void lslpFreeURL(lslpURL *url);
- void lslpFreeURLList(lslpURL *list);
- BOOL lslpStuffURL(int8 **buf, int16 *len, lslpURL *url) ;
- BOOL lslpStuffURLList(int8 **buf, int16 *len, lslpURL *list) ;
- lslpURL *lslpUnstuffURL(int8 **buf, int16 *len, int16 *err) ;
-
-
- lslpAtomList *lslpAllocAtom(void);
- lslpAtomList *lslpAllocAtomList(void);
- void lslpFreeAtom(lslpAtomList *l);
- void lslpFreeAtomList(lslpAtomList *l, int32 flag);
- lslpAtomizedURL *lslpAllocAtomizedURL(void);
- lslpAtomizedURL *lslpAllocAtomizedURLList(void);
- void lslpFreeAtomizedURL(lslpAtomizedURL *u);
- void lslpFreeAtomizedURLList(lslpAtomizedURL *l, int32 flag);
- void lslpInitAtomLists(void);
- void lslpInitURLList(void);
-
- lslpAtomizedURL *_lslpDecodeURLs(int8 *u[], int32 count);
-
-
- /* ldap filter and parser */
-
- lslpLDAPFilter *lslpAllocFilter(int _operator);
- void lslpFreeFilter(lslpLDAPFilter *filter);
- void lslpFreeFilterList(lslpLDAPFilter *head, BOOL static_flag);
- void lslpInitFilterList(void );
- void lslpCleanUpFilterList(void);
- void lslpFreeFilterTree(lslpLDAPFilter *root);
-
-
- lslpLDAPFilter *_lslpDecodeLDAPFilter(int8 *filter) ;
- BOOL lslpEvaluateOperation(int compare_result, int operation);
- BOOL lslpEvaluateAttributes(const lslpAttrList *a, const lslpAttrList *b, int op);
- BOOL lslpEvaluateFilterTree(lslpLDAPFilter *filter, const lslpAttrList *attrs);
-
- /* scope lists */
- lslpScopeList *lslpAllocScope(void);
- lslpScopeList *lslpAllocScopeList(void);
- void lslpFreeScope(lslpScopeList *s);
- void lslpFreeScopeList(lslpScopeList *head);
-
-#define lslpFreeSPI(a) lslpFreeScope((lslpScopeList *)(a))
-#define lslpFreeSPIList(a) lslpFreeScopeList((lslpScopeList *)(a))
-
-
- BOOL lslpStuffScopeList(int8 **buf, int16 *len, lslpScopeList *list);
- lslpScopeList *lslpUnstuffScopeList(int8 **buf, int16 *len, int16 *err);
- lslpSPIList *lslpUnstuffSPIList(int8 **buf, int16 *len, int16 *err);
- BOOL lslpStuffSPIList(int8 **buf, int16 *len, lslpSPIList *list);
-
-
- lslpScopeList *lslpScopeStringToList(int8 *s, int16 len) ;
-
-
- int8 *lslp_foldString(int8 *s);
-
- BOOL lslp_scope_intersection(lslpScopeList *a, lslpScopeList *b) ;
- /* caseless compare that folds whitespace */
- int lslp_string_compare(int8 *s1, int8 *s2);
- int lslp_isscope(int c) ;
- BOOL lslp_islegal_scope(int8 *s);
-
- /* service registrations */
- lslpSrvRegList *lslpAllocSrvReg(void);
- lslpSrvRegHead *lslpAllocSrvRegList(void);
- void lslpFreeSrvReg(lslpSrvRegList *s);
- void lslpFreeSrvRegList(lslpSrvRegHead *head);
-
-
-
- /* authorization blocks */
-
- lslpAuthBlock *lslpAllocAuthBlock(void);
- lslpAuthBlock *lslpAllocAuthList(void);
- void lslpFreeAuthBlock(lslpAuthBlock *auth);
- void lslpFreeAuthList(lslpAuthBlock *list);
- BOOL lslpStuffAuthList(int8 **buf, int16 *len, lslpAuthBlock *list);
- lslpAuthBlock *lslpUnstuffAuthList(int8 **buf, int16 *len, int16 *err);
-
- uint32 lslpCheckSum(int8 *s, int16 l);
- lslpHdr * lslpAllocHdr(void);
- void lslpFreeHdr(lslpHdr *hdr);
- void lslpDestroySrvReq(struct lslp_srv_req *r, int8 flag);
- void lslpDestroySrvRply(struct lslp_srv_rply *r, int8 flag) ;
- void lslpDestroySrvReg(struct lslp_srv_reg *r, int8 flag);
- void lslpDestroySrvAck(struct lslp_srv_ack *r, int8 flag);
- void lslpDestroyDAAdvert(struct lslp_da_advert *r, int8 flag);
- void lslpDestroySAAdvert(struct lslp_sa_advert *r, int8 flag);
- void lslpDestroySrvTypeReq(struct lslp_srvtype_req *r, int8 flag);
- void lslpDestroySrvTypeReply(struct lslp_srvtype_rep *r, int8 flag);
- void lslpDestroyAttrReq(struct lslp_attr_req *r, int8 flag);
- void lslpDestroyAttrReply(struct lslp_attr_rep *r, int8 flag);
- void lslpDestroySrvDeReg(struct lslp_srv_dereg *r, int8 flag);
-
- BOOL check_duplicate_resp(struct slp_client *client, lslpMsg *msg);
- struct lslp_srv_rply_out *_lslpProcessSrvReq(struct slp_client *client,
- struct lslp_srv_req *msg,
- int16 errCode);
- /* a is an attribute list, while b is a string representation of an ldap filter */
- BOOL lslp_predicate_match(lslpAttrList *a, int8 *b);
- int8 * lslp_get_next_ext(int8 *hdr_buf);
-
-
-/***** Functions Exported by the library *****/
-
-SLP_STORAGE_DECL BOOL lslp_pattern_match(const int8 *s, const int8 *p, BOOL case_sensitive);
-SLP_STORAGE_DECL struct slp_client *create_slp_client(const int8 *target_addr,
- const int8 *local_interface,
- uint16 target_port,
- const int8 *spi,
- const int8 *scopes,
- BOOL should_listen,
- BOOL use_das);
-
-SLP_STORAGE_DECL void destroy_slp_client(struct slp_client *client);
-SLP_STORAGE_DECL int8 *encode_opaque(void *buffer, int16 length);
-SLP_STORAGE_DECL void *decode_opaque(int8 *buffer);
-SLP_STORAGE_DECL lslpMsg *alloc_slp_msg(BOOL head);
-SLP_STORAGE_DECL void lslpDestroySLPMsg(lslpMsg *msg, int8 flag);
-SLP_STORAGE_DECL void lslp_print_srv_rply(lslpMsg *srvrply);
-
-
-/** test functions - use these to test the correctness of
- slp strings. They will use the actual parsers to
- try and parse the strings. The return code indicates
- if the string is grammatically correct or not.
-**/
-SLP_STORAGE_DECL BOOL test_service_type(int8 *type);
-SLP_STORAGE_DECL BOOL test_service_type_reg(int8 *type);
-SLP_STORAGE_DECL BOOL test_url(int8 *url);
-SLP_STORAGE_DECL BOOL test_attribute(int8 *attr);
-SLP_STORAGE_DECL BOOL test_scopes(int8 *scopes);
-SLP_STORAGE_DECL BOOL test_predicate(int8 *predicate);
-
-
-/*****************************************************************
- * test_srv_reg
- *
- * test the correctness of a service registration -
- * return codes:
- * 0 == SUCCESS
- * 1 == type string failed parsing
- * 2 == url string failed parsing
- * 3 == attribute string failed parsing
- * 4 == scope string failed parsing
- *
- *****************************************************************/
-SLP_STORAGE_DECL uint32 test_srv_reg(int8 *type,
- int8 *url,
- int8 *attr,
- int8 *scopes);
-
-/*****************************************************************
- * test_query
- *
- * test the correctness of a service request
- *
- * return codes:
- * 0 == SUCCESS
- * 1 == type string failed parsing
- * 2 == predicate string failed parsing
- * 3 == scope string failed parsing
- *****************************************************************/
-
-SLP_STORAGE_DECL uint32 test_query(int8 *type,
- int8 *predicate,
- int8 *scopes);
-
-
-
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* SLP_CLIENT_INC */
+++ /dev/null
-/*****************************************************************************
- * Description: encode/decode attribute urls
- *
- * Originated: February 25, 2000
- * Original Author: Mike Day md@soft-hackle.net
- * mdd@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/slp_client/Attic/url.l,v 1.2 2003/06/05 20:39:29 mday Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-%{
-
-#undef YYLMAX
-#define YYLMAX 2048
-#define YY_NEVER_INTERACTIVE 1
-#undef YY_INPUT
-#define YY_INPUT(b, r, m) abort()
-#define exit(i) abort()
-#undef ECHO
-#define ECHO urlerror(yytext)
-#include "slp_client.h"
-#include "y_url.h"
-#include <stdarg.h>
-
-#define urlless yyless
-void urlerror(int8 *, ...);
-
-static int16 heapIndex;
-static int8 heap[2052];
-static int8 buf[2052];
-/* special counter to exit the appletalk state */
-int8 atalk_state = 0;
-
-static int8 *_lslp_strdup(int8 *s);
-void url_close_lexer(uint32 handle);
-uint32 url_init_lexer(int8 *s);
-
-%}
-
- /* {} */
-digit [0-9]
-upalpha [A-Z]
-lowalpha [a-z]
-alpha [a-zA-Z]
-alphanum [a-zA-Z0-9]
-hex [a-fA-F0-9]
-safe [-$_.~]
-escaped ("%"{hex}{2} | "\\"{hex}{2})
-mark [-_.!~*'()]
-unreserved ({alphanum}|{mark})
-reserved [;/?:@&=+$,]
-uric ({reserved} | {unreserved} | {escaped})
-
-%x IP_SITE
-%x AT_SITE
-%x ATTRIBUTE
-%p 9000
-%n 300
-%e 700
-%option noyywrap prefix="url"
-%%
-
- /* the ip user @ host syntax is a special state because some reserved */
- /* characters are valid - but user the string itself is optional so we can't */
- /* build it into a full-time rule */
-
-"//" {
- BEGIN IP_SITE;
- urlless(0);
- }
- /* return the slash as a token */
-<IP_SITE>"/" {urllval._i = *urltext; return(urllval._i);}
-
- /* this next rule needs to kick in even if it matches a zero-length string */
- /* i.e., it needs to be guaranteed even if there is no user @ host production */
-<IP_SITE>[-_.!~*'()a-zA-Z0-9;+&=\%]* {
- BEGIN INITIAL;
- if (urlleng > 0)
- {
- if(NULL != (urllval._s = _lslp_strdup(urltext)))
- return(_RESNAME);
- else
- return(0L);
- }
- }
-
- /* appletalk syntax includes three reserved characters - give the lexer a chance */
- /* to match an appletalk production before it starts returning reserved */
- /* chars as tokens. */
-
-"/"[aA]{1}[tT]{1}"/" {
- BEGIN AT_SITE;
- if(NULL != (urllval._s = _lslp_strdup(urltext)))
- return(_AT);
- else
- return(0L);
- }
-
-<AT_SITE>(([-a-zA-Z0-9$_.~])|("%"([a-fA-F0-9]{2,2}))){1,31} {
- atalk_state++;
- if (atalk_state == 3)
- {BEGIN INITIAL;}
- if(NULL != (urllval._s = _lslp_strdup(urltext)))
- return(_ZONE);
- else
- return(0L);
- }
-
-<AT_SITE>":" {urllval._i = *urltext; return(urllval._i);}
-<AT_SITE>"/" {BEGIN INITIAL; urlless(0);}
-
- /* ipx syntax includes two reserved characters - give the lexer a chance */
- /* to match an ipx production before it starts returning reserved chars */
- /* as tokens */
-
-"/"[iI]{1}[pP]{1}[xX]{1}"/"({hex}{8})":"({hex}{12})":"({hex}{4}) {
- if(NULL != (urllval._s = _lslp_strdup(urltext)))
- return(_IPX);
- else
- return(0L);
- }
-
- /* reserved characters - always a token in normal state unless part of */
- /* one of the productions above */
-";" {BEGIN ATTRIBUTE; urllval._i = *urltext; return(urllval._i);}
-"/" {urllval._i = *urltext; return(urllval._i);}
-"?" {urllval._i = *urltext; return(urllval._i);}
-":" {urllval._i = *urltext; return(urllval._i);}
-"@" {urllval._i = *urltext; return(urllval._i);}
-"&" {urllval._i = *urltext; return(urllval._i);}
-"=" {urllval._i = *urltext; return(urllval._i);}
-"+" {urllval._i = *urltext; return(urllval._i);}
-"$" {urllval._i = *urltext; return(urllval._i);}
-"," {urllval._i = *urltext; return(urllval._i);}
-
- /* a string consisting of only hex digits */
-{hex}+ {
- if(NULL != (urllval._s = _lslp_strdup(urltext)))
- return(_HEXDIG);
- else
- return(0L);
- }
-
- /* an ipv4 address */
-({hex}{1,3})"."({hex}{1,3})"."({hex}{1,3})"."({hex}{1,3}) {
- if(NULL != (urllval._s = _lslp_strdup(urltext)))
- return(_IPADDR);
- else
- return(0L);
- }
-
- /* resource names start with alpha and include alphanum and '+' or '-' */
- /* but '+' is reserved and must be escaped */
-[-a-zA-Z0-9.]* {
- if(NULL != (urllval._s = _lslp_strdup(urltext)))
- return(_RESNAME);
- else
- return(0L);
- }
-
-
- /* anything else that is not reserved */
-<ATTRIBUTE>[!-~]+ {
- BEGIN INITIAL;
- if(NULL != (urllval._s = _lslp_strdup(urltext)))
- return(_ELEMENT);
- else
- return(0L);
- }
-
- /* anything else that is not reserved */
-[^;/?:@&=+$,]+ {
- if(NULL != (urllval._s = _lslp_strdup(urltext)))
- return(_ELEMENT);
- else
- return(0L);
- }
-
- /* anything else is an error */
-
-%%
-
-
-void url_close_lexer(uint32 handle)
-{
- assert(handle != 0);
- url_delete_buffer((YY_BUFFER_STATE)handle);
-}
-
-
-uint32 url_init_lexer(int8 *s)
-{
- memset(&buf[0], 0x00, 2052);
- memset(&heap[0], 0x00, 2052);
- heapIndex = 0;
- strncpy(&buf[0], s, 2048);
- return((uint32)url_scan_buffer(&buf[0], strlen(s) + 2));
-}
-
-
-static int8 *_lslp_strdup(int8 *s)
-{
- int8 *p = &heap[heapIndex];
- do { heap[heapIndex++] = *s; } while ((*s != 0x00) && (heapIndex < 2049) && (++s));
- return(p);
-}
-
-void urlerror(int8 *s, ...)
-{
- return;
-}
-
+++ /dev/null
-/*****************************************************************************
- * Description: encode/decode attribute urls
- *
- * Originated: March 6, 2000
- * Original Author: Mike Day md@soft-hackle.net
- * mdd@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/slp_client/Attic/url.y,v 1.2 2003/06/05 20:39:29 mday Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-%{
-
-#include "slp_client.h"
-
-
-
-/* prototypes and globals go here */
-void urlerror(int8 *, ...);
-int32 urlwrap(void);
-int32 urllex(void);
-int32 urlparse(void);
-void url_close_lexer(uint32 handle);
-uint32 url_init_lexer(int8 *s);
-
-lslpAtomizedURL urlHead =
-{
- &urlHead, &urlHead, TRUE, NULL, 0
-};
-
-static lslpAtomList srvcHead = {&srvcHead, &srvcHead, TRUE, NULL, 0};
-static lslpAtomList siteHead = {&siteHead, &siteHead, TRUE, NULL, 0};
-static lslpAtomList pathHead = {&pathHead, &pathHead, TRUE, NULL, 0};
-static lslpAtomList attrHead = {&attrHead, &attrHead, TRUE, NULL, 0};
-
-%}
-
-/* definitions for ytab.h */
-%name-prefix="url"
-
-%union {
- int32 _i;
- int8 *_s;
- lslpAtomList *_atl;
- lslpAtomizedURL *_aturl;
-}
-
-%token<_i> _RESERVED
-%token<_s> _HEXDIG _STAG _RESNAME _NAME _ELEMENT _IPADDR _IPX
-%token<_s> _AT _ZONE
-
-/* typecast the non-terminals */
-
-/* %type <_i> */
-%type <_s> ip_site ipx_site at_site hostport host service_id
-%type <_aturl> url
-%type <_atl> service_list service site path_list path_el attr_list attr_el
-%type <_atl> url_part sap
-
-%%
-url: service_list sap {
- if (NULL != ($$ = (lslpAtomizedURL *)calloc(1, sizeof(lslpAtomizedURL))))
- {
- int32 urlLen = 1;
- lslpAtomList *temp = srvcHead.next;
- while (! _LSLP_IS_HEAD(temp) && temp->str != NULL)
- {
- urlLen += strlen(temp->str);
- temp = temp->next;
- }
- temp = siteHead.next;
- while (! _LSLP_IS_HEAD(temp) && temp->str != NULL)
- {
- urlLen += strlen(temp->str);
- temp = temp->next;
- }
- temp = pathHead.next;
- while (! _LSLP_IS_HEAD(temp) && temp->str != NULL)
- {
- urlLen += strlen(temp->str) + 1;
- temp = temp->next;
- }
- temp = attrHead.next;
- while (! _LSLP_IS_HEAD(temp) && temp->str != NULL)
- {
- urlLen += strlen(temp->str) + 1;
- temp = temp->next;
- }
- if (NULL != ($$->url = (int8 *)calloc(urlLen, sizeof(int8))))
- {
- temp = srvcHead.next;
- if (! _LSLP_IS_HEAD(temp) && temp->str != NULL)
- {
- strcpy($$->url, temp->str);
- temp = temp->next;
- }
- while (! _LSLP_IS_HEAD(temp) && temp->str != NULL)
- {
- strcat($$->url, temp->str);
- temp = temp->next;
- }
- temp = siteHead.next;
- while (! _LSLP_IS_HEAD(temp) && temp->str != NULL)
- {
- strcat($$->url, temp->str);
- temp = temp->next;
- }
- temp = pathHead.next;
- while (! _LSLP_IS_HEAD(temp) && temp->str != NULL)
- {
- strcat($$->url, "/");
- strcat($$->url, temp->str);
- temp = temp->next;
- }
- temp = attrHead.next;
- while (! _LSLP_IS_HEAD(temp) && temp->str != NULL)
- {
- strcat($$->url, ";");
- strcat($$->url, temp->str);
- temp = temp->next;
- }
- $$->urlHash = lslpCheckSum($$->url, (int16)strlen($$->url));
- }
-
- /* make certain the listheads are initialized */
- $$->srvcs.next = $$->srvcs.prev = &($$->srvcs);
- $$->srvcs.isHead = TRUE;
- $$->site.next = $$->site.prev = &($$->site);
- $$->site.isHead = TRUE;
- $$->path.next = $$->path.prev = &($$->path);
- $$->path.isHead = TRUE;
- $$->attrs.next = $$->attrs.prev = &($$->attrs);
- $$->attrs.isHead = TRUE;
- if (! _LSLP_IS_EMPTY(&srvcHead ))
- {
- _LSLP_LINK_HEAD(&($$->srvcs), &srvcHead);
- }
- if (! _LSLP_IS_EMPTY(&siteHead))
- {
- _LSLP_LINK_HEAD(&($$->site), &siteHead);
- }
- if (! _LSLP_IS_EMPTY(&pathHead))
- {
- _LSLP_LINK_HEAD(&($$->path), &pathHead);
- }
- if (! _LSLP_IS_EMPTY(&attrHead))
- {
- _LSLP_LINK_HEAD(&($$->attrs), &attrHead);
- }
- _LSLP_INSERT_BEFORE($$, &urlHead);
- lslpInitAtomLists();
- }
- }
- ;
-service_list: service {
- $$ = &srvcHead;
- if ($1 != NULL)
- {
- _LSLP_INSERT_BEFORE($1, $$);
- }
- }
-
- | service_list service {
- $$ = &srvcHead;
- if ($2 != NULL)
- {
- _LSLP_INSERT_BEFORE($2, $$);
- }
- }
- ;
-
-service: _RESNAME ':' {
- if (NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList))))
- {
- $$->next = $$->prev = $$;
- if (NULL != ($$->str = (int8 *)calloc(2 + strlen($1), sizeof(int8))))
- {
- strcpy($$->str, $1);
- strcat($$->str, ":");
- $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str));
- }
- else
- {
- free($$);
- $$ = NULL;
- }
- }
-
- }
- | _RESNAME '.' _RESNAME ':' {
- if (NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList))))
- {
- $$->next = $$->prev = $$;
- if (NULL != ($$->str = (int8 *)calloc(3 + strlen($1) + strlen($3), sizeof(int8))))
- {
- strcpy($$->str, $1);
- strcat($$->str, ".");
- strcat($$->str, $3);
- strcat($$->str, ":");
- $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str));
- }
- else
- {
- free($$);
- $$ = NULL;
- }
- }
-
- }
- ;
-
-sap: site {
- $$ = &siteHead;
- if ($1 != NULL)
- {
- _LSLP_INSERT_BEFORE($1, $$);
- }
- }
- | site url_part {
- $$ = &siteHead;
- if ($1 != NULL)
- {
- _LSLP_INSERT_BEFORE($1, $$);
- }
- }
- ;
-
-site: ip_site {
- if ($1 != NULL)
- {
- if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList))))
- {
- $$->next = $$->prev = $$;
- $$->str = $1;
- $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str));
- }
- }
- else
- $$ = NULL;
- }
- | ipx_site {
- if ($1 != NULL)
- {
- if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList))))
- {
- $$->next = $$->prev = $$;
- $$->str = $1;
- $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str));
- }
- }
- else
- $$ = NULL;
- }
- | at_site {
- if ($1 != NULL)
- {
- if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList))))
- {
- $$->next = $$->prev = $$;
- $$->str = $1;
- $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str));
- }
- }
- else
- $$ = NULL;
- }
-
-| service_id {
-
- if ($1 != NULL)
- {
- if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList))))
- {
- $$->next = $$->prev = $$;
- $$->str = $1;
- $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str));
- }
- }
- else
- $$ = NULL;
-
-}
-
- ;
-
-ip_site: '/''/' {
- $$ = strdup("//");
- }
- | '/''/' hostport {
- if(NULL != $3 && (NULL !=($$ = (int8 *)calloc(3 + strlen($3), sizeof(int8)))))
- {
- strcpy($$, "//");
- strcat($$, $3);
- }
-
- }
- | '/''/' _RESNAME '@' hostport {
- if(NULL != $5 && (NULL !=($$ = (int8 *)calloc(4 + strlen($3) + strlen($5), sizeof(int8)))))
- {
- strcpy($$, "//");
- strcat($$, $3);
- strcat($$, "@");
- strcat($$, $5);
- }
- }
- ;
-
-service_id: _RESNAME {
- $$ = strdup($1);
- }
- ;
-
-ipx_site: _IPX {
- $$ = $1;
- }
- ;
-
-at_site: _AT _ZONE ':' _ZONE ':' _ZONE {
- if(NULL != ($$ = (int8 *)calloc(strlen($1) + strlen($2) + strlen($4) + strlen($6) + 3, sizeof(int8))))
- {
- strcpy($$, $1);
- strcat($$, $2);
- strcat($$, ":");
- strcat($$, $4);
- strcat($$, ":");
- strcat($$, $6);
- }
- }
- ;
-
-hostport: host {
- $$ = $1;
- }
- | host ':' _HEXDIG {
- if ($1 != NULL)
- {
- if(NULL != ($$ = (int8 *)calloc(strlen($1) + strlen($3) + 2, sizeof(int8))))
- {
- strcpy($$, $1);
- strcat($$, ":");
- strcat($$, $3);
- }
- }
- else
- $$ = NULL;
- }
- ;
-
-host: _RESNAME {
- $$ = $1;
- }
- | _IPADDR {
- $$ = $1;
- }
- ;
-
-url_part: path_list {
- ;
- }
- | attr_list {
- ;
- }
- | path_list attr_list {
- ;
- }
- ;
-
-path_list: path_el {
- $$ = &pathHead;
- if ($1 != NULL)
- {
- _LSLP_INSERT_BEFORE($1, $$);
- }
- }
- | path_list path_el {
- $$ = &pathHead;
- if ($2 != NULL)
- {
- _LSLP_INSERT_BEFORE($2, $$);
- }
- }
-
- ;
-
-path_el: '/' {
- /* dangling path slash - do nothing */
- $$ = NULL;
- }
- | '/' _ELEMENT {
- if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList))))
- {
- $$->prev = $$->next = $$;
- if(NULL != ($$->str = (int8 *)calloc(1 + strlen($2), sizeof(int8))))
- {
- strcpy($$->str, $2);
- $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str));
-
- }
- else
- {
- free($$);
- $$ = NULL;
- }
- }
-
- }
- | '/' _RESNAME {
- if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList))))
- {
- $$->prev = $$->next = $$;
- if(NULL != ($$->str = (int8 *)calloc(1 + strlen($2), sizeof(int8))))
- {
- strcpy($$->str, $2);
- $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str));
- }
- else
- {
- free($$);
- $$ = NULL;
- }
- }
-
- }
- | '/' _HEXDIG {
- if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList))))
- {
- $$->prev = $$->next = $$;
- if(NULL != ($$->str = (int8 *)calloc(1 + strlen($2), sizeof(int8))))
- {
- strcpy($$->str, $2);
- $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str));
- }
- else
- {
- free($$);
- $$ = NULL;
- }
- }
- }
- ;
-
-attr_list: attr_el {
- $$ = &attrHead;
- if ($1 != NULL)
- {
- _LSLP_INSERT_BEFORE($1, $$);
- }
- }
- | attr_list attr_el {
- $$ = &attrHead;
- if ($2 != NULL)
- {
- _LSLP_INSERT_BEFORE($2, $$);
- }
- }
- ;
-
-attr_el: ';' _ELEMENT {
- if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList))))
- {
- $$->prev = $$->next = $$;
- if(NULL != ($$->str = (int8 *)calloc(1 + strlen($2), sizeof(int8))))
- {
- strcpy($$->str, $2);
- $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str));
- }
- else
- {
- free($$);
- $$ = NULL;
- }
- }
- }
-
- | ';' _ELEMENT '=' _ELEMENT {
- if(NULL != ($$ = (lslpAtomList *)calloc(1, sizeof(lslpAtomList))))
- {
- $$->prev = $$->next = $$;
- if(NULL != ($$->str = (int8 *)calloc(2 + strlen($2) + strlen($4), sizeof(int8))))
- {
- strcpy($$->str, $2);
- strcat($$->str, "=");
- strcat($$->str, $4);
- $$->hash = lslpCheckSum($$->str, (int16)strlen($$->str));
- }
- else
- {
- free($$);
- $$ = NULL;
- }
- }
- }
- ;
-
-%%
-
-
-lslpAtomList *lslpAllocAtom(void)
-{
- lslpAtomList *temp = (lslpAtomList *)calloc(1, sizeof(lslpAtomList));
- if (temp != NULL)
- {
- temp->next = temp->prev = temp;
- }
- return(temp);
-}
-
-lslpAtomList *lslpAllocAtomList(void)
-{
- lslpAtomList *temp =lslpAllocAtom();
- if (temp != NULL)
- temp->isHead = TRUE;
- return(temp);
-}
-
-void lslpFreeAtom(lslpAtomList *a )
-{
- assert(a != NULL);
- if (a->str != NULL)
- free(a->str);
- free(a);
- return;
-}
-
-void lslpFreeAtomList(lslpAtomList *l, int32 flag)
-{
- lslpAtomList *temp;
- assert(l != NULL);
- assert(_LSLP_IS_HEAD(l));
- while (! _LSLP_IS_EMPTY(l))
- {
- temp = l->next;
- temp->prev->next = temp->next;
- temp->next->prev = temp->prev;
- lslpFreeAtom(temp);
- }
- if (flag)
- lslpFreeAtom(l);
- return;
-}
-
-lslpAtomizedURL *lslpAllocAtomizedURL(void)
-{
- lslpAtomizedURL *temp = (lslpAtomizedURL *)calloc(1, sizeof(lslpAtomizedURL));
- if (temp != NULL)
- {
- temp->prev = temp->next = temp;
- }
- return(temp);
-}
-
-lslpAtomizedURL *lslpAllocAtomizedURLList(void)
-{
- lslpAtomizedURL *temp = lslpAllocAtomizedURL();
- if (temp != NULL)
- {
- temp->isHead = TRUE;
- }
- return(temp);
-}
-
-void lslpFreeAtomizedURL(lslpAtomizedURL *u)
-{
- assert(u != NULL);
- if (u->url != NULL)
- free(u->url);
- if (! _LSLP_IS_EMPTY(&(u->srvcs)))
- lslpFreeAtomList(&(u->srvcs), 0);
- if (! _LSLP_IS_EMPTY(&(u->site)))
- lslpFreeAtomList(&(u->site), 0);
- if (! _LSLP_IS_EMPTY(&(u->path)))
- lslpFreeAtomList(&(u->path), 0);
- if (! _LSLP_IS_EMPTY(&(u->attrs)))
- lslpFreeAtomList(&(u->attrs), 0);
- free(u);
- return;
-}
-
-void lslpFreeAtomizedURLList(lslpAtomizedURL *l, int32 flag)
-{
- lslpAtomizedURL *temp;
- assert(l != NULL);
- assert(_LSLP_IS_HEAD(l));
- while (! (_LSLP_IS_HEAD(l->next)))
- {
- temp = l->next;
- temp->prev->next = temp->next;
- temp->next->prev = temp->prev;
- lslpFreeAtomizedURL(temp);
- }
- if (flag)
- free(l);
- return;
-}
-
-void lslpInitAtomLists(void)
-{
- srvcHead.next = srvcHead.prev = &srvcHead;
- siteHead.next = siteHead.prev = &siteHead;
- pathHead.next = pathHead.prev = &pathHead;
- attrHead.next = attrHead.prev = &attrHead;
- return;
-}
-
-void lslpInitURLList(void)
-{
- urlHead.next = urlHead.prev = &urlHead;
- return;
-}
-
-
-
-void lslpCleanUpURLLists(void)
-{
-
- lslpFreeAtomList(&srvcHead, 0);
- lslpFreeAtomList(&siteHead, 0);
- lslpFreeAtomList(&pathHead, 0);
- lslpFreeAtomList(&attrHead, 0);
- lslpFreeAtomizedURLList(&urlHead, 0);
-}
-
-lslpAtomizedURL *_lslpDecodeURLs(int8 *u[], int32 count)
-{
- int32 i;
-
- uint32 lexer = 0;
- lslpAtomizedURL *temp = NULL;
- assert(u != NULL && u[count - 1] != NULL);
- lslpInitURLList();
- lslpInitAtomLists();
-
- for (i = 0; i < count; i++) {
- if (NULL == u[i])
- break;
- if((0 != (lexer = url_init_lexer(u[i])))) {
- if(urlparse())
- lslpCleanUpURLLists();
- url_close_lexer(lexer);
- }
- }
- if (! _LSLP_IS_EMPTY(&urlHead)) {
- if(NULL != (temp = lslpAllocAtomizedURLList())) {
- _LSLP_LINK_HEAD(temp, &urlHead);
- }
- }
-
- return(temp);
-}
-
+++ /dev/null
-//%2005////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation, The Open Group.
-// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-// EMC Corporation; VERITAS Software Corporation; The Open Group.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//==============================================================================
-#ifndef BISON_Y_ATTR_H
-# define BISON_Y_ATTR_H
-
-#ifndef YYSTYPE
-typedef union {
- int32 _i;
- int8 *_s;
- lslpAttrList *_atl;
-} yystype;
-# define YYSTYPE yystype
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-# define _TRUE 257
-# define _FALSE 258
-# define _MULTIVAL 259
-# define _INT 260
-# define _ESCAPED 261
-# define _TAG 262
-# define _STRING 263
-# define _OPAQUE 264
-
-
-extern YYSTYPE attrlval;
-
-#endif /* not BISON_Y_ATTR_H */
+++ /dev/null
-Terminals which are not used:
-
- _OPAQUE
-
-
-Grammar
-
- Number, Line, Rule
- 1 84 attr_list -> attr
- 2 94 attr_list -> attr_list ',' attr
- 3 106 attr -> _TAG
- 4 113 attr -> '(' _TAG ')'
- 5 120 attr -> '(' _TAG '=' ')'
- 6 128 attr -> '(' _TAG '=' attr_val_list ')'
- 7 140 attr_val_list -> attr_val
- 8 147 attr_val_list -> attr_val_list _MULTIVAL attr_val
- 9 154 attr_val -> _TRUE
- 10 157 attr_val -> _FALSE
- 11 160 attr_val -> _ESCAPED
- 12 163 attr_val -> _STRING
- 13 177 attr_val -> _INT
-
-
-Terminals, with rules where they appear
-
-$ (-1)
-'(' (40) 4 5 6
-')' (41) 4 5 6
-',' (44) 2
-'=' (61) 5 6
-error (256)
-_TRUE (257) 9
-_FALSE (258) 10
-_MULTIVAL (259) 8
-_INT (260) 13
-_ESCAPED (261) 11
-_TAG (262) 3 4 5 6
-_STRING (263) 12
-_OPAQUE (264)
-
-
-Nonterminals, with rules where they appear
-
-attr_list (15)
- on left: 1 2, on right: 2
-attr (16)
- on left: 3 4 5 6, on right: 1 2
-attr_val_list (17)
- on left: 7 8, on right: 6 8
-attr_val (18)
- on left: 9 10 11 12 13, on right: 7 8
-
-
-state 0
-
- _TAG shift, and go to state 1
- '(' shift, and go to state 2
-
- attr_list go to state 3
- attr go to state 4
-
-
-
-state 1
-
- attr -> _TAG . (rule 3)
-
- $default reduce using rule 3 (attr)
-
-
-
-state 2
-
- attr -> '(' . _TAG ')' (rule 4)
- attr -> '(' . _TAG '=' ')' (rule 5)
- attr -> '(' . _TAG '=' attr_val_list ')' (rule 6)
-
- _TAG shift, and go to state 5
-
-
-
-state 3
-
- attr_list -> attr_list . ',' attr (rule 2)
-
- $ go to state 21
- ',' shift, and go to state 6
-
-
-
-state 4
-
- attr_list -> attr . (rule 1)
-
- $default reduce using rule 1 (attr_list)
-
-
-
-state 5
-
- attr -> '(' _TAG . ')' (rule 4)
- attr -> '(' _TAG . '=' ')' (rule 5)
- attr -> '(' _TAG . '=' attr_val_list ')' (rule 6)
-
- ')' shift, and go to state 7
- '=' shift, and go to state 8
-
-
-
-state 6
-
- attr_list -> attr_list ',' . attr (rule 2)
-
- _TAG shift, and go to state 1
- '(' shift, and go to state 2
-
- attr go to state 9
-
-
-
-state 7
-
- attr -> '(' _TAG ')' . (rule 4)
-
- $default reduce using rule 4 (attr)
-
-
-
-state 8
-
- attr -> '(' _TAG '=' . ')' (rule 5)
- attr -> '(' _TAG '=' . attr_val_list ')' (rule 6)
-
- _TRUE shift, and go to state 10
- _FALSE shift, and go to state 11
- _INT shift, and go to state 12
- _ESCAPED shift, and go to state 13
- _STRING shift, and go to state 14
- ')' shift, and go to state 15
-
- attr_val_list go to state 16
- attr_val go to state 17
-
-
-
-state 9
-
- attr_list -> attr_list ',' attr . (rule 2)
-
- $default reduce using rule 2 (attr_list)
-
-
-
-state 10
-
- attr_val -> _TRUE . (rule 9)
-
- $default reduce using rule 9 (attr_val)
-
-
-
-state 11
-
- attr_val -> _FALSE . (rule 10)
-
- $default reduce using rule 10 (attr_val)
-
-
-
-state 12
-
- attr_val -> _INT . (rule 13)
-
- $default reduce using rule 13 (attr_val)
-
-
-
-state 13
-
- attr_val -> _ESCAPED . (rule 11)
-
- $default reduce using rule 11 (attr_val)
-
-
-
-state 14
-
- attr_val -> _STRING . (rule 12)
-
- $default reduce using rule 12 (attr_val)
-
-
-
-state 15
-
- attr -> '(' _TAG '=' ')' . (rule 5)
-
- $default reduce using rule 5 (attr)
-
-
-
-state 16
-
- attr -> '(' _TAG '=' attr_val_list . ')' (rule 6)
- attr_val_list -> attr_val_list . _MULTIVAL attr_val (rule 8)
-
- _MULTIVAL shift, and go to state 18
- ')' shift, and go to state 19
-
-
-
-state 17
-
- attr_val_list -> attr_val . (rule 7)
-
- $default reduce using rule 7 (attr_val_list)
-
-
-
-state 18
-
- attr_val_list -> attr_val_list _MULTIVAL . attr_val (rule 8)
-
- _TRUE shift, and go to state 10
- _FALSE shift, and go to state 11
- _INT shift, and go to state 12
- _ESCAPED shift, and go to state 13
- _STRING shift, and go to state 14
-
- attr_val go to state 20
-
-
-
-state 19
-
- attr -> '(' _TAG '=' attr_val_list ')' . (rule 6)
-
- $default reduce using rule 6 (attr)
-
-
-
-state 20
-
- attr_val_list -> attr_val_list _MULTIVAL attr_val . (rule 8)
-
- $default reduce using rule 8 (attr_val_list)
-
-
-
-state 21
-
- $ go to state 22
-
-
-
-state 22
-
- $default accept
-
-
+++ /dev/null
-//%2005////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation, The Open Group.
-// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-// EMC Corporation; VERITAS Software Corporation; The Open Group.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//==============================================================================
-#ifndef BISON_Y_FILTER_H
-# define BISON_Y_FILTER_H
-
-#ifndef YYSTYPE
-typedef union {
- int32 filter_int;
- int8 *filter_string;
- lslpLDAPFilter *filter_filter;
-} yystype;
-# define YYSTYPE yystype
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-# define L_PAREN 257
-# define R_PAREN 258
-# define OP_AND 259
-# define OP_OR 260
-# define OP_NOT 261
-# define OP_EQU 262
-# define OP_GT 263
-# define OP_LT 264
-# define OP_PRESENT 265
-# define OP_APPROX 266
-# define VAL_INT 267
-# define VAL_BOOL 268
-# define OPERAND 269
-
-
-extern YYSTYPE filterlval;
-
-#endif /* not BISON_Y_FILTER_H */
+++ /dev/null
-Grammar
-
- Number, Line, Rule
- 1 81 filter_list -> filter
- 2 82 filter_list -> filter_list filter
- 3 85 filter -> filter_open filter_op filter_list filter_close
- 4 103 filter -> filter_open expression filter_close
- 5 112 filter_open -> L_PAREN
- 6 115 filter_close -> R_PAREN
- 7 118 filter_op -> OP_AND
- 8 119 filter_op -> OP_OR
- 9 120 filter_op -> OP_NOT
- 10 125 expression -> OPERAND OP_PRESENT
- 11 134 expression -> OPERAND exp_operator VAL_INT
- 12 144 expression -> OPERAND exp_operator VAL_BOOL
- 13 154 expression -> OPERAND exp_operator OPERAND
- 14 165 exp_operator -> OP_EQU
- 15 166 exp_operator -> OP_GT
- 16 167 exp_operator -> OP_LT
- 17 168 exp_operator -> OP_APPROX
-
-
-Terminals, with rules where they appear
-
-$ (-1)
-error (256)
-L_PAREN (257) 5
-R_PAREN (258) 6
-OP_AND (259) 7
-OP_OR (260) 8
-OP_NOT (261) 9
-OP_EQU (262) 14
-OP_GT (263) 15
-OP_LT (264) 16
-OP_PRESENT (265) 10
-OP_APPROX (266) 17
-VAL_INT (267) 11
-VAL_BOOL (268) 12
-OPERAND (269) 10 11 12 13
-
-
-Nonterminals, with rules where they appear
-
-filter_list (16)
- on left: 1 2, on right: 2 3
-filter (17)
- on left: 3 4, on right: 1 2
-filter_open (18)
- on left: 5, on right: 3 4
-filter_close (19)
- on left: 6, on right: 3 4
-filter_op (20)
- on left: 7 8 9, on right: 3
-expression (21)
- on left: 10 11 12 13, on right: 4
-exp_operator (22)
- on left: 14 15 16 17, on right: 11 12 13
-
-
-state 0
-
- L_PAREN shift, and go to state 1
-
- filter_list go to state 2
- filter go to state 3
- filter_open go to state 4
-
-
-
-state 1
-
- filter_open -> L_PAREN . (rule 5)
-
- $default reduce using rule 5 (filter_open)
-
-
-
-state 2
-
- filter_list -> filter_list . filter (rule 2)
-
- $ go to state 25
- L_PAREN shift, and go to state 1
-
- filter go to state 5
- filter_open go to state 4
-
-
-
-state 3
-
- filter_list -> filter . (rule 1)
-
- $default reduce using rule 1 (filter_list)
-
-
-
-state 4
-
- filter -> filter_open . filter_op filter_list filter_close (rule 3)
- filter -> filter_open . expression filter_close (rule 4)
-
- OP_AND shift, and go to state 6
- OP_OR shift, and go to state 7
- OP_NOT shift, and go to state 8
- OPERAND shift, and go to state 9
-
- filter_op go to state 10
- expression go to state 11
-
-
-
-state 5
-
- filter_list -> filter_list filter . (rule 2)
-
- $default reduce using rule 2 (filter_list)
-
-
-
-state 6
-
- filter_op -> OP_AND . (rule 7)
-
- $default reduce using rule 7 (filter_op)
-
-
-
-state 7
-
- filter_op -> OP_OR . (rule 8)
-
- $default reduce using rule 8 (filter_op)
-
-
-
-state 8
-
- filter_op -> OP_NOT . (rule 9)
-
- $default reduce using rule 9 (filter_op)
-
-
-
-state 9
-
- expression -> OPERAND . OP_PRESENT (rule 10)
- expression -> OPERAND . exp_operator VAL_INT (rule 11)
- expression -> OPERAND . exp_operator VAL_BOOL (rule 12)
- expression -> OPERAND . exp_operator OPERAND (rule 13)
-
- OP_EQU shift, and go to state 12
- OP_GT shift, and go to state 13
- OP_LT shift, and go to state 14
- OP_PRESENT shift, and go to state 15
- OP_APPROX shift, and go to state 16
-
- exp_operator go to state 17
-
-
-
-state 10
-
- filter -> filter_open filter_op . filter_list filter_close (rule 3)
-
- L_PAREN shift, and go to state 1
-
- filter_list go to state 18
- filter go to state 3
- filter_open go to state 4
-
-
-
-state 11
-
- filter -> filter_open expression . filter_close (rule 4)
-
- R_PAREN shift, and go to state 19
-
- filter_close go to state 20
-
-
-
-state 12
-
- exp_operator -> OP_EQU . (rule 14)
-
- $default reduce using rule 14 (exp_operator)
-
-
-
-state 13
-
- exp_operator -> OP_GT . (rule 15)
-
- $default reduce using rule 15 (exp_operator)
-
-
-
-state 14
-
- exp_operator -> OP_LT . (rule 16)
-
- $default reduce using rule 16 (exp_operator)
-
-
-
-state 15
-
- expression -> OPERAND OP_PRESENT . (rule 10)
-
- $default reduce using rule 10 (expression)
-
-
-
-state 16
-
- exp_operator -> OP_APPROX . (rule 17)
-
- $default reduce using rule 17 (exp_operator)
-
-
-
-state 17
-
- expression -> OPERAND exp_operator . VAL_INT (rule 11)
- expression -> OPERAND exp_operator . VAL_BOOL (rule 12)
- expression -> OPERAND exp_operator . OPERAND (rule 13)
-
- VAL_INT shift, and go to state 21
- VAL_BOOL shift, and go to state 22
- OPERAND shift, and go to state 23
-
-
-
-state 18
-
- filter_list -> filter_list . filter (rule 2)
- filter -> filter_open filter_op filter_list . filter_close (rule 3)
-
- L_PAREN shift, and go to state 1
- R_PAREN shift, and go to state 19
-
- filter go to state 5
- filter_open go to state 4
- filter_close go to state 24
-
-
-
-state 19
-
- filter_close -> R_PAREN . (rule 6)
-
- $default reduce using rule 6 (filter_close)
-
-
-
-state 20
-
- filter -> filter_open expression filter_close . (rule 4)
-
- $default reduce using rule 4 (filter)
-
-
-
-state 21
-
- expression -> OPERAND exp_operator VAL_INT . (rule 11)
-
- $default reduce using rule 11 (expression)
-
-
-
-state 22
-
- expression -> OPERAND exp_operator VAL_BOOL . (rule 12)
-
- $default reduce using rule 12 (expression)
-
-
-
-state 23
-
- expression -> OPERAND exp_operator OPERAND . (rule 13)
-
- $default reduce using rule 13 (expression)
-
-
-
-state 24
-
- filter -> filter_open filter_op filter_list filter_close . (rule 3)
-
- $default reduce using rule 3 (filter)
-
-
-
-state 25
-
- $ go to state 26
-
-
-
-state 26
-
- $default accept
-
-
+++ /dev/null
-//%2005////////////////////////////////////////////////////////////////////////
-//
-// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation, The Open Group.
-// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-// EMC Corporation; VERITAS Software Corporation; The Open Group.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to
-// deal in the Software without restriction, including without limitation the
-// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-//==============================================================================
-#ifndef BISON_Y_URL_H
-# define BISON_Y_URL_H
-
-#ifndef YYSTYPE
-typedef union {
- int32 _i;
- int8 *_s;
- lslpAtomList *_atl;
- lslpAtomizedURL *_aturl;
-} yystype;
-# define YYSTYPE yystype
-# define YYSTYPE_IS_TRIVIAL 1
-#endif
-# define _RESERVED 257
-# define _HEXDIG 258
-# define _STAG 259
-# define _RESNAME 260
-# define _NAME 261
-# define _ELEMENT 262
-# define _IPADDR 263
-# define _IPX 264
-# define _AT 265
-# define _ZONE 266
-
-
-extern YYSTYPE urllval;
-
-#endif /* not BISON_Y_URL_H */
+++ /dev/null
-Terminals which are not used:
-
- _RESERVED
- _STAG
- _NAME
-
-
-Grammar
-
- Number, Line, Rule
- 1 85 url -> service_list sap
- 2 179 service_list -> service
- 3 187 service_list -> service_list service
- 4 196 service -> _RESNAME ':'
- 5 214 service -> _RESNAME '.' _RESNAME ':'
- 6 236 sap -> site
- 7 243 sap -> site url_part
- 8 252 site -> ip_site
- 9 265 site -> ipx_site
- 10 278 site -> at_site
- 11 292 site -> service_id
- 12 310 ip_site -> '/' '/'
- 13 313 ip_site -> '/' '/' hostport
- 14 321 ip_site -> '/' '/' _RESNAME '@' hostport
- 15 332 service_id -> _RESNAME
- 16 337 ipx_site -> _IPX
- 17 342 at_site -> _AT _ZONE ':' _ZONE ':' _ZONE
- 18 355 hostport -> host
- 19 358 hostport -> host ':' _HEXDIG
- 20 373 host -> _RESNAME
- 21 376 host -> _IPADDR
- 22 381 url_part -> path_list
- 23 384 url_part -> attr_list
- 24 387 url_part -> path_list attr_list
- 25 392 path_list -> path_el
- 26 399 path_list -> path_list path_el
- 27 409 path_el -> '/'
- 28 413 path_el -> '/' _ELEMENT
- 29 431 path_el -> '/' _RESNAME
- 30 448 path_el -> '/' _HEXDIG
- 31 466 attr_list -> attr_el
- 32 473 attr_list -> attr_list attr_el
- 33 482 attr_el -> ';' _ELEMENT
- 34 499 attr_el -> ';' _ELEMENT '=' _ELEMENT
-
-
-Terminals, with rules where they appear
-
-$ (-1)
-'.' (46) 5
-'/' (47) 12 13 14 27 28 29 30
-':' (58) 4 5 17 19
-';' (59) 33 34
-'=' (61) 34
-'@' (64) 14
-error (256)
-_RESERVED (257)
-_HEXDIG (258) 19 30
-_STAG (259)
-_RESNAME (260) 4 5 14 15 20 29
-_NAME (261)
-_ELEMENT (262) 28 33 34
-_IPADDR (263) 21
-_IPX (264) 16
-_AT (265) 17
-_ZONE (266) 17
-
-
-Nonterminals, with rules where they appear
-
-url (19)
- on left: 1
-service_list (20)
- on left: 2 3, on right: 1 3
-service (21)
- on left: 4 5, on right: 2 3
-sap (22)
- on left: 6 7, on right: 1
-site (23)
- on left: 8 9 10 11, on right: 6 7
-ip_site (24)
- on left: 12 13 14, on right: 8
-service_id (25)
- on left: 15, on right: 11
-ipx_site (26)
- on left: 16, on right: 9
-at_site (27)
- on left: 17, on right: 10
-hostport (28)
- on left: 18 19, on right: 13 14
-host (29)
- on left: 20 21, on right: 18 19
-url_part (30)
- on left: 22 23 24, on right: 7
-path_list (31)
- on left: 25 26, on right: 22 24 26
-path_el (32)
- on left: 27 28 29 30, on right: 25 26
-attr_list (33)
- on left: 31 32, on right: 23 24 32
-attr_el (34)
- on left: 33 34, on right: 31 32
-
-
-state 0
-
- _RESNAME shift, and go to state 1
-
- url go to state 50
- service_list go to state 2
- service go to state 3
-
-
-
-state 1
-
- service -> _RESNAME . ':' (rule 4)
- service -> _RESNAME . '.' _RESNAME ':' (rule 5)
-
- ':' shift, and go to state 4
- '.' shift, and go to state 5
-
-
-
-state 2
-
- url -> service_list . sap (rule 1)
- service_list -> service_list . service (rule 3)
-
- _RESNAME shift, and go to state 6
- _IPX shift, and go to state 7
- _AT shift, and go to state 8
- '/' shift, and go to state 9
-
- service go to state 10
- sap go to state 11
- site go to state 12
- ip_site go to state 13
- service_id go to state 14
- ipx_site go to state 15
- at_site go to state 16
-
-
-
-state 3
-
- service_list -> service . (rule 2)
-
- $default reduce using rule 2 (service_list)
-
-
-
-state 4
-
- service -> _RESNAME ':' . (rule 4)
-
- $default reduce using rule 4 (service)
-
-
-
-state 5
-
- service -> _RESNAME '.' . _RESNAME ':' (rule 5)
-
- _RESNAME shift, and go to state 17
-
-
-
-state 6
-
- service -> _RESNAME . ':' (rule 4)
- service -> _RESNAME . '.' _RESNAME ':' (rule 5)
- service_id -> _RESNAME . (rule 15)
-
- ':' shift, and go to state 4
- '.' shift, and go to state 5
-
- $default reduce using rule 15 (service_id)
-
-
-
-state 7
-
- ipx_site -> _IPX . (rule 16)
-
- $default reduce using rule 16 (ipx_site)
-
-
-
-state 8
-
- at_site -> _AT . _ZONE ':' _ZONE ':' _ZONE (rule 17)
-
- _ZONE shift, and go to state 18
-
-
-
-state 9
-
- ip_site -> '/' . '/' (rule 12)
- ip_site -> '/' . '/' hostport (rule 13)
- ip_site -> '/' . '/' _RESNAME '@' hostport (rule 14)
-
- '/' shift, and go to state 19
-
-
-
-state 10
-
- service_list -> service_list service . (rule 3)
-
- $default reduce using rule 3 (service_list)
-
-
-
-state 11
-
- url -> service_list sap . (rule 1)
-
- $default reduce using rule 1 (url)
-
-
-
-state 12
-
- sap -> site . (rule 6)
- sap -> site . url_part (rule 7)
-
- '/' shift, and go to state 20
- ';' shift, and go to state 21
-
- $default reduce using rule 6 (sap)
-
- url_part go to state 22
- path_list go to state 23
- path_el go to state 24
- attr_list go to state 25
- attr_el go to state 26
-
-
-
-state 13
-
- site -> ip_site . (rule 8)
-
- $default reduce using rule 8 (site)
-
-
-
-state 14
-
- site -> service_id . (rule 11)
-
- $default reduce using rule 11 (site)
-
-
-
-state 15
-
- site -> ipx_site . (rule 9)
-
- $default reduce using rule 9 (site)
-
-
-
-state 16
-
- site -> at_site . (rule 10)
-
- $default reduce using rule 10 (site)
-
-
-
-state 17
-
- service -> _RESNAME '.' _RESNAME . ':' (rule 5)
-
- ':' shift, and go to state 27
-
-
-
-state 18
-
- at_site -> _AT _ZONE . ':' _ZONE ':' _ZONE (rule 17)
-
- ':' shift, and go to state 28
-
-
-
-state 19
-
- ip_site -> '/' '/' . (rule 12)
- ip_site -> '/' '/' . hostport (rule 13)
- ip_site -> '/' '/' . _RESNAME '@' hostport (rule 14)
-
- _RESNAME shift, and go to state 29
- _IPADDR shift, and go to state 30
-
- $default reduce using rule 12 (ip_site)
-
- hostport go to state 31
- host go to state 32
-
-
-
-state 20
-
- path_el -> '/' . (rule 27)
- path_el -> '/' . _ELEMENT (rule 28)
- path_el -> '/' . _RESNAME (rule 29)
- path_el -> '/' . _HEXDIG (rule 30)
-
- _HEXDIG shift, and go to state 33
- _RESNAME shift, and go to state 34
- _ELEMENT shift, and go to state 35
-
- $default reduce using rule 27 (path_el)
-
-
-
-state 21
-
- attr_el -> ';' . _ELEMENT (rule 33)
- attr_el -> ';' . _ELEMENT '=' _ELEMENT (rule 34)
-
- _ELEMENT shift, and go to state 36
-
-
-
-state 22
-
- sap -> site url_part . (rule 7)
-
- $default reduce using rule 7 (sap)
-
-
-
-state 23
-
- url_part -> path_list . (rule 22)
- url_part -> path_list . attr_list (rule 24)
- path_list -> path_list . path_el (rule 26)
-
- '/' shift, and go to state 20
- ';' shift, and go to state 21
-
- $default reduce using rule 22 (url_part)
-
- path_el go to state 37
- attr_list go to state 38
- attr_el go to state 26
-
-
-
-state 24
-
- path_list -> path_el . (rule 25)
-
- $default reduce using rule 25 (path_list)
-
-
-
-state 25
-
- url_part -> attr_list . (rule 23)
- attr_list -> attr_list . attr_el (rule 32)
-
- ';' shift, and go to state 21
-
- $default reduce using rule 23 (url_part)
-
- attr_el go to state 39
-
-
-
-state 26
-
- attr_list -> attr_el . (rule 31)
-
- $default reduce using rule 31 (attr_list)
-
-
-
-state 27
-
- service -> _RESNAME '.' _RESNAME ':' . (rule 5)
-
- $default reduce using rule 5 (service)
-
-
-
-state 28
-
- at_site -> _AT _ZONE ':' . _ZONE ':' _ZONE (rule 17)
-
- _ZONE shift, and go to state 40
-
-
-
-state 29
-
- ip_site -> '/' '/' _RESNAME . '@' hostport (rule 14)
- host -> _RESNAME . (rule 20)
-
- '@' shift, and go to state 41
-
- $default reduce using rule 20 (host)
-
-
-
-state 30
-
- host -> _IPADDR . (rule 21)
-
- $default reduce using rule 21 (host)
-
-
-
-state 31
-
- ip_site -> '/' '/' hostport . (rule 13)
-
- $default reduce using rule 13 (ip_site)
-
-
-
-state 32
-
- hostport -> host . (rule 18)
- hostport -> host . ':' _HEXDIG (rule 19)
-
- ':' shift, and go to state 42
-
- $default reduce using rule 18 (hostport)
-
-
-
-state 33
-
- path_el -> '/' _HEXDIG . (rule 30)
-
- $default reduce using rule 30 (path_el)
-
-
-
-state 34
-
- path_el -> '/' _RESNAME . (rule 29)
-
- $default reduce using rule 29 (path_el)
-
-
-
-state 35
-
- path_el -> '/' _ELEMENT . (rule 28)
-
- $default reduce using rule 28 (path_el)
-
-
-
-state 36
-
- attr_el -> ';' _ELEMENT . (rule 33)
- attr_el -> ';' _ELEMENT . '=' _ELEMENT (rule 34)
-
- '=' shift, and go to state 43
-
- $default reduce using rule 33 (attr_el)
-
-
-
-state 37
-
- path_list -> path_list path_el . (rule 26)
-
- $default reduce using rule 26 (path_list)
-
-
-
-state 38
-
- url_part -> path_list attr_list . (rule 24)
- attr_list -> attr_list . attr_el (rule 32)
-
- ';' shift, and go to state 21
-
- $default reduce using rule 24 (url_part)
-
- attr_el go to state 39
-
-
-
-state 39
-
- attr_list -> attr_list attr_el . (rule 32)
-
- $default reduce using rule 32 (attr_list)
-
-
-
-state 40
-
- at_site -> _AT _ZONE ':' _ZONE . ':' _ZONE (rule 17)
-
- ':' shift, and go to state 44
-
-
-
-state 41
-
- ip_site -> '/' '/' _RESNAME '@' . hostport (rule 14)
-
- _RESNAME shift, and go to state 45
- _IPADDR shift, and go to state 30
-
- hostport go to state 46
- host go to state 32
-
-
-
-state 42
-
- hostport -> host ':' . _HEXDIG (rule 19)
-
- _HEXDIG shift, and go to state 47
-
-
-
-state 43
-
- attr_el -> ';' _ELEMENT '=' . _ELEMENT (rule 34)
-
- _ELEMENT shift, and go to state 48
-
-
-
-state 44
-
- at_site -> _AT _ZONE ':' _ZONE ':' . _ZONE (rule 17)
-
- _ZONE shift, and go to state 49
-
-
-
-state 45
-
- host -> _RESNAME . (rule 20)
-
- $default reduce using rule 20 (host)
-
-
-
-state 46
-
- ip_site -> '/' '/' _RESNAME '@' hostport . (rule 14)
-
- $default reduce using rule 14 (ip_site)
-
-
-
-state 47
-
- hostport -> host ':' _HEXDIG . (rule 19)
-
- $default reduce using rule 19 (hostport)
-
-
-
-state 48
-
- attr_el -> ';' _ELEMENT '=' _ELEMENT . (rule 34)
-
- $default reduce using rule 34 (attr_el)
-
-
-
-state 49
-
- at_site -> _AT _ZONE ':' _ZONE ':' _ZONE . (rule 17)
-
- $default reduce using rule 17 (at_site)
-
-
-
-state 50
-
- $ go to state 51
-
-
-
-state 51
-
- $ go to state 52
-
-
-
-state 52
-
- $default accept
-
-
+++ /dev/null
-#//%2006////////////////////////////////////////////////////////////////////////
-#//
-#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation, The Open Group.
-#// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; Symantec Corporation; The Open Group.
-#//
-#// Permission is hereby granted, free of charge, to any person obtaining a copy
-#// of this software and associated documentation files (the "Software"), to
-#// deal in the Software without restriction, including without limitation the
-#// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-#// sell copies of the Software, and to permit persons to whom the Software is
-#// furnished to do so, subject to the following conditions:
-#//
-#// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-#// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-#// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-#// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-#// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-#// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-#// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#//
-#//==============================================================================
-PROJECT = slp_query
-LFLAGS += -o$@
-YFLAGS += -o$@
-
-SOURCES = slp_query.c
-
-OBJS = slp_query$(OBJ)
-
-LIBS = $(SRC_CLIENT)/libslp_client.la
-
-all: $(PROJECT)$(EXE)
-.PHONY: all
-
-install: $(INSTALL) install.txt
-.PHONY: install
-
-remove: $(REMOVE) remove.txt
-.PHONY: remove
-
-clean: $(CLEAN) clean.txt
-.PHONY: clean
-
-
-$(PROJECT)$(EXE): slp_query$(OBJ)
- $(LIBTOOL) $(CC) $(LDFLAGS) $(EXE_OUT) $@ $(OBJS) $(LIBS)
-
-slp_query$(OBJ) : slp_query.c
- $(LIBTOOL) $(CC) $(NO_LINK_FLAG) $(CFLAGS) $(DEFS) $< $(OBJ_OUT) $@
-
-clean.txt :
- $(IGNORE)$(LIBTOOL) $(RM) $(RM_FLAGS) $(SUB_PROJECT)$(EXE)
- $(IGNORE)$(LIBTOOL) $(RM) $(RM_FLAGS) *.o
- $(IGNORE)$(LIBTOOL) $(RM) $(RM_FLAGS) *.lo
-
-install.txt: $(PROJECT)$(EXE)
- $(IGNORE)$(LIBTOOL) $(CP) $(CP_FLAGS) slp_query /usr/local/bin
-
-remove.txt:
- $(IGNORE)$(LIBTOOL) $(RM) $(RM_FLAGS) /usr/local/bin/slp_query
-
-
-
-
-
-
-
+++ /dev/null
-#//%2006////////////////////////////////////////////////////////////////////////
-#//
-#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation, The Open Group.
-#// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; Symantec Corporation; The Open Group.
-#//
-#// Permission is hereby granted, free of charge, to any person obtaining a copy
-#// of this software and associated documentation files (the "Software"), to
-#// deal in the Software without restriction, including without limitation the
-#// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-#// sell copies of the Software, and to permit persons to whom the Software is
-#// furnished to do so, subject to the following conditions:
-#//
-#// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-#// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-#// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-#// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-#// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-#// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-#// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#//
-#//==============================================================================
-CC=cl.exe
-ifdef DEBUG
-CFLAGS=/nologo /Od /D "WIN32" /D "_DEBUG" /Gm /EHsc /RTC1 /MTd /W3 /c /Zi /TC
-LDFLAGS=/nologo /dll /debug
-else
-CFLAGS=/nologo /O2 /D "WIN32" /EHsc /MT /W3 /c /TC
-LDFLAGS=/nologo /dll
-endif
-
-
-all: slp_query.exe
-
-##############################################################
-# slp_query
-##############################################################
-slp_query.obj : slp_query.c
- $(CC) $(CFLAGS) $<
-slp_query.exe : slp_query.obj
- $(CC) /nologo /Fe$@ slp_query.obj ../slp_client/slp_client.lib Ws2_32.lib
-
-clean:
- $(RM) *.obj *.pdb *.idb *.exe
+++ /dev/null
-/*****************************************************************************
- * Description: scripting shell for slp_client - generates an slp QUERY
- *
- * Originated: September 16, 2002
- * Original Author: Mike Day md@soft-hackle.net
- * mdday@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/slp_query/Attic/slp_query.c,v 1.2 2003/11/18 23:59:20 tony Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-
-
-
-/**** define the following token to import labels from the slp_client library *****/
-#define SLP_LIB_IMPORT
-#include "../slp_client/slp_client.h"
-
-int8 *type, *addr, *scopes, *iface, *predicate, *spi;
-int16 port = 427, converge;
-BOOL dir_agent = FALSE;
-BOOL test = FALSE;
-
-void free_globals(void)
-{
- if(type != NULL)
- free(type);
- if(addr != NULL)
- free(addr);
- if(scopes != NULL)
- free(scopes);
- if(iface != NULL)
- free(iface);
- if(predicate != NULL)
- free(predicate);
- if(spi != NULL)
- free(spi);
-}
-
-
-void usage(void)
-{
- printf("\nslp_query -- transmit an SLP Service Request and print the results.\n");
- printf("-------------------------------------------------------------------------\n");
- printf("slp_query --type=service-type-string\n");
- printf(" [--predicate=predicate-string]\n");
- printf(" [--scopes=scope-string]\n");
- printf(" [--address=target-IP]\n");
- printf(" [--port=target-port]\n");
- printf(" [--interface=host-IP]\n");
- printf(" [--use_da=true]\n");
- printf(" [--converge=convergence-cycles]\n");
- printf(" [--spi=security-parameters-index] (not used)\n");
- printf(" [--test] (tests parameters)\n");
- printf("\n");
- printf("All parameters must be a single string containing no spaces.\n");
- printf("Always use the format of <parameter>=<value>.\n");
- printf("Parameters enclosed in brackets are not optional.\n");
-
-
-}
-
-BOOL get_options(int argc, char *argv[])
-{
- int i;
- int8 *bptr;
-
- for(i = 1; i < argc; i++){
- if((*argv[i] == '-') && (*(argv[i] + 1) == '-')) {
- if(TRUE == lslp_pattern_match(argv[i] + 2, "type=*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- /* handle case where type is specified twice on the cmd line */
- if(type != NULL)
- free(type);
- type = strdup(bptr);
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "predicate=*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- if(predicate != NULL)
- free(predicate);
- predicate = strdup(bptr);
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "scopes*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- if(scopes != NULL)
- free(scopes);
- scopes = strdup(bptr);
-
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "address*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- if(addr != NULL)
- free(addr);
- addr = strdup(bptr);
-
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "port*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- port = (int16)strtoul(bptr, NULL, 10);
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "interface*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- if(iface != NULL)
- free(iface);
- iface = strdup(bptr);
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "use_da=true*", FALSE)) {
- dir_agent = TRUE;
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "test*", FALSE)) {
- test = TRUE;
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "converge=*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- converge = (int16)strtoul(bptr, NULL, 10);
- }
- }
- }
-
- if( type == NULL )
- return FALSE;
- return TRUE;
-}
-
-
-int main(int argc, char **argv)
-{
- struct slp_client *client;
- lslpMsg responses, *temp;
-
- if(FALSE == get_options(argc, argv)) {
- usage();
- } else {
- if(scopes == NULL)
- scopes = strdup("DEFAULT");
- if(test == TRUE){
- return test_query(type, predicate, scopes);
- }
-
- if(NULL != (client = create_slp_client(addr,
- iface,
- port,
- "DSA",
- scopes,
- FALSE,
- dir_agent))) {
-
-
- if( addr != NULL && inet_addr(addr) == inet_addr("127.0.0.1")) {
- client->local_srv_req(client, type, predicate, scopes);
- } else if(converge) {
- client->_convergence = converge ;
- client->converge_srv_req(client, type, predicate, scopes);
- } else {
- SOCKADDR_IN address;
- address.sin_port = htons(port);
- address.sin_family = AF_INET;
- if(addr != NULL)
- address.sin_addr.s_addr = inet_addr(addr);
- else
- address.sin_addr.s_addr = _LSLP_MCAST;
- client->unicast_srv_req(client, type, predicate, scopes, &address);
- }
-
- responses.isHead = TRUE;
- responses.next = responses.prev = &responses;
-
- client->get_response(client, &responses);
- while( ! _LSLP_IS_EMPTY(&responses)) {
- temp = responses.next;
- if(temp->type == srvRply)
- lslp_print_srv_rply(temp);
- _LSLP_UNLINK(temp);
- lslpDestroySLPMsg(temp, LSLP_DESTRUCTOR_DYNAMIC);
- }
- destroy_slp_client(client);
- }
- }
-
- free_globals();
- return(0);
-
-}
+++ /dev/null
-#//%2006////////////////////////////////////////////////////////////////////////
-#//
-#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation, The Open Group.
-#// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; Symantec Corporation; The Open Group.
-#//
-#// Permission is hereby granted, free of charge, to any person obtaining a copy
-#// of this software and associated documentation files (the "Software"), to
-#// deal in the Software without restriction, including without limitation the
-#// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-#// sell copies of the Software, and to permit persons to whom the Software is
-#// furnished to do so, subject to the following conditions:
-#//
-#// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-#// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-#// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-#// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-#// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-#// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-#// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#//
-#//==============================================================================
-PROJECT = slp_srvreg
-LFLAGS += -o$@
-YFLAGS += -o$@
-
-SOURCES = slp_srvreg.c
-
-OBJS = slp_srvreg$(OBJ)
-
-LIBS = $(SRC_CLIENT)/libslp_client.la
-
-all: $(PROJECT)$(EXE)
-.PHONY: all
-
-install: $(INSTALL) install.txt
-.PHONY: install
-
-clean: $(CLEAN) clean.txt
-.PHONY: clean
-
-$(PROJECT)$(EXE): slp_srvreg$(OBJ)
- $(LIBTOOL) $(CC) $(LDFLAGS) $(EXE_OUT) $@ $(OBJS) $(LIBS)
-
-slp_srvreg$(OBJ) : slp_srvreg.c
- $(LIBTOOL) $(CC) $(NO_LINK_FLAG) $(CFLAGS) $(DEFS) $< $(OBJ_OUT) $@
-
-install.txt: $(PROJECT)$(EXE)
- $(IGNORE)$(LIBTOOL) $(CP) $(CP_FLAGS) slp_srvreg /usr/local/bin
-
-remove.txt:
- $(IGnore)$(LIBTOOL) $(RM) $(RM_FLAGS) /usr/local/bin/$(SUB_PROJECT)$(EXE)
-
-clean.txt :
- $(IGNORE)$(LIBTOOL) $(RM) $(RM_FLAGS) $(SUB_PROJECT)$(EXE)
- $(IGNORE)$(LIBTOOL) $(RM) $(RM_FLAGS) *$(OBJ)
-
-
-
-
-
-
-
-
-
+++ /dev/null
-#//%2006////////////////////////////////////////////////////////////////////////
-#//
-#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
-#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
-#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation, The Open Group.
-#// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
-#// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; VERITAS Software Corporation; The Open Group.
-#// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
-#// EMC Corporation; Symantec Corporation; The Open Group.
-#//
-#// Permission is hereby granted, free of charge, to any person obtaining a copy
-#// of this software and associated documentation files (the "Software"), to
-#// deal in the Software without restriction, including without limitation the
-#// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-#// sell copies of the Software, and to permit persons to whom the Software is
-#// furnished to do so, subject to the following conditions:
-#//
-#// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
-#// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
-#// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-#// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-#// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-#// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-#// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-#// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#//
-#//==============================================================================
-CC=cl.exe
-ifdef DEBUG
-CFLAGS=/nologo /Od /D "WIN32" /D "_DEBUG" /Gm /EHsc /RTC1 /MTd /W3 /c /Zi /TC
-LDFLAGS=/nologo /dll /debug
-else
-CFLAGS=/nologo /O2 /D "WIN32" /EHsc /MT /W3 /c /TC
-LDFLAGS=/nologo /dll
-endif
-
-
-all: slp_srvreg.exe
-
-##############################################################
-# slp_query
-##############################################################
-slp_srvreg.obj : slp_srvreg.c
- $(CC) $(CFLAGS) $<
-slp_srvreg.exe : slp_srvreg.obj
- $(CC) /nologo /Fe$@ slp_srvreg.obj ../slp_client/slp_client.lib Ws2_32.lib
-
-clean:
- $(RM) *.obj *.pdb *.idb *.exe
-
+++ /dev/null
-/*****************************************************************************
- * Description: scripting shell for slp_client - generates an slp REGISTRATION
- *
- * Originated: September 16, 2002
- * Original Author: Mike Day md@soft-hackle.net
- * mdday@us.ibm.com
- *
- * $Header: /cvs/MSB/pegasus/src/Unsupported/slp_client/src/cmd-utils/slp_srvreg/Attic/slp_srvreg.c,v 1.3 2003/11/18 23:59:20 tony Exp $
- *
- * Copyright (c) 2001 - 2003 IBM
- * Copyright (c) 2000 - 2003 Michael Day
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- *****************************************************************************/
-
-
-#define SLP_LIB_IMPORT
-#include "../slp_client/slp_client.h"
-#ifdef _WIN32
-#include <time.h>
-#endif
-
-int8 *type, *url, *attrs, *addr, *scopes, *iface, *spi;
-uint16 life = 0x0fff, port=427;
-BOOL should_listen = FALSE, dir_agent = FALSE, test = FALSE;
-
-
-void free_globals(void)
-{
- if(type != NULL)
- free(type);
- if(url != NULL)
- free(url);
- if(attrs != NULL)
- free(attrs);
- if(addr != NULL)
- free(addr);
- if(scopes != NULL)
- free(scopes);
- if(iface != NULL)
- free(iface);
-}
-
-
-void usage(void)
-{
- printf("\nslp_srvreg -- transmit an SLP Service Registration and print the results.\n");
- printf("-------------------------------------------------------------------------\n");
- printf("slp_srvreg --type=service-type-string\n");
- printf(" --url=url-string\n");
- printf(" --attributes=attribute-string\n");
- printf(" [--address=target-IP]\n");
- printf(" [--port=target-port]\n");
- printf(" [--scopes=scope-string]\n");
- printf(" [--lifetime=seconds]\n");
- printf(" [--interface=host-IP]\n");
- printf(" [--daemon=true]\n");
- printf(" [--use_da=true]\n");
- printf(" [--test]\n");
- printf(" [--spi=security-parameters-index] (not used)\n");
- printf("\n");
- printf("All parameters must be a single string containing no spaces.\n");
- printf("Always use the format of <parameter>=<value>.\n");
- printf("Parameters enclosed in brackets are not optional.\n");
-
-}
-
-
-BOOL get_options(int argc, char *argv[])
-{
- int i;
- int8 *bptr;
-
- for(i = 1; i < argc; i++){
- if((*argv[i] == '-') && (*(argv[i] + 1) == '-')) {
- if(TRUE == lslp_pattern_match(argv[i] + 2, "type=*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- /* handle case where type is specified twice on the cmd line */
- if(type != NULL)
- free(type);
- type = strdup(bptr);
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "url=*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- if(url != NULL)
- free(url);
- url = strdup(bptr);
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "attributes=*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- if(attrs != NULL)
- free(attrs);
- attrs = strdup(bptr);
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "address=*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- if(addr != NULL)
- free(addr);
- addr = strdup(bptr);
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "scopes=*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- if(scopes != NULL)
- free(scopes);
- scopes = strdup(bptr);
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "lifetime*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- life = (uint16)strtoul(bptr, NULL, 10);
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "port=*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- port = (uint16)strtoul(bptr, NULL, 10);
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "interface=*", FALSE)) {
- bptr = argv[i] + 2;
- while(*bptr != '=') bptr++;
- bptr++;
- if(iface != NULL)
- free(iface);
- iface = strdup(bptr);
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "daemon=true*", FALSE)) {
- should_listen = TRUE;
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "test*", FALSE)) {
- test = TRUE;
- } else if(TRUE == lslp_pattern_match(argv[i] + 2, "use_da=true*", FALSE)) {
- dir_agent = TRUE;
- }
- }
- }
-
- if( type == NULL || url == NULL || attrs == NULL )
- return FALSE;
- return TRUE;
-}
-
-
-int main(int argc, char **argv)
-{
- struct slp_client *client;
- int count = 0;
- time_t now, last;
- lslpMsg msg_list;
-
-
- if(FALSE == get_options(argc, argv)) {
- usage();
- } else {
- if(scopes == NULL)
- scopes = strdup("DEFAULT");
- if(test == TRUE) {
- return test_srv_reg(type, url, attrs, scopes);
- }
-
- if(NULL != (client = create_slp_client(addr,
- iface,
- port,
- "DSA",
- scopes,
- should_listen,
- dir_agent))) {
- now = (last = time(NULL));
- if( addr != NULL && inet_addr(addr) == inet_addr("127.0.0.1") )
- count = client->srv_reg_local(client, url, attrs, type, scopes, life);
- else
- count = client->srv_reg_all(client, url, attrs, type, scopes, life);
- while(should_listen == TRUE) {
- _LSLP_SLEEP(10);
- client->service_listener(client, 0, &msg_list);
- now = time(NULL);
- if((now - last) > (life - 1)) {
- count = client->srv_reg_local(client, url, attrs, type, scopes, life);
- last = time(NULL);
- }
- }
- destroy_slp_client(client);
- }
- printf("srvreg: registered %s with %d SLP agents.\n", type, count);
- }
- free_globals();
- return(1);
-}
-