Compare commits
68 Commits
Bugzilla_P
...
LDAPCSDK_4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1990e291b7 | ||
|
|
e60b9ee80b | ||
|
|
3cde4a621a | ||
|
|
64f40f8489 | ||
|
|
1fb9f11752 | ||
|
|
502bccc8a8 | ||
|
|
b4ddfc1c95 | ||
|
|
5d852b0453 | ||
|
|
303429e675 | ||
|
|
03bda76fdc | ||
|
|
7c77e308f1 | ||
|
|
ee07e89139 | ||
|
|
9c1c937b2c | ||
|
|
30926dff34 | ||
|
|
9a367424a7 | ||
|
|
0f707eee80 | ||
|
|
0058db29ac | ||
|
|
d8db8da830 | ||
|
|
b84bd4bbb1 | ||
|
|
e9ece6cfff | ||
|
|
c38935871c | ||
|
|
aca0e9a57b | ||
|
|
eda351af73 | ||
|
|
6c6f458d61 | ||
|
|
c1b28e1145 | ||
|
|
610d355a28 | ||
|
|
21ec826b31 | ||
|
|
5e50e72813 | ||
|
|
28765dbabb | ||
|
|
08147e94bb | ||
|
|
d7f7cdf24e | ||
|
|
a6b8152f2f | ||
|
|
8ba72fc71e | ||
|
|
a39b168667 | ||
|
|
fae4806ceb | ||
|
|
0f4b2bf801 | ||
|
|
800e9d74b1 | ||
|
|
2dcf7a84d7 | ||
|
|
75482e250d | ||
|
|
c7f4e620c0 | ||
|
|
95f3d41dd7 | ||
|
|
1f15277159 | ||
|
|
e7e909979e | ||
|
|
dafaf01b34 | ||
|
|
8ec7d2ed46 | ||
|
|
28d8bdeaf0 | ||
|
|
0fedb6f1aa | ||
|
|
8eaa3c444f | ||
|
|
9e9975334e | ||
|
|
0cbf36f4b6 | ||
|
|
aa2b4d0aa1 | ||
|
|
282caf40f1 | ||
|
|
95ce340534 | ||
|
|
2b1d6c3606 | ||
|
|
3c45ad3a8f | ||
|
|
fc5abe04aa | ||
|
|
e8619c5bf2 | ||
|
|
468f8b4734 | ||
|
|
1cc5adfd8f | ||
|
|
2e4a047a82 | ||
|
|
2e63344375 | ||
|
|
8ad12bf41f | ||
|
|
16b75f0a5a | ||
|
|
83768657c2 | ||
|
|
96030e9aa3 | ||
|
|
0c7df676d6 | ||
|
|
48ef9fa9c0 | ||
|
|
a2b08efb8c |
80
mozilla/directory/Makefile
Normal file
80
mozilla/directory/Makefile
Normal file
@@ -0,0 +1,80 @@
|
||||
#! gmake
|
||||
#
|
||||
# The contents of this file are subject to the Netscape Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/NPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org code.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Communications Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
|
||||
#
|
||||
#
|
||||
#
|
||||
# You need to have checked out the LDAP tree at the same level as ns
|
||||
# in order to build LDAP.
|
||||
#
|
||||
|
||||
LDAP_DEPTH = .
|
||||
NSPR_TREE = ../nsprpub
|
||||
MOD_DEPTH = ../nsprpub
|
||||
DEPTH = ..
|
||||
|
||||
include $(NSPR_TREE)/config/rules.mk
|
||||
|
||||
all export:: FORCE
|
||||
@if [ -d $(NSPR_TREE)/config ]; then \
|
||||
cd $(NSPR_TREE)/config; \
|
||||
$(MAKE); \
|
||||
else \
|
||||
echo "No NSPR directory found"; \
|
||||
exit 0; \
|
||||
fi
|
||||
@if [ -d $(LDAP_DEPTH)/c-sdk/ldap ]; then \
|
||||
cd $(LDAP_DEPTH)/c-sdk/ldap; \
|
||||
$(MAKE) -f Makefile.client $(MFLAGS) export; \
|
||||
else \
|
||||
echo "No LDAP directory -- skipping"; \
|
||||
exit 0; \
|
||||
fi
|
||||
|
||||
libs install:: FORCE
|
||||
@if [ -d $(LDAP_DEPTH)/c-sdk/ldap ]; then \
|
||||
cd $(LDAP_DEPTH)/c-sdk/ldap; \
|
||||
$(MAKE) -f Makefile.client $(MFLAGS) install; \
|
||||
else \
|
||||
echo "No LDAP directory -- skipping"; \
|
||||
exit 0; \
|
||||
fi
|
||||
|
||||
clean clobber:: FORCE
|
||||
@if [ -d $(LDAP_DEPTH)/c-sdk/ldap ]; then \
|
||||
cd $(LDAP_DEPTH)/c-sdk/ldap; \
|
||||
$(MAKE) -f Makefile.client $(MFLAGS) clean; \
|
||||
else \
|
||||
echo "No LDAP directory -- skipping"; \
|
||||
exit 0; \
|
||||
fi
|
||||
rm -rf ../dist
|
||||
|
||||
realclean clobber_all:: FORCE
|
||||
@if [ -d $(LDAP_DEPTH)/c-sdk/ldap ]; then \
|
||||
cd $(LDAP_DEPTH)/c-sdk/ldap; \
|
||||
$(MAKE) -f Makefile.client $(MFLAGS) realclean; \
|
||||
else \
|
||||
echo "No LDAP directory -- skipping"; \
|
||||
exit 0; \
|
||||
fi
|
||||
|
||||
FORCE:
|
||||
154
mozilla/directory/buildsdk.txt
Normal file
154
mozilla/directory/buildsdk.txt
Normal file
@@ -0,0 +1,154 @@
|
||||
======================================================================
|
||||
NETSCAPE DIRECTORY SDK FOR C:
|
||||
BUILD INSTRUCTIONS
|
||||
Last updated: May 31, 1998
|
||||
======================================================================
|
||||
For information on the Netscape Directory SDK source release,
|
||||
see http://www.mozilla.org/directory/
|
||||
|
||||
Unix/Linux Build Instructions
|
||||
-----------------------------
|
||||
|
||||
System Requirements:
|
||||
32MB of RAM, 128MB of swap, recommended 64MB of RAM.
|
||||
|
||||
Tool Requirements:
|
||||
Native C compiler or GNU C/C++ compiler 2.7.2
|
||||
(or a more recent version)
|
||||
GNU make 3.74 or a more recent version
|
||||
|
||||
Instructions:
|
||||
1. Uncompress and extract the source files by entering the
|
||||
following command (or your preferred variant of this command):
|
||||
|
||||
gzip -dc <filename>.tar.gz | tar -xvf -
|
||||
|
||||
2. Set and unset the following environment variables.
|
||||
|
||||
In csh/tcsh:
|
||||
setenv MOZILLA_CLIENT 1
|
||||
setenv NO_MDUPDATE 1
|
||||
setenv MOZ_LDAP_SDK 1
|
||||
unsetenv MOZ_LI
|
||||
unsetenv MOZ_LITE
|
||||
unsetenv MOZ_MEDIUM
|
||||
unsetenv NO_SECURITY
|
||||
|
||||
In sh/bash/ksh:
|
||||
MOZILLA_CLIENT=1
|
||||
NO_MDUPDATE=1
|
||||
MOZ_LDAP_SDK=1
|
||||
export MOZILLA_CLIENT NO_MDUPDATE MOZ_LDAP_SDK
|
||||
unset MOZ_LI
|
||||
unset MOZ_LITE
|
||||
unset MOZ_MEDIUM
|
||||
unset NO_SECURITY
|
||||
|
||||
3. Build the SDK by entering the following commands:
|
||||
|
||||
cd mozilla
|
||||
gmake -f directory/ldapsdk.mk build
|
||||
|
||||
The SDK will be built and copied into the following directories:
|
||||
mozilla/dist/public/ldap - header files
|
||||
mozilla/dist/<architecture>/bin - LDAP API shared object/libraries
|
||||
(libldap.so, liblber.so)
|
||||
|
||||
|
||||
Windows Build Instructions
|
||||
--------------------------
|
||||
|
||||
System Requirements:
|
||||
Windows NT 3.51 or 4.0 (4.0 preferred).
|
||||
|
||||
Tool Requirements:
|
||||
Microsoft Visual C++ version 4.2 or a more recent version
|
||||
GNU Tools for Windows (you can find these on the Internet).
|
||||
Specifically, you'll need:
|
||||
cp.exe
|
||||
rm.exe
|
||||
Here are some sample download sites to find these:
|
||||
Cygnus (http://www.cygnus.com/misc/gnu-win32)
|
||||
GNU (http://www.gnu.org/order/ftp.html)
|
||||
MIT (ftp://prep.ai.mit.edu/pub/gnu)
|
||||
Netscape uses internally modified versions of the following tools:
|
||||
gmake.exe
|
||||
shmsdos.exe
|
||||
uname.exe
|
||||
You can download them from http://www.mozilla.org/download-mozilla.html
|
||||
(click the Windows Build Tools link). When you unzip the file, the
|
||||
tools will be located in the windows\bin\x86 directory.
|
||||
Netscape-developed tools (makedep.exe, txt2rc.exe, waitfor.exe),
|
||||
which are located in the mozilla\cmd\winfe\mkfiles32 directory
|
||||
|
||||
All of these tools need to be put in your path.
|
||||
|
||||
Extracting the Source Files:
|
||||
The source files for the Directory C SDK are zipped in the file
|
||||
ldap-c-sdk.zip. When unzipping the file, make sure to specify
|
||||
that you want to preserve the directory structure. For example,
|
||||
make sure that "Use Folder Names" is checked.
|
||||
|
||||
Instructions:
|
||||
NOTE: Make sure to run the commands from a standard Windows NT
|
||||
command prompt. Although you may be able to use other shells
|
||||
to build the SDK, you may need to adjust the makefiles for
|
||||
the shell that you are using.
|
||||
1. Set the following environment variables (within the command session,
|
||||
either manually or via a script), or within the system environment
|
||||
through the Control Panel | System control panel):
|
||||
set HOME=(your home directory)
|
||||
set MOZ_BITS=32
|
||||
set MOZ_DEBUG=1
|
||||
set MOZ_GOLD=0
|
||||
set MOZ_JAVA=0
|
||||
set MOZ_NT=351 (if running NT 3.51, don't set otherwise)
|
||||
set MOZ_SRC=(top of your source tree, drive letter and path.
|
||||
For example, set MOZ_SRC=d:\mozilla_src, if the mozilla
|
||||
directory is at d:\mozilla_src\mozilla.)
|
||||
set MOZ_TOOLS=(location of the bin directory containing your
|
||||
GNU tools. The build looks for MOZ_TOOLS\bin\gmake.exe,
|
||||
so make sure that the MOZ_TOOLS environment variable
|
||||
is set correctly.)
|
||||
set PATH=%MOZ_TOOLS%\bin;%PATH%
|
||||
set TEMP=(your temp directory)
|
||||
set TMP=(your temp directory)
|
||||
set VERBOSE=1
|
||||
|
||||
Unset the following environment variables:
|
||||
set MOZ_LI=
|
||||
set MOZ_LITE=
|
||||
set MOZ_MEDIUM=
|
||||
|
||||
2. Enter the following commands to build the SDK:
|
||||
cd mozilla\directory
|
||||
nmake -f ldapsdk.mak
|
||||
|
||||
The SDK will be built and copied into the following directories:
|
||||
mozilla\dist\public\ldap - header files
|
||||
mozilla\dist\Win32_d.obj\bin - LDAP API DLL (nsldap32.dll)
|
||||
mozilla\dist\Win32_d.obj\lib - import and static libraries
|
||||
(nsldap32.lib, nsldap32s.lib)
|
||||
|
||||
Notes:
|
||||
This build process does not use Visual C++ generated project files.
|
||||
(Reasons for this include size, maintainability, and the long-term
|
||||
desire to use tools like gmake or plug-and-play developer tools.)
|
||||
This does not preclude you from using the Visual C++ IDE or its debugger.
|
||||
|
||||
Common Build Problems:
|
||||
If the build fails with the message "'.\WIN32' unexpected",
|
||||
you didn't set the environment variables correctly. Check for
|
||||
extra spaces at the end of the set statements (this is a
|
||||
common problem when copying and pasting commands).
|
||||
If directory-related errors are reported, check the full path to
|
||||
the source for any spaces. Make sure that when you originally extracted
|
||||
the source files, you used a utility that understands long filenames.
|
||||
If you are not sure if your extraction utility understands long filenames,
|
||||
use Info-Zip. (You can get this from ftp://ftp.cdrom.com/pub/infozip.)
|
||||
|
||||
|
||||
--------------------------------------------------------
|
||||
Copyright (c) 1998 Netscape Communications Corporation.
|
||||
(http://home.netscape.com/misc/contact_info.html)
|
||||
|
||||
34
mozilla/directory/c-sdk/ldap/Makefile.client
Normal file
34
mozilla/directory/c-sdk/ldap/Makefile.client
Normal file
@@ -0,0 +1,34 @@
|
||||
DEPTH = ../../..
|
||||
NSPR_TREE = ../../../nsprpub
|
||||
MOD_DEPTH = ../../../nsprpub
|
||||
|
||||
SRCDIRS = build include libraries
|
||||
|
||||
include $(NSPR_TREE)/config/rules.mk
|
||||
|
||||
all export:: FORCE
|
||||
@for i in $(SRCDIRS); do \
|
||||
echo " cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) export"; \
|
||||
( cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) export ); \
|
||||
done
|
||||
|
||||
libs install:: FORCE
|
||||
@for i in $(SRCDIRS); do \
|
||||
echo "cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) install"; \
|
||||
( cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) install ); \
|
||||
done
|
||||
|
||||
clean clobber:: FORCE
|
||||
@for i in $(SRCDIRS); do \
|
||||
echo "cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) clean"; \
|
||||
( cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) clean ); \
|
||||
done
|
||||
|
||||
realclean clobber_all:: FORCE
|
||||
@for i in $(SRCDIRS); do \
|
||||
echo "cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) realclean"; \
|
||||
( cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) realclean ); \
|
||||
done
|
||||
|
||||
FORCE:
|
||||
|
||||
34
mozilla/directory/c-sdk/ldap/Makefile.in
Normal file
34
mozilla/directory/c-sdk/ldap/Makefile.in
Normal file
@@ -0,0 +1,34 @@
|
||||
DEPTH = ../../..
|
||||
srcdir = @srcdir@
|
||||
ldaptopsrcdir = @top_srcdir@
|
||||
|
||||
SRCDIRS = build include libraries
|
||||
DIRS = $(SRCDIRS)
|
||||
|
||||
DIST_GARBAGE = config.cache config.log config.status
|
||||
|
||||
include build/autoconf.mk
|
||||
|
||||
all::
|
||||
$(MAKE) export
|
||||
$(MAKE) install
|
||||
|
||||
install::
|
||||
+$(LOOP_OVER_DIRS)
|
||||
|
||||
include $(NSPR_TREE)/config/rules.mk
|
||||
|
||||
|
||||
# Delete config/autoconf.mk last because it is included by every makefile.
|
||||
distclean::
|
||||
$(RM) -f build/autoconf.mk build/nspr-autoconf.mk
|
||||
|
||||
# dummy target to allow platforms without a compiler-based depend (like GCC
|
||||
# has) to call "make depend" here and not fail, at the cost of actual
|
||||
# dependencies on such builds possibly being incorrect. A nasty hack, but
|
||||
# this build system is going away soon.
|
||||
#
|
||||
depend:
|
||||
|
||||
FORCE:
|
||||
|
||||
31
mozilla/directory/c-sdk/ldap/README.configure
Normal file
31
mozilla/directory/c-sdk/ldap/README.configure
Normal file
@@ -0,0 +1,31 @@
|
||||
The autoconf files here are the barest shim to allow the LDAP C SDK to
|
||||
build with autoconf, including in a --objdir. These are really just a
|
||||
wrapper around the existing (NSPR-based) build-system; they propagate
|
||||
very little information from the autconf command line or environment.
|
||||
The Makefile.in files are all just slightly edited forks of the
|
||||
Makefile.client files. These files are:
|
||||
|
||||
Makefile.in
|
||||
configure
|
||||
configure.in
|
||||
build/Makefile.in
|
||||
build/autoconf.mk.in
|
||||
build/my_overrides.mk
|
||||
include/Makefile.in
|
||||
libraries/Makefile.in
|
||||
libraries/liblber/Makefile.in
|
||||
libraries/libldap/Makefile.in
|
||||
|
||||
Note that as in the main browser tree, I've checked in the (generated)
|
||||
configure script so that autoconf isn't a prerequisite to build.
|
||||
|
||||
At some point after the most current LDAP SDK code lands in Mozilla,
|
||||
then perhaps it will be worth spending some time creating a more
|
||||
correctly autoconfified build process that isn't just a shim and
|
||||
doesn't depend on NSPR.
|
||||
|
||||
Comments to <news://news.mozilla.org/netscape.public.mozilla.directory>,
|
||||
please.
|
||||
|
||||
Dan Mosedale
|
||||
<dmose@mozilla.org>
|
||||
28
mozilla/directory/c-sdk/ldap/build/Makefile.client
Normal file
28
mozilla/directory/c-sdk/ldap/build/Makefile.client
Normal file
@@ -0,0 +1,28 @@
|
||||
DEPTH = ../../../..
|
||||
MOD_DEPTH = ../../../../nsprpub
|
||||
NSPR_TREE = ../../../../nsprpub
|
||||
|
||||
CSRCS = dirver.c
|
||||
|
||||
include $(NSPR_TREE)/config/rules.mk
|
||||
|
||||
TARGETS = $(OBJDIR)/dirver$(BIN_SUFFIX)
|
||||
|
||||
GARBAGE += $(TARGETS)
|
||||
|
||||
ifeq ($(OS_ARCH), OS2)
|
||||
$(OBJS) = $(addprefix $(OBJDIR)/, $(CSRCS:.c=.o))
|
||||
|
||||
$(TARGETS): $(OBJS)
|
||||
@$(MAKE_OBJDIR)
|
||||
$(LINK_EXE) -OUT:$@ $(OBJS)
|
||||
endif
|
||||
|
||||
export:: $(TARGETS)
|
||||
$(INSTALL) -m 555 $(TARGETS) $(DIST)/bin
|
||||
|
||||
install:: export
|
||||
|
||||
clean::
|
||||
rm -rf $(OBJDIR_NAME)
|
||||
|
||||
24
mozilla/directory/c-sdk/ldap/build/Makefile.in
Normal file
24
mozilla/directory/c-sdk/ldap/build/Makefile.in
Normal file
@@ -0,0 +1,24 @@
|
||||
DEPTH = ../../../..
|
||||
srcdir = @srcdir@
|
||||
ldaptopsrcdir = @top_srcdir@
|
||||
|
||||
INTERNAL_TOOLS = 1
|
||||
|
||||
CSRCS = dirver.c
|
||||
|
||||
include autoconf.mk
|
||||
|
||||
PROGRAM = dirver$(BIN_SUFFIX)
|
||||
|
||||
GARBAGE += $(TARGETS)
|
||||
|
||||
include $(NSPR_TREE)/config/rules.mk
|
||||
|
||||
export:: $(PROGRAM)
|
||||
$(INSTALL) -m 555 $(PROGRAM) $(DIST)/bin
|
||||
|
||||
install:: export
|
||||
|
||||
clean::
|
||||
-rm -rf $(filter-out . ..,$(OBJDIR_NAME))
|
||||
|
||||
60
mozilla/directory/c-sdk/ldap/build/autoconf.mk.in
Normal file
60
mozilla/directory/c-sdk/ldap/build/autoconf.mk.in
Normal file
@@ -0,0 +1,60 @@
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org LDAP SDK autoconf glue.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Commmunications Corp. Portions created by Netscape are
|
||||
# Copyright (C) 2000, Netscape Communications Corp. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Mosedale <dmose@mozilla.org>
|
||||
#
|
||||
|
||||
# this is used to override DIST and VPATH
|
||||
#
|
||||
NSPR_MY_OVERRIDES_MK = $(ldaptopsrcdir)/build/my_overrides.mk
|
||||
|
||||
# common to all the ldap sdk makefiles
|
||||
#
|
||||
NSPR_TREE = $(ldaptopsrcdir)/../../../nsprpub
|
||||
topsrcdir = $(ldaptopsrcdir)/../../../nsprpub
|
||||
|
||||
# various stuff from the ldap sdk documentation
|
||||
#
|
||||
MOZILLA_CLIENT = 1
|
||||
NO_MDUPDATE = 1
|
||||
MOZ_LDAP_SDK = 1
|
||||
MOZ_LI =
|
||||
MOZ_LITE =
|
||||
MOZ_MEDIUM =
|
||||
NO_SECURITY =
|
||||
|
||||
# This is where OS/2 Mozilla Client build DIST & LIB .
|
||||
# while DIST is where Security build put it LIB & INCLUDE
|
||||
MOZ_DIST = $(ldaptopsrcdir)/../../../dist
|
||||
|
||||
|
||||
# NSPR now uses autoconf by default.
|
||||
#
|
||||
include $(DEPTH)/directory/c-sdk/ldap/build/nspr-autoconf.mk
|
||||
MOD_DEPTH = $(DEPTH)
|
||||
VPATH = $(srcdir)
|
||||
DIST = $(DEPTH)/dist
|
||||
|
||||
# BIN_SUFFIX not getting defined for os/2
|
||||
ifeq ($(OS_ARCH),OS2)
|
||||
BIN_SUFFIX = .exe
|
||||
LINK = -ilink
|
||||
endif
|
||||
ifeq ($(OS_ARCH),WINNT)
|
||||
BIN_SUFFIX = .exe
|
||||
endif
|
||||
217
mozilla/directory/c-sdk/ldap/build/dirver.c
Normal file
217
mozilla/directory/c-sdk/ldap/build/dirver.c
Normal file
@@ -0,0 +1,217 @@
|
||||
/*--------------------------------------------------------------------------
|
||||
/ Copyright (C) 1996, 1997 Netscape Communications Corporation
|
||||
/ --------------------------------------------------------------------------
|
||||
/
|
||||
/ Name: Netscape File Version Generator
|
||||
/ Platforms: WIN32
|
||||
/ ......................................................................
|
||||
/ This program generates an ascii format of the 64-bit FILEVERSION
|
||||
/ resource identifier used by Windows executable binaries.
|
||||
/
|
||||
/ Usage Syntax:
|
||||
/ fversion <major.minor.patch> [mm/dd/yyyy] [outfile]
|
||||
/ If date is not specified, the current GMT date is used. yyyy must be
|
||||
/ greater than 1980
|
||||
/
|
||||
/ Usage Example:
|
||||
/ fversion 3.0.0
|
||||
/ fversion 6.5.4 1/30/2001
|
||||
/ fversion 6.5.4 1/30/2001 fileversion.h
|
||||
/
|
||||
/ see http://ntsbuild/sd/30ver.htm for specification
|
||||
/ ......................................................................
|
||||
/ Revision History:
|
||||
/ 01-30-97 Initial Version, Andy Hakim (ahakim@netscape.com)
|
||||
/ --------------------------------------------------------------------------*/
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#ifdef macintosh
|
||||
#include <console.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
unsigned _CalcVersion(unsigned nMajor, unsigned nMinor, unsigned nPatch)
|
||||
{
|
||||
unsigned nVersion;
|
||||
nVersion = nMajor;
|
||||
nVersion <<= 5;
|
||||
nVersion += nMinor;
|
||||
nVersion <<= 7;
|
||||
nVersion += nPatch;
|
||||
nVersion &= 0xFFFF;
|
||||
return(nVersion);
|
||||
}
|
||||
|
||||
|
||||
static void _GetVersions(char *szVer, unsigned *nMajor, unsigned *nMinor,
|
||||
unsigned *nPatch)
|
||||
{
|
||||
char szVersion[128];
|
||||
unsigned nReturn = 0;
|
||||
char *szToken;
|
||||
*nMajor = 0;
|
||||
*nMinor = 0;
|
||||
*nPatch = 0;
|
||||
|
||||
strcpy(szVersion, szVer);
|
||||
if(szToken = strtok(szVersion, ".\n"))
|
||||
{
|
||||
*nMajor = atoi(szToken);
|
||||
if(szToken = strtok(NULL, ".\n"))
|
||||
{
|
||||
*nMinor = atoi(szToken);
|
||||
if(szToken = strtok(NULL, ".\n"))
|
||||
{
|
||||
*nPatch = atoi(szToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned _CalcBuildDate(unsigned nYear, unsigned nMonth, unsigned nDay)
|
||||
{
|
||||
unsigned nBuildDate = 0;
|
||||
|
||||
if(nYear < 1900) /* they really mean 1900 + nYear */
|
||||
nYear += 1900;
|
||||
|
||||
nYear -= 1980;
|
||||
nBuildDate = nYear;
|
||||
/*
|
||||
nBuildDate <<= 5;
|
||||
*/
|
||||
nBuildDate <<= 4;
|
||||
nBuildDate += nMonth;
|
||||
/* nBuildDate <<= 4; */
|
||||
nBuildDate <<= 5;
|
||||
nBuildDate += nDay;
|
||||
nBuildDate &= 0xFFFF;
|
||||
return(nBuildDate);
|
||||
}
|
||||
|
||||
|
||||
|
||||
unsigned _GenBuildDate(char *szBuildDate)
|
||||
{
|
||||
unsigned nReturn = 0;
|
||||
char *szToken;
|
||||
unsigned nYear = 0;
|
||||
unsigned nMonth = 0;
|
||||
unsigned nDay = 0;
|
||||
|
||||
if((szBuildDate) && (strchr(szBuildDate, '\\') || strchr(szBuildDate, '/')) && (szToken = strtok(szBuildDate, "\\/")))
|
||||
{
|
||||
nMonth = atoi(szToken);
|
||||
nMonth--; /* use months in the range [0..11], as in struct tm */
|
||||
if(szToken = strtok(NULL, "\\/"))
|
||||
{
|
||||
nDay = atoi(szToken);
|
||||
if(szToken = strtok(NULL, "\\/"))
|
||||
{
|
||||
nYear = atoi(szToken);
|
||||
if(nYear < 70) { /* handle 2 digit years like (20)00 */
|
||||
nYear += 100;
|
||||
}
|
||||
else if (nYear < 100) {
|
||||
}
|
||||
else if (nYear > 1900){
|
||||
nYear -= 1900;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
struct tm *newtime;
|
||||
time_t ltime;
|
||||
|
||||
time( <ime );
|
||||
|
||||
/* Obtain coordinated universal time: */
|
||||
newtime = gmtime( <ime );
|
||||
nYear = newtime->tm_year;
|
||||
nMonth = newtime->tm_mon;
|
||||
nDay = newtime->tm_mday;
|
||||
}
|
||||
|
||||
nReturn = _CalcBuildDate(nYear, nMonth, nDay);
|
||||
return(nReturn);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void ShowHelp(char *szFilename)
|
||||
{
|
||||
char szTemp[128];
|
||||
fprintf(stdout, "%s: Generates ascii format #define for FILEVERSION\n", szFilename);
|
||||
fprintf(stdout, " resource identifier used by Windows executable binaries.\n");
|
||||
fprintf(stdout, "\n");
|
||||
fprintf(stdout, "Usage: %s <major.minor.patch> [mm/dd/yy] [outfile]\n", szFilename);
|
||||
fprintf(stdout, "\n");
|
||||
fprintf(stdout, "Examples:\n");
|
||||
fprintf(stdout, "%s 3.0.0\n", szFilename);
|
||||
fprintf(stdout, "%s 6.5.2 1/30/2001\n", szFilename);
|
||||
fprintf(stdout, "%s 6.5.2 1/30/2001 fileversion.h\n", szFilename);
|
||||
}
|
||||
|
||||
|
||||
|
||||
main(int nArgc, char **lpArgv)
|
||||
{
|
||||
int nReturn = 0;
|
||||
unsigned nVersion = 0;
|
||||
unsigned nBuildDate = 0;
|
||||
|
||||
#ifdef macintosh
|
||||
nArgc = ccommand( &lpArgv );
|
||||
#endif
|
||||
|
||||
if(nArgc < 2)
|
||||
{
|
||||
ShowHelp(lpArgv[0]);
|
||||
nReturn = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
char *szVersion = NULL;
|
||||
char *szDate = NULL;
|
||||
char *szOutput = NULL;
|
||||
FILE *f = stdout;
|
||||
unsigned nMajor = 0;
|
||||
unsigned nMinor = 0;
|
||||
unsigned nPatch = 0;
|
||||
|
||||
szVersion = (char *)lpArgv[1];
|
||||
szDate = (char *)lpArgv[2];
|
||||
szOutput = (char *)lpArgv[3];
|
||||
_GetVersions( szVersion, &nMajor, &nMinor, &nPatch );
|
||||
nVersion = _CalcVersion(nMajor, nMinor, nPatch);
|
||||
nBuildDate = _GenBuildDate(szDate);
|
||||
|
||||
if(nArgc >= 4) {
|
||||
if (( f = fopen(szOutput, "w")) == NULL ) {
|
||||
perror( szOutput );
|
||||
exit( 1 );
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(f, "#define VI_PRODUCTVERSION %u.%u\n", nMajor, nMinor);
|
||||
fprintf(f, "#define PRODUCTTEXT \"%s\"\n", szVersion );
|
||||
fprintf(f, "#define VI_FILEVERSION %u, 0, 0,%u\n",
|
||||
nVersion, nBuildDate);
|
||||
fprintf(f, "#define VI_FileVersion \"%s Build %u\\0\"\n",
|
||||
szVersion, nBuildDate);
|
||||
|
||||
if(nArgc >= 4)
|
||||
fclose(f);
|
||||
nReturn = (nVersion && !nBuildDate);
|
||||
}
|
||||
return(nReturn);
|
||||
}
|
||||
|
||||
23
mozilla/directory/c-sdk/ldap/build/my_overrides.mk
Normal file
23
mozilla/directory/c-sdk/ldap/build/my_overrides.mk
Normal file
@@ -0,0 +1,23 @@
|
||||
#
|
||||
# The contents of this file are subject to the Mozilla Public
|
||||
# License Version 1.1 (the "License"); you may not use this file
|
||||
# except in compliance with the License. You may obtain a copy of
|
||||
# the License at http://www.mozilla.org/MPL/
|
||||
#
|
||||
# Software distributed under the License is distributed on an "AS
|
||||
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
# implied. See the License for the specific language governing
|
||||
# rights and limitations under the License.
|
||||
#
|
||||
# The Original Code is mozilla.org LDAP SDK autoconf glue.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape
|
||||
# Commmunications Corp. Portions created by Netscape are
|
||||
# Copyright (C) 2000, Netscape Communications Corp. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Dan Mosedale <dmose@mozilla.org>
|
||||
#
|
||||
|
||||
DIST = $(DEPTH)/dist
|
||||
VPATH = $(srcdir)
|
||||
786
mozilla/directory/c-sdk/ldap/configure
vendored
Executable file
786
mozilla/directory/c-sdk/ldap/configure
vendored
Executable file
@@ -0,0 +1,786 @@
|
||||
#! /bin/sh
|
||||
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated automatically using autoconf version 2.13
|
||||
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
|
||||
#
|
||||
# This configure script is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy, distribute and modify it.
|
||||
|
||||
# Defaults:
|
||||
ac_help=
|
||||
ac_default_prefix=/usr/local
|
||||
# Any additions from configure.in:
|
||||
|
||||
# Initialize some variables set by options.
|
||||
# The variables have the same names as the options, with
|
||||
# dashes changed to underlines.
|
||||
build=NONE
|
||||
cache_file=./config.cache
|
||||
exec_prefix=NONE
|
||||
host=NONE
|
||||
no_create=
|
||||
nonopt=NONE
|
||||
no_recursion=
|
||||
prefix=NONE
|
||||
program_prefix=NONE
|
||||
program_suffix=NONE
|
||||
program_transform_name=s,x,x,
|
||||
silent=
|
||||
site=
|
||||
srcdir=
|
||||
target=NONE
|
||||
verbose=
|
||||
x_includes=NONE
|
||||
x_libraries=NONE
|
||||
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'
|
||||
|
||||
# Initialize some other variables.
|
||||
subdirs=
|
||||
MFLAGS= MAKEFLAGS=
|
||||
SHELL=${CONFIG_SHELL-/bin/sh}
|
||||
# Maximum number of lines to put in a shell here document.
|
||||
ac_max_here_lines=12
|
||||
|
||||
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
|
||||
|
||||
case "$ac_option" in
|
||||
-*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
|
||||
*) ac_optarg= ;;
|
||||
esac
|
||||
|
||||
# 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 ;;
|
||||
-build=* | --build=* | --buil=* | --bui=* | --bu=*)
|
||||
build="$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" ;;
|
||||
|
||||
-datadir | --datadir | --datadi | --datad | --data | --dat | --da)
|
||||
ac_prev=datadir ;;
|
||||
-datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
|
||||
| --da=*)
|
||||
datadir="$ac_optarg" ;;
|
||||
|
||||
-disable-* | --disable-*)
|
||||
ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
|
||||
# Reject names that are not valid shell variable names.
|
||||
if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
|
||||
{ echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
|
||||
fi
|
||||
ac_feature=`echo $ac_feature| sed 's/-/_/g'`
|
||||
eval "enable_${ac_feature}=no" ;;
|
||||
|
||||
-enable-* | --enable-*)
|
||||
ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
|
||||
# Reject names that are not valid shell variable names.
|
||||
if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
|
||||
{ echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
|
||||
fi
|
||||
ac_feature=`echo $ac_feature| sed 's/-/_/g'`
|
||||
case "$ac_option" in
|
||||
*=*) ;;
|
||||
*) 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)
|
||||
# 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 << EOF
|
||||
Usage: configure [options] [host]
|
||||
Options: [defaults in brackets after descriptions]
|
||||
Configuration:
|
||||
--cache-file=FILE cache test results in FILE
|
||||
--help print this message
|
||||
--no-create do not create output files
|
||||
--quiet, --silent do not print \`checking...' messages
|
||||
--version print the version of autoconf that created configure
|
||||
Directory and file names:
|
||||
--prefix=PREFIX install architecture-independent files in PREFIX
|
||||
[$ac_default_prefix]
|
||||
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
|
||||
[same as prefix]
|
||||
--bindir=DIR user executables in DIR [EPREFIX/bin]
|
||||
--sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
|
||||
--libexecdir=DIR program executables in DIR [EPREFIX/libexec]
|
||||
--datadir=DIR read-only architecture-independent data in DIR
|
||||
[PREFIX/share]
|
||||
--sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
|
||||
--sharedstatedir=DIR modifiable architecture-independent data in DIR
|
||||
[PREFIX/com]
|
||||
--localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
|
||||
--libdir=DIR object code libraries in DIR [EPREFIX/lib]
|
||||
--includedir=DIR C header files in DIR [PREFIX/include]
|
||||
--oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
|
||||
--infodir=DIR info documentation in DIR [PREFIX/info]
|
||||
--mandir=DIR man documentation in DIR [PREFIX/man]
|
||||
--srcdir=DIR find the sources in DIR [configure dir or ..]
|
||||
--program-prefix=PREFIX prepend PREFIX to installed program names
|
||||
--program-suffix=SUFFIX append SUFFIX to installed program names
|
||||
--program-transform-name=PROGRAM
|
||||
run sed PROGRAM on installed program names
|
||||
EOF
|
||||
cat << EOF
|
||||
Host type:
|
||||
--build=BUILD configure for building on BUILD [BUILD=HOST]
|
||||
--host=HOST configure for HOST [guessed]
|
||||
--target=TARGET configure for TARGET [TARGET=HOST]
|
||||
Features and packages:
|
||||
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
|
||||
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
|
||||
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
||||
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
|
||||
--x-includes=DIR X include files are in DIR
|
||||
--x-libraries=DIR X library files are in DIR
|
||||
EOF
|
||||
if test -n "$ac_help"; then
|
||||
echo "--enable and --with options recognized:$ac_help"
|
||||
fi
|
||||
exit 0 ;;
|
||||
|
||||
-host | --host | --hos | --ho)
|
||||
ac_prev=host ;;
|
||||
-host=* | --host=* | --hos=* | --ho=*)
|
||||
host="$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)
|
||||
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 ;;
|
||||
-target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
|
||||
target="$ac_optarg" ;;
|
||||
|
||||
-v | -verbose | --verbose | --verbos | --verbo | --verb)
|
||||
verbose=yes ;;
|
||||
|
||||
-version | --version | --versio | --versi | --vers)
|
||||
echo "configure generated by autoconf version 2.13"
|
||||
exit 0 ;;
|
||||
|
||||
-with-* | --with-*)
|
||||
ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
|
||||
# Reject names that are not valid shell variable names.
|
||||
if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
|
||||
{ echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
|
||||
fi
|
||||
ac_package=`echo $ac_package| sed 's/-/_/g'`
|
||||
case "$ac_option" in
|
||||
*=*) ;;
|
||||
*) ac_optarg=yes ;;
|
||||
esac
|
||||
eval "with_${ac_package}='$ac_optarg'" ;;
|
||||
|
||||
-without-* | --without-*)
|
||||
ac_package=`echo $ac_option|sed -e 's/-*without-//'`
|
||||
# Reject names that are not valid shell variable names.
|
||||
if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
|
||||
{ echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
|
||||
fi
|
||||
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 "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
|
||||
;;
|
||||
|
||||
*)
|
||||
if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
|
||||
echo "configure: warning: $ac_option: invalid host type" 1>&2
|
||||
fi
|
||||
if test "x$nonopt" != xNONE; then
|
||||
{ echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
|
||||
fi
|
||||
nonopt="$ac_option"
|
||||
;;
|
||||
|
||||
esac
|
||||
done
|
||||
|
||||
if test -n "$ac_prev"; then
|
||||
{ echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
|
||||
fi
|
||||
|
||||
trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
|
||||
|
||||
# File descriptor usage:
|
||||
# 0 standard input
|
||||
# 1 file creation
|
||||
# 2 errors and warnings
|
||||
# 3 some systems may open it to /dev/tty
|
||||
# 4 used on the Kubota Titan
|
||||
# 6 checking for... messages and results
|
||||
# 5 compiler messages saved in config.log
|
||||
if test "$silent" = yes; then
|
||||
exec 6>/dev/null
|
||||
else
|
||||
exec 6>&1
|
||||
fi
|
||||
exec 5>./config.log
|
||||
|
||||
echo "\
|
||||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
" 1>&5
|
||||
|
||||
# Strip out --no-create and --no-recursion so they do not pile up.
|
||||
# Also quote any args containing shell metacharacters.
|
||||
ac_configure_args=
|
||||
for ac_arg
|
||||
do
|
||||
case "$ac_arg" in
|
||||
-no-create | --no-create | --no-creat | --no-crea | --no-cre \
|
||||
| --no-cr | --no-c) ;;
|
||||
-no-recursion | --no-recursion | --no-recursio | --no-recursi \
|
||||
| --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
|
||||
*" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
|
||||
ac_configure_args="$ac_configure_args '$ac_arg'" ;;
|
||||
*) ac_configure_args="$ac_configure_args $ac_arg" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# NLS nuisances.
|
||||
# Only set these to C if already set. These must not be set unconditionally
|
||||
# because not all systems understand e.g. LANG=C (notably SCO).
|
||||
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
|
||||
# Non-C LC_CTYPE values break the ctype check.
|
||||
if test "${LANG+set}" = set; then LANG=C; export LANG; fi
|
||||
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
|
||||
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
|
||||
if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
|
||||
|
||||
# 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
|
||||
|
||||
# A filename unique to this package, relative to the directory that
|
||||
# configure is in, which we can look for to find out if srcdir is correct.
|
||||
ac_unique_file=build/dirver.c
|
||||
|
||||
# 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_prog=$0
|
||||
ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
|
||||
test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
|
||||
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 "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
|
||||
else
|
||||
{ echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
|
||||
fi
|
||||
fi
|
||||
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
|
||||
|
||||
# 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 "loading site script $ac_site_file"
|
||||
. "$ac_site_file"
|
||||
fi
|
||||
done
|
||||
|
||||
if test -r "$cache_file"; then
|
||||
echo "loading cache $cache_file"
|
||||
. $cache_file
|
||||
else
|
||||
echo "creating cache $cache_file"
|
||||
> $cache_file
|
||||
fi
|
||||
|
||||
ac_ext=c
|
||||
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
|
||||
ac_cpp='$CPP $CPPFLAGS'
|
||||
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
|
||||
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
|
||||
cross_compiling=$ac_cv_prog_cc_cross
|
||||
|
||||
ac_exeext=
|
||||
ac_objext=o
|
||||
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
|
||||
# Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
|
||||
if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
|
||||
ac_n= ac_c='
|
||||
' ac_t=' '
|
||||
else
|
||||
ac_n=-n ac_c= ac_t=
|
||||
fi
|
||||
else
|
||||
ac_n= ac_c='\c' ac_t=
|
||||
fi
|
||||
|
||||
|
||||
|
||||
MAKEFILES="
|
||||
Makefile
|
||||
build/Makefile
|
||||
build/autoconf.mk
|
||||
include/Makefile
|
||||
libraries/Makefile
|
||||
libraries/libldap/Makefile
|
||||
libraries/liblber/Makefile
|
||||
"
|
||||
trap '' 1 2 15
|
||||
cat > confcache <<\EOF
|
||||
# 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. It is not useful on other systems.
|
||||
# If it contains results you don't want to keep, you may remove or edit it.
|
||||
#
|
||||
# By default, configure uses ./config.cache as the cache file,
|
||||
# creating it if it does not exist already. You can give configure
|
||||
# the --cache-file=FILE option to use a different cache file; that is
|
||||
# what configure does when it calls configure scripts in
|
||||
# subdirectories, so they share the cache.
|
||||
# Giving --cache-file=/dev/null disables caching, for debugging configure.
|
||||
# config.status only pays attention to the cache file if you give it the
|
||||
# --recheck option to rerun configure.
|
||||
#
|
||||
EOF
|
||||
# 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 \
|
||||
-e "s/'/'\\\\''/g" \
|
||||
-e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
|
||||
;;
|
||||
*)
|
||||
# `set' quotes correctly as required by POSIX, so do not add quotes.
|
||||
sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
|
||||
;;
|
||||
esac >> confcache
|
||||
if cmp -s $cache_file confcache; then
|
||||
:
|
||||
else
|
||||
if test -w $cache_file; then
|
||||
echo "updating cache $cache_file"
|
||||
cat confcache > $cache_file
|
||||
else
|
||||
echo "not updating unwritable cache $cache_file"
|
||||
fi
|
||||
fi
|
||||
rm -f confcache
|
||||
|
||||
trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
|
||||
|
||||
test "x$prefix" = xNONE && prefix=$ac_default_prefix
|
||||
# Let make expand exec_prefix.
|
||||
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
|
||||
|
||||
# Any assignment to VPATH causes Sun make to only execute
|
||||
# the first set of double-colon rules, so remove it if not needed.
|
||||
# If there is a colon in the path, we need to keep it.
|
||||
if test "x$srcdir" = x.; then
|
||||
ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
|
||||
fi
|
||||
|
||||
trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
|
||||
|
||||
# Transform confdefs.h into DEFS.
|
||||
# Protect against shell expansion while executing Makefile rules.
|
||||
# Protect against Makefile macro expansion.
|
||||
cat > conftest.defs <<\EOF
|
||||
s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
|
||||
s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
|
||||
s%\[%\\&%g
|
||||
s%\]%\\&%g
|
||||
s%\$%$$%g
|
||||
EOF
|
||||
DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
|
||||
rm -f conftest.defs
|
||||
|
||||
|
||||
# Without the "./", some shells look in PATH for config.status.
|
||||
: ${CONFIG_STATUS=./config.status}
|
||||
|
||||
echo creating $CONFIG_STATUS
|
||||
rm -f $CONFIG_STATUS
|
||||
cat > $CONFIG_STATUS <<EOF
|
||||
#! /bin/sh
|
||||
# Generated automatically by configure.
|
||||
# Run this file to recreate the current configuration.
|
||||
# This directory was configured as follows,
|
||||
# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
|
||||
#
|
||||
# $0 $ac_configure_args
|
||||
#
|
||||
# Compiler output produced by configure, useful for debugging
|
||||
# configure, is in ./config.log if it exists.
|
||||
|
||||
ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
|
||||
for ac_option
|
||||
do
|
||||
case "\$ac_option" in
|
||||
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
|
||||
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
|
||||
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
|
||||
-version | --version | --versio | --versi | --vers | --ver | --ve | --v)
|
||||
echo "$CONFIG_STATUS generated by autoconf version 2.13"
|
||||
exit 0 ;;
|
||||
-help | --help | --hel | --he | --h)
|
||||
echo "\$ac_cs_usage"; exit 0 ;;
|
||||
*) echo "\$ac_cs_usage"; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
ac_given_srcdir=$srcdir
|
||||
|
||||
trap 'rm -fr `echo "$MAKEFILES" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<EOF
|
||||
|
||||
# Protect against being on the right side of a sed subst in config.status.
|
||||
sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
|
||||
s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
|
||||
$ac_vpsub
|
||||
$extrasub
|
||||
s%@SHELL@%$SHELL%g
|
||||
s%@CFLAGS@%$CFLAGS%g
|
||||
s%@CPPFLAGS@%$CPPFLAGS%g
|
||||
s%@CXXFLAGS@%$CXXFLAGS%g
|
||||
s%@FFLAGS@%$FFLAGS%g
|
||||
s%@DEFS@%$DEFS%g
|
||||
s%@LDFLAGS@%$LDFLAGS%g
|
||||
s%@LIBS@%$LIBS%g
|
||||
s%@exec_prefix@%$exec_prefix%g
|
||||
s%@prefix@%$prefix%g
|
||||
s%@program_transform_name@%$program_transform_name%g
|
||||
s%@bindir@%$bindir%g
|
||||
s%@sbindir@%$sbindir%g
|
||||
s%@libexecdir@%$libexecdir%g
|
||||
s%@datadir@%$datadir%g
|
||||
s%@sysconfdir@%$sysconfdir%g
|
||||
s%@sharedstatedir@%$sharedstatedir%g
|
||||
s%@localstatedir@%$localstatedir%g
|
||||
s%@libdir@%$libdir%g
|
||||
s%@includedir@%$includedir%g
|
||||
s%@oldincludedir@%$oldincludedir%g
|
||||
s%@infodir@%$infodir%g
|
||||
s%@mandir@%$mandir%g
|
||||
|
||||
CEOF
|
||||
EOF
|
||||
|
||||
cat >> $CONFIG_STATUS <<\EOF
|
||||
|
||||
# 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_cmds=90 # Maximum number of lines to put in a sed script.
|
||||
ac_file=1 # Number of current file.
|
||||
ac_beg=1 # First line for current file.
|
||||
ac_end=$ac_max_sed_cmds # 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" conftest.subs > conftest.s$ac_file
|
||||
else
|
||||
sed "${ac_end}q" conftest.subs > conftest.s$ac_file
|
||||
fi
|
||||
if test ! -s conftest.s$ac_file; then
|
||||
ac_more_lines=false
|
||||
rm -f conftest.s$ac_file
|
||||
else
|
||||
if test -z "$ac_sed_cmds"; then
|
||||
ac_sed_cmds="sed -f conftest.s$ac_file"
|
||||
else
|
||||
ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
|
||||
fi
|
||||
ac_file=`expr $ac_file + 1`
|
||||
ac_beg=$ac_end
|
||||
ac_end=`expr $ac_end + $ac_max_sed_cmds`
|
||||
fi
|
||||
done
|
||||
if test -z "$ac_sed_cmds"; then
|
||||
ac_sed_cmds=cat
|
||||
fi
|
||||
EOF
|
||||
|
||||
cat >> $CONFIG_STATUS <<EOF
|
||||
|
||||
CONFIG_FILES=\${CONFIG_FILES-"$MAKEFILES"}
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<\EOF
|
||||
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
|
||||
# Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
|
||||
case "$ac_file" in
|
||||
*:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
|
||||
ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
|
||||
*) ac_file_in="${ac_file}.in" ;;
|
||||
esac
|
||||
|
||||
# Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
|
||||
|
||||
# Remove last slash and all that follows it. Not all systems have dirname.
|
||||
ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
|
||||
if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
|
||||
# The file is in a subdirectory.
|
||||
test ! -d "$ac_dir" && mkdir "$ac_dir"
|
||||
ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
|
||||
# A "../" for each directory in $ac_dir_suffix.
|
||||
ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
|
||||
else
|
||||
ac_dir_suffix= ac_dots=
|
||||
fi
|
||||
|
||||
case "$ac_given_srcdir" in
|
||||
.) srcdir=.
|
||||
if test -z "$ac_dots"; then top_srcdir=.
|
||||
else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
|
||||
/*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
|
||||
*) # Relative path.
|
||||
srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
|
||||
top_srcdir="$ac_dots$ac_given_srcdir" ;;
|
||||
esac
|
||||
|
||||
|
||||
echo creating "$ac_file"
|
||||
rm -f "$ac_file"
|
||||
configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
|
||||
case "$ac_file" in
|
||||
*Makefile*) ac_comsub="1i\\
|
||||
# $configure_input" ;;
|
||||
*) ac_comsub= ;;
|
||||
esac
|
||||
|
||||
ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
|
||||
sed -e "$ac_comsub
|
||||
s%@configure_input@%$configure_input%g
|
||||
s%@srcdir@%$srcdir%g
|
||||
s%@top_srcdir@%$top_srcdir%g
|
||||
" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
|
||||
fi; done
|
||||
rm -f conftest.s*
|
||||
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<EOF
|
||||
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<\EOF
|
||||
|
||||
exit 0
|
||||
EOF
|
||||
chmod +x $CONFIG_STATUS
|
||||
rm -fr confdefs* $ac_clean_files
|
||||
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
|
||||
|
||||
|
||||
cp ../../../nsprpub/config/autoconf.mk build/nspr-autoconf.mk
|
||||
43
mozilla/directory/c-sdk/ldap/configure.in
Normal file
43
mozilla/directory/c-sdk/ldap/configure.in
Normal file
@@ -0,0 +1,43 @@
|
||||
dnl
|
||||
dnl The contents of this file are subject to the Mozilla Public
|
||||
dnl License Version 1.1 (the "License"); you may not use this file
|
||||
dnl except in compliance with the License. You may obtain a copy of
|
||||
dnl the License at http://www.mozilla.org/MPL/
|
||||
dnl
|
||||
dnl Software distributed under the License is distributed on an "AS
|
||||
dnl IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
dnl implied. See the License for the specific language governing
|
||||
dnl rights and limitations under the License.
|
||||
dnl
|
||||
dnl The Original Code is mozilla.org LDAP SDK autoconf glue.
|
||||
dnl
|
||||
dnl The Initial Developer of the Original Code is Netscape
|
||||
dnl Communications Corp. Portions created by Netscape are
|
||||
dnl Copyright (C) 2000, Netscape Communications Corp. All
|
||||
dnl Rights Reserved.
|
||||
dnl
|
||||
dnl Contributor(s): Dan Mosedale <dmose@mozilla.org>
|
||||
dnl
|
||||
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
AC_INIT(build/dirver.c)
|
||||
dnl Checks for programs.
|
||||
dnl Checks for libraries.
|
||||
dnl Checks for header files.
|
||||
dnl Checks for typedefs, structures, and compiler characteristics.
|
||||
dnl Checks for library functions.
|
||||
|
||||
dnl Generate output files
|
||||
dnl
|
||||
MAKEFILES="
|
||||
Makefile
|
||||
build/Makefile
|
||||
build/autoconf.mk
|
||||
include/Makefile
|
||||
libraries/Makefile
|
||||
libraries/libldap/Makefile
|
||||
libraries/liblber/Makefile
|
||||
"
|
||||
AC_OUTPUT([$MAKEFILES])
|
||||
|
||||
cp ../../../nsprpub/config/autoconf.mk build/nspr-autoconf.mk
|
||||
4
mozilla/directory/c-sdk/ldap/include/MANIFEST
Normal file
4
mozilla/directory/c-sdk/ldap/include/MANIFEST
Normal file
@@ -0,0 +1,4 @@
|
||||
disptmpl.h
|
||||
lber.h
|
||||
ldap.h
|
||||
srchpref.h
|
||||
52
mozilla/directory/c-sdk/ldap/include/Makefile.client
Normal file
52
mozilla/directory/c-sdk/ldap/include/Makefile.client
Normal file
@@ -0,0 +1,52 @@
|
||||
DEPTH = ../../../..
|
||||
MOD_DEPTH = ../../../../nsprpub
|
||||
NSPR_TREE = ../../../../nsprpub
|
||||
XPDIST = ../../../../dist
|
||||
|
||||
CHMOD = chmod
|
||||
RM = rm -f
|
||||
SED = sed
|
||||
|
||||
HEADERS = \
|
||||
disptmpl.h \
|
||||
lber.h \
|
||||
ldap.h \
|
||||
srchpref.h \
|
||||
$(NULL)
|
||||
|
||||
include $(NSPR_TREE)/config/rules.mk
|
||||
|
||||
GARBAGE += sdkver.h dirver.h
|
||||
|
||||
ETCDIR = $(DIST)/etc
|
||||
INCLUDEDIR = $(XPDIST)/public/ldap
|
||||
|
||||
DIR_VERSION := 2.0
|
||||
DIRSDK_VERSION := 1.0
|
||||
|
||||
ifeq ($(OS_ARCH), WINNT)
|
||||
# Is this correct?
|
||||
DIRVER_PATH = $(DEPTH)/netsite/ldap/build
|
||||
else
|
||||
DIRVER_PATH = $(DIST)/bin
|
||||
endif
|
||||
|
||||
DIRVER_PROG = $(DIRVER_PATH)/dirver$(BIN_SUFFIX)
|
||||
|
||||
###########################################################################
|
||||
|
||||
all export:: sdkver.h dirver.h FORCE
|
||||
$(INSTALL) $(INSTALLFLAGS) -m 644 $(HEADERS) $(INCLUDEDIR)
|
||||
$(INSTALL) $(INSTALLFLAGS) -m 644 $(HEADERS) $(DIST)/include
|
||||
|
||||
sdkver.h: $(DIRVER_PROG)
|
||||
@$< $(DIRSDK_VERSION) UseSystemDate $@
|
||||
|
||||
dirver.h: $(DIRVER_PROG)
|
||||
@$< $(DIR_VERSION) UseSystemDate $@
|
||||
|
||||
install:: export
|
||||
|
||||
clean::
|
||||
|
||||
FORCE:
|
||||
46
mozilla/directory/c-sdk/ldap/include/Makefile.in
Normal file
46
mozilla/directory/c-sdk/ldap/include/Makefile.in
Normal file
@@ -0,0 +1,46 @@
|
||||
DEPTH = ../../../..
|
||||
srcdir = @srcdir@
|
||||
ldaptopsrcdir = @top_srcdir@
|
||||
|
||||
CHMOD = chmod
|
||||
RM = rm -f
|
||||
SED = sed
|
||||
|
||||
HEADERS = \
|
||||
disptmpl.h \
|
||||
lber.h \
|
||||
ldap.h \
|
||||
srchpref.h \
|
||||
$(NULL)
|
||||
HEADERS := $(addprefix $(srcdir)/, $(HEADERS))
|
||||
|
||||
include ../build/autoconf.mk
|
||||
include $(NSPR_TREE)/config/rules.mk
|
||||
|
||||
GARBAGE += sdkver.h dirver.h
|
||||
|
||||
ETCDIR = $(DIST)/etc
|
||||
|
||||
DIR_VERSION := 2.0
|
||||
DIRSDK_VERSION := 1.0
|
||||
|
||||
DIRVER_PATH = $(DIST)/bin
|
||||
|
||||
DIRVER_PROG = $(DIRVER_PATH)/dirver$(BIN_SUFFIX)
|
||||
|
||||
###########################################################################
|
||||
|
||||
all export:: sdkver.h dirver.h FORCE
|
||||
$(INSTALL) $(INSTALLFLAGS) -m 644 $(HEADERS) $(DIST)/include/ldap
|
||||
|
||||
sdkver.h: $(DIRVER_PROG)
|
||||
@$< $(DIRSDK_VERSION) UseSystemDate $@
|
||||
|
||||
dirver.h: $(DIRVER_PROG)
|
||||
@$< $(DIR_VERSION) UseSystemDate $@
|
||||
|
||||
install:: export
|
||||
|
||||
clean::
|
||||
|
||||
FORCE:
|
||||
364
mozilla/directory/c-sdk/ldap/include/disptmpl.h
Normal file
364
mozilla/directory/c-sdk/ldap/include/disptmpl.h
Normal file
@@ -0,0 +1,364 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993, 1994 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*
|
||||
* disptmpl.h: display template library defines
|
||||
*/
|
||||
|
||||
#ifndef _DISPTMPL_H
|
||||
#define _DISPTMPL_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* calling conventions used by library */
|
||||
#ifndef LDAP_CALL
|
||||
#if defined( _WINDOWS ) || defined( _WIN32 )
|
||||
#define LDAP_C __cdecl
|
||||
#ifndef _WIN32
|
||||
#define __stdcall _far _pascal
|
||||
#define LDAP_CALLBACK _loadds
|
||||
#else
|
||||
#define LDAP_CALLBACK
|
||||
#endif /* _WIN32 */
|
||||
#define LDAP_PASCAL __stdcall
|
||||
#define LDAP_CALL LDAP_PASCAL
|
||||
#else /* _WINDOWS */
|
||||
#define LDAP_C
|
||||
#define LDAP_CALLBACK
|
||||
#define LDAP_PASCAL
|
||||
#define LDAP_CALL
|
||||
#endif /* _WINDOWS */
|
||||
#endif /* LDAP_CALL */
|
||||
|
||||
#define LDAP_TEMPLATE_VERSION 1
|
||||
|
||||
/*
|
||||
* general types of items (confined to most significant byte)
|
||||
*/
|
||||
#define LDAP_SYN_TYPE_TEXT 0x01000000L
|
||||
#define LDAP_SYN_TYPE_IMAGE 0x02000000L
|
||||
#define LDAP_SYN_TYPE_BOOLEAN 0x04000000L
|
||||
#define LDAP_SYN_TYPE_BUTTON 0x08000000L
|
||||
#define LDAP_SYN_TYPE_ACTION 0x10000000L
|
||||
|
||||
|
||||
/*
|
||||
* syntax options (confined to second most significant byte)
|
||||
*/
|
||||
#define LDAP_SYN_OPT_DEFER 0x00010000L
|
||||
|
||||
|
||||
/*
|
||||
* display template item syntax ids (defined by common agreement)
|
||||
* these are the valid values for the ti_syntaxid of the tmplitem
|
||||
* struct (defined below). A general type is encoded in the
|
||||
* most-significant 8 bits, and some options are encoded in the next
|
||||
* 8 bits. The lower 16 bits are reserved for the distinct types.
|
||||
*/
|
||||
#define LDAP_SYN_CASEIGNORESTR ( 1 | LDAP_SYN_TYPE_TEXT )
|
||||
#define LDAP_SYN_MULTILINESTR ( 2 | LDAP_SYN_TYPE_TEXT )
|
||||
#define LDAP_SYN_DN ( 3 | LDAP_SYN_TYPE_TEXT )
|
||||
#define LDAP_SYN_BOOLEAN ( 4 | LDAP_SYN_TYPE_BOOLEAN )
|
||||
#define LDAP_SYN_JPEGIMAGE ( 5 | LDAP_SYN_TYPE_IMAGE )
|
||||
#define LDAP_SYN_JPEGBUTTON ( 6 | LDAP_SYN_TYPE_BUTTON | LDAP_SYN_OPT_DEFER )
|
||||
#define LDAP_SYN_FAXIMAGE ( 7 | LDAP_SYN_TYPE_IMAGE )
|
||||
#define LDAP_SYN_FAXBUTTON ( 8 | LDAP_SYN_TYPE_BUTTON | LDAP_SYN_OPT_DEFER )
|
||||
#define LDAP_SYN_AUDIOBUTTON ( 9 | LDAP_SYN_TYPE_BUTTON | LDAP_SYN_OPT_DEFER )
|
||||
#define LDAP_SYN_TIME ( 10 | LDAP_SYN_TYPE_TEXT )
|
||||
#define LDAP_SYN_DATE ( 11 | LDAP_SYN_TYPE_TEXT )
|
||||
#define LDAP_SYN_LABELEDURL ( 12 | LDAP_SYN_TYPE_TEXT )
|
||||
#define LDAP_SYN_SEARCHACTION ( 13 | LDAP_SYN_TYPE_ACTION )
|
||||
#define LDAP_SYN_LINKACTION ( 14 | LDAP_SYN_TYPE_ACTION )
|
||||
#define LDAP_SYN_ADDDNACTION ( 15 | LDAP_SYN_TYPE_ACTION )
|
||||
#define LDAP_SYN_VERIFYDNACTION ( 16 | LDAP_SYN_TYPE_ACTION )
|
||||
#define LDAP_SYN_RFC822ADDR ( 17 | LDAP_SYN_TYPE_TEXT )
|
||||
|
||||
|
||||
/*
|
||||
* handy macros
|
||||
*/
|
||||
#define LDAP_GET_SYN_TYPE( syid ) ((syid) & 0xFF000000UL )
|
||||
#define LDAP_GET_SYN_OPTIONS( syid ) ((syid) & 0x00FF0000UL )
|
||||
|
||||
|
||||
/*
|
||||
* display options for output routines (used by entry2text and friends)
|
||||
*/
|
||||
/*
|
||||
* use calculated label width (based on length of longest label in
|
||||
* template) instead of contant width
|
||||
*/
|
||||
#define LDAP_DISP_OPT_AUTOLABELWIDTH 0x00000001L
|
||||
#define LDAP_DISP_OPT_HTMLBODYONLY 0x00000002L
|
||||
|
||||
/*
|
||||
* perform search actions (applies to ldap_entry2text_search only)
|
||||
*/
|
||||
#define LDAP_DISP_OPT_DOSEARCHACTIONS 0x00000002L
|
||||
|
||||
/*
|
||||
* include additional info. relevant to "non leaf" entries only
|
||||
* used by ldap_entry2html and ldap_entry2html_search to include "Browse"
|
||||
* and "Move Up" HREFs
|
||||
*/
|
||||
#define LDAP_DISP_OPT_NONLEAF 0x00000004L
|
||||
|
||||
|
||||
/*
|
||||
* display template item options (may not apply to all types)
|
||||
* if this bit is set in ti_options, it applies.
|
||||
*/
|
||||
#define LDAP_DITEM_OPT_READONLY 0x00000001L
|
||||
#define LDAP_DITEM_OPT_SORTVALUES 0x00000002L
|
||||
#define LDAP_DITEM_OPT_SINGLEVALUED 0x00000004L
|
||||
#define LDAP_DITEM_OPT_HIDEIFEMPTY 0x00000008L
|
||||
#define LDAP_DITEM_OPT_VALUEREQUIRED 0x00000010L
|
||||
#define LDAP_DITEM_OPT_HIDEIFFALSE 0x00000020L /* booleans only */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* display template item structure
|
||||
*/
|
||||
struct ldap_tmplitem {
|
||||
unsigned long ti_syntaxid;
|
||||
unsigned long ti_options;
|
||||
char *ti_attrname;
|
||||
char *ti_label;
|
||||
char **ti_args;
|
||||
struct ldap_tmplitem *ti_next_in_row;
|
||||
struct ldap_tmplitem *ti_next_in_col;
|
||||
void *ti_appdata;
|
||||
};
|
||||
|
||||
|
||||
#define NULLTMPLITEM ((struct ldap_tmplitem *)0)
|
||||
|
||||
#define LDAP_SET_TMPLITEM_APPDATA( ti, datap ) \
|
||||
(ti)->ti_appdata = (void *)(datap)
|
||||
|
||||
#define LDAP_GET_TMPLITEM_APPDATA( ti, type ) \
|
||||
(type)((ti)->ti_appdata)
|
||||
|
||||
#define LDAP_IS_TMPLITEM_OPTION_SET( ti, option ) \
|
||||
(((ti)->ti_options & option ) != 0 )
|
||||
|
||||
|
||||
/*
|
||||
* object class array structure
|
||||
*/
|
||||
struct ldap_oclist {
|
||||
char **oc_objclasses;
|
||||
struct ldap_oclist *oc_next;
|
||||
};
|
||||
|
||||
#define NULLOCLIST ((struct ldap_oclist *)0)
|
||||
|
||||
|
||||
/*
|
||||
* add defaults list
|
||||
*/
|
||||
struct ldap_adddeflist {
|
||||
int ad_source;
|
||||
#define LDAP_ADSRC_CONSTANTVALUE 1
|
||||
#define LDAP_ADSRC_ADDERSDN 2
|
||||
char *ad_attrname;
|
||||
char *ad_value;
|
||||
struct ldap_adddeflist *ad_next;
|
||||
};
|
||||
|
||||
#define NULLADLIST ((struct ldap_adddeflist *)0)
|
||||
|
||||
|
||||
/*
|
||||
* display template global options
|
||||
* if this bit is set in dt_options, it applies.
|
||||
*/
|
||||
/*
|
||||
* users should be allowed to try to add objects of these entries
|
||||
*/
|
||||
#define LDAP_DTMPL_OPT_ADDABLE 0x00000001L
|
||||
|
||||
/*
|
||||
* users should be allowed to do "modify RDN" operation of these entries
|
||||
*/
|
||||
#define LDAP_DTMPL_OPT_ALLOWMODRDN 0x00000002L
|
||||
|
||||
/*
|
||||
* this template is an alternate view, not a primary view
|
||||
*/
|
||||
#define LDAP_DTMPL_OPT_ALTVIEW 0x00000004L
|
||||
|
||||
|
||||
/*
|
||||
* display template structure
|
||||
*/
|
||||
struct ldap_disptmpl {
|
||||
char *dt_name;
|
||||
char *dt_pluralname;
|
||||
char *dt_iconname;
|
||||
unsigned long dt_options;
|
||||
char *dt_authattrname;
|
||||
char *dt_defrdnattrname;
|
||||
char *dt_defaddlocation;
|
||||
struct ldap_oclist *dt_oclist;
|
||||
struct ldap_adddeflist *dt_adddeflist;
|
||||
struct ldap_tmplitem *dt_items;
|
||||
void *dt_appdata;
|
||||
struct ldap_disptmpl *dt_next;
|
||||
};
|
||||
|
||||
#define NULLDISPTMPL ((struct ldap_disptmpl *)0)
|
||||
|
||||
#define LDAP_SET_DISPTMPL_APPDATA( dt, datap ) \
|
||||
(dt)->dt_appdata = (void *)(datap)
|
||||
|
||||
#define LDAP_GET_DISPTMPL_APPDATA( dt, type ) \
|
||||
(type)((dt)->dt_appdata)
|
||||
|
||||
#define LDAP_IS_DISPTMPL_OPTION_SET( dt, option ) \
|
||||
(((dt)->dt_options & option ) != 0 )
|
||||
|
||||
#define LDAP_TMPL_ERR_VERSION 1
|
||||
#define LDAP_TMPL_ERR_MEM 2
|
||||
#define LDAP_TMPL_ERR_SYNTAX 3
|
||||
#define LDAP_TMPL_ERR_FILE 4
|
||||
|
||||
/*
|
||||
* buffer size needed for entry2text and vals2text
|
||||
*/
|
||||
#define LDAP_DTMPL_BUFSIZ 8192
|
||||
|
||||
typedef int (*writeptype)( void *writeparm, char *p, int len );
|
||||
|
||||
LDAP_API(int)
|
||||
LDAP_CALL
|
||||
ldap_init_templates( char *file, struct ldap_disptmpl **tmpllistp );
|
||||
|
||||
LDAP_API(int)
|
||||
LDAP_CALL
|
||||
ldap_init_templates_buf( char *buf, long buflen,
|
||||
struct ldap_disptmpl **tmpllistp );
|
||||
|
||||
LDAP_API(void)
|
||||
LDAP_CALL
|
||||
ldap_free_templates( struct ldap_disptmpl *tmpllist );
|
||||
|
||||
LDAP_API(struct ldap_disptmpl *)
|
||||
LDAP_CALL
|
||||
ldap_first_disptmpl( struct ldap_disptmpl *tmpllist );
|
||||
|
||||
LDAP_API(struct ldap_disptmpl *)
|
||||
LDAP_CALL
|
||||
ldap_next_disptmpl( struct ldap_disptmpl *tmpllist,
|
||||
struct ldap_disptmpl *tmpl );
|
||||
|
||||
LDAP_API(struct ldap_disptmpl *)
|
||||
LDAP_CALL
|
||||
ldap_name2template( char *name, struct ldap_disptmpl *tmpllist );
|
||||
|
||||
LDAP_API(struct ldap_disptmpl *)
|
||||
LDAP_CALL
|
||||
ldap_oc2template( char **oclist, struct ldap_disptmpl *tmpllist );
|
||||
|
||||
LDAP_API(char **)
|
||||
LDAP_CALL
|
||||
ldap_tmplattrs( struct ldap_disptmpl *tmpl, char **includeattrs, int exclude,
|
||||
unsigned long syntaxmask );
|
||||
|
||||
LDAP_API(struct ldap_tmplitem *)
|
||||
LDAP_CALL
|
||||
ldap_first_tmplrow( struct ldap_disptmpl *tmpl );
|
||||
|
||||
LDAP_API(struct ldap_tmplitem *)
|
||||
LDAP_CALL
|
||||
ldap_next_tmplrow( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row );
|
||||
|
||||
LDAP_API(struct ldap_tmplitem *)
|
||||
LDAP_CALL
|
||||
ldap_first_tmplcol( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row );
|
||||
|
||||
LDAP_API(struct ldap_tmplitem *)
|
||||
LDAP_CALL
|
||||
ldap_next_tmplcol( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row,
|
||||
struct ldap_tmplitem *col );
|
||||
|
||||
LDAP_API(int)
|
||||
LDAP_CALL
|
||||
ldap_entry2text( LDAP *ld, char *buf, LDAPMessage *entry,
|
||||
struct ldap_disptmpl *tmpl, char **defattrs, char ***defvals,
|
||||
writeptype writeproc, void *writeparm, char *eol, int rdncount,
|
||||
unsigned long opts );
|
||||
|
||||
LDAP_API(int)
|
||||
LDAP_CALL
|
||||
ldap_vals2text( LDAP *ld, char *buf, char **vals, char *label, int labelwidth,
|
||||
unsigned long syntaxid, writeptype writeproc, void *writeparm,
|
||||
char *eol, int rdncount );
|
||||
|
||||
LDAP_API(int)
|
||||
LDAP_CALL
|
||||
ldap_entry2text_search( LDAP *ld, char *dn, char *base, LDAPMessage *entry,
|
||||
struct ldap_disptmpl *tmpllist, char **defattrs, char ***defvals,
|
||||
writeptype writeproc, void *writeparm, char *eol, int rdncount,
|
||||
unsigned long opts );
|
||||
|
||||
LDAP_API(int)
|
||||
LDAP_CALL
|
||||
ldap_entry2html( LDAP *ld, char *buf, LDAPMessage *entry,
|
||||
struct ldap_disptmpl *tmpl, char **defattrs, char ***defvals,
|
||||
writeptype writeproc, void *writeparm, char *eol, int rdncount,
|
||||
unsigned long opts, char *urlprefix, char *base );
|
||||
|
||||
LDAP_API(int)
|
||||
LDAP_CALL
|
||||
ldap_vals2html( LDAP *ld, char *buf, char **vals, char *label, int labelwidth,
|
||||
unsigned long syntaxid, writeptype writeproc, void *writeparm,
|
||||
char *eol, int rdncount, char *urlprefix );
|
||||
|
||||
LDAP_API(int)
|
||||
LDAP_CALL
|
||||
ldap_entry2html_search( LDAP *ld, char *dn, char *base, LDAPMessage *entry,
|
||||
struct ldap_disptmpl *tmpllist, char **defattrs, char ***defvals,
|
||||
writeptype writeproc, void *writeparm, char *eol, int rdncount,
|
||||
unsigned long opts, char *urlprefix );
|
||||
|
||||
LDAP_API(char *)
|
||||
LDAP_CALL
|
||||
ldap_tmplerr2string( int err );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* _DISPTMPL_H */
|
||||
272
mozilla/directory/c-sdk/ldap/include/lber.h
Normal file
272
mozilla/directory/c-sdk/ldap/include/lber.h
Normal file
@@ -0,0 +1,272 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/* lber.h - header file for ber_* functions */
|
||||
#ifndef _LBER_H
|
||||
#define _LBER_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdlib.h> /* to pick up size_t typedef */
|
||||
|
||||
/*
|
||||
* Note that LBER_ERROR and LBER_DEFAULT are values that can never appear
|
||||
* as valid BER tags, and so it is safe to use them to report errors. In
|
||||
* fact, any tag for which the following is true is invalid:
|
||||
* (( tag & 0x00000080 ) != 0 ) && (( tag & 0xFFFFFF00 ) != 0 )
|
||||
*/
|
||||
#define LBER_ERROR 0xffffffffUL
|
||||
#define LBER_DEFAULT 0xffffffffUL
|
||||
#define LBER_END_OF_SEQORSET 0xfffffffeUL
|
||||
|
||||
/* BER classes and mask */
|
||||
#define LBER_CLASS_UNIVERSAL 0x00
|
||||
#define LBER_CLASS_APPLICATION 0x40
|
||||
#define LBER_CLASS_CONTEXT 0x80
|
||||
#define LBER_CLASS_PRIVATE 0xc0
|
||||
#define LBER_CLASS_MASK 0xc0
|
||||
|
||||
/* BER encoding type and mask */
|
||||
#define LBER_PRIMITIVE 0x00
|
||||
#define LBER_CONSTRUCTED 0x20
|
||||
#define LBER_ENCODING_MASK 0x20
|
||||
|
||||
#define LBER_BIG_TAG_MASK 0x1f
|
||||
#define LBER_MORE_TAG_MASK 0x80
|
||||
|
||||
/* general BER types we know about */
|
||||
#define LBER_BOOLEAN 0x01L
|
||||
#define LBER_INTEGER 0x02L
|
||||
#define LBER_BITSTRING 0x03L
|
||||
#define LBER_OCTETSTRING 0x04L
|
||||
#define LBER_NULL 0x05L
|
||||
#define LBER_ENUMERATED 0x0aL
|
||||
#define LBER_SEQUENCE 0x30L
|
||||
#define LBER_SET 0x31L
|
||||
|
||||
/* BerElement set/get options */
|
||||
#define LBER_OPT_REMAINING_BYTES 0x01
|
||||
#define LBER_OPT_TOTAL_BYTES 0x02
|
||||
#define LBER_OPT_USE_DER 0x04
|
||||
#define LBER_OPT_TRANSLATE_STRINGS 0x08
|
||||
#define LBER_OPT_BYTES_TO_WRITE 0x10
|
||||
#define LBER_OPT_MEMALLOC_FN_PTRS 0x20
|
||||
#define LBER_OPT_DEBUG_LEVEL 0x40
|
||||
/*
|
||||
* LBER_USE_DER is defined for compatibility with the C LDAP API RFC.
|
||||
* In our implementation, we recognize it (instead of the numerically
|
||||
* identical LBER_OPT_REMAINING_BYTES) in calls to ber_alloc_t() and
|
||||
* ber_init_w_nullchar() only. Callers of ber_set_option() or
|
||||
* ber_get_option() must use LBER_OPT_USE_DER instead. Sorry!
|
||||
*/
|
||||
#define LBER_USE_DER 0x01
|
||||
|
||||
|
||||
/* Sockbuf set/get options */
|
||||
#define LBER_SOCKBUF_OPT_TO_FILE 0x001
|
||||
#define LBER_SOCKBUF_OPT_TO_FILE_ONLY 0x002
|
||||
#define LBER_SOCKBUF_OPT_MAX_INCOMING_SIZE 0x004
|
||||
#define LBER_SOCKBUF_OPT_NO_READ_AHEAD 0x008
|
||||
#define LBER_SOCKBUF_OPT_DESC 0x010
|
||||
#define LBER_SOCKBUF_OPT_COPYDESC 0x020
|
||||
#define LBER_SOCKBUF_OPT_READ_FN 0x040
|
||||
#define LBER_SOCKBUF_OPT_WRITE_FN 0x080
|
||||
|
||||
#define LBER_OPT_ON ((void *) 1)
|
||||
#define LBER_OPT_OFF ((void *) 0)
|
||||
|
||||
|
||||
typedef struct berval {
|
||||
unsigned long bv_len;
|
||||
char *bv_val;
|
||||
} BerValue;
|
||||
|
||||
typedef struct berelement BerElement;
|
||||
typedef struct sockbuf Sockbuf;
|
||||
typedef int (*BERTranslateProc)( char **bufp, unsigned long *buflenp,
|
||||
int free_input );
|
||||
#ifndef macintosh
|
||||
#if defined( _WINDOWS ) || defined( _WIN32) || defined( _CONSOLE )
|
||||
#include <winsock.h> /* for SOCKET */
|
||||
typedef SOCKET LBER_SOCKET;
|
||||
#else
|
||||
typedef int LBER_SOCKET;
|
||||
#endif /* _WINDOWS */
|
||||
#else /* macintosh */
|
||||
typedef void *LBER_SOCKET;
|
||||
#endif /* macintosh */
|
||||
|
||||
/* calling conventions used by library */
|
||||
#ifndef LDAP_CALL
|
||||
#if defined( _WINDOWS ) || defined( _WIN32 )
|
||||
#define LDAP_C __cdecl
|
||||
#ifndef _WIN32
|
||||
#define __stdcall _far _pascal
|
||||
#define LDAP_CALLBACK _loadds
|
||||
#else
|
||||
#define LDAP_CALLBACK
|
||||
#endif /* _WIN32 */
|
||||
#define LDAP_PASCAL __stdcall
|
||||
#define LDAP_CALL LDAP_PASCAL
|
||||
#else /* _WINDOWS */
|
||||
#define LDAP_C
|
||||
#define LDAP_CALLBACK
|
||||
#define LDAP_PASCAL
|
||||
#define LDAP_CALL
|
||||
#endif /* _WINDOWS */
|
||||
#endif /* LDAP_CALL */
|
||||
|
||||
/*
|
||||
* function prototypes for lber library
|
||||
*/
|
||||
|
||||
#ifndef LDAP_API
|
||||
#if defined( _WINDOWS ) || defined( _WIN32 )
|
||||
#define LDAP_API(rt) rt
|
||||
#else /* _WINDOWS */
|
||||
#define LDAP_API(rt) rt
|
||||
#endif /* _WINDOWS */
|
||||
#endif /* LDAP_API */
|
||||
|
||||
/*
|
||||
* libldap read and write I/O function callbacks. The rest of the I/O callback
|
||||
* types are in ldap.h
|
||||
*/
|
||||
typedef int (LDAP_C LDAP_CALLBACK LDAP_IOF_READ_CALLBACK)( LBER_SOCKET,
|
||||
void *, int );
|
||||
typedef int (LDAP_C LDAP_CALLBACK LDAP_IOF_WRITE_CALLBACK)( LBER_SOCKET,
|
||||
const void *, int );
|
||||
|
||||
/*
|
||||
* liblber memory allocation callback functions. These are global to all
|
||||
* Sockbufs and BerElements. Install your own functions by using a call
|
||||
* like this: ber_set_option( NULL, LBER_OPT_MEMALLOC_FN_PTRS, &memalloc_fns );
|
||||
*/
|
||||
typedef void * (LDAP_C LDAP_CALLBACK LDAP_MALLOC_CALLBACK)( size_t size );
|
||||
typedef void * (LDAP_C LDAP_CALLBACK LDAP_CALLOC_CALLBACK)( size_t nelem,
|
||||
size_t elsize );
|
||||
typedef void * (LDAP_C LDAP_CALLBACK LDAP_REALLOC_CALLBACK)( void *ptr,
|
||||
size_t size );
|
||||
typedef void (LDAP_C LDAP_CALLBACK LDAP_FREE_CALLBACK)( void *ptr );
|
||||
|
||||
struct lber_memalloc_fns {
|
||||
LDAP_MALLOC_CALLBACK *lbermem_malloc;
|
||||
LDAP_CALLOC_CALLBACK *lbermem_calloc;
|
||||
LDAP_REALLOC_CALLBACK *lbermem_realloc;
|
||||
LDAP_FREE_CALLBACK *lbermem_free;
|
||||
};
|
||||
|
||||
/*
|
||||
* decode routines
|
||||
*/
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_get_tag( BerElement *ber );
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_skip_tag( BerElement *ber,
|
||||
unsigned long *len );
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_peek_tag( BerElement *ber,
|
||||
unsigned long *len );
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_get_int( BerElement *ber, long *num );
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_get_stringb( BerElement *ber, char *buf,
|
||||
unsigned long *len );
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_get_stringa( BerElement *ber,
|
||||
char **buf );
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_get_stringal( BerElement *ber,
|
||||
struct berval **bv );
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_get_bitstringa( BerElement *ber,
|
||||
char **buf, unsigned long *len );
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_get_null( BerElement *ber );
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_get_boolean( BerElement *ber,
|
||||
int *boolval );
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_first_element( BerElement *ber,
|
||||
unsigned long *len, char **last );
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_next_element( BerElement *ber,
|
||||
unsigned long *len, char *last );
|
||||
LDAP_API(unsigned long) LDAP_C ber_scanf( BerElement *ber, const char *fmt,
|
||||
... );
|
||||
LDAP_API(void) LDAP_CALL ber_bvfree( struct berval *bv );
|
||||
LDAP_API(void) LDAP_CALL ber_bvecfree( struct berval **bv );
|
||||
LDAP_API(struct berval *) LDAP_CALL ber_bvdup( const struct berval *bv );
|
||||
LDAP_API(void) LDAP_CALL ber_set_string_translators( BerElement *ber,
|
||||
BERTranslateProc encode_proc, BERTranslateProc decode_proc );
|
||||
LDAP_API(BerElement *) LDAP_CALL ber_init( const struct berval *bv );
|
||||
|
||||
/*
|
||||
* encoding routines
|
||||
*/
|
||||
LDAP_API(int) LDAP_CALL ber_put_enum( BerElement *ber, long num,
|
||||
unsigned long tag );
|
||||
LDAP_API(int) LDAP_CALL ber_put_int( BerElement *ber, long num,
|
||||
unsigned long tag );
|
||||
LDAP_API(int) LDAP_CALL ber_put_ostring( BerElement *ber, char *str,
|
||||
unsigned long len, unsigned long tag );
|
||||
LDAP_API(int) LDAP_CALL ber_put_string( BerElement *ber, char *str,
|
||||
unsigned long tag );
|
||||
LDAP_API(int) LDAP_CALL ber_put_bitstring( BerElement *ber, char *str,
|
||||
unsigned long bitlen, unsigned long tag );
|
||||
LDAP_API(int) LDAP_CALL ber_put_null( BerElement *ber, unsigned long tag );
|
||||
LDAP_API(int) LDAP_CALL ber_put_boolean( BerElement *ber, int boolval,
|
||||
unsigned long tag );
|
||||
LDAP_API(int) LDAP_CALL ber_start_seq( BerElement *ber, unsigned long tag );
|
||||
LDAP_API(int) LDAP_CALL ber_start_set( BerElement *ber, unsigned long tag );
|
||||
LDAP_API(int) LDAP_CALL ber_put_seq( BerElement *ber );
|
||||
LDAP_API(int) LDAP_CALL ber_put_set( BerElement *ber );
|
||||
LDAP_API(int) LDAP_C ber_printf( BerElement *ber, const char *fmt, ... );
|
||||
LDAP_API(int) LDAP_CALL ber_flatten( BerElement *ber,
|
||||
struct berval **bvPtr );
|
||||
|
||||
/*
|
||||
* miscellaneous routines
|
||||
*/
|
||||
LDAP_API(void) LDAP_CALL ber_free( BerElement *ber, int freebuf );
|
||||
LDAP_API(void) LDAP_CALL ber_special_free(void* buf, BerElement *ber);
|
||||
LDAP_API(int) LDAP_CALL ber_flush( Sockbuf *sb, BerElement *ber, int freeit );
|
||||
LDAP_API(BerElement*) LDAP_CALL ber_alloc( void );
|
||||
LDAP_API(BerElement*) LDAP_CALL der_alloc( void );
|
||||
LDAP_API(BerElement*) LDAP_CALL ber_alloc_t( int options );
|
||||
LDAP_API(void*) LDAP_CALL ber_special_alloc(size_t size, BerElement **ppBer);
|
||||
LDAP_API(BerElement*) LDAP_CALL ber_dup( BerElement *ber );
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_get_next( Sockbuf *sb, unsigned long *len,
|
||||
BerElement *ber );
|
||||
LDAP_API(unsigned long) LDAP_CALL ber_get_next_buffer( void *buffer,
|
||||
size_t buffer_size, unsigned long *len, BerElement *ber,
|
||||
unsigned long *Bytes_Scanned );
|
||||
LDAP_API(long) LDAP_CALL ber_read( BerElement *ber, char *buf,
|
||||
unsigned long len );
|
||||
LDAP_API(long) LDAP_CALL ber_write( BerElement *ber, char *buf,
|
||||
unsigned long len, int nosos );
|
||||
LDAP_API(void) LDAP_CALL ber_init_w_nullchar( BerElement *ber, int options );
|
||||
LDAP_API(void) LDAP_CALL ber_reset( BerElement *ber, int was_writing );
|
||||
LDAP_API(int) LDAP_CALL ber_set_option( BerElement *ber, int option,
|
||||
void *value );
|
||||
LDAP_API(int) LDAP_CALL ber_get_option( BerElement *ber, int option,
|
||||
void *value );
|
||||
LDAP_API(Sockbuf*) LDAP_CALL ber_sockbuf_alloc( void );
|
||||
LDAP_API(void) LDAP_CALL ber_sockbuf_free( Sockbuf* p );
|
||||
LDAP_API(int) LDAP_CALL ber_sockbuf_set_option( Sockbuf *sb, int option,
|
||||
void *value );
|
||||
LDAP_API(int) LDAP_CALL ber_sockbuf_get_option( Sockbuf *sb, int option,
|
||||
void *value );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* _LBER_H */
|
||||
57
mozilla/directory/c-sdk/ldap/include/lcache.h
Normal file
57
mozilla/directory/c-sdk/ldap/include/lcache.h
Normal file
@@ -0,0 +1,57 @@
|
||||
/* lcache.h - ldap persistent cache */
|
||||
#ifndef _LCACHE_H
|
||||
#define _LCACHE_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* calling conventions used by library */
|
||||
#ifndef LDAP_CALL
|
||||
#if defined( _WINDOWS ) || defined( _WIN32 )
|
||||
#define LDAP_C __cdecl
|
||||
#ifndef _WIN32
|
||||
#define __stdcall _far _pascal
|
||||
#define LDAP_CALLBACK _loadds
|
||||
#else
|
||||
#define LDAP_CALLBACK
|
||||
#endif /* _WIN32 */
|
||||
#define LDAP_PASCAL __stdcall
|
||||
#define LDAP_CALL LDAP_PASCAL
|
||||
#else /* _WINDOWS */
|
||||
#define LDAP_C
|
||||
#define LDAP_CALLBACK
|
||||
#define LDAP_PASCAL
|
||||
#define LDAP_CALL
|
||||
#endif /* _WINDOWS */
|
||||
#endif /* LDAP_CALL */
|
||||
|
||||
LDAP_API(int) LDAP_C lcache_init( LDAP *ld, void *arg );
|
||||
LDAP_API(int) LDAP_C lcache_bind( LDAP *ld, int msgid, unsigned long tag,
|
||||
const char *dn, struct berval *cred, int method );
|
||||
LDAP_API(int) LDAP_C lcache_unbind( LDAP *ld, int msgid, unsigned long tag );
|
||||
LDAP_API(int) LDAP_C lcache_search( LDAP *ld, int msgid, unsigned long tag,
|
||||
const char *dn, int scope, const char *filter, char **attrs,
|
||||
int attrsonly );
|
||||
LDAP_API(int) LDAP_C lcache_compare( LDAP *ld, int msgid, unsigned long tag,
|
||||
const char *dn, const char *attr, struct berval *val );
|
||||
LDAP_API(int) LDAP_C lcache_add( LDAP *ld, int msgid, unsigned long tag,
|
||||
const char *dn, LDAPMod **entry );
|
||||
LDAP_API(int) LDAP_C lcache_delete( LDAP *ld, int msgid, unsigned long tag,
|
||||
const char *dn );
|
||||
LDAP_API(int) LDAP_C lcache_rename( LDAP *ld, int msgid, unsigned long tag,
|
||||
const char *dn, const char *newrdn, const char *newparent,
|
||||
int deleteoldrdn );
|
||||
LDAP_API(int) LDAP_C lcache_modify( LDAP *ld, int msgid, unsigned long tag,
|
||||
const char *dn, LDAPMod **mods );
|
||||
LDAP_API(int) LDAP_C lcache_modrdn( LDAP *ld, int msgid, unsigned long tag,
|
||||
const char *dn, const char *newrdn, int deleteoldrdn );
|
||||
LDAP_API(int) LDAP_C lcache_result( LDAP *ld, int msgid, int all,
|
||||
struct timeval *timeout, LDAPMessage **result );
|
||||
LDAP_API(int) LDAP_C lcache_flush( LDAP *ld, char *dn, char *filter );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _LCACHE_H */
|
||||
1178
mozilla/directory/c-sdk/ldap/include/ldap.h
Normal file
1178
mozilla/directory/c-sdk/ldap/include/ldap.h
Normal file
File diff suppressed because it is too large
Load Diff
68
mozilla/directory/c-sdk/ldap/include/ldaplog.h
Normal file
68
mozilla/directory/c-sdk/ldap/include/ldaplog.h
Normal file
@@ -0,0 +1,68 @@
|
||||
#ifndef _LDAPLOG_H
|
||||
#define _LDAPLOG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define LDAP_DEBUG_TRACE 0x00001
|
||||
#define LDAP_DEBUG_PACKETS 0x00002
|
||||
#define LDAP_DEBUG_ARGS 0x00004
|
||||
#define LDAP_DEBUG_CONNS 0x00008
|
||||
#define LDAP_DEBUG_BER 0x00010
|
||||
#define LDAP_DEBUG_FILTER 0x00020
|
||||
#define LDAP_DEBUG_CONFIG 0x00040
|
||||
#define LDAP_DEBUG_ACL 0x00080
|
||||
#define LDAP_DEBUG_STATS 0x00100
|
||||
#define LDAP_DEBUG_STATS2 0x00200
|
||||
#define LDAP_DEBUG_SHELL 0x00400
|
||||
#define LDAP_DEBUG_PARSE 0x00800
|
||||
#define LDAP_DEBUG_HOUSE 0x01000
|
||||
#define LDAP_DEBUG_REPL 0x02000
|
||||
#define LDAP_DEBUG_ANY 0x04000
|
||||
#define LDAP_DEBUG_CACHE 0x08000
|
||||
#define LDAP_DEBUG_PLUGIN 0x10000
|
||||
|
||||
/* debugging stuff */
|
||||
/* Disable by default */
|
||||
#define LDAPDebug( level, fmt, arg1, arg2, arg3 )
|
||||
|
||||
#ifdef LDAP_DEBUG
|
||||
# undef LDAPDebug
|
||||
|
||||
/* SLAPD_LOGGING should not be on for WINSOCK (16-bit Windows) */
|
||||
# if defined(SLAPD_LOGGING)
|
||||
# ifdef _WIN32
|
||||
extern int *module_ldap_debug;
|
||||
# define LDAPDebug( level, fmt, arg1, arg2, arg3 ) \
|
||||
{ \
|
||||
if ( *module_ldap_debug & level ) { \
|
||||
slapd_log_error_proc( NULL, fmt, arg1, arg2, arg3 ); \
|
||||
} \
|
||||
}
|
||||
# else /* _WIN32 */
|
||||
extern int ldap_debug;
|
||||
# define LDAPDebug( level, fmt, arg1, arg2, arg3 ) \
|
||||
{ \
|
||||
if ( ldap_debug & level ) { \
|
||||
slapd_log_error_proc( NULL, fmt, arg1, arg2, arg3 ); \
|
||||
} \
|
||||
}
|
||||
# endif /* Win32 */
|
||||
# else /* no SLAPD_LOGGING */
|
||||
extern void ber_err_print( char * );
|
||||
extern int ldap_debug;
|
||||
# define LDAPDebug( level, fmt, arg1, arg2, arg3 ) \
|
||||
if ( ldap_debug & level ) { \
|
||||
char msg[256]; \
|
||||
sprintf( msg, fmt, arg1, arg2, arg3 ); \
|
||||
ber_err_print( msg ); \
|
||||
}
|
||||
# endif /* SLAPD_LOGGING */
|
||||
#endif /* LDAP_DEBUG */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _LDAP_H */
|
||||
158
mozilla/directory/c-sdk/ldap/include/ldaprot.h
Normal file
158
mozilla/directory/c-sdk/ldap/include/ldaprot.h
Normal file
@@ -0,0 +1,158 @@
|
||||
#ifndef _LDAPROT_H
|
||||
#define _LDAPROT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define LDAP_VERSION1 1
|
||||
#define LDAP_VERSION2 2
|
||||
#define LDAP_VERSION3 3
|
||||
#define LDAP_VERSION LDAP_VERSION2
|
||||
|
||||
#define COMPAT20
|
||||
#define COMPAT30
|
||||
#if defined(COMPAT20) || defined(COMPAT30)
|
||||
#define COMPAT
|
||||
#endif
|
||||
|
||||
#define LDAP_URL_PREFIX "ldap://"
|
||||
#define LDAP_URL_PREFIX_LEN 7
|
||||
#define LDAPS_URL_PREFIX "ldaps://"
|
||||
#define LDAPS_URL_PREFIX_LEN 8
|
||||
#define LDAP_REF_STR "Referral:\n"
|
||||
#define LDAP_REF_STR_LEN 10
|
||||
|
||||
/*
|
||||
* specific LDAP instantiations of BER types we know about
|
||||
*/
|
||||
|
||||
/* general stuff */
|
||||
#define LDAP_TAG_MESSAGE 0x30L /* tag is 16 + constructed bit */
|
||||
#define OLD_LDAP_TAG_MESSAGE 0x10L /* forgot the constructed bit */
|
||||
#define LDAP_TAG_MSGID 0x02L /* INTEGER */
|
||||
#define LDAP_TAG_LDAPDN 0x04L /* OCTET STRING */
|
||||
#define LDAP_TAG_CONTROLS 0xa0L /* context specific + constructed + 0 */
|
||||
#define LDAP_TAG_REFERRAL 0xa3L /* context specific + constructed */
|
||||
#define LDAP_TAG_NEWSUPERIOR 0x80L /* context specific + primitive */
|
||||
#define LDAP_TAG_MRA_OID 0x81L /* context specific + primitive */
|
||||
#define LDAP_TAG_MRA_TYPE 0x82L /* context specific + primitive */
|
||||
#define LDAP_TAG_MRA_VALUE 0x83L /* context specific + primitive */
|
||||
#define LDAP_TAG_MRA_DNATTRS 0x84L /* context specific + primitive */
|
||||
#define LDAP_TAG_EXOP_REQ_OID 0x80L /* context specific + primitive */
|
||||
#define LDAP_TAG_EXOP_REQ_VALUE 0x81L /* context specific + primitive */
|
||||
#define LDAP_TAG_EXOP_RES_OID 0x8aL /* context specific + primitive */
|
||||
#define LDAP_TAG_EXOP_RES_VALUE 0x8bL /* context specific + primitive */
|
||||
#define LDAP_TAG_SK_MATCHRULE 0x80L /* context specific + primitive */
|
||||
#define LDAP_TAG_SK_REVERSE 0x81L /* context specific + primitive */
|
||||
#define LDAP_TAG_SR_ATTRTYPE 0x80L /* context specific + primitive */
|
||||
#define LDAP_TAG_SASL_RES_CREDS 0x87L /* context specific + primitive */
|
||||
#define LDAP_TAG_VLV_BY_INDEX 0xa0L /* context specific + constructed + 0 */
|
||||
#define LDAP_TAG_VLV_BY_VALUE 0x81L /* context specific + primitive + 1 */
|
||||
|
||||
/* possible operations a client can invoke */
|
||||
#define LDAP_REQ_BIND 0x60L /* application + constructed */
|
||||
#define LDAP_REQ_UNBIND 0x42L /* application + primitive */
|
||||
#define LDAP_REQ_SEARCH 0x63L /* application + constructed */
|
||||
#define LDAP_REQ_MODIFY 0x66L /* application + constructed */
|
||||
#define LDAP_REQ_ADD 0x68L /* application + constructed */
|
||||
#define LDAP_REQ_DELETE 0x4aL /* application + primitive */
|
||||
#define LDAP_REQ_MODRDN 0x6cL /* application + constructed */
|
||||
#define LDAP_REQ_MODDN 0x6cL /* application + constructed */
|
||||
#define LDAP_REQ_RENAME 0x6cL /* application + constructed */
|
||||
#define LDAP_REQ_COMPARE 0x6eL /* application + constructed */
|
||||
#define LDAP_REQ_ABANDON 0x50L /* application + primitive */
|
||||
#define LDAP_REQ_EXTENDED 0x77L /* application + constructed */
|
||||
|
||||
/* U-M LDAP release 3.0 compatibility stuff */
|
||||
#define LDAP_REQ_UNBIND_30 0x62L
|
||||
#define LDAP_REQ_DELETE_30 0x6aL
|
||||
#define LDAP_REQ_ABANDON_30 0x70L
|
||||
|
||||
/*
|
||||
* old broken stuff for backwards compatibility - forgot application tag
|
||||
* and constructed/primitive bit
|
||||
*/
|
||||
#define OLD_LDAP_REQ_BIND 0x00L
|
||||
#define OLD_LDAP_REQ_UNBIND 0x02L
|
||||
#define OLD_LDAP_REQ_SEARCH 0x03L
|
||||
#define OLD_LDAP_REQ_MODIFY 0x06L
|
||||
#define OLD_LDAP_REQ_ADD 0x08L
|
||||
#define OLD_LDAP_REQ_DELETE 0x0aL
|
||||
#define OLD_LDAP_REQ_MODRDN 0x0cL
|
||||
#define OLD_LDAP_REQ_MODDN 0x0cL
|
||||
#define OLD_LDAP_REQ_COMPARE 0x0eL
|
||||
#define OLD_LDAP_REQ_ABANDON 0x10L
|
||||
|
||||
/* old broken stuff for backwards compatibility */
|
||||
#define OLD_LDAP_RES_BIND 0x01L
|
||||
#define OLD_LDAP_RES_SEARCH_ENTRY 0x04L
|
||||
#define OLD_LDAP_RES_SEARCH_RESULT 0x05L
|
||||
#define OLD_LDAP_RES_MODIFY 0x07L
|
||||
#define OLD_LDAP_RES_ADD 0x09L
|
||||
#define OLD_LDAP_RES_DELETE 0x0bL
|
||||
#define OLD_LDAP_RES_MODRDN 0x0dL
|
||||
#define OLD_LDAP_RES_MODDN 0x0dL
|
||||
#define OLD_LDAP_RES_COMPARE 0x0fL
|
||||
|
||||
/* 3.0 compatibility auth methods */
|
||||
#define LDAP_AUTH_SIMPLE_30 0xa0L /* context specific + constructed */
|
||||
#define LDAP_AUTH_KRBV41_30 0xa1L /* context specific + constructed */
|
||||
#define LDAP_AUTH_KRBV42_30 0xa2L /* context specific + constructed */
|
||||
|
||||
/* old broken stuff */
|
||||
#define OLD_LDAP_AUTH_SIMPLE 0x00L
|
||||
#define OLD_LDAP_AUTH_KRBV4 0x01L
|
||||
#define OLD_LDAP_AUTH_KRBV42 0x02L
|
||||
|
||||
/* 3.0 compatibility filter types */
|
||||
#define LDAP_FILTER_PRESENT_30 0xa7L /* context specific + constructed */
|
||||
|
||||
/* filter types */
|
||||
#define LDAP_FILTER_AND 0xa0L /* context specific + constructed */
|
||||
#define LDAP_FILTER_OR 0xa1L /* context specific + constructed */
|
||||
#define LDAP_FILTER_NOT 0xa2L /* context specific + constructed */
|
||||
#define LDAP_FILTER_EQUALITY 0xa3L /* context specific + constructed */
|
||||
#define LDAP_FILTER_SUBSTRINGS 0xa4L /* context specific + constructed */
|
||||
#define LDAP_FILTER_GE 0xa5L /* context specific + constructed */
|
||||
#define LDAP_FILTER_LE 0xa6L /* context specific + constructed */
|
||||
#define LDAP_FILTER_PRESENT 0x87L /* context specific + primitive */
|
||||
#define LDAP_FILTER_APPROX 0xa8L /* context specific + constructed */
|
||||
#define LDAP_FILTER_EXTENDED 0xa9L /* context specific + constructed */
|
||||
|
||||
/* old broken stuff */
|
||||
#define OLD_LDAP_FILTER_AND 0x00L
|
||||
#define OLD_LDAP_FILTER_OR 0x01L
|
||||
#define OLD_LDAP_FILTER_NOT 0x02L
|
||||
#define OLD_LDAP_FILTER_EQUALITY 0x03L
|
||||
#define OLD_LDAP_FILTER_SUBSTRINGS 0x04L
|
||||
#define OLD_LDAP_FILTER_GE 0x05L
|
||||
#define OLD_LDAP_FILTER_LE 0x06L
|
||||
#define OLD_LDAP_FILTER_PRESENT 0x07L
|
||||
#define OLD_LDAP_FILTER_APPROX 0x08L
|
||||
|
||||
/* substring filter component types */
|
||||
#define LDAP_SUBSTRING_INITIAL 0x80L /* context specific */
|
||||
#define LDAP_SUBSTRING_ANY 0x81L /* context specific */
|
||||
#define LDAP_SUBSTRING_FINAL 0x82L /* context specific */
|
||||
|
||||
/* extended filter component types */
|
||||
#define LDAP_FILTER_EXTENDED_OID 0x81L /* context specific */
|
||||
#define LDAP_FILTER_EXTENDED_TYPE 0x82L /* context specific */
|
||||
#define LDAP_FILTER_EXTENDED_VALUE 0x83L /* context specific */
|
||||
#define LDAP_FILTER_EXTENDED_DNATTRS 0x84L /* context specific */
|
||||
|
||||
/* 3.0 compatibility substring filter component types */
|
||||
#define LDAP_SUBSTRING_INITIAL_30 0xa0L /* context specific */
|
||||
#define LDAP_SUBSTRING_ANY_30 0xa1L /* context specific */
|
||||
#define LDAP_SUBSTRING_FINAL_30 0xa2L /* context specific */
|
||||
|
||||
/* old broken stuff */
|
||||
#define OLD_LDAP_SUBSTRING_INITIAL 0x00L
|
||||
#define OLD_LDAP_SUBSTRING_ANY 0x01L
|
||||
#define OLD_LDAP_SUBSTRING_FINAL 0x02L
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* _LDAPROT_H */
|
||||
57
mozilla/directory/c-sdk/ldap/include/ldif.h
Normal file
57
mozilla/directory/c-sdk/ldap/include/ldif.h
Normal file
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (c) 1996 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _LDIF_H
|
||||
#define _LDIF_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define LDIF_MAX_LINE_WIDTH 76 /* maximum length of LDIF lines */
|
||||
|
||||
/*
|
||||
* Macro to calculate maximum number of bytes that the base64 equivalent
|
||||
* of an item that is "vlen" bytes long will take up. Base64 encoding
|
||||
* uses one byte for every six bits in the value plus up to two pad bytes.
|
||||
*/
|
||||
#define LDIF_BASE64_LEN(vlen) (((vlen) * 4 / 3 ) + 3)
|
||||
|
||||
/*
|
||||
* Macro to calculate maximum size that an LDIF-encoded type (length
|
||||
* tlen) and value (length vlen) will take up: room for type + ":: " +
|
||||
* first newline + base64 value + continued lines. Each continued line
|
||||
* needs room for a newline and a leading space character.
|
||||
*/
|
||||
#define LDIF_SIZE_NEEDED(tlen,vlen) \
|
||||
((tlen) + 4 + LDIF_BASE64_LEN(vlen) \
|
||||
+ ((LDIF_BASE64_LEN(vlen) + tlen + 3) / LDIF_MAX_LINE_WIDTH * 2 ))
|
||||
|
||||
|
||||
int ldif_parse_line( char *line, char **type, char **value, int *vlen);
|
||||
char * ldif_getline( char **next );
|
||||
void ldif_put_type_and_value( char **out, char *t, char *val, int vlen );
|
||||
void ldif_put_type_and_value_nowrap( char **out, char *t, char *val, int vlen );
|
||||
char *ldif_type_and_value( char *type, char *val, int vlen );
|
||||
char *ldif_type_and_value_nowrap( char *type, char *val, int vlen );
|
||||
int ldif_base64_decode( char *src, unsigned char *dst );
|
||||
int ldif_base64_encode( unsigned char *src, char *dst, int srclen,
|
||||
int lenused );
|
||||
int ldif_base64_encode_nowrap( unsigned char *src, char *dst, int srclen,
|
||||
int lenused );
|
||||
char *ldif_get_entry( FILE *fp, int *lineno );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _LDIF_H */
|
||||
404
mozilla/directory/c-sdk/ldap/include/portable.h
Normal file
404
mozilla/directory/c-sdk/ldap/include/portable.h
Normal file
@@ -0,0 +1,404 @@
|
||||
/*
|
||||
* Copyright (c) 1994 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*/
|
||||
|
||||
#ifndef _PORTABLE_H
|
||||
#define _PORTABLE_H
|
||||
|
||||
/*
|
||||
* portable.h for LDAP -- this is where we define common stuff to make
|
||||
* life easier on various Unix systems.
|
||||
*
|
||||
* Unless you are porting LDAP to a new platform, you should not need to
|
||||
* edit this file.
|
||||
*/
|
||||
|
||||
#if defined(LINUX) || defined ( linux )
|
||||
#define LINUX2_1
|
||||
#endif
|
||||
|
||||
#ifndef SYSV
|
||||
#if defined( hpux ) || defined( sunos5 ) || defined ( sgi ) || defined( SVR4 )
|
||||
#define SYSV
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* under System V, use sysconf() instead of getdtablesize
|
||||
*/
|
||||
#if !defined( USE_SYSCONF ) && defined( SYSV )
|
||||
#define USE_SYSCONF
|
||||
#endif
|
||||
|
||||
/*
|
||||
* under System V, daemons should use setsid() instead of detaching from their
|
||||
* tty themselves
|
||||
*/
|
||||
#if !defined( USE_SETSID ) && defined( SYSV )
|
||||
#define USE_SETSID
|
||||
#endif
|
||||
|
||||
/*
|
||||
* System V has socket options in filio.h
|
||||
*/
|
||||
#if !defined( NEED_FILIO ) && defined( SYSV ) && !defined( hpux ) && !defined( AIX )
|
||||
#define NEED_FILIO
|
||||
#endif
|
||||
|
||||
/*
|
||||
* use lockf() under System V
|
||||
*/
|
||||
#if !defined( USE_LOCKF ) && ( defined( SYSV ) || defined( aix ))
|
||||
#define USE_LOCKF
|
||||
#endif
|
||||
|
||||
/*
|
||||
* on many systems, we should use waitpid() instead of waitN()
|
||||
*/
|
||||
#if !defined( USE_WAITPID ) && ( defined( SYSV ) || defined( sunos4 ) || defined( ultrix ) || defined( aix ))
|
||||
#define USE_WAITPID
|
||||
#endif
|
||||
|
||||
/*
|
||||
* define the wait status argument type
|
||||
*/
|
||||
#if ( defined( SunOS ) && SunOS < 40 ) || defined( nextstep )
|
||||
#define WAITSTATUSTYPE union wait
|
||||
#else
|
||||
#define WAITSTATUSTYPE int
|
||||
#endif
|
||||
|
||||
/*
|
||||
* define the flags for wait
|
||||
*/
|
||||
#ifdef sunos5
|
||||
#define WAIT_FLAGS ( WNOHANG | WUNTRACED | WCONTINUED )
|
||||
#else
|
||||
#define WAIT_FLAGS ( WNOHANG | WUNTRACED )
|
||||
#endif
|
||||
|
||||
/*
|
||||
* defined the options for openlog (syslog)
|
||||
*/
|
||||
#ifdef ultrix
|
||||
#define OPENLOG_OPTIONS LOG_PID
|
||||
#else
|
||||
#define OPENLOG_OPTIONS ( LOG_PID | LOG_NOWAIT )
|
||||
#endif
|
||||
|
||||
/*
|
||||
* some systems don't have the BSD re_comp and re_exec routines
|
||||
*/
|
||||
#ifndef NEED_BSDREGEX
|
||||
#if ( defined( SYSV ) || defined( VMS ) || defined( netbsd ) || defined( freebsd ) || defined( linux ) || defined( DARWIN )) && !defined(sgi)
|
||||
#define NEED_BSDREGEX
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* many systems do not have the setpwfile() library routine... we just
|
||||
* enable use for those systems we know have it.
|
||||
*/
|
||||
#ifndef HAVE_SETPWFILE
|
||||
#if defined( sunos4 ) || defined( ultrix ) || defined( OSF1 )
|
||||
#define HAVE_SETPWFILE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Are sys_errlist and sys_nerr declared in stdio.h?
|
||||
*/
|
||||
#ifndef SYSERRLIST_IN_STDIO
|
||||
#if defined( freebsd )
|
||||
#define SYSERRLIST_IN_STDIO
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Async IO. Use a non blocking implementation of connect() and
|
||||
* dns functions
|
||||
*/
|
||||
#if !defined(LDAP_ASYNC_IO)
|
||||
#if !defined(_WINDOWS) && !defined(macintosh)
|
||||
#define LDAP_ASYNC_IO
|
||||
#endif /* _WINDOWS */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* for select()
|
||||
*/
|
||||
#if !defined(WINSOCK) && !defined(_WINDOWS) && !defined(macintosh) && !defined(XP_OS2)
|
||||
#if defined(HPUX) || defined(LINUX) || defined(SUNOS4) || defined(XP_BEOS)
|
||||
#include <sys/time.h>
|
||||
#else
|
||||
#include <sys/select.h>
|
||||
#endif
|
||||
#if !defined(FD_SET)
|
||||
#define NFDBITS 32
|
||||
#define FD_SETSIZE 32
|
||||
#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
|
||||
#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
|
||||
#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
|
||||
#define FD_ZERO(p) bzero((char *)(p), sizeof(*(p)))
|
||||
#endif /* !FD_SET */
|
||||
#endif /* !WINSOCK && !_WINDOWS && !macintosh */
|
||||
|
||||
|
||||
/*
|
||||
* for connect() -- must we block signals when calling connect()? This
|
||||
* is necessary on some buggy UNIXes.
|
||||
*/
|
||||
#if !defined(LDAP_CONNECT_MUST_NOT_BE_INTERRUPTED) && \
|
||||
( defined(AIX) || defined(IRIX) || defined(HPUX) || defined(SUNOS4) \
|
||||
|| defined(SOLARIS) || defined(OSF1) ||defined(freebsd))
|
||||
#define LDAP_CONNECT_MUST_NOT_BE_INTERRUPTED
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* for signal() -- what do signal handling functions return?
|
||||
*/
|
||||
#ifndef SIG_FN
|
||||
#ifdef sunos5
|
||||
# define SIG_FN void /* signal-catching functions return void */
|
||||
#else /* sunos5 */
|
||||
# ifdef BSD
|
||||
# if (BSD >= 199006) || defined(NeXT) || defined(OSF1) || defined(sun) || defined(ultrix) || defined(apollo) || defined(POSIX_SIGNALS)
|
||||
# define SIG_FN void /* signal-catching functions return void */
|
||||
# else
|
||||
# define SIG_FN int /* signal-catching functions return int */
|
||||
# endif
|
||||
# else /* BSD */
|
||||
# define SIG_FN void /* signal-catching functions return void */
|
||||
# endif /* BSD */
|
||||
#endif /* sunos5 */
|
||||
#endif /* SIG_FN */
|
||||
|
||||
/*
|
||||
* toupper and tolower macros are different under bsd and sys v
|
||||
*/
|
||||
#if defined( SYSV ) && !defined( hpux )
|
||||
#define TOUPPER(c) (isascii(c) && islower(c) ? _toupper(c) : c)
|
||||
#define TOLOWER(c) (isascii(c) && isupper(c) ? _tolower(c) : c)
|
||||
#else
|
||||
#define TOUPPER(c) (isascii(c) && islower(c) ? toupper(c) : c)
|
||||
#define TOLOWER(c) (isascii(c) && isupper(c) ? tolower(c) : c)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* put a cover on the tty-related ioctl calls we need to use
|
||||
*/
|
||||
#if defined( NeXT ) || (defined(SunOS) && SunOS < 40)
|
||||
#define TERMIO_TYPE struct sgttyb
|
||||
#define TERMFLAG_TYPE int
|
||||
#define GETATTR( fd, tiop ) ioctl((fd), TIOCGETP, (caddr_t)(tiop))
|
||||
#define SETATTR( fd, tiop ) ioctl((fd), TIOCSETP, (caddr_t)(tiop))
|
||||
#define GETFLAGS( tio ) (tio).sg_flags
|
||||
#define SETFLAGS( tio, flags ) (tio).sg_flags = (flags)
|
||||
#else
|
||||
#define USE_TERMIOS
|
||||
#define TERMIO_TYPE struct termios
|
||||
#define TERMFLAG_TYPE tcflag_t
|
||||
#define GETATTR( fd, tiop ) tcgetattr((fd), (tiop))
|
||||
#define SETATTR( fd, tiop ) tcsetattr((fd), TCSANOW /* 0 */, (tiop))
|
||||
#define GETFLAGS( tio ) (tio).c_lflag
|
||||
#define SETFLAGS( tio, flags ) (tio).c_lflag = (flags)
|
||||
#endif
|
||||
|
||||
#if ( !defined( HPUX9 )) && ( !defined( sunos4 )) && ( !defined( SNI )) && \
|
||||
( !defined( HAVE_TIME_R ))
|
||||
#define HAVE_TIME_R
|
||||
#endif
|
||||
|
||||
#if defined( sunos5 ) || defined( aix )
|
||||
#define HAVE_GETPWNAM_R
|
||||
#define HAVE_GETGRNAM_R
|
||||
#endif
|
||||
|
||||
#if defined(SNI) || defined(LINUX1_2)
|
||||
int strcasecmp(const char *, const char *);
|
||||
#ifdef SNI
|
||||
int strncasecmp(const char *, const char *, int);
|
||||
#endif /* SNI */
|
||||
#ifdef LINUX1_2
|
||||
int strncasecmp(const char *, const char *, size_t);
|
||||
#endif /* LINUX1_2 */
|
||||
#endif /* SNI || LINUX1_2 */
|
||||
|
||||
#if defined(_WINDOWS) || defined(macintosh) || defined(XP_OS2) || defined(DARWIN)
|
||||
#define GETHOSTBYNAME( n, r, b, l, e ) gethostbyname( n )
|
||||
#define CTIME( c, b, l ) ctime( c )
|
||||
#define STRTOK( s1, s2, l ) strtok( s1, s2 )
|
||||
#elif defined(XP_BEOS)
|
||||
#define GETHOSTBYNAME( n, r, b, l, e ) gethostbyname( n )
|
||||
#define CTIME( c, b, l ) ctime_r( c, b )
|
||||
#define STRTOK( s1, s2, l ) strtok_r( s1, s2, l )
|
||||
#define HAVE_STRTOK_R
|
||||
#else /* UNIX */
|
||||
#if defined(sgi) || defined(HPUX9) || defined(LINUX1_2) || defined(SCOOS) || \
|
||||
defined(UNIXWARE) || defined(SUNOS4) || defined(SNI) || defined(BSDI) || \
|
||||
defined(NCR) || defined(OSF1) || defined(NEC) || defined(VMS) || \
|
||||
( defined(HPUX10) && !defined(_REENTRANT)) || defined(HPUX11) || \
|
||||
defined(UnixWare) || defined(LINUX) || defined(NETBSD) || \
|
||||
defined(FREEBSD) || defined(OPENBSD) || \
|
||||
(defined(AIX) && !defined(USE_REENTRANT_LIBC))
|
||||
#define GETHOSTBYNAME( n, r, b, l, e ) gethostbyname( n )
|
||||
#elif defined(AIX)
|
||||
/* Maybe this is for another version of AIX?
|
||||
Commenting out for AIX 4.1 for Nova
|
||||
Replaced with following to lines, stolen from the #else below
|
||||
#define GETHOSTBYNAME_BUF_T struct hostent_data
|
||||
*/
|
||||
typedef char GETHOSTBYNAME_buf_t [BUFSIZ /* XXX might be too small */];
|
||||
#define GETHOSTBYNAME_BUF_T GETHOSTBYNAME_buf_t
|
||||
#define GETHOSTBYNAME( n, r, b, l, e ) \
|
||||
(memset (&b, 0, l), gethostbyname_r (n, r, &b) ? NULL : r)
|
||||
#elif defined(HPUX10)
|
||||
#define GETHOSTBYNAME_BUF_T struct hostent_data
|
||||
#define GETHOSTBYNAME( n, r, b, l, e ) nsldapi_compat_gethostbyname_r( n, r, (char *)&b, l, e )
|
||||
#else
|
||||
#include <stdio.h> /* BUFSIZ */
|
||||
typedef char GETHOSTBYNAME_buf_t [BUFSIZ /* XXX might be too small */];
|
||||
#define GETHOSTBYNAME_BUF_T GETHOSTBYNAME_buf_t
|
||||
#define GETHOSTBYNAME( n, r, b, l, e ) gethostbyname_r( n, r, b, l, e )
|
||||
#endif
|
||||
#if defined(HPUX9) || defined(LINUX1_2) || defined(LINUX2_0) || \
|
||||
defined(LINUX2_1) || defined(SUNOS4) || defined(SNI) || \
|
||||
defined(SCOOS) || defined(BSDI) || defined(NCR) || \
|
||||
defined(NEC) || ( defined(HPUX10) && !defined(_REENTRANT)) || \
|
||||
(defined(AIX) && !defined(USE_REENTRANT_LIBC))
|
||||
#define CTIME( c, b, l ) ctime( c )
|
||||
#elif defined(HPUX10) && defined(_REENTRANT) && !defined(HPUX11)
|
||||
#define CTIME( c, b, l ) nsldapi_compat_ctime_r( c, b, l )
|
||||
#elif defined( IRIX6_2 ) || defined( IRIX6_3 ) || defined(UNIXWARE) \
|
||||
|| defined(OSF1V4) || defined(AIX) || defined(UnixWare) \
|
||||
|| defined(hpux) || defined(HPUX11) || defined(NETBSD) \
|
||||
|| defined(IRIX6) || defined(FREEBSD) || defined(VMS) \
|
||||
|| defined(NTO) || defined(OPENBSD)
|
||||
#define CTIME( c, b, l ) ctime_r( c, b )
|
||||
#elif defined( OSF1V3 )
|
||||
#define CTIME( c, b, l ) (ctime_r( c, b, l ) ? NULL : b)
|
||||
#else
|
||||
#define CTIME( c, b, l ) ctime_r( c, b, l )
|
||||
#endif
|
||||
#if defined(hpux9) || defined(LINUX1_2) || defined(SUNOS4) || defined(SNI) || \
|
||||
defined(SCOOS) || defined(BSDI) || defined(NCR) || defined(VMS) || \
|
||||
defined(NEC) || defined(LINUX) || (defined(AIX) && !defined(USE_REENTRANT_LIBC))
|
||||
#define STRTOK( s1, s2, l ) strtok( s1, s2 )
|
||||
#else
|
||||
#define HAVE_STRTOK_R
|
||||
char *strtok_r(char *, const char *, char **);
|
||||
#define STRTOK( s1, s2, l ) (char *)strtok_r( s1, s2, l )
|
||||
#endif /* STRTOK */
|
||||
#endif /* UNIX */
|
||||
|
||||
#if defined( ultrix ) || defined( nextstep )
|
||||
extern char *strdup();
|
||||
#endif /* ultrix || nextstep */
|
||||
|
||||
#if defined( sunos4 ) || defined( OSF1 )
|
||||
#define BSD_TIME 1 /* for servers/slapd/log.h */
|
||||
#endif /* sunos4 || osf */
|
||||
|
||||
#if !defined(_WINDOWS) && !defined(macintosh) && !defined(XP_OS2)
|
||||
#include <netinet/in.h>
|
||||
#if !defined(XP_BEOS)
|
||||
#include <arpa/inet.h> /* for inet_addr() */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Define a portable type for IPv4 style Internet addresses (32 bits):
|
||||
*/
|
||||
#if ( defined(sunos5) && defined(_IN_ADDR_T)) || \
|
||||
defined(aix) || defined(HPUX11) || defined(OSF1)
|
||||
typedef in_addr_t nsldapi_in_addr_t;
|
||||
#else
|
||||
typedef unsigned long nsldapi_in_addr_t;
|
||||
#endif
|
||||
|
||||
#ifdef SUNOS4
|
||||
#include <pcfs/pc_dir.h> /* for toupper() */
|
||||
int fprintf(FILE *, char *, ...);
|
||||
int fseek(FILE *, long, int);
|
||||
int fread(char *, int, int, FILE *);
|
||||
int fclose(FILE *);
|
||||
int fflush(FILE *);
|
||||
int rewind(FILE *);
|
||||
void *memmove(void *, const void *, size_t);
|
||||
int strcasecmp(char *, char *);
|
||||
int strncasecmp(char *, char *, int);
|
||||
time_t time(time_t *);
|
||||
void perror(char *);
|
||||
int fputc(char, FILE *);
|
||||
int fputs(char *, FILE *);
|
||||
int re_exec(char *);
|
||||
int socket(int, int, int);
|
||||
void bzero(char *, int);
|
||||
unsigned long inet_addr(char *);
|
||||
char * inet_ntoa(struct in_addr);
|
||||
int getdtablesize();
|
||||
int connect(int, struct sockaddr *, int);
|
||||
#endif /* SUNOS4 */
|
||||
|
||||
/* #if defined(SUNOS4) || defined(SNI) */
|
||||
#if defined(SUNOS4)
|
||||
int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
|
||||
#endif /* SUNOS4 || SNI */
|
||||
|
||||
/*
|
||||
* SAFEMEMCPY is an overlap-safe copy from s to d of n bytes
|
||||
*/
|
||||
#ifdef macintosh
|
||||
#define SAFEMEMCPY( d, s, n ) BlockMoveData( (Ptr)s, (Ptr)d, n )
|
||||
#else /* macintosh */
|
||||
#ifdef sunos4
|
||||
#define SAFEMEMCPY( d, s, n ) bcopy( s, d, n )
|
||||
#else /* sunos4 */
|
||||
#define SAFEMEMCPY( d, s, n ) memmove( d, s, n )
|
||||
#endif /* sunos4 */
|
||||
#endif /* macintosh */
|
||||
|
||||
#ifdef _WINDOWS
|
||||
|
||||
#define strcasecmp strcmpi
|
||||
#define strncasecmp _strnicmp
|
||||
#define bzero(a, b) memset( a, 0, b )
|
||||
#define getpid _getpid
|
||||
#define ioctl ioctlsocket
|
||||
#define sleep(a) Sleep( a*1000 )
|
||||
|
||||
#define EMSGSIZE WSAEMSGSIZE
|
||||
#define EWOULDBLOCK WSAEWOULDBLOCK
|
||||
#define EHOSTUNREACH WSAEHOSTUNREACH
|
||||
|
||||
#ifndef MAXPATHLEN
|
||||
#define MAXPATHLEN _MAX_PATH
|
||||
#endif
|
||||
|
||||
/* We'd like this number to be prime for the hash
|
||||
* into the Connection table */
|
||||
#define DS_MAX_NT_SOCKET_CONNECTIONS 2003
|
||||
|
||||
#elif defined(XP_OS2)
|
||||
|
||||
#define strcasecmp strcmpi
|
||||
#define strncasecmp strnicmp
|
||||
#define bzero(a, b) memset( a, 0, b )
|
||||
#include "dirent.h"
|
||||
#include <string.h> /*for strcmpi()*/
|
||||
#include <time.h> /*for ctime()*/
|
||||
|
||||
#endif /* XP_OS2 */
|
||||
|
||||
|
||||
#endif /* _PORTABLE_H */
|
||||
58
mozilla/directory/c-sdk/ldap/include/regex.h
Normal file
58
mozilla/directory/c-sdk/ldap/include/regex.h
Normal file
@@ -0,0 +1,58 @@
|
||||
#if defined( macintosh ) || defined( DOS ) || defined( _WINDOWS ) || defined( NEED_BSDREGEX ) || defined( XP_OS2 )
|
||||
/*
|
||||
* Copyright (c) 1993 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*/
|
||||
/*
|
||||
* regex.h -- includes for regular expression matching routines
|
||||
* 13 August 1993 Mark C Smith
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "ldap.h"
|
||||
|
||||
#if !defined( NEEDPROTOS ) && defined( __STDC__ )
|
||||
#define NEEDPROTOS
|
||||
#endif
|
||||
|
||||
#ifdef _SLDAPD_H_ /* server build: no need to use LDAP_CALL stuff */
|
||||
#ifdef LDAP_CALL
|
||||
#undef LDAP_CALL
|
||||
#define LDAP_CALL
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef NEEDPROTOS
|
||||
int re_init( void );
|
||||
void re_lock( void );
|
||||
int re_unlock( void );
|
||||
char * LDAP_CALL re_comp( char *pat );
|
||||
int LDAP_CALL re_exec( char *lp );
|
||||
void LDAP_CALL re_modw( char *s );
|
||||
int LDAP_CALL re_subs( char *src, char *dst );
|
||||
#else /* NEEDPROTOS */
|
||||
int re_init();
|
||||
void re_lock();
|
||||
int re_unlock();
|
||||
char * LDAP_CALL re_comp();
|
||||
int LDAP_CALL re_exec();
|
||||
void LDAP_CALL re_modw();
|
||||
int LDAP_CALL re_subs();
|
||||
#endif /* NEEDPROTOS */
|
||||
|
||||
#define re_fail( m, p )
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* macintosh or DOS or or _WIN32 or NEED_BSDREGEX */
|
||||
135
mozilla/directory/c-sdk/ldap/include/srchpref.h
Normal file
135
mozilla/directory/c-sdk/ldap/include/srchpref.h
Normal file
@@ -0,0 +1,135 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public License
|
||||
* Version 1.0 (the "NPL"); you may not use this file except in
|
||||
* compliance with the NPL. You may obtain a copy of the NPL at
|
||||
* http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||||
* for the specific language governing rights and limitations under the
|
||||
* NPL.
|
||||
*
|
||||
* The Initial Developer of this code under the NPL is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1999 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993, 1994 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*
|
||||
* searchpref.h: display template library defines
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _SRCHPREF_H
|
||||
#define _SRCHPREF_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* calling conventions used by library */
|
||||
#ifndef LDAP_CALL
|
||||
#if defined( _WINDOWS ) || defined( _WIN32 )
|
||||
#define LDAP_C __cdecl
|
||||
#ifndef _WIN32
|
||||
#define __stdcall _far _pascal
|
||||
#define LDAP_CALLBACK _loadds
|
||||
#else
|
||||
#define LDAP_CALLBACK
|
||||
#endif /* _WIN32 */
|
||||
#define LDAP_PASCAL __stdcall
|
||||
#define LDAP_CALL LDAP_PASCAL
|
||||
#else /* _WINDOWS */
|
||||
#define LDAP_C
|
||||
#define LDAP_CALLBACK
|
||||
#define LDAP_PASCAL
|
||||
#define LDAP_CALL
|
||||
#endif /* _WINDOWS */
|
||||
#endif /* LDAP_CALL */
|
||||
|
||||
struct ldap_searchattr {
|
||||
char *sa_attrlabel;
|
||||
char *sa_attr;
|
||||
/* max 32 matchtypes for now */
|
||||
unsigned long sa_matchtypebitmap;
|
||||
char *sa_selectattr;
|
||||
char *sa_selecttext;
|
||||
struct ldap_searchattr *sa_next;
|
||||
};
|
||||
|
||||
struct ldap_searchmatch {
|
||||
char *sm_matchprompt;
|
||||
char *sm_filter;
|
||||
struct ldap_searchmatch *sm_next;
|
||||
};
|
||||
|
||||
struct ldap_searchobj {
|
||||
char *so_objtypeprompt;
|
||||
unsigned long so_options;
|
||||
char *so_prompt;
|
||||
short so_defaultscope;
|
||||
char *so_filterprefix;
|
||||
char *so_filtertag;
|
||||
char *so_defaultselectattr;
|
||||
char *so_defaultselecttext;
|
||||
struct ldap_searchattr *so_salist;
|
||||
struct ldap_searchmatch *so_smlist;
|
||||
struct ldap_searchobj *so_next;
|
||||
};
|
||||
|
||||
#define NULLSEARCHOBJ ((struct ldap_searchobj *)0)
|
||||
|
||||
/*
|
||||
* global search object options
|
||||
*/
|
||||
#define LDAP_SEARCHOBJ_OPT_INTERNAL 0x00000001
|
||||
|
||||
#define LDAP_IS_SEARCHOBJ_OPTION_SET( so, option ) \
|
||||
(((so)->so_options & option ) != 0 )
|
||||
|
||||
#define LDAP_SEARCHPREF_VERSION_ZERO 0
|
||||
#define LDAP_SEARCHPREF_VERSION 1
|
||||
|
||||
#define LDAP_SEARCHPREF_ERR_VERSION 1
|
||||
#define LDAP_SEARCHPREF_ERR_MEM 2
|
||||
#define LDAP_SEARCHPREF_ERR_SYNTAX 3
|
||||
#define LDAP_SEARCHPREF_ERR_FILE 4
|
||||
|
||||
|
||||
LDAP_API(int)
|
||||
LDAP_CALL
|
||||
ldap_init_searchprefs( char *file, struct ldap_searchobj **solistp );
|
||||
|
||||
LDAP_API(int)
|
||||
LDAP_CALL
|
||||
ldap_init_searchprefs_buf( char *buf, long buflen,
|
||||
struct ldap_searchobj **solistp );
|
||||
|
||||
LDAP_API(void)
|
||||
LDAP_CALL
|
||||
ldap_free_searchprefs( struct ldap_searchobj *solist );
|
||||
|
||||
LDAP_API(struct ldap_searchobj *)
|
||||
LDAP_CALL
|
||||
ldap_first_searchobj( struct ldap_searchobj *solist );
|
||||
|
||||
LDAP_API(struct ldap_searchobj *)
|
||||
LDAP_CALL
|
||||
ldap_next_searchobj( struct ldap_searchobj *sollist,
|
||||
struct ldap_searchobj *so );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* _SRCHPREF_H */
|
||||
32
mozilla/directory/c-sdk/ldap/libraries/Makefile.client
Normal file
32
mozilla/directory/c-sdk/ldap/libraries/Makefile.client
Normal file
@@ -0,0 +1,32 @@
|
||||
DEPTH = ../../../..
|
||||
MOD_DEPTH = ../../../../nsprpub
|
||||
NSPR_TREE = ../../../../nsprpub
|
||||
UNIXDIRLIST = liblber libldap
|
||||
|
||||
include $(NSPR_TREE)/config/rules.mk
|
||||
|
||||
all export:: FORCE
|
||||
@for i in $(UNIXDIRLIST); do \
|
||||
echo " cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) export"; \
|
||||
( cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) export ); \
|
||||
done
|
||||
|
||||
libs install:: FORCE
|
||||
@for i in $(UNIXDIRLIST); do \
|
||||
echo " cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) install"; \
|
||||
( cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) install ); \
|
||||
done
|
||||
|
||||
clean clobber:: FORCE
|
||||
@for i in $(UNIXDIRLIST); do \
|
||||
echo " cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) clean"; \
|
||||
( cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) clean ); \
|
||||
done
|
||||
|
||||
realclean clobber_all:: FORCE
|
||||
@for i in $(UNIXDIRLIST); do \
|
||||
echo " cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) realclean"; \
|
||||
( cd $$i; $(MAKE) -f Makefile.client $(MFLAGS) realclean ); \
|
||||
done
|
||||
|
||||
FORCE:
|
||||
19
mozilla/directory/c-sdk/ldap/libraries/Makefile.in
Normal file
19
mozilla/directory/c-sdk/ldap/libraries/Makefile.in
Normal file
@@ -0,0 +1,19 @@
|
||||
DEPTH = ../../../..
|
||||
srcdir = @srcdir@
|
||||
ldaptopsrcdir = @top_srcdir@
|
||||
|
||||
include ../build/autoconf.mk
|
||||
|
||||
ifeq ($(OS_ARCH),WINNT)
|
||||
DIRS = libldap
|
||||
else
|
||||
DIRS = liblber libldap
|
||||
endif
|
||||
|
||||
all:: export install
|
||||
|
||||
install::
|
||||
+$(LOOP_OVER_DIRS)
|
||||
|
||||
include $(NSPR_TREE)/config/rules.mk
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
DEPTH = ../../../../..
|
||||
NS_DEPTH = ../../../..
|
||||
MOD_DEPTH = ../../../../../nsprpub
|
||||
NSPR_TREE = ../../../../../nsprpub
|
||||
|
||||
LDAPSRC = ../..
|
||||
|
||||
RM = rm -f
|
||||
SED = sed
|
||||
|
||||
SRCS = decode.c \
|
||||
encode.c \
|
||||
io.c \
|
||||
bprint.c
|
||||
|
||||
REALOBJS = $(SRCS:.c=.o)
|
||||
|
||||
#OBJS = $(REALOBJS) versiont.o
|
||||
OBJS = $(REALOBJS)
|
||||
|
||||
HDIR = $(LDAPSRC)/include
|
||||
|
||||
LIBRARY_NAME = lber40
|
||||
|
||||
#
|
||||
# DEFS are included in CFLAGS
|
||||
#
|
||||
DEFS = $(PLATFORMCFLAGS) $(LDAP_DEBUG) $(KERBEROS) $(AFSKERBEROS) \
|
||||
$(UOFM) $(UOFA) $(NO_USERINTERFACE) $(CLDAP) $(NO_CACHE) \
|
||||
$(LDAP_REFERRALS) $(LDAP_DNS) $(STR_TRANSLATION) \
|
||||
$(LIBLDAP_CHARSETS) $(LIBLDAP_DEF_CHARSET) \
|
||||
$(SLAPD_BACKENDS) $(LDBMBACKEND) $(LDBMINCLUDE) $(PHONETIC)
|
||||
|
||||
include $(NSPR_TREE)/config/rules.mk
|
||||
|
||||
LOCAL_INCLUDES = -I$(PUBLIC)/nspr
|
||||
INCLUDES += -I$(HDIR)
|
||||
DEFINES += $(DEFS)
|
||||
|
||||
PLATFORMCFLAGS = -DUSE_WAITPID -DNEEDPROTOS
|
||||
PLATFORMLIBS =
|
||||
THREADS =
|
||||
THREADSLIB =
|
||||
|
||||
#
|
||||
# To build slapd (the stand-alone ldap daemon), uncomment the MAKESLAPD
|
||||
# line and select the SLAPD_BACKENDS you want to use. If you enable the
|
||||
# LDBM backend, also select one of the LDBM backends.
|
||||
#
|
||||
MAKESLAPD = yes
|
||||
SLAPD_BACKENDS = -DLDAP_LDBM -DLDAP_SHELL -DLDAP_PASSWD
|
||||
LDBMBACKEND = -DLDBM_USE_NDBM
|
||||
|
||||
#
|
||||
# uncomment this line to enable debugging code (a good idea)
|
||||
#
|
||||
ifndef BUILD_OPT
|
||||
LDAP_DEBUG = -DLDAP_DEBUG
|
||||
endif
|
||||
|
||||
#
|
||||
# uncomment this line to enable support for LDAP referrals in libldap
|
||||
#
|
||||
LDAP_REFERRALS = -DLDAP_REFERRALS
|
||||
|
||||
###########################################################################
|
||||
|
||||
versiont.c: Makefile.client Version.c
|
||||
@$(RM) $@
|
||||
@(u="$${USER-root}" v="$(shell cat ../../build/version)" d="$(shell pwd)" \
|
||||
h="$(shell hostname)" t="$(shell date)"; $(SED) -e "s|%WHEN%|$${t}|" \
|
||||
-e "s|%WHOANDWHERE%|$${u}@$${h}:$${d}|" \
|
||||
-e "s|%VERSION%|$${v}|" \
|
||||
< Version.c > $@)
|
||||
|
||||
install:: $(LIBRARY) $(SHARED_LIBRARY)
|
||||
$(INSTALL) -m 444 $(LIBRARY) $(DIST)/lib
|
||||
ifdef MKSHLIB
|
||||
$(INSTALL) -m 555 $(SHARED_LIBRARY) $(DIST)/lib
|
||||
endif
|
||||
104
mozilla/directory/c-sdk/ldap/libraries/liblber/Makefile.in
Normal file
104
mozilla/directory/c-sdk/ldap/libraries/liblber/Makefile.in
Normal file
@@ -0,0 +1,104 @@
|
||||
DEPTH = ../../../../..
|
||||
NS_DEPTH = ../../../..
|
||||
srcdir = @srcdir@
|
||||
ldaptopsrcdir = @top_srcdir@
|
||||
|
||||
RM = rm -f
|
||||
SED = sed
|
||||
|
||||
SRCS = decode.c \
|
||||
encode.c \
|
||||
io.c \
|
||||
bprint.c
|
||||
|
||||
REALOBJS = $(SRCS:.c=.o)
|
||||
|
||||
#OBJS = $(REALOBJS) versiont.o
|
||||
OBJS = $(REALOBJS)
|
||||
|
||||
HDIR = $(ldaptopsrcdir)/include
|
||||
|
||||
LIBRARY_NAME = lber40
|
||||
|
||||
#
|
||||
# DEFS are included in CFLAGS
|
||||
#
|
||||
DEFS = $(PLATFORMCFLAGS) $(LDAP_DEBUG) $(KERBEROS) $(AFSKERBEROS) \
|
||||
$(UOFM) $(UOFA) $(NO_USERINTERFACE) $(CLDAP) $(NO_CACHE) \
|
||||
$(LDAP_REFERRALS) $(LDAP_DNS) $(STR_TRANSLATION) \
|
||||
$(LIBLDAP_CHARSETS) $(LIBLDAP_DEF_CHARSET) \
|
||||
$(SLAPD_BACKENDS) $(LDBMBACKEND) $(LDBMINCLUDE) $(PHONETIC)
|
||||
|
||||
include ../../build/autoconf.mk
|
||||
|
||||
ifeq ($(OS_ARCH),OS2)
|
||||
OBJS = $(REALOBJS:.o=.obj)
|
||||
endif
|
||||
|
||||
include $(NSPR_TREE)/config/rules.mk
|
||||
|
||||
LOCAL_INCLUDES = -I$(PUBLIC)/nspr
|
||||
INCLUDES += -I$(HDIR)
|
||||
DEFINES += $(DEFS)
|
||||
|
||||
ifeq ($(OS_ARCH),AIX)
|
||||
DSO_LDOPTS += -lc_r
|
||||
endif
|
||||
|
||||
ifeq ($(OS_ARCH),OS2)
|
||||
INCLUDES += -I$(DIST)/include
|
||||
endif
|
||||
|
||||
PLATFORMCFLAGS = -DUSE_WAITPID -DNEEDPROTOS
|
||||
PLATFORMLIBS =
|
||||
THREADS =
|
||||
THREADSLIB =
|
||||
|
||||
#
|
||||
# To build slapd (the stand-alone ldap daemon), uncomment the MAKESLAPD
|
||||
# line and select the SLAPD_BACKENDS you want to use. If you enable the
|
||||
# LDBM backend, also select one of the LDBM backends.
|
||||
#
|
||||
MAKESLAPD = yes
|
||||
SLAPD_BACKENDS = -DLDAP_LDBM -DLDAP_SHELL -DLDAP_PASSWD
|
||||
LDBMBACKEND = -DLDBM_USE_NDBM
|
||||
|
||||
#
|
||||
# uncomment this line to enable debugging code (a good idea)
|
||||
#
|
||||
ifndef BUILD_OPT
|
||||
LDAP_DEBUG = -DLDAP_DEBUG
|
||||
endif
|
||||
|
||||
#
|
||||
# uncomment this line to enable support for LDAP referrals in libldap
|
||||
#
|
||||
LDAP_REFERRALS = -DLDAP_REFERRALS
|
||||
|
||||
###########################################################################
|
||||
|
||||
versiont.c: Makefile.client Version.c
|
||||
@$(RM) $@
|
||||
@(u="$${USER-root}" v="$(shell cat ../../build/version)" d="$(shell pwd)" \
|
||||
h="$(shell hostname)" t="$(shell date)"; $(SED) -e "s|%WHEN%|$${t}|" \
|
||||
-e "s|%WHOANDWHERE%|$${u}@$${h}:$${d}|" \
|
||||
-e "s|%VERSION%|$${v}|" \
|
||||
< Version.c > $@)
|
||||
|
||||
ifeq ($(OS_ARCH),OS2)
|
||||
install:: $(TARGETS)
|
||||
$(INSTALL) -m 444 $(TARGETS) $(DIST)/lib
|
||||
ifdef SHARED_LIBRARY
|
||||
$(INSTALL) -m 444 $(SHARED_LIBRARY) $(DIST)/bin
|
||||
endif
|
||||
|
||||
else # !os2
|
||||
|
||||
install:: $(LIBRARY) $(SHARED_LIBRARY)
|
||||
$(INSTALL) -m 444 $(LIBRARY) $(DIST)/lib
|
||||
ifdef MKSHLIB
|
||||
$(INSTALL) -m 555 $(SHARED_LIBRARY) $(DIST)/lib
|
||||
$(INSTALL) -m 555 $(SHARED_LIBRARY) $(DIST)/bin
|
||||
endif
|
||||
|
||||
endif # os2
|
||||
87
mozilla/directory/c-sdk/ldap/libraries/liblber/bprint.c
Normal file
87
mozilla/directory/c-sdk/ldap/libraries/liblber/bprint.c
Normal file
@@ -0,0 +1,87 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/* bprint.c - a printing utility for debuging output */
|
||||
|
||||
#include <string.h>
|
||||
#include "lber-int.h"
|
||||
|
||||
#ifdef LDAP_DEBUG
|
||||
/*
|
||||
* Print arbitrary stuff, for debugging.
|
||||
*/
|
||||
|
||||
#define BPLEN 48
|
||||
|
||||
void
|
||||
lber_bprint( char *data, int len )
|
||||
{
|
||||
static char hexdig[] = "0123456789abcdef";
|
||||
char out[ BPLEN ];
|
||||
int i = 0;
|
||||
|
||||
memset( out, 0, BPLEN );
|
||||
for ( ;; ) {
|
||||
if ( len < 1 ) {
|
||||
char msg[BPLEN + 80];
|
||||
sprintf( msg, "\t%s\n", ( i == 0 ) ? "(end)" : out );
|
||||
ber_err_print( msg );
|
||||
break;
|
||||
}
|
||||
|
||||
#ifndef HEX
|
||||
if ( isgraph( (unsigned char)*data )) {
|
||||
out[ i ] = ' ';
|
||||
out[ i+1 ] = *data;
|
||||
} else {
|
||||
#endif
|
||||
out[ i ] = hexdig[ ( *data & 0xf0 ) >> 4 ];
|
||||
out[ i+1 ] = hexdig[ *data & 0x0f ];
|
||||
#ifndef HEX
|
||||
}
|
||||
#endif
|
||||
i += 2;
|
||||
len--;
|
||||
data++;
|
||||
|
||||
if ( i > BPLEN - 2 ) {
|
||||
char msg[BPLEN + 80];
|
||||
sprintf( msg, "\t%s\n", out );
|
||||
ber_err_print( msg );
|
||||
memset( out, 0, BPLEN );
|
||||
i = 0;
|
||||
continue;
|
||||
}
|
||||
out[ i++ ] = ' ';
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void ber_err_print( char *data )
|
||||
{
|
||||
#ifdef USE_DEBUG_WIN
|
||||
OutputDebugString( data );
|
||||
#else
|
||||
fputs( data, stderr );
|
||||
fflush( stderr );
|
||||
#endif
|
||||
}
|
||||
658
mozilla/directory/c-sdk/ldap/libraries/liblber/decode.c
Normal file
658
mozilla/directory/c-sdk/ldap/libraries/liblber/decode.c
Normal file
@@ -0,0 +1,658 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*/
|
||||
|
||||
/* decode.c - ber input decoding routines */
|
||||
|
||||
#include "lber-int.h"
|
||||
|
||||
/*
|
||||
* Note: ber_get_tag() only uses the ber_end and ber_ptr elements of ber.
|
||||
* If that changes, the ber_peek_tag() and/or ber_skip_tag() implementations
|
||||
* will need to be changed.
|
||||
*/
|
||||
/* return the tag - LBER_DEFAULT returned means trouble */
|
||||
unsigned long
|
||||
LDAP_CALL
|
||||
ber_get_tag( BerElement *ber )
|
||||
{
|
||||
unsigned char xbyte;
|
||||
unsigned long tag;
|
||||
char *tagp;
|
||||
int i;
|
||||
|
||||
if ( ber_read( ber, (char *) &xbyte, 1 ) != 1 )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
if ( (xbyte & LBER_BIG_TAG_MASK) != LBER_BIG_TAG_MASK )
|
||||
return( (unsigned long) xbyte );
|
||||
|
||||
tagp = (char *) &tag;
|
||||
tagp[0] = xbyte;
|
||||
for ( i = 1; i < sizeof(long); i++ ) {
|
||||
if ( ber_read( ber, (char *) &xbyte, 1 ) != 1 )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
tagp[i] = xbyte;
|
||||
|
||||
if ( ! (xbyte & LBER_MORE_TAG_MASK) )
|
||||
break;
|
||||
}
|
||||
|
||||
/* tag too big! */
|
||||
if ( i == sizeof(long) )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
/* want leading, not trailing 0's */
|
||||
return( tag >> (sizeof(long) - i - 1) );
|
||||
}
|
||||
|
||||
/*
|
||||
* Note: ber_skip_tag() only uses the ber_end and ber_ptr elements of ber.
|
||||
* If that changes, the implementation of ber_peek_tag() will need to
|
||||
* be changed.
|
||||
*/
|
||||
unsigned long
|
||||
LDAP_CALL
|
||||
ber_skip_tag( BerElement *ber, unsigned long *len )
|
||||
{
|
||||
unsigned long tag;
|
||||
unsigned char lc;
|
||||
int noctets, diff;
|
||||
unsigned long netlen;
|
||||
|
||||
/*
|
||||
* Any ber element looks like this: tag length contents.
|
||||
* Assuming everything's ok, we return the tag byte (we
|
||||
* can assume a single byte), and return the length in len.
|
||||
*
|
||||
* Assumptions:
|
||||
* 1) definite lengths
|
||||
* 2) primitive encodings used whenever possible
|
||||
*/
|
||||
|
||||
/*
|
||||
* First, we read the tag.
|
||||
*/
|
||||
|
||||
if ( (tag = ber_get_tag( ber )) == LBER_DEFAULT )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
/*
|
||||
* Next, read the length. The first byte contains the length of
|
||||
* the length. If bit 8 is set, the length is the long form,
|
||||
* otherwise it's the short form. We don't allow a length that's
|
||||
* greater than what we can hold in an unsigned long.
|
||||
*/
|
||||
|
||||
*len = netlen = 0;
|
||||
if ( ber_read( ber, (char *) &lc, 1 ) != 1 )
|
||||
return( LBER_DEFAULT );
|
||||
if ( lc & 0x80 ) {
|
||||
noctets = (lc & 0x7f);
|
||||
if ( noctets > sizeof(unsigned long) )
|
||||
return( LBER_DEFAULT );
|
||||
diff = sizeof(unsigned long) - noctets;
|
||||
if ( ber_read( ber, (char *) &netlen + diff, noctets )
|
||||
!= noctets )
|
||||
return( LBER_DEFAULT );
|
||||
*len = LBER_NTOHL( netlen );
|
||||
} else {
|
||||
*len = lc;
|
||||
}
|
||||
|
||||
return( tag );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Note: Previously, we passed the "ber" parameter directly to ber_skip_tag(),
|
||||
* saving and restoring the ber_ptr element only. We now take advantage
|
||||
* of the fact that the only ber structure elements touched by ber_skip_tag()
|
||||
* are ber_end and ber_ptr. If that changes, this code must change too.
|
||||
*/
|
||||
unsigned long
|
||||
LDAP_CALL
|
||||
ber_peek_tag( BerElement *ber, unsigned long *len )
|
||||
{
|
||||
BerElement bercopy;
|
||||
|
||||
bercopy.ber_end = ber->ber_end;
|
||||
bercopy.ber_ptr = ber->ber_ptr;
|
||||
return( ber_skip_tag( &bercopy, len ));
|
||||
}
|
||||
|
||||
static int
|
||||
ber_getnint( BerElement *ber, long *num, int len )
|
||||
{
|
||||
int i;
|
||||
long value;
|
||||
unsigned char buffer[sizeof(long)];
|
||||
/*
|
||||
* The tag and length have already been stripped off. We should
|
||||
* be sitting right before len bytes of 2's complement integer,
|
||||
* ready to be read straight into an int. We may have to sign
|
||||
* extend after we read it in.
|
||||
*/
|
||||
|
||||
if ( len > sizeof(long) )
|
||||
return( -1 );
|
||||
|
||||
/* read into the low-order bytes of netnum */
|
||||
if ( ber_read( ber, (char *) buffer, len ) != len )
|
||||
return( -1 );
|
||||
|
||||
/* This sets the required sign extension */
|
||||
if ( len != 0) {
|
||||
value = 0x80 & buffer[0] ? (-1L) : 0;
|
||||
} else {
|
||||
value = 0;
|
||||
}
|
||||
|
||||
for ( i = 0; i < len; i++ )
|
||||
value = (value << 8) | buffer[i];
|
||||
|
||||
*num = value;
|
||||
|
||||
return( len );
|
||||
}
|
||||
|
||||
unsigned long
|
||||
LDAP_CALL
|
||||
ber_get_int( BerElement *ber, long *num )
|
||||
{
|
||||
unsigned long tag, len;
|
||||
|
||||
if ( (tag = ber_skip_tag( ber, &len )) == LBER_DEFAULT )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
/*
|
||||
* len is being demoted to a long here -- possible conversion error
|
||||
*/
|
||||
|
||||
if ( ber_getnint( ber, num, (int)len ) != (long)len )
|
||||
return( LBER_DEFAULT );
|
||||
else
|
||||
return( tag );
|
||||
}
|
||||
|
||||
unsigned long
|
||||
LDAP_CALL
|
||||
ber_get_stringb( BerElement *ber, char *buf, unsigned long *len )
|
||||
{
|
||||
unsigned long datalen, tag;
|
||||
#ifdef STR_TRANSLATION
|
||||
char *transbuf;
|
||||
#endif /* STR_TRANSLATION */
|
||||
|
||||
if ( (tag = ber_skip_tag( ber, &datalen )) == LBER_DEFAULT )
|
||||
return( LBER_DEFAULT );
|
||||
if ( datalen > (*len - 1) )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
/*
|
||||
* datalen is being demoted to a long here -- possible conversion error
|
||||
*/
|
||||
|
||||
if ( ber_read( ber, buf, datalen ) != (long) datalen )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
buf[datalen] = '\0';
|
||||
|
||||
#ifdef STR_TRANSLATION
|
||||
if ( datalen > 0 && ( ber->ber_options & LBER_OPT_TRANSLATE_STRINGS )
|
||||
!= 0 && ber->ber_decode_translate_proc != NULL ) {
|
||||
transbuf = buf;
|
||||
++datalen;
|
||||
if ( (*(ber->ber_decode_translate_proc))( &transbuf, &datalen,
|
||||
0 ) != 0 ) {
|
||||
return( LBER_DEFAULT );
|
||||
}
|
||||
if ( datalen > *len ) {
|
||||
NSLBERI_FREE( transbuf );
|
||||
return( LBER_DEFAULT );
|
||||
}
|
||||
SAFEMEMCPY( buf, transbuf, datalen );
|
||||
NSLBERI_FREE( transbuf );
|
||||
--datalen;
|
||||
}
|
||||
#endif /* STR_TRANSLATION */
|
||||
|
||||
*len = datalen;
|
||||
return( tag );
|
||||
}
|
||||
|
||||
unsigned long
|
||||
LDAP_CALL
|
||||
ber_get_stringa( BerElement *ber, char **buf )
|
||||
{
|
||||
unsigned long datalen, tag;
|
||||
|
||||
if ( (tag = ber_skip_tag( ber, &datalen )) == LBER_DEFAULT )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
if ( (*buf = (char *)NSLBERI_MALLOC( (size_t)datalen + 1 )) == NULL )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
/*
|
||||
* datalen is being demoted to a long here -- possible conversion error
|
||||
*/
|
||||
if ( ber_read( ber, *buf, datalen ) != (long) datalen )
|
||||
return( LBER_DEFAULT );
|
||||
(*buf)[datalen] = '\0';
|
||||
|
||||
#ifdef STR_TRANSLATION
|
||||
if ( datalen > 0 && ( ber->ber_options & LBER_OPT_TRANSLATE_STRINGS )
|
||||
!= 0 && ber->ber_decode_translate_proc != NULL ) {
|
||||
++datalen;
|
||||
if ( (*(ber->ber_decode_translate_proc))( buf, &datalen, 1 )
|
||||
!= 0 ) {
|
||||
NSLBERI_FREE( *buf );
|
||||
return( LBER_DEFAULT );
|
||||
}
|
||||
}
|
||||
#endif /* STR_TRANSLATION */
|
||||
|
||||
return( tag );
|
||||
}
|
||||
|
||||
unsigned long
|
||||
LDAP_CALL
|
||||
ber_get_stringal( BerElement *ber, struct berval **bv )
|
||||
{
|
||||
unsigned long len, tag;
|
||||
|
||||
if ( (*bv = (struct berval *)NSLBERI_MALLOC( sizeof(struct berval) ))
|
||||
== NULL ) {
|
||||
return( LBER_DEFAULT );
|
||||
}
|
||||
|
||||
if ( (tag = ber_skip_tag( ber, &len )) == LBER_DEFAULT ) {
|
||||
return( LBER_DEFAULT );
|
||||
}
|
||||
|
||||
if ( ((*bv)->bv_val = (char *)NSLBERI_MALLOC( (size_t)len + 1 ))
|
||||
== NULL ) {
|
||||
return( LBER_DEFAULT );
|
||||
}
|
||||
|
||||
/*
|
||||
* len is being demoted to a long here -- possible conversion error
|
||||
*/
|
||||
if ( ber_read( ber, (*bv)->bv_val, len ) != (int) len )
|
||||
return( LBER_DEFAULT );
|
||||
((*bv)->bv_val)[len] = '\0';
|
||||
(*bv)->bv_len = len;
|
||||
|
||||
#ifdef STR_TRANSLATION
|
||||
if ( len > 0 && ( ber->ber_options & LBER_OPT_TRANSLATE_STRINGS ) != 0
|
||||
&& ber->ber_decode_translate_proc != NULL ) {
|
||||
++len;
|
||||
if ( (*(ber->ber_decode_translate_proc))( &((*bv)->bv_val),
|
||||
&len, 1 ) != 0 ) {
|
||||
NSLBERI_FREE( (*bv)->bv_val );
|
||||
return( LBER_DEFAULT );
|
||||
}
|
||||
(*bv)->bv_len = len - 1;
|
||||
}
|
||||
#endif /* STR_TRANSLATION */
|
||||
|
||||
return( tag );
|
||||
}
|
||||
|
||||
unsigned long
|
||||
LDAP_CALL
|
||||
ber_get_bitstringa( BerElement *ber, char **buf, unsigned long *blen )
|
||||
{
|
||||
unsigned long datalen, tag;
|
||||
unsigned char unusedbits;
|
||||
|
||||
if ( (tag = ber_skip_tag( ber, &datalen )) == LBER_DEFAULT )
|
||||
return( LBER_DEFAULT );
|
||||
--datalen;
|
||||
|
||||
if ( (*buf = (char *)NSLBERI_MALLOC( (size_t)datalen )) == NULL )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
if ( ber_read( ber, (char *)&unusedbits, 1 ) != 1 )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
/*
|
||||
* datalen is being demoted to a long here -- possible conversion error
|
||||
*/
|
||||
if ( ber_read( ber, *buf, datalen ) != (long) datalen )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
*blen = datalen * 8 - unusedbits;
|
||||
return( tag );
|
||||
}
|
||||
|
||||
unsigned long
|
||||
LDAP_CALL
|
||||
ber_get_null( BerElement *ber )
|
||||
{
|
||||
unsigned long len, tag;
|
||||
|
||||
if ( (tag = ber_skip_tag( ber, &len )) == LBER_DEFAULT )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
if ( len != 0 )
|
||||
return( LBER_DEFAULT );
|
||||
|
||||
return( tag );
|
||||
}
|
||||
|
||||
unsigned long
|
||||
LDAP_CALL
|
||||
ber_get_boolean( BerElement *ber, int *boolval )
|
||||
{
|
||||
long longbool;
|
||||
int rc;
|
||||
|
||||
rc = ber_get_int( ber, &longbool );
|
||||
*boolval = longbool;
|
||||
|
||||
return( rc );
|
||||
}
|
||||
|
||||
unsigned long
|
||||
LDAP_CALL
|
||||
ber_first_element( BerElement *ber, unsigned long *len, char **last )
|
||||
{
|
||||
/* skip the sequence header, use the len to mark where to stop */
|
||||
if ( ber_skip_tag( ber, len ) == LBER_DEFAULT ) {
|
||||
return( LBER_ERROR );
|
||||
}
|
||||
|
||||
*last = ber->ber_ptr + *len;
|
||||
|
||||
if ( *last == ber->ber_ptr ) {
|
||||
return( LBER_END_OF_SEQORSET );
|
||||
}
|
||||
|
||||
return( ber_peek_tag( ber, len ) );
|
||||
}
|
||||
|
||||
unsigned long
|
||||
LDAP_CALL
|
||||
ber_next_element( BerElement *ber, unsigned long *len, char *last )
|
||||
{
|
||||
if ( ber->ber_ptr == last ) {
|
||||
return( LBER_END_OF_SEQORSET );
|
||||
}
|
||||
|
||||
return( ber_peek_tag( ber, len ) );
|
||||
}
|
||||
|
||||
/* VARARGS */
|
||||
unsigned long
|
||||
LDAP_C
|
||||
ber_scanf( BerElement *ber, const char *fmt, ... )
|
||||
{
|
||||
va_list ap;
|
||||
char *last;
|
||||
char *s, **ss, ***sss;
|
||||
struct berval ***bv, **bvp, *bval;
|
||||
int *i, j;
|
||||
long *l, rc, tag;
|
||||
unsigned long *t;
|
||||
unsigned long len;
|
||||
size_t array_size;
|
||||
|
||||
va_start( ap, fmt );
|
||||
|
||||
#ifdef LDAP_DEBUG
|
||||
if ( lber_debug & 64 ) {
|
||||
char msg[80];
|
||||
sprintf( msg, "ber_scanf fmt (%s) ber:\n", fmt );
|
||||
ber_err_print( msg );
|
||||
ber_dump( ber, 1 );
|
||||
}
|
||||
#endif
|
||||
|
||||
for ( rc = 0; *fmt && rc != LBER_DEFAULT; fmt++ ) {
|
||||
switch ( *fmt ) {
|
||||
case 'a': /* octet string - allocate storage as needed */
|
||||
ss = va_arg( ap, char ** );
|
||||
rc = ber_get_stringa( ber, ss );
|
||||
break;
|
||||
|
||||
case 'b': /* boolean */
|
||||
i = va_arg( ap, int * );
|
||||
rc = ber_get_boolean( ber, i );
|
||||
break;
|
||||
|
||||
case 'e': /* enumerated */
|
||||
case 'i': /* int */
|
||||
l = va_arg( ap, long * );
|
||||
rc = ber_get_int( ber, l );
|
||||
break;
|
||||
|
||||
case 'l': /* length of next item */
|
||||
l = va_arg( ap, long * );
|
||||
rc = ber_peek_tag( ber, (unsigned long *)l );
|
||||
break;
|
||||
|
||||
case 'n': /* null */
|
||||
rc = ber_get_null( ber );
|
||||
break;
|
||||
|
||||
case 's': /* octet string - in a buffer */
|
||||
s = va_arg( ap, char * );
|
||||
l = va_arg( ap, long * );
|
||||
rc = ber_get_stringb( ber, s, (unsigned long *)l );
|
||||
break;
|
||||
|
||||
case 'o': /* octet string in a supplied berval */
|
||||
bval = va_arg( ap, struct berval * );
|
||||
ber_peek_tag( ber, &bval->bv_len );
|
||||
rc = ber_get_stringa( ber, &bval->bv_val );
|
||||
break;
|
||||
|
||||
case 'O': /* octet string - allocate & include length */
|
||||
bvp = va_arg( ap, struct berval ** );
|
||||
rc = ber_get_stringal( ber, bvp );
|
||||
break;
|
||||
|
||||
case 'B': /* bit string - allocate storage as needed */
|
||||
ss = va_arg( ap, char ** );
|
||||
l = va_arg( ap, long * ); /* for length, in bits */
|
||||
rc = ber_get_bitstringa( ber, ss, (unsigned long *)l );
|
||||
break;
|
||||
|
||||
case 't': /* tag of next item */
|
||||
t = va_arg( ap, unsigned long * );
|
||||
*t = rc = ber_peek_tag( ber, &len );
|
||||
break;
|
||||
|
||||
case 'T': /* skip tag of next item */
|
||||
t = va_arg( ap, unsigned long * );
|
||||
*t = rc = ber_skip_tag( ber, &len );
|
||||
break;
|
||||
|
||||
case 'v': /* sequence of strings */
|
||||
sss = va_arg( ap, char *** );
|
||||
*sss = NULL;
|
||||
j = 0;
|
||||
array_size = 0;
|
||||
for ( tag = ber_first_element( ber, &len, &last );
|
||||
tag != LBER_DEFAULT && tag != LBER_END_OF_SEQORSET
|
||||
&& rc != LBER_DEFAULT;
|
||||
tag = ber_next_element( ber, &len, last ) ) {
|
||||
if ( *sss == NULL ) {
|
||||
/* Make room for at least 15 strings */
|
||||
*sss = (char **)NSLBERI_MALLOC(16 * sizeof(char *) );
|
||||
array_size = 16;
|
||||
} else {
|
||||
if ( (size_t)(j+2) > array_size) {
|
||||
/* We'v overflowed our buffer */
|
||||
*sss = (char **)NSLBERI_REALLOC( *sss, (array_size * 2) * sizeof(char *) );
|
||||
array_size = array_size * 2;
|
||||
}
|
||||
}
|
||||
rc = ber_get_stringa( ber, &((*sss)[j]) );
|
||||
j++;
|
||||
}
|
||||
if ( rc != LBER_DEFAULT &&
|
||||
tag != LBER_END_OF_SEQORSET ) {
|
||||
rc = LBER_DEFAULT;
|
||||
}
|
||||
if ( j > 0 )
|
||||
(*sss)[j] = NULL;
|
||||
break;
|
||||
|
||||
case 'V': /* sequence of strings + lengths */
|
||||
bv = va_arg( ap, struct berval *** );
|
||||
*bv = NULL;
|
||||
j = 0;
|
||||
for ( tag = ber_first_element( ber, &len, &last );
|
||||
tag != LBER_DEFAULT && tag != LBER_END_OF_SEQORSET
|
||||
&& rc != LBER_DEFAULT;
|
||||
tag = ber_next_element( ber, &len, last ) ) {
|
||||
if ( *bv == NULL ) {
|
||||
*bv = (struct berval **)NSLBERI_MALLOC(
|
||||
2 * sizeof(struct berval *) );
|
||||
} else {
|
||||
*bv = (struct berval **)NSLBERI_REALLOC(
|
||||
*bv,
|
||||
(j + 2) * sizeof(struct berval *) );
|
||||
}
|
||||
rc = ber_get_stringal( ber, &((*bv)[j]) );
|
||||
j++;
|
||||
}
|
||||
if ( rc != LBER_DEFAULT &&
|
||||
tag != LBER_END_OF_SEQORSET ) {
|
||||
rc = LBER_DEFAULT;
|
||||
}
|
||||
if ( j > 0 )
|
||||
(*bv)[j] = NULL;
|
||||
break;
|
||||
|
||||
case 'x': /* skip the next element - whatever it is */
|
||||
if ( (rc = ber_skip_tag( ber, &len )) == LBER_DEFAULT )
|
||||
break;
|
||||
ber->ber_ptr += len;
|
||||
break;
|
||||
|
||||
case '{': /* begin sequence */
|
||||
case '[': /* begin set */
|
||||
if ( *(fmt + 1) != 'v' && *(fmt + 1) != 'V' )
|
||||
rc = ber_skip_tag( ber, &len );
|
||||
break;
|
||||
|
||||
case '}': /* end sequence */
|
||||
case ']': /* end set */
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
char msg[80];
|
||||
sprintf( msg, "unknown fmt %c\n", *fmt );
|
||||
ber_err_print( msg );
|
||||
}
|
||||
rc = LBER_DEFAULT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
va_end( ap );
|
||||
|
||||
return( rc );
|
||||
}
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ber_bvfree( struct berval *bv )
|
||||
{
|
||||
if ( bv != NULL ) {
|
||||
if ( bv->bv_val != NULL ) {
|
||||
NSLBERI_FREE( bv->bv_val );
|
||||
}
|
||||
NSLBERI_FREE( (char *) bv );
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ber_bvecfree( struct berval **bv )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( bv != NULL ) {
|
||||
for ( i = 0; bv[i] != NULL; i++ ) {
|
||||
ber_bvfree( bv[i] );
|
||||
}
|
||||
NSLBERI_FREE( (char *) bv );
|
||||
}
|
||||
}
|
||||
|
||||
struct berval *
|
||||
LDAP_CALL
|
||||
ber_bvdup( const struct berval *bv )
|
||||
{
|
||||
struct berval *new;
|
||||
|
||||
if ( (new = (struct berval *)NSLBERI_MALLOC( sizeof(struct berval) ))
|
||||
== NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
if ( bv->bv_val == NULL ) {
|
||||
new->bv_val = NULL;
|
||||
new->bv_len = 0;
|
||||
} else {
|
||||
if ( (new->bv_val = (char *)NSLBERI_MALLOC( bv->bv_len + 1 ))
|
||||
== NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
SAFEMEMCPY( new->bv_val, bv->bv_val, (size_t) bv->bv_len );
|
||||
new->bv_val[bv->bv_len] = '\0';
|
||||
new->bv_len = bv->bv_len;
|
||||
}
|
||||
|
||||
return( new );
|
||||
}
|
||||
|
||||
|
||||
#ifdef STR_TRANSLATION
|
||||
void
|
||||
LDAP_CALL
|
||||
ber_set_string_translators(
|
||||
BerElement *ber,
|
||||
BERTranslateProc encode_proc,
|
||||
BERTranslateProc decode_proc
|
||||
)
|
||||
{
|
||||
ber->ber_encode_translate_proc = encode_proc;
|
||||
ber->ber_decode_translate_proc = decode_proc;
|
||||
}
|
||||
#endif /* STR_TRANSLATION */
|
||||
98
mozilla/directory/c-sdk/ldap/libraries/liblber/dtest.c
Normal file
98
mozilla/directory/c-sdk/ldap/libraries/liblber/dtest.c
Normal file
@@ -0,0 +1,98 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*/
|
||||
/* dtest.c - lber decoding test program */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#ifdef MACOS
|
||||
#include <stdlib.h>
|
||||
#include <console.h>
|
||||
#else /* MACOS */
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#endif /* _WIN32 */
|
||||
#endif /* MACOS */
|
||||
#include "lber.h"
|
||||
|
||||
int
|
||||
SSL_Recv( int s, char *b, unsigned l, int dummy )
|
||||
{
|
||||
return( read( s, b, l ) );
|
||||
}
|
||||
|
||||
SSL_Send( int s, char *b, unsigned l, int dummy )
|
||||
{
|
||||
return( write( s, b, l ) );
|
||||
}
|
||||
|
||||
static void usage( char *name )
|
||||
{
|
||||
fprintf( stderr, "usage: %s < berfile\n", name );
|
||||
}
|
||||
|
||||
main( int argc, char **argv )
|
||||
{
|
||||
long i, fd;
|
||||
unsigned long len;
|
||||
int tag;
|
||||
BerElement *ber;
|
||||
Sockbuf *sb;
|
||||
extern int lber_debug;
|
||||
|
||||
lber_debug = 255;
|
||||
if ( argc > 1 ) {
|
||||
usage( argv[0] );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
sb = ber_sockbuf_alloc();
|
||||
fd = 0;
|
||||
ber_sockbuf_set_option( sb, LBER_SOCKBUF_OPT_DESC, &fd );
|
||||
|
||||
if ( (ber = der_alloc()) == NULL ) {
|
||||
perror( "ber_alloc" );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
if ( (tag = ber_get_next( sb, &len, ber )) == LBER_ERROR ) {
|
||||
perror( "ber_get_next" );
|
||||
exit( 1 );
|
||||
}
|
||||
printf( "message has tag 0x%x and length %ld\n", tag, len );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
668
mozilla/directory/c-sdk/ldap/libraries/liblber/encode.c
Normal file
668
mozilla/directory/c-sdk/ldap/libraries/liblber/encode.c
Normal file
@@ -0,0 +1,668 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*/
|
||||
|
||||
/* encode.c - ber output encoding routines */
|
||||
|
||||
#include "lber-int.h"
|
||||
|
||||
static int
|
||||
ber_calc_taglen( unsigned long tag )
|
||||
{
|
||||
int i;
|
||||
long mask;
|
||||
|
||||
/* find the first non-all-zero byte in the tag */
|
||||
for ( i = sizeof(long) - 1; i > 0; i-- ) {
|
||||
mask = (0xffL << (i * 8));
|
||||
/* not all zero */
|
||||
if ( tag & mask )
|
||||
break;
|
||||
}
|
||||
|
||||
return( i + 1 );
|
||||
}
|
||||
|
||||
static int
|
||||
ber_put_tag( BerElement *ber, unsigned long tag, int nosos )
|
||||
{
|
||||
int taglen;
|
||||
unsigned long ntag;
|
||||
|
||||
taglen = ber_calc_taglen( tag );
|
||||
|
||||
ntag = LBER_HTONL( tag );
|
||||
|
||||
return( ber_write( ber, ((char *) &ntag) + sizeof(long) - taglen,
|
||||
taglen, nosos ) );
|
||||
}
|
||||
|
||||
static int
|
||||
ber_calc_lenlen( unsigned long len )
|
||||
{
|
||||
/*
|
||||
* short len if it's less than 128 - one byte giving the len,
|
||||
* with bit 8 0.
|
||||
*/
|
||||
|
||||
if ( len <= 0x7F )
|
||||
return( 1 );
|
||||
|
||||
/*
|
||||
* long len otherwise - one byte with bit 8 set, giving the
|
||||
* length of the length, followed by the length itself.
|
||||
*/
|
||||
|
||||
if ( len <= 0xFF )
|
||||
return( 2 );
|
||||
if ( len <= 0xFFFFL )
|
||||
return( 3 );
|
||||
if ( len <= 0xFFFFFFL )
|
||||
return( 4 );
|
||||
|
||||
return( 5 );
|
||||
}
|
||||
|
||||
static int
|
||||
ber_put_len( BerElement *ber, unsigned long len, int nosos )
|
||||
{
|
||||
int i;
|
||||
char lenlen;
|
||||
long mask;
|
||||
unsigned long netlen;
|
||||
|
||||
/*
|
||||
* short len if it's less than 128 - one byte giving the len,
|
||||
* with bit 8 0.
|
||||
*/
|
||||
|
||||
if ( len <= 127 ) {
|
||||
netlen = LBER_HTONL( len );
|
||||
return( ber_write( ber, (char *) &netlen + sizeof(long) - 1,
|
||||
1, nosos ) );
|
||||
}
|
||||
|
||||
/*
|
||||
* long len otherwise - one byte with bit 8 set, giving the
|
||||
* length of the length, followed by the length itself.
|
||||
*/
|
||||
|
||||
/* find the first non-all-zero byte */
|
||||
for ( i = sizeof(long) - 1; i > 0; i-- ) {
|
||||
mask = (0xffL << (i * 8));
|
||||
/* not all zero */
|
||||
if ( len & mask )
|
||||
break;
|
||||
}
|
||||
lenlen = ++i;
|
||||
if ( lenlen > 4 )
|
||||
return( -1 );
|
||||
lenlen |= 0x80;
|
||||
|
||||
/* write the length of the length */
|
||||
if ( ber_write( ber, &lenlen, 1, nosos ) != 1 )
|
||||
return( -1 );
|
||||
|
||||
/* write the length itself */
|
||||
netlen = LBER_HTONL( len );
|
||||
if ( ber_write( ber, (char *) &netlen + (sizeof(long) - i), i, nosos )
|
||||
!= i )
|
||||
return( -1 );
|
||||
|
||||
return( i + 1 );
|
||||
}
|
||||
|
||||
static int
|
||||
ber_put_int_or_enum( BerElement *ber, long num, unsigned long tag )
|
||||
{
|
||||
int i, sign, taglen;
|
||||
int len, lenlen;
|
||||
long netnum, mask;
|
||||
|
||||
sign = (num < 0);
|
||||
|
||||
/*
|
||||
* high bit is set - look for first non-all-one byte
|
||||
* high bit is clear - look for first non-all-zero byte
|
||||
*/
|
||||
for ( i = sizeof(long) - 1; i > 0; i-- ) {
|
||||
mask = (0xffL << (i * 8));
|
||||
|
||||
if ( sign ) {
|
||||
/* not all ones */
|
||||
if ( (num & mask) != mask )
|
||||
break;
|
||||
} else {
|
||||
/* not all zero */
|
||||
if ( num & mask )
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* we now have the "leading byte". if the high bit on this
|
||||
* byte matches the sign bit, we need to "back up" a byte.
|
||||
*/
|
||||
mask = (num & (0x80L << (i * 8)));
|
||||
if ( (mask && !sign) || (sign && !mask) )
|
||||
i++;
|
||||
|
||||
len = i + 1;
|
||||
|
||||
if ( (taglen = ber_put_tag( ber, tag, 0 )) == -1 )
|
||||
return( -1 );
|
||||
|
||||
if ( (lenlen = ber_put_len( ber, len, 0 )) == -1 )
|
||||
return( -1 );
|
||||
i++;
|
||||
netnum = LBER_HTONL( num );
|
||||
if ( ber_write( ber, (char *) &netnum + (sizeof(long) - i), i, 0 )
|
||||
== i)
|
||||
/* length of tag + length + contents */
|
||||
return( taglen + lenlen + i );
|
||||
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ber_put_enum( BerElement *ber, long num, unsigned long tag )
|
||||
{
|
||||
if ( tag == LBER_DEFAULT )
|
||||
tag = LBER_ENUMERATED;
|
||||
|
||||
return( ber_put_int_or_enum( ber, num, tag ) );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ber_put_int( BerElement *ber, long num, unsigned long tag )
|
||||
{
|
||||
if ( tag == LBER_DEFAULT )
|
||||
tag = LBER_INTEGER;
|
||||
|
||||
return( ber_put_int_or_enum( ber, num, tag ) );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ber_put_ostring( BerElement *ber, char *str, unsigned long len,
|
||||
unsigned long tag )
|
||||
{
|
||||
int taglen, lenlen, rc;
|
||||
#ifdef STR_TRANSLATION
|
||||
int free_str;
|
||||
#endif /* STR_TRANSLATION */
|
||||
|
||||
if ( tag == LBER_DEFAULT )
|
||||
tag = LBER_OCTETSTRING;
|
||||
|
||||
if ( (taglen = ber_put_tag( ber, tag, 0 )) == -1 )
|
||||
return( -1 );
|
||||
|
||||
#ifdef STR_TRANSLATION
|
||||
if ( len > 0 && ( ber->ber_options & LBER_OPT_TRANSLATE_STRINGS ) != 0
|
||||
&& ber->ber_encode_translate_proc != NULL ) {
|
||||
if ( (*(ber->ber_encode_translate_proc))( &str, &len, 0 )
|
||||
!= 0 ) {
|
||||
return( -1 );
|
||||
}
|
||||
free_str = 1;
|
||||
} else {
|
||||
free_str = 0;
|
||||
}
|
||||
#endif /* STR_TRANSLATION */
|
||||
|
||||
/*
|
||||
* Note: below is a spot where we limit ber_write
|
||||
* to signed long (instead of unsigned long)
|
||||
*/
|
||||
|
||||
if ( (lenlen = ber_put_len( ber, len, 0 )) == -1 ||
|
||||
ber_write( ber, str, len, 0 ) != (long) len ) {
|
||||
rc = -1;
|
||||
} else {
|
||||
/* return length of tag + length + contents */
|
||||
rc = taglen + lenlen + len;
|
||||
}
|
||||
|
||||
#ifdef STR_TRANSLATION
|
||||
if ( free_str ) {
|
||||
NSLBERI_FREE( str );
|
||||
}
|
||||
#endif /* STR_TRANSLATION */
|
||||
|
||||
return( rc );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ber_put_string( BerElement *ber, char *str, unsigned long tag )
|
||||
{
|
||||
return( ber_put_ostring( ber, str, strlen( str ), tag ));
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ber_put_bitstring( BerElement *ber, char *str,
|
||||
unsigned long blen /* in bits */, unsigned long tag )
|
||||
{
|
||||
int taglen, lenlen, len;
|
||||
unsigned char unusedbits;
|
||||
|
||||
if ( tag == LBER_DEFAULT )
|
||||
tag = LBER_BITSTRING;
|
||||
|
||||
if ( (taglen = ber_put_tag( ber, tag, 0 )) == -1 )
|
||||
return( -1 );
|
||||
|
||||
len = ( blen + 7 ) / 8;
|
||||
unusedbits = (unsigned char) (len * 8 - blen);
|
||||
if ( (lenlen = ber_put_len( ber, len + 1, 0 )) == -1 )
|
||||
return( -1 );
|
||||
|
||||
if ( ber_write( ber, (char *)&unusedbits, 1, 0 ) != 1 )
|
||||
return( -1 );
|
||||
|
||||
if ( ber_write( ber, str, len, 0 ) != len )
|
||||
return( -1 );
|
||||
|
||||
/* return length of tag + length + unused bit count + contents */
|
||||
return( taglen + 1 + lenlen + len );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ber_put_null( BerElement *ber, unsigned long tag )
|
||||
{
|
||||
int taglen;
|
||||
|
||||
if ( tag == LBER_DEFAULT )
|
||||
tag = LBER_NULL;
|
||||
|
||||
if ( (taglen = ber_put_tag( ber, tag, 0 )) == -1 )
|
||||
return( -1 );
|
||||
|
||||
if ( ber_put_len( ber, 0, 0 ) != 1 )
|
||||
return( -1 );
|
||||
|
||||
return( taglen + 1 );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ber_put_boolean( BerElement *ber, int boolval, unsigned long tag )
|
||||
{
|
||||
int taglen;
|
||||
unsigned char trueval = 0xff;
|
||||
unsigned char falseval = 0x00;
|
||||
|
||||
if ( tag == LBER_DEFAULT )
|
||||
tag = LBER_BOOLEAN;
|
||||
|
||||
if ( (taglen = ber_put_tag( ber, tag, 0 )) == -1 )
|
||||
return( -1 );
|
||||
|
||||
if ( ber_put_len( ber, 1, 0 ) != 1 )
|
||||
return( -1 );
|
||||
|
||||
if ( ber_write( ber, (char *)(boolval ? &trueval : &falseval), 1, 0 )
|
||||
!= 1 )
|
||||
return( -1 );
|
||||
|
||||
return( taglen + 2 );
|
||||
}
|
||||
|
||||
#define FOUR_BYTE_LEN 5
|
||||
|
||||
|
||||
/* the idea here is roughly this: we maintain a stack of these Seqorset
|
||||
* structures. This is pushed when we see the beginning of a new set or
|
||||
* sequence. It is popped when we see the end of a set or sequence.
|
||||
* Since we don't want to malloc and free these structures all the time,
|
||||
* we pre-allocate a small set of them within the ber element structure.
|
||||
* thus we need to spot when we've overflowed this stack and fall back to
|
||||
* malloc'ing instead.
|
||||
*/
|
||||
static int
|
||||
ber_start_seqorset( BerElement *ber, unsigned long tag )
|
||||
{
|
||||
Seqorset *new_sos;
|
||||
|
||||
/* can we fit into the local stack ? */
|
||||
if (ber->ber_sos_stack_posn < SOS_STACK_SIZE) {
|
||||
/* yes */
|
||||
new_sos = &ber->ber_sos_stack[ber->ber_sos_stack_posn];
|
||||
} else {
|
||||
/* no */
|
||||
if ( (new_sos = (Seqorset *)NSLBERI_MALLOC( sizeof(Seqorset)))
|
||||
== NULLSEQORSET ) {
|
||||
return( -1 );
|
||||
}
|
||||
}
|
||||
ber->ber_sos_stack_posn++;
|
||||
|
||||
if ( ber->ber_sos == NULLSEQORSET )
|
||||
new_sos->sos_first = ber->ber_ptr;
|
||||
else
|
||||
new_sos->sos_first = ber->ber_sos->sos_ptr;
|
||||
|
||||
/* Set aside room for a 4 byte length field */
|
||||
new_sos->sos_ptr = new_sos->sos_first + ber_calc_taglen( tag ) + FOUR_BYTE_LEN;
|
||||
new_sos->sos_tag = tag;
|
||||
|
||||
new_sos->sos_next = ber->ber_sos;
|
||||
new_sos->sos_clen = 0;
|
||||
|
||||
ber->ber_sos = new_sos;
|
||||
if (ber->ber_sos->sos_ptr > ber->ber_end) {
|
||||
nslberi_ber_realloc(ber, ber->ber_sos->sos_ptr - ber->ber_end);
|
||||
}
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ber_start_seq( BerElement *ber, unsigned long tag )
|
||||
{
|
||||
if ( tag == LBER_DEFAULT )
|
||||
tag = LBER_SEQUENCE;
|
||||
|
||||
return( ber_start_seqorset( ber, tag ) );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ber_start_set( BerElement *ber, unsigned long tag )
|
||||
{
|
||||
if ( tag == LBER_DEFAULT )
|
||||
tag = LBER_SET;
|
||||
|
||||
return( ber_start_seqorset( ber, tag ) );
|
||||
}
|
||||
|
||||
static int
|
||||
ber_put_seqorset( BerElement *ber )
|
||||
{
|
||||
unsigned long len, netlen;
|
||||
int taglen, lenlen;
|
||||
unsigned char ltag = 0x80 + FOUR_BYTE_LEN - 1;
|
||||
Seqorset *next;
|
||||
Seqorset **sos = &ber->ber_sos;
|
||||
|
||||
/*
|
||||
* If this is the toplevel sequence or set, we need to actually
|
||||
* write the stuff out. Otherwise, it's already been put in
|
||||
* the appropriate buffer and will be written when the toplevel
|
||||
* one is written. In this case all we need to do is update the
|
||||
* length and tag.
|
||||
*/
|
||||
|
||||
len = (*sos)->sos_clen;
|
||||
netlen = LBER_HTONL( len );
|
||||
if ( sizeof(long) > 4 && len > 0xFFFFFFFFUL )
|
||||
return( -1 );
|
||||
|
||||
if ( ber->ber_options & LBER_OPT_USE_DER ) {
|
||||
lenlen = ber_calc_lenlen( len );
|
||||
} else {
|
||||
lenlen = FOUR_BYTE_LEN;
|
||||
}
|
||||
|
||||
if ( (next = (*sos)->sos_next) == NULLSEQORSET ) {
|
||||
/* write the tag */
|
||||
if ( (taglen = ber_put_tag( ber, (*sos)->sos_tag, 1 )) == -1 )
|
||||
return( -1 );
|
||||
|
||||
if ( ber->ber_options & LBER_OPT_USE_DER ) {
|
||||
/* Write the length in the minimum # of octets */
|
||||
if ( ber_put_len( ber, len, 1 ) == -1 )
|
||||
return( -1 );
|
||||
|
||||
if (lenlen != FOUR_BYTE_LEN) {
|
||||
/*
|
||||
* We set aside FOUR_BYTE_LEN bytes for
|
||||
* the length field. Move the data if
|
||||
* we don't actually need that much
|
||||
*/
|
||||
SAFEMEMCPY( (*sos)->sos_first + taglen +
|
||||
lenlen, (*sos)->sos_first + taglen +
|
||||
FOUR_BYTE_LEN, len );
|
||||
}
|
||||
} else {
|
||||
/* Fill FOUR_BYTE_LEN bytes for length field */
|
||||
/* one byte of length length */
|
||||
if ( ber_write( ber, (char *)<ag, 1, 1 ) != 1 )
|
||||
return( -1 );
|
||||
|
||||
/* the length itself */
|
||||
if ( ber_write( ber, (char *) &netlen + sizeof(long)
|
||||
- (FOUR_BYTE_LEN - 1), FOUR_BYTE_LEN - 1, 1 )
|
||||
!= FOUR_BYTE_LEN - 1 )
|
||||
return( -1 );
|
||||
}
|
||||
/* The ber_ptr is at the set/seq start - move it to the end */
|
||||
ber->ber_ptr += len;
|
||||
} else {
|
||||
unsigned long ntag;
|
||||
|
||||
/* the tag */
|
||||
taglen = ber_calc_taglen( (*sos)->sos_tag );
|
||||
ntag = LBER_HTONL( (*sos)->sos_tag );
|
||||
SAFEMEMCPY( (*sos)->sos_first, (char *) &ntag +
|
||||
sizeof(long) - taglen, taglen );
|
||||
|
||||
if ( ber->ber_options & LBER_OPT_USE_DER ) {
|
||||
ltag = (lenlen == 1) ? (unsigned char)len :
|
||||
(unsigned char) (0x80 + (lenlen - 1));
|
||||
}
|
||||
|
||||
/* one byte of length length */
|
||||
SAFEMEMCPY( (*sos)->sos_first + 1, <ag, 1 );
|
||||
|
||||
if ( ber->ber_options & LBER_OPT_USE_DER ) {
|
||||
if (lenlen > 1) {
|
||||
/* Write the length itself */
|
||||
SAFEMEMCPY( (*sos)->sos_first + 2,
|
||||
(char *)&netlen + sizeof(unsigned long) -
|
||||
(lenlen - 1),
|
||||
lenlen - 1 );
|
||||
}
|
||||
if (lenlen != FOUR_BYTE_LEN) {
|
||||
/*
|
||||
* We set aside FOUR_BYTE_LEN bytes for
|
||||
* the length field. Move the data if
|
||||
* we don't actually need that much
|
||||
*/
|
||||
SAFEMEMCPY( (*sos)->sos_first + taglen +
|
||||
lenlen, (*sos)->sos_first + taglen +
|
||||
FOUR_BYTE_LEN, len );
|
||||
}
|
||||
} else {
|
||||
/* the length itself */
|
||||
SAFEMEMCPY( (*sos)->sos_first + taglen + 1,
|
||||
(char *) &netlen + sizeof(long) -
|
||||
(FOUR_BYTE_LEN - 1), FOUR_BYTE_LEN - 1 );
|
||||
}
|
||||
|
||||
next->sos_clen += (taglen + lenlen + len);
|
||||
next->sos_ptr += (taglen + lenlen + len);
|
||||
}
|
||||
|
||||
/* we're done with this seqorset, so free it up */
|
||||
/* was this one from the local stack ? */
|
||||
if (ber->ber_sos_stack_posn <= SOS_STACK_SIZE) {
|
||||
/* yes */
|
||||
} else {
|
||||
/* no */
|
||||
NSLBERI_FREE( (char *) (*sos) );
|
||||
}
|
||||
ber->ber_sos_stack_posn--;
|
||||
*sos = next;
|
||||
|
||||
return( taglen + lenlen + len );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ber_put_seq( BerElement *ber )
|
||||
{
|
||||
return( ber_put_seqorset( ber ) );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ber_put_set( BerElement *ber )
|
||||
{
|
||||
return( ber_put_seqorset( ber ) );
|
||||
}
|
||||
|
||||
/* VARARGS */
|
||||
int
|
||||
LDAP_C
|
||||
ber_printf( BerElement *ber, const char *fmt, ... )
|
||||
{
|
||||
va_list ap;
|
||||
char *s, **ss;
|
||||
struct berval **bv;
|
||||
int rc, i;
|
||||
unsigned long len;
|
||||
|
||||
va_start( ap, fmt );
|
||||
|
||||
#ifdef LDAP_DEBUG
|
||||
if ( lber_debug & 64 ) {
|
||||
char msg[80];
|
||||
sprintf( msg, "ber_printf fmt (%s)\n", fmt );
|
||||
ber_err_print( msg );
|
||||
}
|
||||
#endif
|
||||
|
||||
for ( rc = 0; *fmt && rc != -1; fmt++ ) {
|
||||
switch ( *fmt ) {
|
||||
case 'b': /* boolean */
|
||||
i = va_arg( ap, int );
|
||||
rc = ber_put_boolean( ber, i, ber->ber_tag );
|
||||
break;
|
||||
|
||||
case 'i': /* int */
|
||||
i = va_arg( ap, int );
|
||||
rc = ber_put_int( ber, (long)i, ber->ber_tag );
|
||||
break;
|
||||
|
||||
case 'e': /* enumeration */
|
||||
i = va_arg( ap, int );
|
||||
rc = ber_put_enum( ber, (long)i, ber->ber_tag );
|
||||
break;
|
||||
|
||||
case 'n': /* null */
|
||||
rc = ber_put_null( ber, ber->ber_tag );
|
||||
break;
|
||||
|
||||
case 'o': /* octet string (non-null terminated) */
|
||||
s = va_arg( ap, char * );
|
||||
len = va_arg( ap, int );
|
||||
rc = ber_put_ostring( ber, s, len, ber->ber_tag );
|
||||
break;
|
||||
|
||||
case 's': /* string */
|
||||
s = va_arg( ap, char * );
|
||||
rc = ber_put_string( ber, s, ber->ber_tag );
|
||||
break;
|
||||
|
||||
case 'B': /* bit string */
|
||||
s = va_arg( ap, char * );
|
||||
len = va_arg( ap, int ); /* in bits */
|
||||
rc = ber_put_bitstring( ber, s, len, ber->ber_tag );
|
||||
break;
|
||||
|
||||
case 't': /* tag for the next element */
|
||||
ber->ber_tag = va_arg( ap, unsigned long );
|
||||
ber->ber_usertag = 1;
|
||||
break;
|
||||
|
||||
case 'v': /* vector of strings */
|
||||
if ( (ss = va_arg( ap, char ** )) == NULL )
|
||||
break;
|
||||
for ( i = 0; ss[i] != NULL; i++ ) {
|
||||
if ( (rc = ber_put_string( ber, ss[i],
|
||||
ber->ber_tag )) == -1 )
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'V': /* sequences of strings + lengths */
|
||||
if ( (bv = va_arg( ap, struct berval ** )) == NULL )
|
||||
break;
|
||||
for ( i = 0; bv[i] != NULL; i++ ) {
|
||||
if ( (rc = ber_put_ostring( ber, bv[i]->bv_val,
|
||||
bv[i]->bv_len, ber->ber_tag )) == -1 )
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case '{': /* begin sequence */
|
||||
rc = ber_start_seq( ber, ber->ber_tag );
|
||||
break;
|
||||
|
||||
case '}': /* end sequence */
|
||||
rc = ber_put_seqorset( ber );
|
||||
break;
|
||||
|
||||
case '[': /* begin set */
|
||||
rc = ber_start_set( ber, ber->ber_tag );
|
||||
break;
|
||||
|
||||
case ']': /* end set */
|
||||
rc = ber_put_seqorset( ber );
|
||||
break;
|
||||
|
||||
default: {
|
||||
char msg[80];
|
||||
sprintf( msg, "unknown fmt %c\n", *fmt );
|
||||
ber_err_print( msg );
|
||||
rc = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ber->ber_usertag == 0 )
|
||||
ber->ber_tag = LBER_DEFAULT;
|
||||
else
|
||||
ber->ber_usertag = 0;
|
||||
}
|
||||
|
||||
va_end( ap );
|
||||
|
||||
return( rc );
|
||||
}
|
||||
172
mozilla/directory/c-sdk/ldap/libraries/liblber/etest.c
Normal file
172
mozilla/directory/c-sdk/ldap/libraries/liblber/etest.c
Normal file
@@ -0,0 +1,172 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
/* test.c - lber encoding test program */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#ifdef MACOS
|
||||
#include <stdlib.h>
|
||||
#include <unix.h>
|
||||
#include <fcntl.h>
|
||||
#include <console.h>
|
||||
#else /* MACOS */
|
||||
#include <sys/types.h>
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
#endif /* _WIN32 */
|
||||
#endif /* MACOS */
|
||||
#include "lber.h"
|
||||
|
||||
int
|
||||
SSL_Recv( int s, char *b, unsigned l, int dummy )
|
||||
{
|
||||
return( read( s, b, l ) );
|
||||
}
|
||||
|
||||
SSL_Send( int s, char *b, unsigned l, int dummy )
|
||||
{
|
||||
return( write( s, b, l ) );
|
||||
}
|
||||
|
||||
int
|
||||
getline( char *prompt, char c, char *buf, int bsize )
|
||||
{
|
||||
char *p;
|
||||
|
||||
if ( prompt != NULL ) {
|
||||
fprintf( stderr, "%s: ", prompt );
|
||||
} else {
|
||||
fprintf( stderr, "enter value for '%c': ", c );
|
||||
}
|
||||
if ( fgets( buf, bsize, stdin ) == NULL ) {
|
||||
return( -1 );
|
||||
}
|
||||
if ( (p = strchr( buf, '\n' )) != NULL ) {
|
||||
*p = '\0';
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
||||
static void usage( char *name )
|
||||
{
|
||||
fprintf( stderr, "usage: %s fmtstring\n", name );
|
||||
}
|
||||
|
||||
main( int argc, char **argv )
|
||||
{
|
||||
int rc, fd;
|
||||
char *s, *p;
|
||||
void *arg1, *arg2;
|
||||
Sockbuf *sb;
|
||||
BerElement *ber;
|
||||
char fmt[2];
|
||||
char buf[BUFSIZ];
|
||||
extern int lber_debug;
|
||||
|
||||
lber_debug = 255;
|
||||
if ( argc < 2 ) {
|
||||
usage( argv[0] );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
sb = ber_sockbuf_alloc();
|
||||
fd = 1;
|
||||
ber_sockbuf_set_option( sb, LBER_SOCKBUF_OPT_DESC, &fd );
|
||||
|
||||
if ( (ber = der_alloc()) == NULL ) {
|
||||
perror( "ber_alloc" );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
rc = 0;
|
||||
fmt[1] = '\0';
|
||||
for ( s = argv[1]; *s; s++ ) {
|
||||
switch ( *s ) {
|
||||
case 'i': /* int */
|
||||
case 'b': /* boolean */
|
||||
case 'e': /* enumeration */
|
||||
getline( NULL, *s, buf, sizeof(buf) );
|
||||
arg1 = (void *) atoi( buf );
|
||||
break;
|
||||
|
||||
case 'n': /* null */
|
||||
arg1 = NULL;
|
||||
break;
|
||||
|
||||
case 'o': /* octet string (non-null terminated) */
|
||||
getline( NULL, *s, buf, sizeof(buf) );
|
||||
arg1 = (void *) buf;
|
||||
arg2 = (void *) strlen( buf );
|
||||
break;
|
||||
|
||||
case 's': /* string */
|
||||
getline( NULL, *s, buf, sizeof(buf) );
|
||||
arg1 = (void *) buf;
|
||||
break;
|
||||
|
||||
case 'B': /* bit string */
|
||||
getline( NULL, *s, buf, sizeof(buf) );
|
||||
arg1 = (void *) buf;
|
||||
arg2 = (void *) strlen( buf );
|
||||
break;
|
||||
|
||||
case 't': /* tag for the next element */
|
||||
getline( NULL, *s, buf, sizeof(buf) );
|
||||
arg1 = (void *) buf;
|
||||
break;
|
||||
|
||||
case '{': /* begin sequence */
|
||||
case '}': /* end sequence */
|
||||
case '[': /* begin set */
|
||||
case ']': /* end set */
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf( stderr, "unknown fmt %c\n", *s );
|
||||
rc = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
fmt[0] = *s;
|
||||
if ( ber_printf( ber, fmt, arg1, arg2 ) == -1 ) {
|
||||
fprintf( stderr, "ber_printf\n" );
|
||||
exit( 1 );
|
||||
}
|
||||
}
|
||||
|
||||
if ( ber_flush( sb, ber, 1 ) != 0 ) {
|
||||
perror( "ber_flush" );
|
||||
rc = -1;
|
||||
}
|
||||
|
||||
return( rc );
|
||||
}
|
||||
86
mozilla/directory/c-sdk/ldap/libraries/liblber/idtest.c
Normal file
86
mozilla/directory/c-sdk/ldap/libraries/liblber/idtest.c
Normal file
@@ -0,0 +1,86 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*/
|
||||
|
||||
/* idtest.c - ber decoding test program using isode libraries */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <psap.h>
|
||||
#include <quipu/attr.h>
|
||||
|
||||
static usage( char *name )
|
||||
{
|
||||
fprintf( stderr, "usage: %s\n", name );
|
||||
}
|
||||
|
||||
main( int argc, char **argv )
|
||||
{
|
||||
PE pe;
|
||||
PS psin, psout, pserr;
|
||||
|
||||
/* read the pe from standard in */
|
||||
if ( (psin = ps_alloc( std_open )) == NULLPS ) {
|
||||
perror( "ps_alloc" );
|
||||
exit( 1 );
|
||||
}
|
||||
if ( std_setup( psin, stdin ) == NOTOK ) {
|
||||
perror( "std_setup" );
|
||||
exit( 1 );
|
||||
}
|
||||
/* write the pe to standard out */
|
||||
if ( (psout = ps_alloc( std_open )) == NULLPS ) {
|
||||
perror( "ps_alloc" );
|
||||
exit( 1 );
|
||||
}
|
||||
if ( std_setup( psout, stdout ) == NOTOK ) {
|
||||
perror( "std_setup" );
|
||||
exit( 1 );
|
||||
}
|
||||
/* pretty print it to standard error */
|
||||
if ( (pserr = ps_alloc( std_open )) == NULLPS ) {
|
||||
perror( "ps_alloc" );
|
||||
exit( 1 );
|
||||
}
|
||||
if ( std_setup( pserr, stderr ) == NOTOK ) {
|
||||
perror( "std_setup" );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
while ( (pe = ps2pe( psin )) != NULLPE ) {
|
||||
pe2pl( pserr, pe );
|
||||
pe2ps( psout, pe );
|
||||
}
|
||||
|
||||
exit( 0 );
|
||||
}
|
||||
1241
mozilla/directory/c-sdk/ldap/libraries/liblber/io.c
Normal file
1241
mozilla/directory/c-sdk/ldap/libraries/liblber/io.c
Normal file
File diff suppressed because it is too large
Load Diff
241
mozilla/directory/c-sdk/ldap/libraries/liblber/lber-int.h
Normal file
241
mozilla/directory/c-sdk/ldap/libraries/liblber/lber-int.h
Normal file
@@ -0,0 +1,241 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*/
|
||||
/* lbet-int.h - internal header file for liblber */
|
||||
|
||||
#ifndef _LBERINT_H
|
||||
#define _LBERINT_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef macintosh
|
||||
# include "ldap-macos.h"
|
||||
#else /* macintosh */
|
||||
#if !defined(BSDI) && !defined(DARWIN) && !defined(FREEBSD)
|
||||
# include <malloc.h>
|
||||
#endif
|
||||
# include <errno.h>
|
||||
# include <sys/types.h>
|
||||
#if defined(SUNOS4) || defined(SCOOS)
|
||||
# include <sys/time.h>
|
||||
#endif
|
||||
#if defined( _WINDOWS )
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# include <windows.h>
|
||||
# include <time.h>
|
||||
/* No stderr in a 16-bit Windows DLL */
|
||||
# if defined(_WINDLL) && !defined(_WIN32)
|
||||
# define USE_DBG_WIN
|
||||
# endif
|
||||
# else
|
||||
/* # include <sys/varargs.h> */
|
||||
# include <sys/socket.h>
|
||||
# include <netinet/in.h>
|
||||
#if !defined(XP_OS2) && !defined(DARWIN)
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
# endif /* defined( _WINDOWS ) */
|
||||
#endif /* macintosh */
|
||||
|
||||
#include <memory.h>
|
||||
#include <string.h>
|
||||
#include "portable.h"
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <winsock.h>
|
||||
#include <io.h>
|
||||
#endif /* _WINDOWS */
|
||||
|
||||
#ifdef XP_OS2
|
||||
#include <io.h>
|
||||
#endif /* XP_OS2 */
|
||||
|
||||
/* No stderr in a 16-bit Windows DLL */
|
||||
#if defined(_WINDLL) && !defined(_WIN32)
|
||||
#define stderr NULL
|
||||
#endif
|
||||
|
||||
#include "lber.h"
|
||||
|
||||
#define OLD_LBER_SEQUENCE 0x10L /* w/o constructed bit - broken */
|
||||
#define OLD_LBER_SET 0x11L /* w/o constructed bit - broken */
|
||||
|
||||
#ifndef _IFP
|
||||
#define _IFP
|
||||
typedef int (LDAP_C LDAP_CALLBACK *IFP)();
|
||||
#endif
|
||||
|
||||
extern struct lber_memalloc_fns nslberi_memalloc_fns;
|
||||
|
||||
typedef struct seqorset {
|
||||
unsigned long sos_clen;
|
||||
unsigned long sos_tag;
|
||||
char *sos_first;
|
||||
char *sos_ptr;
|
||||
struct seqorset *sos_next;
|
||||
} Seqorset;
|
||||
#define NULLSEQORSET ((Seqorset *) 0)
|
||||
|
||||
#define SOS_STACK_SIZE 8 /* depth of the pre-allocated sos structure stack */
|
||||
|
||||
struct berelement {
|
||||
char *ber_buf;
|
||||
char *ber_ptr;
|
||||
char *ber_end;
|
||||
struct seqorset *ber_sos;
|
||||
unsigned long ber_tag;
|
||||
unsigned long ber_len;
|
||||
int ber_usertag;
|
||||
char ber_options;
|
||||
char *ber_rwptr;
|
||||
BERTranslateProc ber_encode_translate_proc;
|
||||
BERTranslateProc ber_decode_translate_proc;
|
||||
int ber_flags;
|
||||
#define LBER_FLAG_NO_FREE_BUFFER 1 /* don't free ber_buf */
|
||||
int ber_sos_stack_posn;
|
||||
Seqorset ber_sos_stack[SOS_STACK_SIZE];
|
||||
};
|
||||
#define NULLBER ((BerElement *)NULL)
|
||||
|
||||
struct sockbuf {
|
||||
LBER_SOCKET sb_sd;
|
||||
BerElement sb_ber;
|
||||
int sb_naddr; /* > 0 implies using CLDAP (UDP) */
|
||||
void *sb_useaddr; /* pointer to sockaddr to use next */
|
||||
void *sb_fromaddr; /* pointer to message source sockaddr */
|
||||
void **sb_addrs; /* actually an array of pointers to
|
||||
sockaddrs */
|
||||
|
||||
int sb_options; /* to support copying ber elements */
|
||||
LBER_SOCKET sb_fd;
|
||||
unsigned long sb_max_incoming;
|
||||
|
||||
LDAP_IOF_READ_CALLBACK *sb_read_fn;
|
||||
LDAP_IOF_WRITE_CALLBACK *sb_write_fn;
|
||||
};
|
||||
#define NULLSOCKBUF ((Sockbuf *)NULL)
|
||||
#define READBUFSIZ 8192
|
||||
|
||||
|
||||
/*
|
||||
* macros used to check validity of data structures and parameters
|
||||
*/
|
||||
#define NSLBERI_VALID_BERELEMENT_POINTER( ber ) \
|
||||
( (ber) != NULLBER )
|
||||
|
||||
#define NSLBERI_VALID_SOCKBUF_POINTER( sb ) \
|
||||
( (sb) != NULLSOCKBUF )
|
||||
|
||||
|
||||
#if defined(_WIN32) && defined(_ALPHA)
|
||||
#define LBER_HTONL( _l ) \
|
||||
((((_l)&0xff)<<24) + (((_l)&0xff00)<<8) + \
|
||||
(((_l)&0xff0000)>>8) + (((_l)&0xff000000)>>24))
|
||||
#define LBER_NTOHL(_l) LBER_HTONL(_l)
|
||||
|
||||
#elif !defined(__alpha) || defined(VMS)
|
||||
|
||||
#define LBER_HTONL( l ) htonl( l )
|
||||
#define LBER_NTOHL( l ) ntohl( l )
|
||||
|
||||
#else /* __alpha */
|
||||
/*
|
||||
* htonl and ntohl on the DEC Alpha under OSF 1 seem to only swap the
|
||||
* lower-order 32-bits of a (64-bit) long, so we define correct versions
|
||||
* here.
|
||||
*/
|
||||
#define LBER_HTONL( l ) (((long)htonl( (l) & 0x00000000FFFFFFFF )) << 32 \
|
||||
| htonl( ( (l) & 0xFFFFFFFF00000000 ) >> 32 ))
|
||||
|
||||
#define LBER_NTOHL( l ) (((long)ntohl( (l) & 0x00000000FFFFFFFF )) << 32 \
|
||||
| ntohl( ( (l) & 0xFFFFFFFF00000000 ) >> 32 ))
|
||||
#endif /* __alpha */
|
||||
|
||||
|
||||
/* function prototypes */
|
||||
#ifdef LDAP_DEBUG
|
||||
void ber_dump( BerElement *ber, int inout );
|
||||
void lber_bprint( char *data, int len );
|
||||
#endif
|
||||
void ber_err_print( char *data );
|
||||
void *nslberi_malloc( size_t size );
|
||||
void *nslberi_calloc( size_t nelem, size_t elsize );
|
||||
void *nslberi_realloc( void *ptr, size_t size );
|
||||
void nslberi_free( void *ptr );
|
||||
int nslberi_ber_realloc( BerElement *ber, unsigned long len );
|
||||
|
||||
|
||||
|
||||
/* blame: dboreham
|
||||
* slapd spends much of its time doing memcpy's for the ber code.
|
||||
* Most of these are single-byte, so we special-case those and speed
|
||||
* things up considerably.
|
||||
*/
|
||||
|
||||
#ifdef sunos4
|
||||
#define THEMEMCPY( d, s, n ) bcopy( s, d, n )
|
||||
#else /* sunos4 */
|
||||
#define THEMEMCPY( d, s, n ) memmove( d, s, n )
|
||||
#endif /* sunos4 */
|
||||
|
||||
#ifdef SAFEMEMCPY
|
||||
#undef SAFEMEMCPY
|
||||
#define SAFEMEMCPY(d,s,n) if (1 == n) *((char*)d) = *((char*)s); else THEMEMCPY(d,s,n);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Memory allocation done in liblber should all go through one of the
|
||||
* following macros. This is so we can plug-in alternative memory
|
||||
* allocators, etc. as the need arises.
|
||||
*/
|
||||
#define NSLBERI_MALLOC( size ) nslberi_malloc( size )
|
||||
#define NSLBERI_CALLOC( nelem, elsize ) nslberi_calloc( nelem, elsize )
|
||||
#define NSLBERI_REALLOC( ptr, size ) nslberi_realloc( ptr, size )
|
||||
#define NSLBERI_FREE( ptr ) nslberi_free( ptr )
|
||||
|
||||
/* allow the library to access the debug variable */
|
||||
|
||||
extern int lber_debug;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* _LBERINT_H */
|
||||
164
mozilla/directory/c-sdk/ldap/libraries/libldap/Makefile.client
Normal file
164
mozilla/directory/c-sdk/ldap/libraries/libldap/Makefile.client
Normal file
@@ -0,0 +1,164 @@
|
||||
DEPTH = ../../../../..
|
||||
NS_DEPTH = ../../../..
|
||||
LDAPSRC = ../..
|
||||
MOD_DEPTH = ../../../../../nsprpub
|
||||
NSPR_TREE = ../../../../../nsprpub
|
||||
|
||||
RM = rm -f
|
||||
SED = sed
|
||||
|
||||
SRCS = abandon.c \
|
||||
add.c \
|
||||
bind.c \
|
||||
cache.c \
|
||||
charray.c \
|
||||
charset.c \
|
||||
compare.c \
|
||||
compat.c \
|
||||
control.c \
|
||||
countvalues.c \
|
||||
delete.c \
|
||||
disptmpl.c \
|
||||
dsparse.c \
|
||||
error.c \
|
||||
extendop.c \
|
||||
free.c \
|
||||
freevalues.c \
|
||||
friendly.c \
|
||||
getattr.c \
|
||||
getdn.c \
|
||||
getdxbyname.c \
|
||||
getentry.c \
|
||||
getfilter.c \
|
||||
getoption.c \
|
||||
getvalues.c \
|
||||
memcache.c \
|
||||
message.c \
|
||||
modify.c \
|
||||
open.c \
|
||||
os-ip.c \
|
||||
proxyauthctrl.c \
|
||||
psearch.c \
|
||||
referral.c \
|
||||
regex.c \
|
||||
rename.c \
|
||||
request.c \
|
||||
reslist.c \
|
||||
result.c \
|
||||
saslbind.c \
|
||||
sbind.c \
|
||||
search.c \
|
||||
setoption.c \
|
||||
sort.c \
|
||||
sortctrl.c \
|
||||
srchpref.c \
|
||||
tmplout.c \
|
||||
ufn.c \
|
||||
unbind.c \
|
||||
unescape.c \
|
||||
url.c \
|
||||
utf8.c \
|
||||
vlistctrl.c
|
||||
|
||||
REALOBJS = $(SRCS:.c=.o)
|
||||
|
||||
#OBJS = $(REALOBJS) versiont.o
|
||||
OBJS = $(REALOBJS)
|
||||
|
||||
HDIR = $(LDAPSRC)/include
|
||||
|
||||
CFLAGS = $(INCLUDES) $(DEFINES)
|
||||
|
||||
LIBRARY_NAME = ldap40
|
||||
|
||||
#
|
||||
# DEFS are included in CFLAGS
|
||||
#
|
||||
DEFS = $(PLATFORMCFLAGS) $(LDAP_DEBUG) $(KERBEROS) $(AFSKERBEROS) \
|
||||
$(UOFM) $(UOFA) $(NO_USERINTERFACE) $(CLDAP) $(NO_CACHE) \
|
||||
$(LDAP_REFERRALS) $(LDAP_DNS) $(STR_TRANSLATION) \
|
||||
$(LIBLDAP_CHARSETS) $(LIBLDAP_DEF_CHARSET) \
|
||||
$(SLAPD_BACKENDS) $(LDBMBACKEND) $(LDBMINCLUDE) $(PHONETIC) \
|
||||
$(LDAP_SSLIO_HOOKS)
|
||||
|
||||
include $(NSPR_TREE)/config/rules.mk
|
||||
|
||||
LOCAL_INCLUDES = -I$(PUBLIC)/nspr
|
||||
INCLUDES += -I$(HDIR) $(KRBINCLUDEFLAG)
|
||||
DEFINES += $(DEFS) -DFILTERFILE=./ldapfilter.conf \
|
||||
-DTEMPLATEFILE=./ldaptemplates.conf \
|
||||
-DNDEBUG -UMOZILLA_CLIENT
|
||||
|
||||
# So we actually get the definition of hostent_data....
|
||||
ifeq ($(OS_ARCH),AIX)
|
||||
DEFINES += -D_THREAD_SAFE
|
||||
endif
|
||||
|
||||
GARBAGE += $(ETCDIR)/ldapfriendly $(ETCDIR)/ldapfilter.conf \
|
||||
$(ETCDIR)/ldaptemplates.conf $(ETCDIR)/ldapsearchprefs.conf
|
||||
|
||||
PLATFORMCFLAGS = -DUSE_WAITPID -DNEEDPROTOS
|
||||
PLATFORMLIBS =
|
||||
THREADS =
|
||||
THREADSLIB =
|
||||
|
||||
ETCFILES = ldapfilter.conf \
|
||||
ldapfriendly \
|
||||
ldapsearchprefs.conf \
|
||||
ldaptemplates.conf \
|
||||
$(NULL)
|
||||
|
||||
#ETCDIR = $(DIST)/etc
|
||||
INSTALLDIR = $(DEPTH)/dist/$(OBJDIR_NAME)
|
||||
ETCDIR = $(INSTALLDIR)/etc
|
||||
|
||||
#
|
||||
# if you want things to run in a different directory from where they
|
||||
# are installed, set this accordingly (this path gets compiled into a
|
||||
# few binaries). otherwise, leave it alone.
|
||||
#
|
||||
RUNTIMEETCDIR = $(ETCDIR)
|
||||
|
||||
#
|
||||
# To build slapd (the stand-alone ldap daemon), uncomment the MAKESLAPD
|
||||
# line and select the SLAPD_BACKENDS you want to use. If you enable the
|
||||
# LDBM backend, also select one of the LDBM backends.
|
||||
#
|
||||
MAKESLAPD = yes
|
||||
SLAPD_BACKENDS = -DLDAP_LDBM -DLDAP_SHELL -DLDAP_PASSWD
|
||||
LDBMBACKEND = -DLDBM_USE_NDBM
|
||||
|
||||
#
|
||||
# uncomment this line to enable debugging code (a good idea)
|
||||
#
|
||||
ifndef BUILD_OPT
|
||||
LDAP_DEBUG = -DLDAP_DEBUG
|
||||
endif
|
||||
|
||||
#
|
||||
# uncomment this line to enable support for LDAP referrals in libldap
|
||||
#
|
||||
LDAP_REFERRALS = -DLDAP_REFERRALS
|
||||
|
||||
#
|
||||
# uncomment this line to enable support for SSL I/O in libldap
|
||||
#
|
||||
LDAP_SSLIO_HOOKS = -DLDAP_SSLIO_HOOKS
|
||||
|
||||
###########################################################################
|
||||
|
||||
versiont.c: Makefile.client Version.c
|
||||
@$(RM) $@
|
||||
@(u="$${USER-root}" v="$(shell cat ../../build/version)" d="$(shell pwd)" \
|
||||
h="$(shell hostname)" t="$(shell date)"; $(SED) -e "s|%WHEN%|$${t}|" \
|
||||
-e "s|%WHOANDWHERE%|$${u}@$${h}:$${d}|" \
|
||||
-e "s|%VERSION%|$${v}|" \
|
||||
< Version.c > $@)
|
||||
|
||||
install:: $(LIBRARY) $(SHARED_LIBRARY)
|
||||
$(INSTALL) -m 444 $(LIBRARY) $(INSTALLDIR)/lib
|
||||
ifdef MKSHLIB
|
||||
$(INSTALL) -m 555 $(SHARED_LIBRARY) $(INSTALLDIR)/lib
|
||||
endif
|
||||
$(INSTALL) $(INSTALLFLAGS) -m 644 $(ETCFILES) $(ETCDIR)
|
||||
|
||||
232
mozilla/directory/c-sdk/ldap/libraries/libldap/Makefile.in
Normal file
232
mozilla/directory/c-sdk/ldap/libraries/libldap/Makefile.in
Normal file
@@ -0,0 +1,232 @@
|
||||
DEPTH = ../../../../..
|
||||
NS_DEPTH = ../../../..
|
||||
srcdir = @srcdir@
|
||||
ldaptopsrcdir = @top_srcdir@
|
||||
|
||||
include ../../build/autoconf.mk
|
||||
|
||||
RM = rm -f
|
||||
SED = sed
|
||||
|
||||
SRCS = abandon.c \
|
||||
add.c \
|
||||
bind.c \
|
||||
cache.c \
|
||||
charray.c \
|
||||
charset.c \
|
||||
compare.c \
|
||||
compat.c \
|
||||
control.c \
|
||||
countvalues.c \
|
||||
delete.c \
|
||||
disptmpl.c \
|
||||
dsparse.c \
|
||||
error.c \
|
||||
extendop.c \
|
||||
free.c \
|
||||
freevalues.c \
|
||||
friendly.c \
|
||||
getattr.c \
|
||||
getdn.c \
|
||||
getdxbyname.c \
|
||||
getentry.c \
|
||||
getfilter.c \
|
||||
getoption.c \
|
||||
getvalues.c \
|
||||
memcache.c \
|
||||
message.c \
|
||||
modify.c \
|
||||
open.c \
|
||||
os-ip.c \
|
||||
proxyauthctrl.c \
|
||||
psearch.c \
|
||||
referral.c \
|
||||
regex.c \
|
||||
rename.c \
|
||||
request.c \
|
||||
reslist.c \
|
||||
result.c \
|
||||
saslbind.c \
|
||||
sbind.c \
|
||||
search.c \
|
||||
setoption.c \
|
||||
sort.c \
|
||||
sortctrl.c \
|
||||
srchpref.c \
|
||||
tmplout.c \
|
||||
ufn.c \
|
||||
unbind.c \
|
||||
unescape.c \
|
||||
url.c \
|
||||
utf8.c \
|
||||
vlistctrl.c
|
||||
|
||||
ifeq ($(OS_ARCH),WINNT)
|
||||
LBER_SRCS = \
|
||||
decode.c \
|
||||
encode.c \
|
||||
io.c \
|
||||
bprint.c \
|
||||
$(NULL)
|
||||
|
||||
SRCS += mozock.c \
|
||||
$(addprefix ../liblber/,$(LBER_SRCS))
|
||||
endif
|
||||
|
||||
REALOBJS = $(SRCS:.c=.$(OBJ_SUFFIX))
|
||||
|
||||
#OBJS = $(REALOBJS) versiont.o
|
||||
OBJS = $(REALOBJS)
|
||||
|
||||
HDIR = $(ldaptopsrcdir)/include
|
||||
HDIR2 = ../../include
|
||||
|
||||
CFLAGS = $(INCLUDES) $(DEFINES)
|
||||
|
||||
ifeq ($(OS_ARCH),WINNT)
|
||||
RES = nsldap.res
|
||||
RESNAME = $(srcdir)/../msdos/winsock/nsldap.rc
|
||||
LIBRARY_NAME = nsldap32v40
|
||||
else
|
||||
LIBRARY_NAME = ldap40
|
||||
endif
|
||||
|
||||
#
|
||||
# DEFS are included in CFLAGS
|
||||
#
|
||||
DEFS = $(PLATFORMCFLAGS) $(LDAP_DEBUG) $(KERBEROS) $(AFSKERBEROS) \
|
||||
$(UOFM) $(UOFA) $(NO_USERINTERFACE) $(CLDAP) $(NO_CACHE) \
|
||||
$(LDAP_REFERRALS) $(LDAP_DNS) $(STR_TRANSLATION) \
|
||||
$(LIBLDAP_CHARSETS) $(LIBLDAP_DEF_CHARSET) \
|
||||
$(SLAPD_BACKENDS) $(LDBMBACKEND) $(LDBMINCLUDE) $(PHONETIC) \
|
||||
$(LDAP_SSLIO_HOOKS)
|
||||
|
||||
include $(NSPR_TREE)/config/rules.mk
|
||||
|
||||
LOCAL_INCLUDES = -I$(PUBLIC)/nspr
|
||||
INCLUDES += -I$(HDIR) -I$(HDIR2) $(KRBINCLUDEFLAG)
|
||||
DEFINES += $(DEFS) -DFILTERFILE=./ldapfilter.conf \
|
||||
-DTEMPLATEFILE=./ldaptemplates.conf \
|
||||
-DNDEBUG -UMOZILLA_CLIENT
|
||||
|
||||
ifeq ($(OS_ARCH),WINNT)
|
||||
DEFINES += /D_WINDOWS /DWINSOCK \
|
||||
/D_WIN32 /DWIN32_KERNEL_THREADS \
|
||||
/DNO_USERINTERFACE /DLDAP_SSLIO_HOOKS
|
||||
EXTRA_LIBS += rpcrt4.lib winmm.lib wsock32.lib oldnames.lib kernel32.lib user32.lib
|
||||
DLL_LIBS += /DEF:$(srcdir)/../msdos/winsock/nsldap3240.def \
|
||||
/implib:$(LIBRARY_NAME).$(LIB_SUFFIX) \
|
||||
/nodefaultlib
|
||||
ifdef BUILD_OPT
|
||||
EXTRA_LIBS += msvcrt.lib
|
||||
else
|
||||
EXTRA_LIBS += msvcrtd.lib
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(OS_ARCH), OS2)
|
||||
INCLUDES += -I$(DIST)/include
|
||||
EXTRA_LIBS += $(DIST)/lib/lber40.lib
|
||||
endif
|
||||
|
||||
# So we actually get the definition of hostent_data....
|
||||
ifeq ($(OS_ARCH),AIX)
|
||||
DEFINES += -D_THREAD_SAFE
|
||||
DSO_LDOPTS += -lm -lc_r -L../liblber -llber40
|
||||
endif
|
||||
|
||||
ifneq (,$(filter BeOS Linux,$(OS_ARCH)))
|
||||
DSO_LDOPTS += -L../liblber -llber40
|
||||
endif
|
||||
|
||||
ifneq (,$(filter OpenVMS Darwin,$(OS_ARCH)))
|
||||
EXTRA_LIBS += -L../liblber -llber40
|
||||
endif
|
||||
|
||||
GARBAGE += $(ETCDIR)/ldapfriendly $(ETCDIR)/ldapfilter.conf \
|
||||
$(ETCDIR)/ldaptemplates.conf $(ETCDIR)/ldapsearchprefs.conf
|
||||
|
||||
ifeq ($(OS_ARCH),WINNT)
|
||||
PLATFORMCFLAGS = -DNEEDPROTOS
|
||||
else
|
||||
PLATFORMCFLAGS = -DUSE_WAITPID -DNEEDPROTOS
|
||||
endif
|
||||
PLATFORMLIBS =
|
||||
THREADS =
|
||||
THREADSLIB =
|
||||
|
||||
ETCFILES = ldapfilter.conf \
|
||||
ldapfriendly \
|
||||
ldapsearchprefs.conf \
|
||||
ldaptemplates.conf \
|
||||
$(NULL)
|
||||
|
||||
ETCDIR = $(DIST)/etc
|
||||
|
||||
#
|
||||
# if you want things to run in a different directory from where they
|
||||
# are installed, set this accordingly (this path gets compiled into a
|
||||
# few binaries). otherwise, leave it alone.
|
||||
#
|
||||
RUNTIMEETCDIR = $(ETCDIR)
|
||||
|
||||
#
|
||||
# To build slapd (the stand-alone ldap daemon), uncomment the MAKESLAPD
|
||||
# line and select the SLAPD_BACKENDS you want to use. If you enable the
|
||||
# LDBM backend, also select one of the LDBM backends.
|
||||
#
|
||||
MAKESLAPD = yes
|
||||
SLAPD_BACKENDS = -DLDAP_LDBM -DLDAP_SHELL -DLDAP_PASSWD
|
||||
LDBMBACKEND = -DLDBM_USE_NDBM
|
||||
|
||||
#
|
||||
# uncomment this line to enable debugging code (a good idea)
|
||||
#
|
||||
ifndef BUILD_OPT
|
||||
LDAP_DEBUG = -DLDAP_DEBUG
|
||||
endif
|
||||
|
||||
#
|
||||
# uncomment this line to enable support for LDAP referrals in libldap
|
||||
#
|
||||
LDAP_REFERRALS = -DLDAP_REFERRALS
|
||||
|
||||
#
|
||||
# uncomment this line to enable support for SSL I/O in libldap
|
||||
#
|
||||
LDAP_SSLIO_HOOKS = -DLDAP_SSLIO_HOOKS
|
||||
|
||||
###########################################################################
|
||||
|
||||
versiont.c: Makefile.client Version.c
|
||||
@$(RM) $@
|
||||
@(u="$${USER-root}" v="$(shell cat ../../build/version)" d="$(shell pwd)" \
|
||||
h="$(shell hostname)" t="$(shell date)"; $(SED) -e "s|%WHEN%|$${t}|" \
|
||||
-e "s|%WHOANDWHERE%|$${u}@$${h}:$${d}|" \
|
||||
-e "s|%VERSION%|$${v}|" \
|
||||
< Version.c > $@)
|
||||
|
||||
ifeq ($(OS_ARCH),OS2)
|
||||
install:: $(TARGETS)
|
||||
$(INSTALL) -m 444 $(TARGETS) $(DIST)/lib
|
||||
ifdef SHARED_LIBRARY
|
||||
$(INSTALL) -m 444 $(SHARED_LIBRARY) $(DIST)/bin
|
||||
endif
|
||||
|
||||
else # !os2
|
||||
|
||||
install:: $(LIBRARY) $(SHARED_LIBRARY) $(IMPORT_LIBRARY)
|
||||
$(INSTALL) -m 444 $(LIBRARY) $(DIST)/lib
|
||||
ifdef MKSHLIB
|
||||
$(INSTALL) -m 555 $(SHARED_LIBRARY) $(DIST)/lib
|
||||
$(INSTALL) -m 555 $(SHARED_LIBRARY) $(DIST)/bin
|
||||
ifdef IMPORT_LIBRARY
|
||||
$(INSTALL) -m 444 $(IMPORT_LIBRARY) $(DIST)/lib
|
||||
endif
|
||||
endif
|
||||
|
||||
endif # os2
|
||||
|
||||
# XXX currently we don't install any of these config files; what to do?
|
||||
#
|
||||
# $(INSTALL) $(INSTALLFLAGS) -m 644 $(ETCFILES) $(ETCDIR)
|
||||
268
mozilla/directory/c-sdk/ldap/libraries/libldap/abandon.c
Normal file
268
mozilla/directory/c-sdk/ldap/libraries/libldap/abandon.c
Normal file
@@ -0,0 +1,268 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* abandon.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
static int do_abandon( LDAP *ld, int origid, int msgid,
|
||||
LDAPControl **serverctrls, LDAPControl **clientctrls );
|
||||
|
||||
/*
|
||||
* ldap_abandon - perform an ldap abandon operation. Parameters:
|
||||
*
|
||||
* ld LDAP descriptor
|
||||
* msgid The message id of the operation to abandon
|
||||
*
|
||||
* ldap_abandon returns 0 if everything went ok, -1 otherwise.
|
||||
*
|
||||
* Example:
|
||||
* ldap_abandon( ld, msgid );
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_abandon( LDAP *ld, int msgid )
|
||||
{
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_abandon %d\n", msgid, 0, 0 );
|
||||
|
||||
if ( ldap_abandon_ext( ld, msgid, NULL, NULL ) == LDAP_SUCCESS ) {
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* LDAPv3 extended abandon.
|
||||
* Returns an LDAP error code.
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_abandon_ext( LDAP *ld, int msgid, LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls )
|
||||
{
|
||||
int rc;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_abandon_ext %d\n", msgid, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CONN_LOCK );
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_REQ_LOCK );
|
||||
rc = do_abandon( ld, msgid, msgid, serverctrls, clientctrls );
|
||||
|
||||
/*
|
||||
* XXXmcs should use cache function pointers to hook in memcache
|
||||
*/
|
||||
ldap_memcache_abandon( ld, msgid );
|
||||
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_REQ_LOCK );
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CONN_LOCK );
|
||||
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Abandon all outstanding requests for msgid (included child requests
|
||||
* spawned when chasing referrals). This function calls itself recursively.
|
||||
* No locking is done is this function so it must be done by the caller.
|
||||
* Returns an LDAP error code and sets it in LDAP *ld as well
|
||||
*/
|
||||
static int
|
||||
do_abandon( LDAP *ld, int origid, int msgid, LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls )
|
||||
{
|
||||
BerElement *ber;
|
||||
int i, bererr, lderr, sendabandon;
|
||||
Sockbuf *sb;
|
||||
LDAPRequest *lr = NULL;
|
||||
|
||||
/*
|
||||
* An abandon request looks like this:
|
||||
* AbandonRequest ::= MessageID
|
||||
*/
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "do_abandon origid %d, msgid %d\n",
|
||||
origid, msgid, 0 );
|
||||
|
||||
/* optimistic */
|
||||
lderr = LDAP_SUCCESS;
|
||||
|
||||
/*
|
||||
* this is not the best implementation...
|
||||
* the code special cases the when async io is enabled.
|
||||
* The logic is clear this way, at the cost of code bloat.
|
||||
* This logic should be cleaned up post nova 4.5 rtm
|
||||
*/
|
||||
if (ld->ld_options & LDAP_BITOPT_ASYNC)
|
||||
{
|
||||
/* Don't send an abandon message unless there is something to abandon. */
|
||||
sendabandon = 0;
|
||||
|
||||
/* Find the request that we are abandoning. */
|
||||
if (ld->ld_requests != NULL) {
|
||||
for ( lr = ld->ld_requests; lr != NULL; lr = lr->lr_next ) {
|
||||
if ( lr->lr_msgid == msgid ) { /* this message */
|
||||
if ( origid == msgid && lr->lr_parent != NULL ) {
|
||||
/* don't let caller abandon child requests! */
|
||||
lderr = LDAP_PARAM_ERROR;
|
||||
goto set_errorcode_and_return;
|
||||
}
|
||||
if ( lr->lr_status == LDAP_REQST_INPROGRESS ) {
|
||||
/* We only need to send an abandon message if the request
|
||||
* is in progress.
|
||||
*/
|
||||
sendabandon = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if ( lr->lr_origid == msgid ) { /* child: abandon it */
|
||||
(void)do_abandon( ld, msgid, lr->lr_msgid,
|
||||
serverctrls, clientctrls );
|
||||
/* we ignore errors from child abandons... */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sendabandon = 1;
|
||||
/* find the request that we are abandoning */
|
||||
for ( lr = ld->ld_requests; lr != NULL; lr = lr->lr_next ) {
|
||||
if ( lr->lr_msgid == msgid ) { /* this message */
|
||||
break;
|
||||
}
|
||||
if ( lr->lr_origid == msgid ) { /* child: abandon it */
|
||||
(void)do_abandon( ld, msgid, lr->lr_msgid,
|
||||
serverctrls, clientctrls );
|
||||
/* we ignore errors from child abandons... */
|
||||
}
|
||||
}
|
||||
|
||||
if ( lr != NULL ) {
|
||||
if ( origid == msgid && lr->lr_parent != NULL ) {
|
||||
/* don't let caller abandon child requests! */
|
||||
lderr = LDAP_PARAM_ERROR;
|
||||
goto set_errorcode_and_return;
|
||||
}
|
||||
if ( lr->lr_status != LDAP_REQST_INPROGRESS ) {
|
||||
/* no need to send abandon message */
|
||||
sendabandon = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( ldap_msgdelete( ld, msgid ) == 0 ) {
|
||||
/* we had all the results and deleted them */
|
||||
goto set_errorcode_and_return;
|
||||
}
|
||||
|
||||
if ( sendabandon ) {
|
||||
/* create a message to send */
|
||||
if (( lderr = nsldapi_alloc_ber_with_options( ld, &ber )) ==
|
||||
LDAP_SUCCESS ) {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK );
|
||||
#ifdef CLDAP
|
||||
if ( ld->ld_dbp->sb_naddr > 0 ) {
|
||||
bererr = ber_printf( ber, "{isti",
|
||||
++ld->ld_msgid, ld->ld_cldapdn,
|
||||
LDAP_REQ_ABANDON, msgid );
|
||||
} else {
|
||||
#endif /* CLDAP */
|
||||
bererr = ber_printf( ber, "{iti",
|
||||
++ld->ld_msgid, LDAP_REQ_ABANDON, msgid );
|
||||
#ifdef CLDAP
|
||||
}
|
||||
#endif /* CLDAP */
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK );
|
||||
|
||||
if ( bererr == -1 ||
|
||||
( lderr = nsldapi_put_controls( ld, serverctrls,
|
||||
1, ber )) != LDAP_SUCCESS ) {
|
||||
lderr = LDAP_ENCODING_ERROR;
|
||||
ber_free( ber, 1 );
|
||||
} else {
|
||||
/* send the message */
|
||||
if ( lr != NULL ) {
|
||||
sb = lr->lr_conn->lconn_sb;
|
||||
} else {
|
||||
sb = ld->ld_sbp;
|
||||
}
|
||||
if ( nsldapi_ber_flush( ld, sb, ber, 1, 0 )
|
||||
!= 0 ) {
|
||||
lderr = LDAP_SERVER_DOWN;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( lr != NULL ) {
|
||||
if ( sendabandon ) {
|
||||
nsldapi_free_connection( ld, lr->lr_conn, NULL, NULL,
|
||||
0, 1 );
|
||||
}
|
||||
if ( origid == msgid ) {
|
||||
nsldapi_free_request( ld, lr, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_ABANDON_LOCK );
|
||||
if ( ld->ld_abandoned == NULL ) {
|
||||
if ( (ld->ld_abandoned = (int *)NSLDAPI_MALLOC( 2
|
||||
* sizeof(int) )) == NULL ) {
|
||||
lderr = LDAP_NO_MEMORY;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_ABANDON_LOCK );
|
||||
goto set_errorcode_and_return;
|
||||
}
|
||||
i = 0;
|
||||
} else {
|
||||
for ( i = 0; ld->ld_abandoned[i] != -1; i++ )
|
||||
; /* NULL */
|
||||
if ( (ld->ld_abandoned = (int *)NSLDAPI_REALLOC( (char *)
|
||||
ld->ld_abandoned, (i + 2) * sizeof(int) )) == NULL ) {
|
||||
lderr = LDAP_NO_MEMORY;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_ABANDON_LOCK );
|
||||
goto set_errorcode_and_return;
|
||||
}
|
||||
}
|
||||
ld->ld_abandoned[i] = msgid;
|
||||
ld->ld_abandoned[i + 1] = -1;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_ABANDON_LOCK );
|
||||
|
||||
set_errorcode_and_return:
|
||||
LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
|
||||
return( lderr );
|
||||
}
|
||||
210
mozilla/directory/c-sdk/ldap/libraries/libldap/add.c
Normal file
210
mozilla/directory/c-sdk/ldap/libraries/libldap/add.c
Normal file
@@ -0,0 +1,210 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* add.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
/*
|
||||
* ldap_add - initiate an ldap add operation. Parameters:
|
||||
*
|
||||
* ld LDAP descriptor
|
||||
* dn DN of the entry to add
|
||||
* mods List of attributes for the entry. This is a null-
|
||||
* terminated array of pointers to LDAPMod structures.
|
||||
* only the type and values in the structures need be
|
||||
* filled in.
|
||||
*
|
||||
* Example:
|
||||
* LDAPMod *attrs[] = {
|
||||
* { 0, "cn", { "babs jensen", "babs", 0 } },
|
||||
* { 0, "sn", { "jensen", 0 } },
|
||||
* { 0, "objectClass", { "person", 0 } },
|
||||
* 0
|
||||
* }
|
||||
* msgid = ldap_add( ld, dn, attrs );
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_add( LDAP *ld, const char *dn, LDAPMod **attrs )
|
||||
{
|
||||
int msgid;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_add\n", 0, 0, 0 );
|
||||
|
||||
if ( ldap_add_ext( ld, dn, attrs, NULL, NULL, &msgid )
|
||||
== LDAP_SUCCESS ) {
|
||||
return( msgid );
|
||||
} else {
|
||||
return( -1 ); /* error is in ld handle */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* LDAPv3 extended add.
|
||||
* Returns an LDAP error code.
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_add_ext( LDAP *ld, const char *dn, LDAPMod **attrs,
|
||||
LDAPControl **serverctrls, LDAPControl **clientctrls, int *msgidp )
|
||||
{
|
||||
BerElement *ber;
|
||||
int i, rc, lderr;
|
||||
|
||||
/*
|
||||
* An add request looks like this:
|
||||
* AddRequest ::= SEQUENCE {
|
||||
* entry DistinguishedName,
|
||||
* attrs SEQUENCE OF SEQUENCE {
|
||||
* type AttributeType,
|
||||
* values SET OF AttributeValue
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_add_ext\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAPMESSAGE_POINTER( msgidp ))
|
||||
{
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
if ( !NSLDAPI_VALID_NONEMPTY_LDAPMOD_ARRAY( attrs )
|
||||
|| msgidp == NULL ) {
|
||||
lderr = LDAP_PARAM_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
if ( dn == NULL ) {
|
||||
dn = "";
|
||||
}
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK );
|
||||
*msgidp = ++ld->ld_msgid;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK );
|
||||
|
||||
/* see if we should add to the cache */
|
||||
if ( ld->ld_cache_on && ld->ld_cache_add != NULL ) {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
|
||||
if ( (rc = (ld->ld_cache_add)( ld, *msgidp, LDAP_REQ_ADD, dn,
|
||||
attrs )) != 0 ) {
|
||||
*msgidp = rc;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
}
|
||||
|
||||
/* create a message to send */
|
||||
if (( lderr = nsldapi_alloc_ber_with_options( ld, &ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
if ( ber_printf( ber, "{it{s{", *msgidp, LDAP_REQ_ADD, dn )
|
||||
== -1 ) {
|
||||
lderr = LDAP_ENCODING_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
/* for each attribute in the entry... */
|
||||
for ( i = 0; attrs[i] != NULL; i++ ) {
|
||||
if ( ( attrs[i]->mod_op & LDAP_MOD_BVALUES) != 0 ) {
|
||||
rc = ber_printf( ber, "{s[V]}", attrs[i]->mod_type,
|
||||
attrs[i]->mod_bvalues );
|
||||
} else {
|
||||
rc = ber_printf( ber, "{s[v]}", attrs[i]->mod_type,
|
||||
attrs[i]->mod_values );
|
||||
}
|
||||
if ( rc == -1 ) {
|
||||
lderr = LDAP_ENCODING_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( lderr );
|
||||
}
|
||||
}
|
||||
|
||||
if ( ber_printf( ber, "}}" ) == -1 ) {
|
||||
lderr = LDAP_ENCODING_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
if (( lderr = nsldapi_put_controls( ld, serverctrls, 1, ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
ber_free( ber, 1 );
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
/* send the message */
|
||||
rc = nsldapi_send_initial_request( ld, *msgidp, LDAP_REQ_ADD,
|
||||
(char *) dn, ber );
|
||||
*msgidp = rc;
|
||||
return( rc < 0 ? LDAP_GET_LDERRNO( ld, NULL, NULL ) : LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_add_s( LDAP *ld, const char *dn, LDAPMod **attrs )
|
||||
{
|
||||
return( ldap_add_ext_s( ld, dn, attrs, NULL, NULL ));
|
||||
}
|
||||
|
||||
int LDAP_CALL
|
||||
ldap_add_ext_s( LDAP *ld, const char *dn, LDAPMod **attrs,
|
||||
LDAPControl **serverctrls, LDAPControl **clientctrls )
|
||||
{
|
||||
int err, msgid;
|
||||
LDAPMessage *res;
|
||||
|
||||
if (( err = ldap_add_ext( ld, dn, attrs, serverctrls, clientctrls,
|
||||
&msgid )) != LDAP_SUCCESS ) {
|
||||
return( err );
|
||||
}
|
||||
|
||||
if ( ldap_result( ld, msgid, 1, (struct timeval *)NULL, &res ) == -1 ) {
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
}
|
||||
|
||||
return( ldap_result2error( ld, res, 1 ) );
|
||||
}
|
||||
155
mozilla/directory/c-sdk/ldap/libraries/libldap/bind.c
Normal file
155
mozilla/directory/c-sdk/ldap/libraries/libldap/bind.c
Normal file
@@ -0,0 +1,155 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* bind.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
/*
|
||||
* ldap_bind - bind to the ldap server. The dn and password
|
||||
* of the entry to which to bind are supplied, along with the authentication
|
||||
* method to use. The msgid of the bind request is returned on success,
|
||||
* -1 if there's trouble. Note, the kerberos support assumes the user already
|
||||
* has a valid tgt for now. ldap_result() should be called to find out the
|
||||
* outcome of the bind request.
|
||||
*
|
||||
* Example:
|
||||
* ldap_bind( ld, "cn=manager, o=university of michigan, c=us", "secret",
|
||||
* LDAP_AUTH_SIMPLE )
|
||||
*/
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_bind( LDAP *ld, const char *dn, const char *passwd, int authmethod )
|
||||
{
|
||||
/*
|
||||
* The bind request looks like this:
|
||||
* BindRequest ::= SEQUENCE {
|
||||
* version INTEGER,
|
||||
* name DistinguishedName, -- who
|
||||
* authentication CHOICE {
|
||||
* simple [0] OCTET STRING -- passwd
|
||||
* }
|
||||
* }
|
||||
* all wrapped up in an LDAPMessage sequence.
|
||||
*/
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_bind\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
switch ( authmethod ) {
|
||||
case LDAP_AUTH_SIMPLE:
|
||||
return( ldap_simple_bind( ld, dn, passwd ) );
|
||||
|
||||
default:
|
||||
LDAP_SET_LDERRNO( ld, LDAP_AUTH_UNKNOWN, NULL, NULL );
|
||||
return( -1 );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* ldap_bind_s - bind to the ldap server. The dn and password
|
||||
* of the entry to which to bind are supplied, along with the authentication
|
||||
* method to use. This routine just calls whichever bind routine is
|
||||
* appropriate and returns the result of the bind (e.g. LDAP_SUCCESS or
|
||||
* some other error indication). Note, the kerberos support assumes the
|
||||
* user already has a valid tgt for now.
|
||||
*
|
||||
* Examples:
|
||||
* ldap_bind_s( ld, "cn=manager, o=university of michigan, c=us",
|
||||
* "secret", LDAP_AUTH_SIMPLE )
|
||||
* ldap_bind_s( ld, "cn=manager, o=university of michigan, c=us",
|
||||
* NULL, LDAP_AUTH_KRBV4 )
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_bind_s( LDAP *ld, const char *dn, const char *passwd, int authmethod )
|
||||
{
|
||||
int err;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_bind_s\n", 0, 0, 0 );
|
||||
|
||||
switch ( authmethod ) {
|
||||
case LDAP_AUTH_SIMPLE:
|
||||
return( ldap_simple_bind_s( ld, dn, passwd ) );
|
||||
|
||||
default:
|
||||
err = LDAP_AUTH_UNKNOWN;
|
||||
LDAP_SET_LDERRNO( ld, err, NULL, NULL );
|
||||
return( err );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_set_rebind_proc( LDAP *ld, LDAP_REBINDPROC_CALLBACK *rebindproc,
|
||||
void *arg )
|
||||
{
|
||||
if ( ld == NULL ) {
|
||||
if ( !nsldapi_initialized ) {
|
||||
nsldapi_initialize_defaults();
|
||||
}
|
||||
ld = &nsldapi_ld_defaults;
|
||||
}
|
||||
|
||||
if ( NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_OPTION_LOCK );
|
||||
ld->ld_rebind_fn = rebindproc;
|
||||
ld->ld_rebind_arg = arg;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_OPTION_LOCK );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* return a pointer to the bind DN for the default connection (a copy is
|
||||
* not made). If there is no bind DN available, NULL is returned.
|
||||
*/
|
||||
char *
|
||||
nsldapi_get_binddn( LDAP *ld )
|
||||
{
|
||||
char *binddn;
|
||||
|
||||
binddn = NULL; /* default -- assume they are not bound */
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CONN_LOCK );
|
||||
if ( NULL != ld->ld_defconn && LDAP_CONNST_CONNECTED ==
|
||||
ld->ld_defconn->lconn_status && ld->ld_defconn->lconn_bound ) {
|
||||
if (( binddn = ld->ld_defconn->lconn_binddn ) == NULL ) {
|
||||
binddn = "";
|
||||
}
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CONN_LOCK );
|
||||
|
||||
return( binddn );
|
||||
}
|
||||
130
mozilla/directory/c-sdk/ldap/libraries/libldap/cache.c
Normal file
130
mozilla/directory/c-sdk/ldap/libraries/libldap/cache.c
Normal file
@@ -0,0 +1,130 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1993 The Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* cache.c - generic caching support for LDAP
|
||||
*/
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
/*
|
||||
* ldap_cache_flush - flush part of the LDAP cache. returns an
|
||||
* ldap error code (LDAP_SUCCESS, LDAP_NO_SUCH_OBJECT, etc.).
|
||||
*/
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_cache_flush( LDAP *ld, const char *dn, const char *filter )
|
||||
{
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( dn == NULL ) {
|
||||
dn = "";
|
||||
}
|
||||
|
||||
return( (ld->ld_cache_flush)( ld, dn, filter ) );
|
||||
}
|
||||
|
||||
/*
|
||||
* nsldapi_add_result_to_cache - add an ldap entry we just read off the network
|
||||
* to the ldap cache. this routine parses the ber for the entry and
|
||||
* constructs the appropriate add request. this routine calls the
|
||||
* cache add routine to actually add the entry.
|
||||
*/
|
||||
|
||||
void
|
||||
nsldapi_add_result_to_cache( LDAP *ld, LDAPMessage *m )
|
||||
{
|
||||
char *dn;
|
||||
LDAPMod **mods;
|
||||
int i, max, rc;
|
||||
char *a;
|
||||
BerElement *ber;
|
||||
char buf[50];
|
||||
struct berval bv;
|
||||
struct berval *bvp[2];
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "=> nsldapi_add_result_to_cache id %d type %d\n",
|
||||
m->lm_msgid, m->lm_msgtype, 0 );
|
||||
if ( m->lm_msgtype != LDAP_RES_SEARCH_ENTRY ||
|
||||
ld->ld_cache_add == NULL ) {
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"<= nsldapi_add_result_to_cache not added\n", 0, 0, 0 );
|
||||
return;
|
||||
}
|
||||
|
||||
#define GRABSIZE 5
|
||||
|
||||
dn = ldap_get_dn( ld, m );
|
||||
mods = (LDAPMod **)NSLDAPI_MALLOC( GRABSIZE * sizeof(LDAPMod *) );
|
||||
max = GRABSIZE;
|
||||
for ( i = 0, a = ldap_first_attribute( ld, m, &ber ); a != NULL;
|
||||
a = ldap_next_attribute( ld, m, ber ), i++ ) {
|
||||
if ( i == (max - 1) ) {
|
||||
max += GRABSIZE;
|
||||
mods = (LDAPMod **)NSLDAPI_REALLOC( mods,
|
||||
sizeof(LDAPMod *) * max );
|
||||
}
|
||||
|
||||
mods[i] = (LDAPMod *)NSLDAPI_CALLOC( 1, sizeof(LDAPMod) );
|
||||
mods[i]->mod_op = LDAP_MOD_BVALUES;
|
||||
mods[i]->mod_type = a;
|
||||
mods[i]->mod_bvalues = ldap_get_values_len( ld, m, a );
|
||||
}
|
||||
if ( ber != NULL ) {
|
||||
ber_free( ber, 0 );
|
||||
}
|
||||
if (( rc = LDAP_GET_LDERRNO( ld, NULL, NULL )) != LDAP_SUCCESS ) {
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"<= nsldapi_add_result_to_cache error: failed to construct mod list (%s)\n",
|
||||
ldap_err2string( rc ), 0, 0 );
|
||||
ldap_mods_free( mods, 1 );
|
||||
return;
|
||||
}
|
||||
|
||||
/* update special cachedtime attribute */
|
||||
if ( i == (max - 1) ) {
|
||||
max++;
|
||||
mods = (LDAPMod **)NSLDAPI_REALLOC( mods,
|
||||
sizeof(LDAPMod *) * max );
|
||||
}
|
||||
mods[i] = (LDAPMod *)NSLDAPI_CALLOC( 1, sizeof(LDAPMod) );
|
||||
mods[i]->mod_op = LDAP_MOD_BVALUES;
|
||||
mods[i]->mod_type = "cachedtime";
|
||||
sprintf( buf, "%d", time( NULL ) );
|
||||
bv.bv_val = buf;
|
||||
bv.bv_len = strlen( buf );
|
||||
bvp[0] = &bv;
|
||||
bvp[1] = NULL;
|
||||
mods[i]->mod_bvalues = bvp;
|
||||
mods[++i] = NULL;
|
||||
|
||||
/* msgid of -1 means don't send the result */
|
||||
rc = (ld->ld_cache_add)( ld, -1, m->lm_msgtype, dn, mods );
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"<= nsldapi_add_result_to_cache added (rc %d)\n", rc, 0, 0 );
|
||||
}
|
||||
230
mozilla/directory/c-sdk/ldap/libraries/libldap/charray.c
Normal file
230
mozilla/directory/c-sdk/ldap/libraries/libldap/charray.c
Normal file
@@ -0,0 +1,230 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/* charray.c - routines for dealing with char * arrays */
|
||||
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
/*
|
||||
* Add s at the end of the array of strings *a.
|
||||
* Return 0 for success, -1 for failure.
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_charray_add(
|
||||
char ***a,
|
||||
char *s
|
||||
)
|
||||
{
|
||||
int n;
|
||||
|
||||
if ( *a == NULL ) {
|
||||
*a = (char **)NSLDAPI_MALLOC( 2 * sizeof(char *) );
|
||||
if ( *a == NULL ) {
|
||||
return -1;
|
||||
}
|
||||
n = 0;
|
||||
} else {
|
||||
for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
|
||||
; /* NULL */
|
||||
}
|
||||
|
||||
*a = (char **)NSLDAPI_REALLOC( (char *) *a,
|
||||
(n + 2) * sizeof(char *) );
|
||||
if ( *a == NULL ) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
(*a)[n++] = s;
|
||||
(*a)[n] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add array of strings s at the end of the array of strings *a.
|
||||
* Return 0 for success, -1 for failure.
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_charray_merge(
|
||||
char ***a,
|
||||
char **s
|
||||
)
|
||||
{
|
||||
int i, n, nn;
|
||||
|
||||
if ( (s == NULL) || (s[0] == NULL) )
|
||||
return 0;
|
||||
|
||||
for ( n = 0; *a != NULL && (*a)[n] != NULL; n++ ) {
|
||||
; /* NULL */
|
||||
}
|
||||
for ( nn = 0; s[nn] != NULL; nn++ ) {
|
||||
; /* NULL */
|
||||
}
|
||||
|
||||
*a = (char **)NSLDAPI_REALLOC( (char *) *a,
|
||||
(n + nn + 1) * sizeof(char *) );
|
||||
if ( *a == NULL ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
for ( i = 0; i < nn; i++ ) {
|
||||
(*a)[n + i] = s[i];
|
||||
}
|
||||
(*a)[n + nn] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_charray_free( char **array )
|
||||
{
|
||||
char **a;
|
||||
|
||||
if ( array == NULL ) {
|
||||
return;
|
||||
}
|
||||
|
||||
for ( a = array; *a != NULL; a++ ) {
|
||||
if ( *a != NULL ) {
|
||||
NSLDAPI_FREE( *a );
|
||||
}
|
||||
}
|
||||
NSLDAPI_FREE( (char *) array );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_charray_inlist(
|
||||
char **a,
|
||||
char *s
|
||||
)
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( a == NULL )
|
||||
return( 0 );
|
||||
|
||||
for ( i = 0; a[i] != NULL; i++ ) {
|
||||
if ( strcasecmp( s, a[i] ) == 0 ) {
|
||||
return( 1 );
|
||||
}
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
/*
|
||||
* Duplicate the array of strings a, return NULL upon any memory failure.
|
||||
*/
|
||||
char **
|
||||
LDAP_CALL
|
||||
ldap_charray_dup( char **a )
|
||||
{
|
||||
int i;
|
||||
char **new;
|
||||
|
||||
for ( i = 0; a[i] != NULL; i++ )
|
||||
; /* NULL */
|
||||
|
||||
new = (char **)NSLDAPI_MALLOC( (i + 1) * sizeof(char *) );
|
||||
if ( new == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for ( i = 0; a[i] != NULL; i++ ) {
|
||||
new[i] = nsldapi_strdup( a[i] );
|
||||
if ( new[i] == NULL ) {
|
||||
int j;
|
||||
|
||||
for ( j = 0; j < i; j++ )
|
||||
NSLDAPI_FREE( new[j] );
|
||||
NSLDAPI_FREE( new );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
new[i] = NULL;
|
||||
|
||||
return( new );
|
||||
}
|
||||
|
||||
/*
|
||||
* Tokenize the string str, return NULL upon any memory failure.
|
||||
* XXX: on many platforms this function is not thread safe because it
|
||||
* uses strtok().
|
||||
*/
|
||||
char **
|
||||
LDAP_CALL
|
||||
ldap_str2charray( char *str, char *brkstr )
|
||||
/* This implementation fails if brkstr contains multibyte characters.
|
||||
But it works OK if str is UTF-8 and brkstr is 7-bit ASCII.
|
||||
*/
|
||||
{
|
||||
char **res;
|
||||
char *s;
|
||||
int i;
|
||||
|
||||
i = 1;
|
||||
for ( s = str; *s; s++ ) {
|
||||
if ( strchr( brkstr, *s ) != NULL ) {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
res = (char **)NSLDAPI_MALLOC( (i + 1) * sizeof(char *) );
|
||||
if ( res == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
i = 0;
|
||||
for ( s = strtok( str, brkstr ); s != NULL; s = strtok( NULL,
|
||||
brkstr ) ) {
|
||||
res[i++] = nsldapi_strdup( s );
|
||||
if ( res[i - 1] == NULL ) {
|
||||
int j;
|
||||
|
||||
for ( j = 0; j < (i - 1); j++ )
|
||||
NSLDAPI_FREE( res[j] );
|
||||
NSLDAPI_FREE( res );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
res[i] = NULL;
|
||||
|
||||
return( res );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_charray_position( char **a, char *s )
|
||||
{
|
||||
int i;
|
||||
|
||||
for ( i = 0; a[i] != NULL; i++ ) {
|
||||
if ( strcasecmp( s, a[i] ) == 0 ) {
|
||||
return( i );
|
||||
}
|
||||
}
|
||||
|
||||
return( -1 );
|
||||
}
|
||||
1830
mozilla/directory/c-sdk/ldap/libraries/libldap/charset.c
Normal file
1830
mozilla/directory/c-sdk/ldap/libraries/libldap/charset.c
Normal file
File diff suppressed because it is too large
Load Diff
569
mozilla/directory/c-sdk/ldap/libraries/libldap/cldap.c
Normal file
569
mozilla/directory/c-sdk/ldap/libraries/libldap/cldap.c
Normal file
@@ -0,0 +1,569 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990, 1994 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* cldap.c - synchronous, retrying interface to the cldap protocol
|
||||
*/
|
||||
|
||||
|
||||
#ifdef CLDAP
|
||||
|
||||
XXX not MT-safe XXX
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990, 1994 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#ifdef macintosh
|
||||
#include <stdlib.h>
|
||||
#include "macos.h"
|
||||
#else /* macintosh */
|
||||
#ifdef DOS
|
||||
#include "msdos.h"
|
||||
#else /* DOS */
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#else /* _WINDOWS */
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
#endif /* _WINDOWS */
|
||||
#endif /* DOS */
|
||||
#endif /* macintosh */
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
#define DEF_CLDAP_TIMEOUT 3
|
||||
#define DEF_CLDAP_TRIES 4
|
||||
|
||||
#ifndef INADDR_LOOPBACK
|
||||
#define INADDR_LOOPBACK ((unsigned long) 0x7f000001)
|
||||
#endif
|
||||
|
||||
|
||||
struct cldap_retinfo {
|
||||
int cri_maxtries;
|
||||
int cri_try;
|
||||
int cri_useaddr;
|
||||
long cri_timeout;
|
||||
};
|
||||
|
||||
#ifdef NEEDPROTOS
|
||||
static int add_addr( LDAP *ld, struct sockaddr *sap );
|
||||
static int cldap_result( LDAP *ld, int msgid, LDAPMessage **res,
|
||||
struct cldap_retinfo *crip, char *base );
|
||||
static int cldap_parsemsg( LDAP *ld, int msgid, BerElement *ber,
|
||||
LDAPMessage **res, char *base );
|
||||
#else /* NEEDPROTOS */
|
||||
static int add_addr();
|
||||
static int cldap_result();
|
||||
static int cldap_parsemsg();
|
||||
#endif /* NEEDPROTOS */
|
||||
|
||||
/*
|
||||
* cldap_open - initialize and connect to an ldap server. A magic cookie to
|
||||
* be used for future communication is returned on success, NULL on failure.
|
||||
*
|
||||
* Example:
|
||||
* LDAP *ld;
|
||||
* ld = cldap_open( hostname, port );
|
||||
*/
|
||||
|
||||
LDAP *
|
||||
cldap_open( char *host, int port )
|
||||
{
|
||||
int s;
|
||||
nsldapi_in_addr_t address;
|
||||
struct sockaddr_in sock;
|
||||
struct hostent *hp;
|
||||
LDAP *ld;
|
||||
char *p;
|
||||
int i;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "cldap_open\n", 0, 0, 0 );
|
||||
|
||||
if ( port == 0 ) {
|
||||
port = LDAP_PORT;
|
||||
}
|
||||
|
||||
if ( (s = socket( AF_INET, SOCK_DGRAM, 0 )) < 0 ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
sock.sin_addr.s_addr = 0;
|
||||
sock.sin_family = AF_INET;
|
||||
sock.sin_port = 0;
|
||||
if ( bind(s, (struct sockaddr *) &sock, sizeof(sock)) < 0) {
|
||||
close( s );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
if (( ld = ldap_init( host, port )) == NULL ) {
|
||||
close( s );
|
||||
return( NULL );
|
||||
}
|
||||
if ( (ld->ld_sbp->sb_fromaddr = (void *)NSLDAPI_CALLOC( 1,
|
||||
sizeof( struct sockaddr ))) == NULL ) {
|
||||
NSLDAPI_FREE( ld );
|
||||
close( s );
|
||||
return( NULL );
|
||||
}
|
||||
ld->ld_sbp->sb_sd = s;
|
||||
ld->ld_sbp->sb_naddr = 0;
|
||||
ld->ld_version = LDAP_VERSION;
|
||||
|
||||
sock.sin_family = AF_INET;
|
||||
sock.sin_port = htons( port );
|
||||
|
||||
/*
|
||||
* 'host' may be a space-separated list.
|
||||
*/
|
||||
if ( host != NULL ) {
|
||||
for ( ; host != NULL; host = p ) {
|
||||
if (( p = strchr( host, ' ' )) != NULL ) {
|
||||
for (*p++ = '\0'; *p == ' '; p++) {
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
if ( (address = inet_addr( host )) == -1 ) {
|
||||
/* XXXmcs: need to use DNS callbacks here XXX */
|
||||
XXX
|
||||
if ( (hp = gethostbyname( host )) == NULL ) {
|
||||
LDAP_SET_ERRNO( ld, EHOSTUNREACH );
|
||||
continue;
|
||||
}
|
||||
|
||||
for ( i = 0; hp->h_addr_list[ i ] != 0; ++i ) {
|
||||
SAFEMEMCPY( (char *)&sock.sin_addr.s_addr,
|
||||
(char *)hp->h_addr_list[ i ],
|
||||
sizeof(sock.sin_addr.s_addr));
|
||||
if ( add_addr( ld, (struct sockaddr *)&sock ) < 0 ) {
|
||||
close( s );
|
||||
NSLDAPI_FREE( ld );
|
||||
return( NULL );
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
sock.sin_addr.s_addr = address;
|
||||
if ( add_addr( ld, (struct sockaddr *)&sock ) < 0 ) {
|
||||
close( s );
|
||||
NSLDAPI_FREE( ld );
|
||||
return( NULL );
|
||||
}
|
||||
}
|
||||
|
||||
if ( ld->ld_host == NULL ) {
|
||||
ld->ld_host = nsldapi_strdup( host );
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
address = INADDR_LOOPBACK;
|
||||
sock.sin_addr.s_addr = htonl( address );
|
||||
if ( add_addr( ld, (struct sockaddr *)&sock ) < 0 ) {
|
||||
close( s );
|
||||
NSLDAPI_FREE( ld );
|
||||
return( NULL );
|
||||
}
|
||||
}
|
||||
|
||||
if ( ld->ld_sbp->sb_addrs == NULL
|
||||
|| ( ld->ld_defconn = nsldapi_new_connection( ld, NULL, 1,0,0 )) == NULL ) {
|
||||
NSLDAPI_FREE( ld );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
ld->ld_sbp->sb_useaddr = ld->ld_sbp->sb_addrs[ 0 ];
|
||||
cldap_setretryinfo( ld, 0, 0 );
|
||||
|
||||
#ifdef LDAP_DEBUG
|
||||
putchar( '\n' );
|
||||
for ( i = 0; i < ld->ld_sbp->sb_naddr; ++i ) {
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "end of cldap_open address %d is %s\n",
|
||||
i, inet_ntoa( ((struct sockaddr_in *)
|
||||
ld->ld_sbp->sb_addrs[ i ])->sin_addr ), 0 );
|
||||
}
|
||||
#endif
|
||||
|
||||
return( ld );
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
cldap_close( LDAP *ld )
|
||||
{
|
||||
ldap_ld_free( ld, NULL, NULL, 0 );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
cldap_setretryinfo( LDAP *ld, int tries, int timeout )
|
||||
{
|
||||
ld->ld_cldaptries = ( tries <= 0 ) ? DEF_CLDAP_TRIES : tries;
|
||||
ld->ld_cldaptimeout = ( timeout <= 0 ) ? DEF_CLDAP_TIMEOUT : timeout;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
cldap_search_s( LDAP *ld, char *base, int scope, char *filter, char **attrs,
|
||||
int attrsonly, LDAPMessage **res, char *logdn )
|
||||
{
|
||||
int ret, msgid;
|
||||
struct cldap_retinfo cri;
|
||||
|
||||
*res = NULLMSG;
|
||||
|
||||
(void) memset( &cri, 0, sizeof( cri ));
|
||||
|
||||
if ( logdn != NULL ) {
|
||||
ld->ld_cldapdn = logdn;
|
||||
} else if ( ld->ld_cldapdn == NULL ) {
|
||||
ld->ld_cldapdn = "";
|
||||
}
|
||||
|
||||
do {
|
||||
if ( cri.cri_try != 0 ) {
|
||||
--ld->ld_msgid; /* use same id as before */
|
||||
}
|
||||
ld->ld_sbp->sb_useaddr = ld->ld_sbp->sb_addrs[ cri.cri_useaddr ];
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "cldap_search_s try %d (to %s)\n",
|
||||
cri.cri_try, inet_ntoa( ((struct sockaddr_in *)
|
||||
ld->ld_sbp->sb_useaddr)->sin_addr ), 0 );
|
||||
|
||||
if ( (msgid = ldap_search( ld, base, scope, filter, attrs,
|
||||
attrsonly )) == -1 ) {
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
}
|
||||
#ifndef NO_CACHE
|
||||
if ( ld->ld_cache != NULL && ld->ld_responses != NULL ) {
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "cldap_search_s res from cache\n",
|
||||
0, 0, 0 );
|
||||
*res = ld->ld_responses;
|
||||
ld->ld_responses = ld->ld_responses->lm_next;
|
||||
return( ldap_result2error( ld, *res, 0 ));
|
||||
}
|
||||
#endif /* NO_CACHE */
|
||||
ret = cldap_result( ld, msgid, res, &cri, base );
|
||||
} while (ret == -1);
|
||||
|
||||
return( ret );
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
add_addr( LDAP *ld, struct sockaddr *sap )
|
||||
{
|
||||
struct sockaddr *newsap, **addrs;
|
||||
|
||||
if (( newsap = (struct sockaddr *)NSLDAPI_MALLOC(
|
||||
sizeof( struct sockaddr ))) == NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL, NULL );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
if ( ld->ld_sbp->sb_naddr == 0 ) {
|
||||
addrs = (struct sockaddr **)NSLDAPI_MALLOC( sizeof(struct sockaddr *));
|
||||
} else {
|
||||
addrs = (struct sockaddr **)NSLDAPI_REALLOC( ld->ld_sbp->sb_addrs,
|
||||
( ld->ld_sbp->sb_naddr + 1 ) * sizeof(struct sockaddr *));
|
||||
}
|
||||
|
||||
if ( addrs == NULL ) {
|
||||
NSLDAPI_FREE( newsap );
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL, NULL );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
SAFEMEMCPY( (char *)newsap, (char *)sap, sizeof( struct sockaddr ));
|
||||
addrs[ ld->ld_sbp->sb_naddr++ ] = newsap;
|
||||
ld->ld_sbp->sb_addrs = (void **)addrs;
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
cldap_result( LDAP *ld, int msgid, LDAPMessage **res,
|
||||
struct cldap_retinfo *crip, char *base )
|
||||
{
|
||||
Sockbuf *sb = ld->ld_sbp;
|
||||
BerElement ber;
|
||||
char *logdn;
|
||||
int ret, fromaddr, i;
|
||||
long id;
|
||||
struct timeval tv;
|
||||
|
||||
fromaddr = -1;
|
||||
|
||||
if ( crip->cri_try == 0 ) {
|
||||
crip->cri_maxtries = ld->ld_cldaptries * sb->sb_naddr;
|
||||
crip->cri_timeout = ld->ld_cldaptimeout;
|
||||
crip->cri_useaddr = 0;
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "cldap_result tries %d timeout %d\n",
|
||||
ld->ld_cldaptries, ld->ld_cldaptimeout, 0 );
|
||||
}
|
||||
|
||||
if ((tv.tv_sec = crip->cri_timeout / sb->sb_naddr) < 1 ) {
|
||||
tv.tv_sec = 1;
|
||||
}
|
||||
tv.tv_usec = 0;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"cldap_result waiting up to %d seconds for a response\n",
|
||||
tv.tv_sec, 0, 0 );
|
||||
ber_init_w_nullchar( &ber, 0 );
|
||||
nsldapi_set_ber_options( ld, &ber );
|
||||
|
||||
if ( cldap_getmsg( ld, &tv, &ber ) == -1 ) {
|
||||
ret = LDAP_GET_LDERRNO( ld, NULL, NULL );
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "cldap_getmsg returned -1 (%d)\n",
|
||||
ret, 0, 0 );
|
||||
} else if ( LDAP_GET_LDERRNO( ld, NULL, NULL ) == LDAP_TIMEOUT ) {
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"cldap_result timed out\n", 0, 0, 0 );
|
||||
/*
|
||||
* It timed out; is it time to give up?
|
||||
*/
|
||||
if ( ++crip->cri_try >= crip->cri_maxtries ) {
|
||||
ret = LDAP_TIMEOUT;
|
||||
--crip->cri_try;
|
||||
} else {
|
||||
if ( ++crip->cri_useaddr >= sb->sb_naddr ) {
|
||||
/*
|
||||
* new round: reset address to first one and
|
||||
* double the timeout
|
||||
*/
|
||||
crip->cri_useaddr = 0;
|
||||
crip->cri_timeout <<= 1;
|
||||
}
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
} else {
|
||||
/*
|
||||
* Got a response. It should look like:
|
||||
* { msgid, logdn, { searchresponse...}}
|
||||
*/
|
||||
logdn = NULL;
|
||||
|
||||
if ( ber_scanf( &ber, "ia", &id, &logdn ) == LBER_ERROR ) {
|
||||
NSLDAPI_FREE( ber.ber_buf ); /* gack! */
|
||||
ret = LDAP_DECODING_ERROR;
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"cldap_result: ber_scanf returned LBER_ERROR (%d)\n",
|
||||
ret, 0, 0 );
|
||||
} else if ( id != msgid ) {
|
||||
NSLDAPI_FREE( ber.ber_buf ); /* gack! */
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"cldap_result: looking for msgid %d; got %ld\n",
|
||||
msgid, id, 0 );
|
||||
ret = -1; /* ignore and keep looking */
|
||||
} else {
|
||||
/*
|
||||
* got a result: determine which server it came from
|
||||
* decode into ldap message chain
|
||||
*/
|
||||
for ( fromaddr = 0; fromaddr < sb->sb_naddr; ++fromaddr ) {
|
||||
if ( memcmp( &((struct sockaddr_in *)
|
||||
sb->sb_addrs[ fromaddr ])->sin_addr,
|
||||
&((struct sockaddr_in *)sb->sb_fromaddr)->sin_addr,
|
||||
sizeof( struct in_addr )) == 0 ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
ret = cldap_parsemsg( ld, msgid, &ber, res, base );
|
||||
NSLDAPI_FREE( ber.ber_buf ); /* gack! */
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"cldap_result got result (%d)\n", ret, 0, 0 );
|
||||
}
|
||||
|
||||
if ( logdn != NULL ) {
|
||||
NSLDAPI_FREE( logdn );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* If we are giving up (successfully or otherwise) then
|
||||
* abandon any outstanding requests.
|
||||
*/
|
||||
if ( ret != -1 ) {
|
||||
i = crip->cri_try;
|
||||
if ( i >= sb->sb_naddr ) {
|
||||
i = sb->sb_naddr - 1;
|
||||
}
|
||||
|
||||
for ( ; i >= 0; --i ) {
|
||||
if ( i == fromaddr ) {
|
||||
continue;
|
||||
}
|
||||
sb->sb_useaddr = sb->sb_addrs[ i ];
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "cldap_result abandoning id %d (to %s)\n",
|
||||
msgid, inet_ntoa( ((struct sockaddr_in *)
|
||||
sb->sb_useaddr)->sin_addr ), 0 );
|
||||
(void) ldap_abandon( ld, msgid );
|
||||
}
|
||||
}
|
||||
|
||||
LDAP_SET_LDERRNO( ld, ret, NULL, NULL );
|
||||
return( ret );
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
cldap_parsemsg( LDAP *ld, int msgid, BerElement *ber,
|
||||
LDAPMessage **res, char *base )
|
||||
{
|
||||
unsigned long tag, len;
|
||||
int baselen, slen, rc;
|
||||
char *dn, *p, *cookie;
|
||||
LDAPMessage *chain, *prev, *ldm;
|
||||
struct berval *bv;
|
||||
|
||||
rc = LDAP_DECODING_ERROR; /* pessimistic */
|
||||
ldm = chain = prev = NULLMSG;
|
||||
baselen = ( base == NULL ) ? 0 : strlen( base );
|
||||
bv = NULL;
|
||||
|
||||
for ( tag = ber_first_element( ber, &len, &cookie );
|
||||
tag != LBER_ERROR && tag != LBER_END_OF_SEQOFSET
|
||||
&& rc != LDAP_SUCCESS;
|
||||
tag = ber_next_element( ber, &len, cookie )) {
|
||||
if (( ldm = (LDAPMessage *)NSLDAPI_CALLOC( 1, sizeof(LDAPMessage)))
|
||||
== NULL ) {
|
||||
rc = LDAP_NO_MEMORY;
|
||||
break; /* return with error */
|
||||
} else if (( rc = nsldapi_alloc_ber_with_options( ld, &ldm->lm_ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
break; /* return with error*/
|
||||
}
|
||||
ldm->lm_msgid = msgid;
|
||||
ldm->lm_msgtype = tag;
|
||||
|
||||
if ( tag == LDAP_RES_SEARCH_RESULT ) {
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "cldap_parsemsg got search result\n",
|
||||
0, 0, 0 );
|
||||
|
||||
if ( ber_get_stringal( ber, &bv ) == LBER_DEFAULT ) {
|
||||
break; /* return w/error */
|
||||
}
|
||||
|
||||
if ( ber_printf( ldm->lm_ber, "to", tag, bv->bv_val,
|
||||
(int)bv->bv_len /* XXX lossy cast */ ) == -1 ) {
|
||||
break; /* return w/error */
|
||||
}
|
||||
ber_bvfree( bv );
|
||||
bv = NULL;
|
||||
rc = LDAP_SUCCESS;
|
||||
|
||||
} else if ( tag == LDAP_RES_SEARCH_ENTRY ) {
|
||||
if ( ber_scanf( ber, "{aO", &dn, &bv ) == LBER_ERROR ) {
|
||||
break; /* return w/error */
|
||||
}
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "cldap_parsemsg entry %s\n", dn, 0, 0 );
|
||||
if ( dn != NULL && *(dn + ( slen = strlen(dn)) - 1) == '*' &&
|
||||
baselen > 0 ) {
|
||||
/*
|
||||
* substitute original searchbase for trailing '*'
|
||||
*/
|
||||
if (( p = (char *)NSLDAPI_MALLOC( slen + baselen )) == NULL ) {
|
||||
rc = LDAP_NO_MEMORY;
|
||||
NSLDAPI_FREE( dn );
|
||||
break; /* return w/error */
|
||||
}
|
||||
strcpy( p, dn );
|
||||
strcpy( p + slen - 1, base );
|
||||
NSLDAPI_FREE( dn );
|
||||
dn = p;
|
||||
}
|
||||
|
||||
if ( ber_printf( ldm->lm_ber, "t{so}", tag, dn, bv->bv_val,
|
||||
(int)bv->bv_len /* XXX lossy cast */ ) == -1 ) {
|
||||
break; /* return w/error */
|
||||
}
|
||||
NSLDAPI_FREE( dn );
|
||||
ber_bvfree( bv );
|
||||
bv = NULL;
|
||||
|
||||
} else {
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "cldap_parsemsg got unknown tag %d\n",
|
||||
tag, 0, 0 );
|
||||
rc = LDAP_PROTOCOL_ERROR;
|
||||
break; /* return w/error */
|
||||
}
|
||||
|
||||
/* Reset message ber so we can read from it later. Gack! */
|
||||
ldm->lm_ber->ber_end = ldm->lm_ber->ber_ptr;
|
||||
ldm->lm_ber->ber_ptr = ldm->lm_ber->ber_buf;
|
||||
|
||||
#ifdef LDAP_DEBUG
|
||||
if ( ldap_debug & LDAP_DEBUG_PACKETS ) {
|
||||
char msg[80];
|
||||
sprintf( msg, "cldap_parsemsg add message id %d type %d:\n",
|
||||
ldm->lm_msgid, ldm->lm_msgtype );
|
||||
ber_err_print( msg );
|
||||
ber_dump( ldm->lm_ber, 1 );
|
||||
}
|
||||
#endif /* LDAP_DEBUG */
|
||||
|
||||
#ifndef NO_CACHE
|
||||
if ( ld->ld_cache != NULL ) {
|
||||
nsldapi_add_result_to_cache( ld, ldm );
|
||||
}
|
||||
#endif /* NO_CACHE */
|
||||
|
||||
if ( chain == NULL ) {
|
||||
chain = ldm;
|
||||
} else {
|
||||
prev->lm_chain = ldm;
|
||||
}
|
||||
prev = ldm;
|
||||
ldm = NULL;
|
||||
}
|
||||
|
||||
/* dispose of any leftovers */
|
||||
if ( ldm != NULL ) {
|
||||
if ( ldm->lm_ber != NULLBER ) {
|
||||
ber_free( ldm->lm_ber, 1 );
|
||||
}
|
||||
NSLDAPI_FREE( ldm );
|
||||
}
|
||||
if ( bv != NULL ) {
|
||||
ber_bvfree( bv );
|
||||
}
|
||||
|
||||
/* return chain, calling result2error if we got anything at all */
|
||||
*res = chain;
|
||||
return(( *res == NULLMSG ) ? rc : ldap_result2error( ld, *res, 0 ));
|
||||
}
|
||||
#endif /* CLDAP */
|
||||
179
mozilla/directory/c-sdk/ldap/libraries/libldap/compare.c
Normal file
179
mozilla/directory/c-sdk/ldap/libraries/libldap/compare.c
Normal file
@@ -0,0 +1,179 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* compare.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
/*
|
||||
* ldap_compare - perform an ldap compare operation. The dn
|
||||
* of the entry to compare to and the attribute and value to compare (in
|
||||
* attr and value) are supplied. The msgid of the response is returned.
|
||||
*
|
||||
* Example:
|
||||
* ldap_compare( ld, "c=us@cn=bob", "userPassword", "secret" )
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_compare( LDAP *ld, const char *dn, const char *attr, const char *value )
|
||||
{
|
||||
int msgid;
|
||||
struct berval bv;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_compare\n", 0, 0, 0 );
|
||||
|
||||
bv.bv_val = (char *)value;
|
||||
bv.bv_len = ( value == NULL ) ? 0 : strlen( value );
|
||||
|
||||
if ( ldap_compare_ext( ld, dn, attr, &bv, NULL, NULL, &msgid )
|
||||
== LDAP_SUCCESS ) {
|
||||
return( msgid );
|
||||
} else {
|
||||
return( -1 ); /* error is in ld handle */
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_compare_ext( LDAP *ld, const char *dn, const char *attr,
|
||||
const struct berval *bvalue, LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls, int *msgidp )
|
||||
{
|
||||
BerElement *ber;
|
||||
int rc, lderr;
|
||||
|
||||
/* The compare request looks like this:
|
||||
* CompareRequest ::= SEQUENCE {
|
||||
* entry DistinguishedName,
|
||||
* ava SEQUENCE {
|
||||
* type AttributeType,
|
||||
* value AttributeValue
|
||||
* }
|
||||
* }
|
||||
* and must be wrapped in an LDAPMessage.
|
||||
*/
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_compare_ext\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
if ( attr == NULL || bvalue == NULL || bvalue->bv_len == 0
|
||||
|| msgidp == NULL ) {
|
||||
lderr = LDAP_PARAM_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
if ( dn == NULL ) {
|
||||
dn = "";
|
||||
}
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK );
|
||||
*msgidp = ++ld->ld_msgid;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK );
|
||||
|
||||
/* check the cache */
|
||||
if ( ld->ld_cache_on && ld->ld_cache_compare != NULL ) {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
|
||||
if ( (rc = (ld->ld_cache_compare)( ld, *msgidp,
|
||||
LDAP_REQ_COMPARE, dn, attr, bvalue )) != 0 ) {
|
||||
*msgidp = rc;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
}
|
||||
|
||||
/* create a message to send */
|
||||
if (( lderr = nsldapi_alloc_ber_with_options( ld, &ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
if ( ber_printf( ber, "{it{s{so}}", *msgidp, LDAP_REQ_COMPARE, dn,
|
||||
attr, bvalue->bv_val, (int)bvalue->bv_len /* XXX lossy cast */ )
|
||||
== -1 ) {
|
||||
lderr = LDAP_ENCODING_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
if (( lderr = nsldapi_put_controls( ld, serverctrls, 1, ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
ber_free( ber, 1 );
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
/* send the message */
|
||||
rc = nsldapi_send_initial_request( ld, *msgidp, LDAP_REQ_COMPARE,
|
||||
(char *)dn, ber );
|
||||
*msgidp = rc;
|
||||
return( rc < 0 ? LDAP_GET_LDERRNO( ld, NULL, NULL ) : LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_compare_s( LDAP *ld, const char *dn, const char *attr,
|
||||
const char *value )
|
||||
{
|
||||
struct berval bv;
|
||||
|
||||
bv.bv_val = (char *)value;
|
||||
bv.bv_len = ( value == NULL ) ? 0 : strlen( value );
|
||||
|
||||
return( ldap_compare_ext_s( ld, dn, attr, &bv, NULL, NULL ));
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_compare_ext_s( LDAP *ld, const char *dn, const char *attr,
|
||||
const struct berval *bvalue, LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls )
|
||||
{
|
||||
int err, msgid;
|
||||
LDAPMessage *res;
|
||||
|
||||
if (( err = ldap_compare_ext( ld, dn, attr, bvalue, serverctrls,
|
||||
clientctrls, &msgid )) != LDAP_SUCCESS ) {
|
||||
return( err );
|
||||
}
|
||||
|
||||
if ( ldap_result( ld, msgid, 1, (struct timeval *)NULL, &res )
|
||||
== -1 ) {
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
}
|
||||
|
||||
return( ldap_result2error( ld, res, 1 ) );
|
||||
}
|
||||
67
mozilla/directory/c-sdk/ldap/libraries/libldap/compat.c
Normal file
67
mozilla/directory/c-sdk/ldap/libraries/libldap/compat.c
Normal file
@@ -0,0 +1,67 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1994 The Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* compat.c - compatibility routines.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1994 The Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
#if defined( HPUX10 ) && defined( _REENTRANT ) && !defined ( HPUX11 )
|
||||
extern int h_errno;
|
||||
|
||||
struct hostent *
|
||||
nsldapi_compat_gethostbyname_r( const char *name, struct hostent *result,
|
||||
char *buffer, int buflen, int *h_errnop )
|
||||
{
|
||||
struct hostent_data *hep;
|
||||
|
||||
if ( buflen < sizeof(struct hostent_data)) { /* sanity check */
|
||||
*h_errnop = NO_RECOVERY; /* XXX best error code to use? */
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
hep = (struct hostent_data *)buffer;
|
||||
hep->current = NULL;
|
||||
|
||||
if ( gethostbyname_r( name, result, hep ) == -1) {
|
||||
*h_errnop = h_errno; /* XXX don't see anywhere else to get this */
|
||||
return NULL;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
char *
|
||||
nsldapi_compat_ctime_r( const time_t *clock, char *buf, int buflen )
|
||||
{
|
||||
(void) ctime_r( clock, buf, buflen );
|
||||
return buf;
|
||||
}
|
||||
#endif /* HPUX10 && _REENTRANT && !HPUX11 */
|
||||
493
mozilla/directory/c-sdk/ldap/libraries/libldap/control.c
Normal file
493
mozilla/directory/c-sdk/ldap/libraries/libldap/control.c
Normal file
@@ -0,0 +1,493 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/* control.c - routines to handle ldapv3 controls */
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
static LDAPControl *ldap_control_dup( LDAPControl *ctrl );
|
||||
static int ldap_control_copy_contents( LDAPControl *ctrl_dst,
|
||||
LDAPControl *ctrl_src );
|
||||
|
||||
/*
|
||||
* Append a list of LDAPv3 controls to ber. If ctrls is NULL, use default
|
||||
* set of controls from ld.
|
||||
* Return an LDAP error code (LDAP_SUCCESS if all goes well).
|
||||
* If closeseq is non-zero, we do an extra ber_put_seq() as well.
|
||||
*/
|
||||
int
|
||||
nsldapi_put_controls( LDAP *ld, LDAPControl **ctrls, int closeseq,
|
||||
BerElement *ber )
|
||||
{
|
||||
LDAPControl *c;
|
||||
int rc, i;
|
||||
|
||||
rc = LDAP_ENCODING_ERROR; /* the most popular error */
|
||||
|
||||
/* if no controls were passed in, use global list from LDAP * */
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CTRL_LOCK );
|
||||
if ( ctrls == NULL ) {
|
||||
ctrls = ld->ld_servercontrols;
|
||||
}
|
||||
|
||||
/* if there are no controls then we are done */
|
||||
if ( ctrls == NULL || ctrls[ 0 ] == NULL ) {
|
||||
goto clean_exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we're using LDAPv2 or earlier we can't send any controls, so
|
||||
* we just ignore them unless one is marked critical, in which case
|
||||
* we return an error.
|
||||
*/
|
||||
if ( NSLDAPI_LDAP_VERSION( ld ) < LDAP_VERSION3 ) {
|
||||
for ( i = 0; ctrls != NULL && ctrls[i] != NULL; i++ ) {
|
||||
if ( ctrls[i]->ldctl_iscritical ) {
|
||||
rc = LDAP_NOT_SUPPORTED;
|
||||
goto error_exit;
|
||||
}
|
||||
}
|
||||
goto clean_exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* encode the controls as a Sequence of Sequence
|
||||
*/
|
||||
if ( ber_printf( ber, "t{", LDAP_TAG_CONTROLS ) == -1 ) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
for ( i = 0; ctrls[i] != NULL; i++ ) {
|
||||
c = ctrls[i];
|
||||
|
||||
if ( ber_printf( ber, "{s", c->ldctl_oid ) == -1 ) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
/* criticality is "BOOLEAN DEFAULT FALSE" */
|
||||
/* therefore, it should only be encoded if it exists AND is TRUE */
|
||||
if ( c->ldctl_iscritical ) {
|
||||
if ( ber_printf( ber, "b", (int)c->ldctl_iscritical )
|
||||
== -1 ) {
|
||||
goto error_exit;
|
||||
}
|
||||
}
|
||||
|
||||
if ( c->ldctl_value.bv_val != NULL ) {
|
||||
if ( ber_printf( ber, "o", c->ldctl_value.bv_val,
|
||||
(int)c->ldctl_value.bv_len /* XXX lossy cast */ )
|
||||
== -1 ) {
|
||||
goto error_exit;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ber_put_seq( ber ) == -1 ) {
|
||||
goto error_exit;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ber_put_seq( ber ) == -1 ) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
clean_exit:
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CTRL_LOCK );
|
||||
if ( closeseq && ber_put_seq( ber ) == -1 ) {
|
||||
goto error_exit;
|
||||
}
|
||||
return( LDAP_SUCCESS );
|
||||
|
||||
error_exit:
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CTRL_LOCK );
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Pull controls out of "ber" (if any present) and return them in "controlsp."
|
||||
* Returns an LDAP error code.
|
||||
*/
|
||||
int
|
||||
nsldapi_get_controls( BerElement *ber, LDAPControl ***controlsp )
|
||||
{
|
||||
LDAPControl *newctrl;
|
||||
unsigned long tag, len;
|
||||
int rc, maxcontrols, curcontrols;
|
||||
char *last;
|
||||
|
||||
/*
|
||||
* Each LDAPMessage can have a set of controls appended
|
||||
* to it. Controls are used to extend the functionality
|
||||
* of an LDAP operation (e.g., add an attribute size limit
|
||||
* to the search operation). These controls look like this:
|
||||
*
|
||||
* Controls ::= SEQUENCE OF Control
|
||||
*
|
||||
* Control ::= SEQUENCE {
|
||||
* controlType LDAPOID,
|
||||
* criticality BOOLEAN DEFAULT FALSE,
|
||||
* controlValue OCTET STRING
|
||||
* }
|
||||
*/
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "=> nsldapi_get_controls\n", 0, 0, 0 );
|
||||
|
||||
*controlsp = NULL;
|
||||
|
||||
/*
|
||||
* check to see if controls were included
|
||||
*/
|
||||
if ( ber_get_option( ber, LBER_OPT_REMAINING_BYTES, &len ) != 0 ) {
|
||||
return( LDAP_DECODING_ERROR ); /* unexpected error */
|
||||
}
|
||||
if ( len == 0 ) {
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"<= nsldapi_get_controls no controls\n", 0, 0, 0 );
|
||||
return( LDAP_SUCCESS ); /* no controls */
|
||||
}
|
||||
if (( tag = ber_peek_tag( ber, &len )) != LDAP_TAG_CONTROLS ) {
|
||||
if ( tag == LBER_ERROR ) {
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"<= nsldapi_get_controls LDAP_PROTOCOL_ERROR\n",
|
||||
0, 0, 0 );
|
||||
return( LDAP_DECODING_ERROR ); /* decoding error */
|
||||
}
|
||||
/*
|
||||
* We found something other than controls. This should never
|
||||
* happen in LDAPv3, but we don't treat this is a hard error --
|
||||
* we just ignore the extra stuff.
|
||||
*/
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"<= nsldapi_get_controls ignoring unrecognized data in message (tag 0x%x)\n",
|
||||
tag, 0, 0 );
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
maxcontrols = curcontrols = 0;
|
||||
for ( tag = ber_first_element( ber, &len, &last );
|
||||
tag != LBER_ERROR && tag != LBER_END_OF_SEQORSET;
|
||||
tag = ber_next_element( ber, &len, last ) ) {
|
||||
if ( curcontrols >= maxcontrols - 1 ) {
|
||||
#define CONTROL_GRABSIZE 5
|
||||
maxcontrols += CONTROL_GRABSIZE;
|
||||
*controlsp = (struct ldapcontrol **)NSLDAPI_REALLOC(
|
||||
(char *)*controlsp, maxcontrols *
|
||||
sizeof(struct ldapcontrol *) );
|
||||
if ( *controlsp == NULL ) {
|
||||
rc = LDAP_NO_MEMORY;
|
||||
goto free_and_return;
|
||||
}
|
||||
}
|
||||
if (( newctrl = (struct ldapcontrol *)NSLDAPI_CALLOC( 1,
|
||||
sizeof(LDAPControl))) == NULL ) {
|
||||
rc = LDAP_NO_MEMORY;
|
||||
goto free_and_return;
|
||||
}
|
||||
|
||||
(*controlsp)[curcontrols++] = newctrl;
|
||||
(*controlsp)[curcontrols] = NULL;
|
||||
|
||||
if ( ber_scanf( ber, "{a", &newctrl->ldctl_oid )
|
||||
== LBER_ERROR ) {
|
||||
rc = LDAP_DECODING_ERROR;
|
||||
goto free_and_return;
|
||||
}
|
||||
|
||||
/* the criticality is optional */
|
||||
if ( ber_peek_tag( ber, &len ) == LBER_BOOLEAN ) {
|
||||
int aint;
|
||||
|
||||
if ( ber_scanf( ber, "b", &aint ) == LBER_ERROR ) {
|
||||
rc = LDAP_DECODING_ERROR;
|
||||
goto free_and_return;
|
||||
}
|
||||
newctrl->ldctl_iscritical = (char)aint; /* XXX lossy cast */
|
||||
} else {
|
||||
/* absent is synonomous with FALSE */
|
||||
newctrl->ldctl_iscritical = 0;
|
||||
}
|
||||
|
||||
/* the control value is optional */
|
||||
if ( ber_peek_tag( ber, &len ) == LBER_OCTETSTRING ) {
|
||||
if ( ber_scanf( ber, "o", &newctrl->ldctl_value )
|
||||
== LBER_ERROR ) {
|
||||
rc = LDAP_DECODING_ERROR;
|
||||
goto free_and_return;
|
||||
}
|
||||
} else {
|
||||
(newctrl->ldctl_value).bv_val = NULL;
|
||||
(newctrl->ldctl_value).bv_len = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ( tag == LBER_ERROR ) {
|
||||
rc = LDAP_DECODING_ERROR;
|
||||
goto free_and_return;
|
||||
}
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"<= nsldapi_get_controls found %d controls\n", curcontrols, 0, 0 );
|
||||
return( LDAP_SUCCESS );
|
||||
|
||||
free_and_return:;
|
||||
ldap_controls_free( *controlsp );
|
||||
*controlsp = NULL;
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"<= nsldapi_get_controls error 0x%x\n", rc, 0, 0 );
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_control_free( LDAPControl *ctrl )
|
||||
{
|
||||
if ( ctrl != NULL ) {
|
||||
if ( ctrl->ldctl_oid != NULL ) {
|
||||
NSLDAPI_FREE( ctrl->ldctl_oid );
|
||||
}
|
||||
if ( ctrl->ldctl_value.bv_val != NULL ) {
|
||||
NSLDAPI_FREE( ctrl->ldctl_value.bv_val );
|
||||
}
|
||||
NSLDAPI_FREE( (char *)ctrl );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_controls_free( LDAPControl **ctrls )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( ctrls != NULL ) {
|
||||
for ( i = 0; ctrls[i] != NULL; i++ ) {
|
||||
ldap_control_free( ctrls[i] );
|
||||
}
|
||||
NSLDAPI_FREE( (char *)ctrls );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
LDAPControl **
|
||||
LDAP_CALL
|
||||
ldap_control_append( LDAPControl **ctrl_src, LDAPControl *ctrl )
|
||||
{
|
||||
int nctrls = 0;
|
||||
LDAPControl **ctrlp;
|
||||
int i;
|
||||
|
||||
if ( NULL == ctrl )
|
||||
return ( NULL );
|
||||
|
||||
/* Count the existing controls */
|
||||
if ( NULL != ctrl_src ) {
|
||||
while( NULL != ctrl_src[nctrls] ) {
|
||||
nctrls++;
|
||||
}
|
||||
}
|
||||
|
||||
/* allocate the new control structure */
|
||||
if ( ( ctrlp = (LDAPControl **)NSLDAPI_MALLOC( sizeof(LDAPControl *)
|
||||
* (nctrls + 2) ) ) == NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
memset( ctrlp, 0, sizeof(*ctrlp) * (nctrls + 2) );
|
||||
|
||||
for( i = 0; i < (nctrls + 1); i++ ) {
|
||||
if ( i < nctrls ) {
|
||||
ctrlp[i] = ldap_control_dup( ctrl_src[i] );
|
||||
} else {
|
||||
ctrlp[i] = ldap_control_dup( ctrl );
|
||||
}
|
||||
if ( NULL == ctrlp[i] ) {
|
||||
ldap_controls_free( ctrlp );
|
||||
return( NULL );
|
||||
}
|
||||
}
|
||||
return ctrlp;
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
|
||||
/*
|
||||
* Replace *ldctrls with a copy of newctrls.
|
||||
* returns 0 if successful.
|
||||
* return -1 if not and set error code inside LDAP *ld.
|
||||
*/
|
||||
int
|
||||
nsldapi_dup_controls( LDAP *ld, LDAPControl ***ldctrls, LDAPControl **newctrls )
|
||||
{
|
||||
int count;
|
||||
|
||||
if ( *ldctrls != NULL ) {
|
||||
ldap_controls_free( *ldctrls );
|
||||
}
|
||||
|
||||
if ( newctrls == NULL || newctrls[0] == NULL ) {
|
||||
*ldctrls = NULL;
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
for ( count = 0; newctrls[ count ] != NULL; ++count ) {
|
||||
;
|
||||
}
|
||||
|
||||
if (( *ldctrls = (LDAPControl **)NSLDAPI_MALLOC(( count + 1 ) *
|
||||
sizeof( LDAPControl *))) == NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL, NULL );
|
||||
return( -1 );
|
||||
}
|
||||
(*ldctrls)[ count ] = NULL;
|
||||
|
||||
for ( count = 0; newctrls[ count ] != NULL; ++count ) {
|
||||
if (( (*ldctrls)[ count ] =
|
||||
ldap_control_dup( newctrls[ count ] )) == NULL ) {
|
||||
ldap_controls_free( *ldctrls );
|
||||
*ldctrls = NULL;
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL, NULL );
|
||||
return( -1 );
|
||||
}
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* return a malloc'd copy of "ctrl" (NULL if memory allocation fails)
|
||||
*/
|
||||
static LDAPControl *
|
||||
/* LDAP_CALL */ /* keep this routine internal for now */
|
||||
ldap_control_dup( LDAPControl *ctrl )
|
||||
{
|
||||
LDAPControl *rctrl;
|
||||
|
||||
if (( rctrl = (LDAPControl *)NSLDAPI_MALLOC( sizeof( LDAPControl )))
|
||||
== NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
if ( ldap_control_copy_contents( rctrl, ctrl ) != LDAP_SUCCESS ) {
|
||||
NSLDAPI_FREE( rctrl );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( rctrl );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* duplicate the contents of "ctrl_src" and place in "ctrl_dst"
|
||||
*/
|
||||
static int
|
||||
/* LDAP_CALL */ /* keep this routine internal for now */
|
||||
ldap_control_copy_contents( LDAPControl *ctrl_dst, LDAPControl *ctrl_src )
|
||||
{
|
||||
size_t len;
|
||||
|
||||
if ( NULL == ctrl_dst || NULL == ctrl_src ) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
ctrl_dst->ldctl_iscritical = ctrl_src->ldctl_iscritical;
|
||||
|
||||
/* fill in the fields of this new control */
|
||||
if (( ctrl_dst->ldctl_oid = nsldapi_strdup( ctrl_src->ldctl_oid ))
|
||||
== NULL ) {
|
||||
return( LDAP_NO_MEMORY );
|
||||
}
|
||||
|
||||
len = (size_t)(ctrl_src->ldctl_value).bv_len;
|
||||
if ( ctrl_src->ldctl_value.bv_val == NULL || len <= 0 ) {
|
||||
ctrl_dst->ldctl_value.bv_len = 0;
|
||||
ctrl_dst->ldctl_value.bv_val = NULL;
|
||||
} else {
|
||||
ctrl_dst->ldctl_value.bv_len = len;
|
||||
if (( ctrl_dst->ldctl_value.bv_val = NSLDAPI_MALLOC( len ))
|
||||
== NULL ) {
|
||||
NSLDAPI_FREE( ctrl_dst->ldctl_oid );
|
||||
return( LDAP_NO_MEMORY );
|
||||
}
|
||||
SAFEMEMCPY( ctrl_dst->ldctl_value.bv_val,
|
||||
ctrl_src->ldctl_value.bv_val, len );
|
||||
}
|
||||
|
||||
return ( LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* build an allocated LDAPv3 control. Returns an LDAP error code.
|
||||
*/
|
||||
int
|
||||
nsldapi_build_control( char *oid, BerElement *ber, int freeber, char iscritical,
|
||||
LDAPControl **ctrlp )
|
||||
{
|
||||
int rc;
|
||||
struct berval *bvp;
|
||||
|
||||
if ( ber == NULL ) {
|
||||
bvp = NULL;
|
||||
} else {
|
||||
/* allocate struct berval with contents of the BER encoding */
|
||||
rc = ber_flatten( ber, &bvp );
|
||||
if ( freeber ) {
|
||||
ber_free( ber, 1 );
|
||||
}
|
||||
if ( rc == -1 ) {
|
||||
return( LDAP_NO_MEMORY );
|
||||
}
|
||||
}
|
||||
|
||||
/* allocate the new control structure */
|
||||
if (( *ctrlp = (LDAPControl *)NSLDAPI_MALLOC( sizeof(LDAPControl)))
|
||||
== NULL ) {
|
||||
if ( bvp != NULL ) {
|
||||
ber_bvfree( bvp );
|
||||
}
|
||||
return( LDAP_NO_MEMORY );
|
||||
}
|
||||
|
||||
/* fill in the fields of this new control */
|
||||
(*ctrlp)->ldctl_iscritical = iscritical;
|
||||
if (( (*ctrlp)->ldctl_oid = nsldapi_strdup( oid )) == NULL ) {
|
||||
NSLDAPI_FREE( *ctrlp );
|
||||
if ( bvp != NULL ) {
|
||||
ber_bvfree( bvp );
|
||||
}
|
||||
return( LDAP_NO_MEMORY );
|
||||
}
|
||||
|
||||
if ( bvp == NULL ) {
|
||||
(*ctrlp)->ldctl_value.bv_len = 0;
|
||||
(*ctrlp)->ldctl_value.bv_val = NULL;
|
||||
} else {
|
||||
(*ctrlp)->ldctl_value = *bvp; /* struct copy */
|
||||
NSLDAPI_FREE( bvp ); /* free container, not contents! */
|
||||
}
|
||||
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
52
mozilla/directory/c-sdk/ldap/libraries/libldap/countvalues.c
Normal file
52
mozilla/directory/c-sdk/ldap/libraries/libldap/countvalues.c
Normal file
@@ -0,0 +1,52 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* countvalues.c
|
||||
*/
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_count_values( char **vals )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( vals == NULL )
|
||||
return( 0 );
|
||||
|
||||
for ( i = 0; vals[i] != NULL; i++ )
|
||||
; /* NULL */
|
||||
|
||||
return( i );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_count_values_len( struct berval **vals )
|
||||
{
|
||||
return( ldap_count_values( (char **) vals ) );
|
||||
}
|
||||
158
mozilla/directory/c-sdk/ldap/libraries/libldap/delete.c
Normal file
158
mozilla/directory/c-sdk/ldap/libraries/libldap/delete.c
Normal file
@@ -0,0 +1,158 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* delete.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
/*
|
||||
* ldap_delete - initiate an ldap delete operation. Parameters:
|
||||
*
|
||||
* ld LDAP descriptor
|
||||
* dn DN of the object to delete
|
||||
*
|
||||
* Example:
|
||||
* msgid = ldap_delete( ld, dn );
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_delete( LDAP *ld, const char *dn )
|
||||
{
|
||||
int msgid;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_delete\n", 0, 0, 0 );
|
||||
|
||||
if ( ldap_delete_ext( ld, dn, NULL, NULL, &msgid ) == LDAP_SUCCESS ) {
|
||||
return( msgid );
|
||||
} else {
|
||||
return( -1 ); /* error is in ld handle */
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_delete_ext( LDAP *ld, const char *dn, LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls, int *msgidp )
|
||||
{
|
||||
BerElement *ber;
|
||||
int rc, lderr;
|
||||
|
||||
/*
|
||||
* A delete request looks like this:
|
||||
* DelRequet ::= DistinguishedName,
|
||||
*/
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_delete_ext\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAPMESSAGE_POINTER( msgidp ))
|
||||
{
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
if ( dn == NULL ) {
|
||||
dn = "";
|
||||
}
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK );
|
||||
*msgidp = ++ld->ld_msgid;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK );
|
||||
|
||||
/* see if we should add to the cache */
|
||||
if ( ld->ld_cache_on && ld->ld_cache_delete != NULL ) {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
|
||||
if ( (rc = (ld->ld_cache_delete)( ld, *msgidp, LDAP_REQ_DELETE,
|
||||
dn )) != 0 ) {
|
||||
*msgidp = rc;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
}
|
||||
|
||||
/* create a message to send */
|
||||
if (( lderr = nsldapi_alloc_ber_with_options( ld, &ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
if ( ber_printf( ber, "{its", *msgidp, LDAP_REQ_DELETE, dn )
|
||||
== -1 ) {
|
||||
lderr = LDAP_ENCODING_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
if (( lderr = nsldapi_put_controls( ld, serverctrls, 1, ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
ber_free( ber, 1 );
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
/* send the message */
|
||||
rc = nsldapi_send_initial_request( ld, *msgidp, LDAP_REQ_DELETE,
|
||||
(char *)dn, ber );
|
||||
*msgidp = rc;
|
||||
return( rc < 0 ? LDAP_GET_LDERRNO( ld, NULL, NULL ) : LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_delete_s( LDAP *ld, const char *dn )
|
||||
{
|
||||
return( ldap_delete_ext_s( ld, dn, NULL, NULL ));
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_delete_ext_s( LDAP *ld, const char *dn, LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls )
|
||||
{
|
||||
int err, msgid;
|
||||
LDAPMessage *res;
|
||||
|
||||
if (( err = ldap_delete_ext( ld, dn, serverctrls, clientctrls,
|
||||
&msgid )) != LDAP_SUCCESS ) {
|
||||
return( err );
|
||||
}
|
||||
|
||||
if ( ldap_result( ld, msgid, 1, (struct timeval *)NULL, &res ) == -1 ) {
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
}
|
||||
|
||||
return( ldap_result2error( ld, res, 1 ) );
|
||||
}
|
||||
757
mozilla/directory/c-sdk/ldap/libraries/libldap/disptmpl.c
Normal file
757
mozilla/directory/c-sdk/ldap/libraries/libldap/disptmpl.c
Normal file
@@ -0,0 +1,757 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1993, 1994 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*/
|
||||
/*
|
||||
* disptmpl.c: display template library routines for LDAP clients
|
||||
*/
|
||||
|
||||
#include "ldap-int.h"
|
||||
#include "disptmpl.h"
|
||||
|
||||
static void free_disptmpl( struct ldap_disptmpl *tmpl );
|
||||
static int read_next_tmpl( char **bufp, long *blenp,
|
||||
struct ldap_disptmpl **tmplp, int dtversion );
|
||||
int nsldapi_next_line_tokens( char **bufp, long *blenp, char ***toksp );
|
||||
void nsldapi_free_strarray( char **sap );
|
||||
|
||||
static char *tmploptions[] = {
|
||||
"addable", "modrdn",
|
||||
"altview",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
static unsigned long tmploptvals[] = {
|
||||
LDAP_DTMPL_OPT_ADDABLE, LDAP_DTMPL_OPT_ALLOWMODRDN,
|
||||
LDAP_DTMPL_OPT_ALTVIEW,
|
||||
};
|
||||
|
||||
|
||||
static char *itemtypes[] = {
|
||||
"cis", "mls", "dn",
|
||||
"bool", "jpeg", "jpegbtn",
|
||||
"fax", "faxbtn", "audiobtn",
|
||||
"time", "date", "url",
|
||||
"searchact", "linkact", "adddnact",
|
||||
"addact", "verifyact", "mail",
|
||||
NULL
|
||||
};
|
||||
|
||||
static unsigned long itemsynids[] = {
|
||||
LDAP_SYN_CASEIGNORESTR, LDAP_SYN_MULTILINESTR, LDAP_SYN_DN,
|
||||
LDAP_SYN_BOOLEAN, LDAP_SYN_JPEGIMAGE, LDAP_SYN_JPEGBUTTON,
|
||||
LDAP_SYN_FAXIMAGE, LDAP_SYN_FAXBUTTON, LDAP_SYN_AUDIOBUTTON,
|
||||
LDAP_SYN_TIME, LDAP_SYN_DATE, LDAP_SYN_LABELEDURL,
|
||||
LDAP_SYN_SEARCHACTION, LDAP_SYN_LINKACTION, LDAP_SYN_ADDDNACTION,
|
||||
LDAP_SYN_ADDDNACTION, LDAP_SYN_VERIFYDNACTION,LDAP_SYN_RFC822ADDR,
|
||||
};
|
||||
|
||||
|
||||
static char *itemoptions[] = {
|
||||
"ro", "sort",
|
||||
"1val", "hide",
|
||||
"required", "hideiffalse",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
static unsigned long itemoptvals[] = {
|
||||
LDAP_DITEM_OPT_READONLY, LDAP_DITEM_OPT_SORTVALUES,
|
||||
LDAP_DITEM_OPT_SINGLEVALUED, LDAP_DITEM_OPT_HIDEIFEMPTY,
|
||||
LDAP_DITEM_OPT_VALUEREQUIRED, LDAP_DITEM_OPT_HIDEIFFALSE,
|
||||
};
|
||||
|
||||
|
||||
#define ADDEF_CONSTANT "constant"
|
||||
#define ADDEF_ADDERSDN "addersdn"
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_init_templates( char *file, struct ldap_disptmpl **tmpllistp )
|
||||
{
|
||||
FILE *fp;
|
||||
char *buf;
|
||||
long rlen, len;
|
||||
int rc, eof;
|
||||
|
||||
*tmpllistp = NULLDISPTMPL;
|
||||
|
||||
if (( fp = fopen( file, "r" )) == NULL ) {
|
||||
return( LDAP_TMPL_ERR_FILE );
|
||||
}
|
||||
|
||||
if ( fseek( fp, 0L, SEEK_END ) != 0 ) { /* move to end to get len */
|
||||
fclose( fp );
|
||||
return( LDAP_TMPL_ERR_FILE );
|
||||
}
|
||||
|
||||
len = ftell( fp );
|
||||
|
||||
if ( fseek( fp, 0L, SEEK_SET ) != 0 ) { /* back to start of file */
|
||||
fclose( fp );
|
||||
return( LDAP_TMPL_ERR_FILE );
|
||||
}
|
||||
|
||||
if (( buf = NSLDAPI_MALLOC( (size_t)len )) == NULL ) {
|
||||
fclose( fp );
|
||||
return( LDAP_TMPL_ERR_MEM );
|
||||
}
|
||||
|
||||
rlen = fread( buf, 1, (size_t)len, fp );
|
||||
eof = feof( fp );
|
||||
fclose( fp );
|
||||
|
||||
if ( rlen != len && !eof ) { /* error: didn't get the whole file */
|
||||
NSLDAPI_FREE( buf );
|
||||
return( LDAP_TMPL_ERR_FILE );
|
||||
}
|
||||
|
||||
rc = ldap_init_templates_buf( buf, rlen, tmpllistp );
|
||||
NSLDAPI_FREE( buf );
|
||||
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_init_templates_buf( char *buf, long buflen,
|
||||
struct ldap_disptmpl **tmpllistp )
|
||||
{
|
||||
int rc = 0, version;
|
||||
char **toks;
|
||||
struct ldap_disptmpl *prevtmpl, *tmpl;
|
||||
|
||||
*tmpllistp = prevtmpl = NULLDISPTMPL;
|
||||
|
||||
if ( nsldapi_next_line_tokens( &buf, &buflen, &toks ) != 2 ||
|
||||
strcasecmp( toks[ 0 ], "version" ) != 0 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
version = atoi( toks[ 1 ] );
|
||||
nsldapi_free_strarray( toks );
|
||||
if ( version != LDAP_TEMPLATE_VERSION ) {
|
||||
return( LDAP_TMPL_ERR_VERSION );
|
||||
}
|
||||
|
||||
while ( buflen > 0 && ( rc = read_next_tmpl( &buf, &buflen, &tmpl,
|
||||
version )) == 0 && tmpl != NULLDISPTMPL ) {
|
||||
if ( prevtmpl == NULLDISPTMPL ) {
|
||||
*tmpllistp = tmpl;
|
||||
} else {
|
||||
prevtmpl->dt_next = tmpl;
|
||||
}
|
||||
prevtmpl = tmpl;
|
||||
}
|
||||
|
||||
if ( rc != 0 ) {
|
||||
ldap_free_templates( *tmpllistp );
|
||||
}
|
||||
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_free_templates( struct ldap_disptmpl *tmpllist )
|
||||
{
|
||||
struct ldap_disptmpl *tp, *nexttp;
|
||||
|
||||
if ( tmpllist != NULL ) {
|
||||
for ( tp = tmpllist; tp != NULL; tp = nexttp ) {
|
||||
nexttp = tp->dt_next;
|
||||
free_disptmpl( tp );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
free_disptmpl( struct ldap_disptmpl *tmpl )
|
||||
{
|
||||
if ( tmpl != NULL ) {
|
||||
if ( tmpl->dt_name != NULL ) {
|
||||
NSLDAPI_FREE( tmpl->dt_name );
|
||||
}
|
||||
|
||||
if ( tmpl->dt_pluralname != NULL ) {
|
||||
NSLDAPI_FREE( tmpl->dt_pluralname );
|
||||
}
|
||||
|
||||
if ( tmpl->dt_iconname != NULL ) {
|
||||
NSLDAPI_FREE( tmpl->dt_iconname );
|
||||
}
|
||||
|
||||
if ( tmpl->dt_authattrname != NULL ) {
|
||||
NSLDAPI_FREE( tmpl->dt_authattrname );
|
||||
}
|
||||
|
||||
if ( tmpl->dt_defrdnattrname != NULL ) {
|
||||
NSLDAPI_FREE( tmpl->dt_defrdnattrname );
|
||||
}
|
||||
|
||||
if ( tmpl->dt_defaddlocation != NULL ) {
|
||||
NSLDAPI_FREE( tmpl->dt_defaddlocation );
|
||||
}
|
||||
|
||||
if ( tmpl->dt_oclist != NULL ) {
|
||||
struct ldap_oclist *ocp, *nextocp;
|
||||
|
||||
for ( ocp = tmpl->dt_oclist; ocp != NULL; ocp = nextocp ) {
|
||||
nextocp = ocp->oc_next;
|
||||
nsldapi_free_strarray( ocp->oc_objclasses );
|
||||
NSLDAPI_FREE( ocp );
|
||||
}
|
||||
}
|
||||
|
||||
if ( tmpl->dt_adddeflist != NULL ) {
|
||||
struct ldap_adddeflist *adp, *nextadp;
|
||||
|
||||
for ( adp = tmpl->dt_adddeflist; adp != NULL; adp = nextadp ) {
|
||||
nextadp = adp->ad_next;
|
||||
if( adp->ad_attrname != NULL ) {
|
||||
NSLDAPI_FREE( adp->ad_attrname );
|
||||
}
|
||||
if( adp->ad_value != NULL ) {
|
||||
NSLDAPI_FREE( adp->ad_value );
|
||||
}
|
||||
NSLDAPI_FREE( adp );
|
||||
}
|
||||
}
|
||||
|
||||
if ( tmpl->dt_items != NULL ) {
|
||||
struct ldap_tmplitem *rowp, *nextrowp, *colp, *nextcolp;
|
||||
|
||||
for ( rowp = tmpl->dt_items; rowp != NULL; rowp = nextrowp ) {
|
||||
nextrowp = rowp->ti_next_in_col;
|
||||
for ( colp = rowp; colp != NULL; colp = nextcolp ) {
|
||||
nextcolp = colp->ti_next_in_row;
|
||||
if ( colp->ti_attrname != NULL ) {
|
||||
NSLDAPI_FREE( colp->ti_attrname );
|
||||
}
|
||||
if ( colp->ti_label != NULL ) {
|
||||
NSLDAPI_FREE( colp->ti_label );
|
||||
}
|
||||
if ( colp->ti_args != NULL ) {
|
||||
nsldapi_free_strarray( colp->ti_args );
|
||||
}
|
||||
NSLDAPI_FREE( colp );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NSLDAPI_FREE( tmpl );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
struct ldap_disptmpl *
|
||||
LDAP_CALL
|
||||
ldap_first_disptmpl( struct ldap_disptmpl *tmpllist )
|
||||
{
|
||||
return( tmpllist );
|
||||
}
|
||||
|
||||
|
||||
struct ldap_disptmpl *
|
||||
LDAP_CALL
|
||||
ldap_next_disptmpl( struct ldap_disptmpl *tmpllist,
|
||||
struct ldap_disptmpl *tmpl )
|
||||
{
|
||||
return( tmpl == NULLDISPTMPL ? tmpl : tmpl->dt_next );
|
||||
}
|
||||
|
||||
|
||||
struct ldap_disptmpl *
|
||||
LDAP_CALL
|
||||
ldap_name2template( char *name, struct ldap_disptmpl *tmpllist )
|
||||
{
|
||||
struct ldap_disptmpl *dtp;
|
||||
|
||||
for ( dtp = ldap_first_disptmpl( tmpllist ); dtp != NULLDISPTMPL;
|
||||
dtp = ldap_next_disptmpl( tmpllist, dtp )) {
|
||||
if ( strcasecmp( name, dtp->dt_name ) == 0 ) {
|
||||
return( dtp );
|
||||
}
|
||||
}
|
||||
|
||||
return( NULLDISPTMPL );
|
||||
}
|
||||
|
||||
|
||||
struct ldap_disptmpl *
|
||||
LDAP_CALL
|
||||
ldap_oc2template( char **oclist, struct ldap_disptmpl *tmpllist )
|
||||
{
|
||||
struct ldap_disptmpl *dtp;
|
||||
struct ldap_oclist *oclp;
|
||||
int i, j, needcnt, matchcnt;
|
||||
|
||||
if ( tmpllist == NULL || oclist == NULL || oclist[ 0 ] == NULL ) {
|
||||
return( NULLDISPTMPL );
|
||||
}
|
||||
|
||||
for ( dtp = ldap_first_disptmpl( tmpllist ); dtp != NULLDISPTMPL;
|
||||
dtp = ldap_next_disptmpl( tmpllist, dtp )) {
|
||||
for ( oclp = dtp->dt_oclist; oclp != NULLOCLIST;
|
||||
oclp = oclp->oc_next ) {
|
||||
needcnt = matchcnt = 0;
|
||||
for ( i = 0; oclp->oc_objclasses[ i ] != NULL; ++i ) {
|
||||
for ( j = 0; oclist[ j ] != NULL; ++j ) {
|
||||
if ( strcasecmp( oclist[ j ], oclp->oc_objclasses[ i ] )
|
||||
== 0 ) {
|
||||
++matchcnt;
|
||||
}
|
||||
}
|
||||
++needcnt;
|
||||
}
|
||||
|
||||
if ( matchcnt == needcnt ) {
|
||||
return( dtp );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return( NULLDISPTMPL );
|
||||
}
|
||||
|
||||
|
||||
struct ldap_tmplitem *
|
||||
LDAP_CALL
|
||||
ldap_first_tmplrow( struct ldap_disptmpl *tmpl )
|
||||
{
|
||||
return( tmpl->dt_items );
|
||||
}
|
||||
|
||||
|
||||
struct ldap_tmplitem *
|
||||
LDAP_CALL
|
||||
ldap_next_tmplrow( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row )
|
||||
{
|
||||
return( row == NULLTMPLITEM ? row : row->ti_next_in_col );
|
||||
}
|
||||
|
||||
|
||||
struct ldap_tmplitem *
|
||||
LDAP_CALL
|
||||
ldap_first_tmplcol( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row )
|
||||
{
|
||||
return( row );
|
||||
}
|
||||
|
||||
|
||||
struct ldap_tmplitem *
|
||||
LDAP_CALL
|
||||
ldap_next_tmplcol( struct ldap_disptmpl *tmpl, struct ldap_tmplitem *row,
|
||||
struct ldap_tmplitem *col )
|
||||
{
|
||||
return( col == NULLTMPLITEM ? col : col->ti_next_in_row );
|
||||
}
|
||||
|
||||
|
||||
char **
|
||||
LDAP_CALL
|
||||
ldap_tmplattrs( struct ldap_disptmpl *tmpl, char **includeattrs,
|
||||
int exclude, unsigned long syntaxmask )
|
||||
{
|
||||
/*
|
||||
* this routine should filter out duplicate attributes...
|
||||
*/
|
||||
struct ldap_tmplitem *tirowp, *ticolp;
|
||||
int i, attrcnt, memerr;
|
||||
char **attrs;
|
||||
|
||||
attrcnt = 0;
|
||||
memerr = 0;
|
||||
|
||||
if (( attrs = (char **)NSLDAPI_MALLOC( sizeof( char * ))) == NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
if ( includeattrs != NULL ) {
|
||||
for ( i = 0; !memerr && includeattrs[ i ] != NULL; ++i ) {
|
||||
if (( attrs = (char **)NSLDAPI_REALLOC( attrs, ( attrcnt + 2 ) *
|
||||
sizeof( char * ))) == NULL || ( attrs[ attrcnt++ ] =
|
||||
nsldapi_strdup( includeattrs[ i ] )) == NULL ) {
|
||||
memerr = 1;
|
||||
} else {
|
||||
attrs[ attrcnt ] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for ( tirowp = ldap_first_tmplrow( tmpl );
|
||||
!memerr && tirowp != NULLTMPLITEM;
|
||||
tirowp = ldap_next_tmplrow( tmpl, tirowp )) {
|
||||
for ( ticolp = ldap_first_tmplcol( tmpl, tirowp );
|
||||
ticolp != NULLTMPLITEM;
|
||||
ticolp = ldap_next_tmplcol( tmpl, tirowp, ticolp )) {
|
||||
|
||||
if ( syntaxmask != 0 ) {
|
||||
if (( exclude &&
|
||||
( syntaxmask & ticolp->ti_syntaxid ) != 0 ) ||
|
||||
( !exclude &&
|
||||
( syntaxmask & ticolp->ti_syntaxid ) == 0 )) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ticolp->ti_attrname != NULL ) {
|
||||
if (( attrs = (char **)NSLDAPI_REALLOC( attrs, ( attrcnt + 2 )
|
||||
* sizeof( char * ))) == NULL || ( attrs[ attrcnt++ ] =
|
||||
nsldapi_strdup( ticolp->ti_attrname )) == NULL ) {
|
||||
memerr = 1;
|
||||
} else {
|
||||
attrs[ attrcnt ] = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( memerr || attrcnt == 0 ) {
|
||||
for ( i = 0; i < attrcnt; ++i ) {
|
||||
if ( attrs[ i ] != NULL ) {
|
||||
NSLDAPI_FREE( attrs[ i ] );
|
||||
}
|
||||
}
|
||||
|
||||
NSLDAPI_FREE( (char *)attrs );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( attrs );
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
read_next_tmpl( char **bufp, long *blenp, struct ldap_disptmpl **tmplp,
|
||||
int dtversion )
|
||||
{
|
||||
int i, j, tokcnt, samerow, adsource;
|
||||
char **toks, *itemopts;
|
||||
struct ldap_disptmpl *tmpl = NULL;
|
||||
struct ldap_oclist *ocp = NULL, *prevocp = NULL;
|
||||
struct ldap_adddeflist *adp = NULL, *prevadp = NULL;
|
||||
struct ldap_tmplitem *rowp = NULL, *ip = NULL, *previp = NULL;
|
||||
|
||||
/*
|
||||
* template name comes first
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) != 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
return( tokcnt == 0 ? 0 : LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
|
||||
if (( tmpl = (struct ldap_disptmpl *)NSLDAPI_CALLOC( 1,
|
||||
sizeof( struct ldap_disptmpl ))) == NULL ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
return( LDAP_TMPL_ERR_MEM );
|
||||
}
|
||||
tmpl->dt_name = toks[ 0 ];
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
/*
|
||||
* template plural name comes next
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) != 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
tmpl->dt_pluralname = toks[ 0 ];
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
/*
|
||||
* template icon name is next
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) != 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
tmpl->dt_iconname = toks[ 0 ];
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
/*
|
||||
* template options come next
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) < 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
for ( i = 0; toks[ i ] != NULL; ++i ) {
|
||||
for ( j = 0; tmploptions[ j ] != NULL; ++j ) {
|
||||
if ( strcasecmp( toks[ i ], tmploptions[ j ] ) == 0 ) {
|
||||
tmpl->dt_options |= tmploptvals[ j ];
|
||||
}
|
||||
}
|
||||
}
|
||||
nsldapi_free_strarray( toks );
|
||||
|
||||
/*
|
||||
* object class list is next
|
||||
*/
|
||||
while (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) > 0 ) {
|
||||
if (( ocp = (struct ldap_oclist *)NSLDAPI_CALLOC( 1,
|
||||
sizeof( struct ldap_oclist ))) == NULL ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_MEM );
|
||||
}
|
||||
ocp->oc_objclasses = toks;
|
||||
if ( tmpl->dt_oclist == NULL ) {
|
||||
tmpl->dt_oclist = ocp;
|
||||
} else {
|
||||
prevocp->oc_next = ocp;
|
||||
}
|
||||
prevocp = ocp;
|
||||
}
|
||||
if ( tokcnt < 0 ) {
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
|
||||
/*
|
||||
* read name of attribute to authenticate as
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) != 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
if ( toks[ 0 ][ 0 ] != '\0' ) {
|
||||
tmpl->dt_authattrname = toks[ 0 ];
|
||||
} else {
|
||||
NSLDAPI_FREE( toks[ 0 ] );
|
||||
}
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
/*
|
||||
* read default attribute to use for RDN
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) != 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
tmpl->dt_defrdnattrname = toks[ 0 ];
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
/*
|
||||
* read default location for new entries
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) != 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
if ( toks[ 0 ][ 0 ] != '\0' ) {
|
||||
tmpl->dt_defaddlocation = toks[ 0 ];
|
||||
} else {
|
||||
NSLDAPI_FREE( toks[ 0 ] );
|
||||
}
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
/*
|
||||
* read list of rules used to define default values for new entries
|
||||
*/
|
||||
while (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) > 0 ) {
|
||||
if ( strcasecmp( ADDEF_CONSTANT, toks[ 0 ] ) == 0 ) {
|
||||
adsource = LDAP_ADSRC_CONSTANTVALUE;
|
||||
} else if ( strcasecmp( ADDEF_ADDERSDN, toks[ 0 ] ) == 0 ) {
|
||||
adsource = LDAP_ADSRC_ADDERSDN;
|
||||
} else {
|
||||
adsource = 0;
|
||||
}
|
||||
if ( adsource == 0 || tokcnt < 2 ||
|
||||
( adsource == LDAP_ADSRC_CONSTANTVALUE && tokcnt != 3 ) ||
|
||||
( adsource == LDAP_ADSRC_ADDERSDN && tokcnt != 2 )) {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
|
||||
if (( adp = (struct ldap_adddeflist *)NSLDAPI_CALLOC( 1,
|
||||
sizeof( struct ldap_adddeflist ))) == NULL ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_MEM );
|
||||
}
|
||||
adp->ad_source = adsource;
|
||||
adp->ad_attrname = toks[ 1 ];
|
||||
if ( adsource == LDAP_ADSRC_CONSTANTVALUE ) {
|
||||
adp->ad_value = toks[ 2 ];
|
||||
}
|
||||
NSLDAPI_FREE( toks[ 0 ] );
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
if ( tmpl->dt_adddeflist == NULL ) {
|
||||
tmpl->dt_adddeflist = adp;
|
||||
} else {
|
||||
prevadp->ad_next = adp;
|
||||
}
|
||||
prevadp = adp;
|
||||
}
|
||||
|
||||
/*
|
||||
* item list is next
|
||||
*/
|
||||
samerow = 0;
|
||||
while (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) > 0 ) {
|
||||
if ( strcasecmp( toks[ 0 ], "item" ) == 0 ) {
|
||||
if ( tokcnt < 4 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
|
||||
if (( ip = (struct ldap_tmplitem *)NSLDAPI_CALLOC( 1,
|
||||
sizeof( struct ldap_tmplitem ))) == NULL ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_MEM );
|
||||
}
|
||||
|
||||
/*
|
||||
* find syntaxid from config file string
|
||||
*/
|
||||
while (( itemopts = strrchr( toks[ 1 ], ',' )) != NULL ) {
|
||||
*itemopts++ = '\0';
|
||||
for ( i = 0; itemoptions[ i ] != NULL; ++i ) {
|
||||
if ( strcasecmp( itemopts, itemoptions[ i ] ) == 0 ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( itemoptions[ i ] == NULL ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
ip->ti_options |= itemoptvals[ i ];
|
||||
}
|
||||
|
||||
for ( i = 0; itemtypes[ i ] != NULL; ++i ) {
|
||||
if ( strcasecmp( toks[ 1 ], itemtypes[ i ] ) == 0 ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( itemtypes[ i ] == NULL ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
|
||||
NSLDAPI_FREE( toks[ 0 ] );
|
||||
NSLDAPI_FREE( toks[ 1 ] );
|
||||
ip->ti_syntaxid = itemsynids[ i ];
|
||||
ip->ti_label = toks[ 2 ];
|
||||
if ( toks[ 3 ][ 0 ] == '\0' ) {
|
||||
ip->ti_attrname = NULL;
|
||||
NSLDAPI_FREE( toks[ 3 ] );
|
||||
} else {
|
||||
ip->ti_attrname = toks[ 3 ];
|
||||
}
|
||||
if ( toks[ 4 ] != NULL ) { /* extra args. */
|
||||
for ( i = 0; toks[ i + 4 ] != NULL; ++i ) {
|
||||
;
|
||||
}
|
||||
if (( ip->ti_args = (char **)NSLDAPI_CALLOC( i + 1,
|
||||
sizeof( char * ))) == NULL ) {
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_MEM );
|
||||
}
|
||||
for ( i = 0; toks[ i + 4 ] != NULL; ++i ) {
|
||||
ip->ti_args[ i ] = toks[ i + 4 ];
|
||||
}
|
||||
}
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
if ( tmpl->dt_items == NULL ) {
|
||||
tmpl->dt_items = rowp = ip;
|
||||
} else if ( samerow ) {
|
||||
previp->ti_next_in_row = ip;
|
||||
} else {
|
||||
rowp->ti_next_in_col = ip;
|
||||
rowp = ip;
|
||||
}
|
||||
previp = ip;
|
||||
samerow = 0;
|
||||
} else if ( strcasecmp( toks[ 0 ], "samerow" ) == 0 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
samerow = 1;
|
||||
} else {
|
||||
nsldapi_free_strarray( toks );
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
}
|
||||
if ( tokcnt < 0 ) {
|
||||
free_disptmpl( tmpl );
|
||||
return( LDAP_TMPL_ERR_SYNTAX );
|
||||
}
|
||||
|
||||
*tmplp = tmpl;
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
||||
struct tmplerror {
|
||||
int e_code;
|
||||
char *e_reason;
|
||||
};
|
||||
|
||||
static struct tmplerror ldap_tmplerrlist[] = {
|
||||
LDAP_TMPL_ERR_VERSION, "Bad template version",
|
||||
LDAP_TMPL_ERR_MEM, "Out of memory",
|
||||
LDAP_TMPL_ERR_SYNTAX, "Bad template syntax",
|
||||
LDAP_TMPL_ERR_FILE, "File error reading template",
|
||||
-1, 0
|
||||
};
|
||||
|
||||
char *
|
||||
LDAP_CALL
|
||||
ldap_tmplerr2string( int err )
|
||||
{
|
||||
int i;
|
||||
|
||||
for ( i = 0; ldap_tmplerrlist[i].e_code != -1; i++ ) {
|
||||
if ( err == ldap_tmplerrlist[i].e_code )
|
||||
return( ldap_tmplerrlist[i].e_reason );
|
||||
}
|
||||
|
||||
return( "Unknown error" );
|
||||
}
|
||||
163
mozilla/directory/c-sdk/ldap/libraries/libldap/dllmain.c
Normal file
163
mozilla/directory/c-sdk/ldap/libraries/libldap/dllmain.c
Normal file
@@ -0,0 +1,163 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Microsoft Windows specifics for LIBLDAP DLL
|
||||
*/
|
||||
#include "ldap.h"
|
||||
#include "lber.h"
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
/* Lifted from Q125688
|
||||
* How to Port a 16-bit DLL to a Win32 DLL
|
||||
* on the MSVC 4.0 CD
|
||||
*/
|
||||
BOOL WINAPI DllMain (HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
|
||||
{
|
||||
switch (fdwReason)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
/* Code from LibMain inserted here. Return TRUE to keep the
|
||||
DLL loaded or return FALSE to fail loading the DLL.
|
||||
|
||||
You may have to modify the code in your original LibMain to
|
||||
account for the fact that it may be called more than once.
|
||||
You will get one DLL_PROCESS_ATTACH for each process that
|
||||
loads the DLL. This is different from LibMain which gets
|
||||
called only once when the DLL is loaded. The only time this
|
||||
is critical is when you are using shared data sections.
|
||||
If you are using shared data sections for statically
|
||||
allocated data, you will need to be careful to initialize it
|
||||
only once. Check your code carefully.
|
||||
|
||||
Certain one-time initializations may now need to be done for
|
||||
each process that attaches. You may also not need code from
|
||||
your original LibMain because the operating system may now
|
||||
be doing it for you.
|
||||
*/
|
||||
/*
|
||||
* 16 bit code calls UnlockData()
|
||||
* which is mapped to UnlockSegment in windows.h
|
||||
* in 32 bit world UnlockData is not defined anywhere
|
||||
* UnlockSegment is mapped to GlobalUnfix in winbase.h
|
||||
* and the docs for both UnlockSegment and GlobalUnfix say
|
||||
* ".. function is oboslete. Segments have no meaning
|
||||
* in the 32-bit environment". So we do nothing here.
|
||||
*/
|
||||
/* If we are building a version that includes the security libraries,
|
||||
* we have to initialize Winsock here. If not, we can defer until the
|
||||
* first real socket call is made (in mozock.c).
|
||||
*/
|
||||
#ifdef LINK_SSL
|
||||
{
|
||||
WSADATA wsaData;
|
||||
WSAStartup(0x0101, &wsaData);
|
||||
}
|
||||
#endif
|
||||
|
||||
break;
|
||||
|
||||
case DLL_THREAD_ATTACH:
|
||||
/* Called each time a thread is created in a process that has
|
||||
already loaded (attached to) this DLL. Does not get called
|
||||
for each thread that exists in the process before it loaded
|
||||
the DLL.
|
||||
|
||||
Do thread-specific initialization here.
|
||||
*/
|
||||
break;
|
||||
|
||||
case DLL_THREAD_DETACH:
|
||||
/* Same as above, but called when a thread in the process
|
||||
exits.
|
||||
|
||||
Do thread-specific cleanup here.
|
||||
*/
|
||||
break;
|
||||
|
||||
case DLL_PROCESS_DETACH:
|
||||
/* Code from _WEP inserted here. This code may (like the
|
||||
LibMain) not be necessary. Check to make certain that the
|
||||
operating system is not doing it for you.
|
||||
*/
|
||||
#ifdef LINK_SSL
|
||||
WSACleanup();
|
||||
#endif
|
||||
|
||||
break;
|
||||
}
|
||||
/* The return value is only used for DLL_PROCESS_ATTACH; all other
|
||||
conditions are ignored. */
|
||||
return TRUE; // successful DLL_PROCESS_ATTACH
|
||||
}
|
||||
#else
|
||||
int CALLBACK
|
||||
LibMain( HINSTANCE hinst, WORD wDataSeg, WORD cbHeapSize, LPSTR lpszCmdLine )
|
||||
{
|
||||
/*UnlockData( 0 );*/
|
||||
return( 1 );
|
||||
}
|
||||
|
||||
BOOL CALLBACK __loadds WEP(BOOL fSystemExit)
|
||||
{
|
||||
WSACleanup();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef LDAP_DEBUG
|
||||
#ifndef _WIN32
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void LDAP_C LDAPDebug( int level, char* fmt, ... )
|
||||
{
|
||||
static char debugBuf[1024];
|
||||
|
||||
if (ldap_debug & level)
|
||||
{
|
||||
va_list ap;
|
||||
va_start (ap, fmt);
|
||||
_snprintf (debugBuf, sizeof(debugBuf), fmt, ap);
|
||||
va_end (ap);
|
||||
|
||||
OutputDebugString (debugBuf);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef _WIN32
|
||||
|
||||
/* The 16-bit version of the RTL does not implement perror() */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
void perror( const char *msg )
|
||||
{
|
||||
char buf[128];
|
||||
wsprintf( buf, "%s: error %d\n", msg, WSAGetLastError()) ;
|
||||
OutputDebugString( buf );
|
||||
}
|
||||
|
||||
#endif
|
||||
212
mozilla/directory/c-sdk/ldap/libraries/libldap/dsparse.c
Normal file
212
mozilla/directory/c-sdk/ldap/libraries/libldap/dsparse.c
Normal file
@@ -0,0 +1,212 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1993, 1994 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*/
|
||||
/*
|
||||
* dsparse.c: parsing routines used by display template and search
|
||||
* preference file library routines for LDAP clients.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
static int next_line( char **bufp, long *blenp, char **linep );
|
||||
static char *next_token( char ** sp );
|
||||
|
||||
int
|
||||
nsldapi_next_line_tokens( char **bufp, long *blenp, char ***toksp )
|
||||
{
|
||||
char *p, *line, *token, **toks;
|
||||
int rc, tokcnt;
|
||||
|
||||
*toksp = NULL;
|
||||
|
||||
if (( rc = next_line( bufp, blenp, &line )) <= 0 ) {
|
||||
return( rc );
|
||||
}
|
||||
|
||||
if (( toks = (char **)NSLDAPI_CALLOC( 1, sizeof( char * ))) == NULL ) {
|
||||
NSLDAPI_FREE( line );
|
||||
return( -1 );
|
||||
}
|
||||
tokcnt = 0;
|
||||
|
||||
p = line;
|
||||
while (( token = next_token( &p )) != NULL ) {
|
||||
if (( toks = (char **)NSLDAPI_REALLOC( toks, ( tokcnt + 2 ) *
|
||||
sizeof( char * ))) == NULL ) {
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
NSLDAPI_FREE( line );
|
||||
return( -1 );
|
||||
}
|
||||
toks[ tokcnt ] = token;
|
||||
toks[ ++tokcnt ] = NULL;
|
||||
}
|
||||
|
||||
if ( tokcnt == 1 && strcasecmp( toks[ 0 ], "END" ) == 0 ) {
|
||||
tokcnt = 0;
|
||||
nsldapi_free_strarray( toks );
|
||||
toks = NULL;
|
||||
}
|
||||
|
||||
NSLDAPI_FREE( line );
|
||||
|
||||
if ( tokcnt == 0 ) {
|
||||
if ( toks != NULL ) {
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
}
|
||||
} else {
|
||||
*toksp = toks;
|
||||
}
|
||||
|
||||
return( tokcnt );
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
next_line( char **bufp, long *blenp, char **linep )
|
||||
{
|
||||
char *linestart, *line, *p;
|
||||
long plen;
|
||||
|
||||
linestart = *bufp;
|
||||
p = *bufp;
|
||||
plen = *blenp;
|
||||
|
||||
do {
|
||||
for ( linestart = p; plen > 0; ++p, --plen ) {
|
||||
if ( *p == '\r' ) {
|
||||
if ( plen > 1 && *(p+1) == '\n' ) {
|
||||
++p;
|
||||
--plen;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if ( *p == '\n' ) {
|
||||
if ( plen > 1 && *(p+1) == '\r' ) {
|
||||
++p;
|
||||
--plen;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
++p;
|
||||
--plen;
|
||||
} while ( plen > 0 && ( *linestart == '#' || linestart + 1 == p ));
|
||||
|
||||
|
||||
*bufp = p;
|
||||
*blenp = plen;
|
||||
|
||||
|
||||
if ( plen <= 0 ) {
|
||||
*linep = NULL;
|
||||
return( 0 ); /* end of file */
|
||||
}
|
||||
|
||||
if (( line = NSLDAPI_MALLOC( p - linestart )) == NULL ) {
|
||||
*linep = NULL;
|
||||
return( -1 ); /* fatal error */
|
||||
}
|
||||
|
||||
SAFEMEMCPY( line, linestart, p - linestart );
|
||||
line[ p - linestart - 1 ] = '\0';
|
||||
*linep = line;
|
||||
return( strlen( line ));
|
||||
}
|
||||
|
||||
|
||||
static char *
|
||||
next_token( char **sp )
|
||||
{
|
||||
int in_quote = 0;
|
||||
char *p, *tokstart, *t;
|
||||
|
||||
if ( **sp == '\0' ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
p = *sp;
|
||||
|
||||
while ( ldap_utf8isspace( p )) { /* skip leading white space */
|
||||
++p;
|
||||
}
|
||||
|
||||
if ( *p == '\0' ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
if ( *p == '\"' ) {
|
||||
in_quote = 1;
|
||||
++p;
|
||||
}
|
||||
t = tokstart = p;
|
||||
|
||||
for ( ;; ) {
|
||||
if ( *p == '\0' || ( ldap_utf8isspace( p ) && !in_quote )) {
|
||||
if ( *p != '\0' ) {
|
||||
++p;
|
||||
}
|
||||
*t++ = '\0'; /* end of token */
|
||||
break;
|
||||
}
|
||||
|
||||
if ( *p == '\"' ) {
|
||||
in_quote = !in_quote;
|
||||
++p;
|
||||
} else {
|
||||
*t++ = *p++;
|
||||
}
|
||||
}
|
||||
|
||||
*sp = p;
|
||||
|
||||
if ( t == tokstart ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( nsldapi_strdup( tokstart ));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nsldapi_free_strarray( char **sap )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( sap != NULL ) {
|
||||
for ( i = 0; sap[ i ] != NULL; ++i ) {
|
||||
NSLDAPI_FREE( sap[ i ] );
|
||||
}
|
||||
NSLDAPI_FREE( (char *)sap );
|
||||
}
|
||||
}
|
||||
446
mozilla/directory/c-sdk/ldap/libraries/libldap/error.c
Normal file
446
mozilla/directory/c-sdk/ldap/libraries/libldap/error.c
Normal file
@@ -0,0 +1,446 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#include "ldap-int.h"
|
||||
|
||||
struct ldaperror {
|
||||
int e_code;
|
||||
char *e_reason;
|
||||
};
|
||||
|
||||
static struct ldaperror ldap_errlist[] = {
|
||||
{ LDAP_SUCCESS, "Success" },
|
||||
{ LDAP_OPERATIONS_ERROR, "Operations error" },
|
||||
{ LDAP_PROTOCOL_ERROR, "Protocol error" },
|
||||
{ LDAP_TIMELIMIT_EXCEEDED, "Timelimit exceeded" },
|
||||
{ LDAP_SIZELIMIT_EXCEEDED, "Sizelimit exceeded" },
|
||||
{ LDAP_COMPARE_FALSE, "Compare false" },
|
||||
{ LDAP_COMPARE_TRUE, "Compare true" },
|
||||
{ LDAP_STRONG_AUTH_NOT_SUPPORTED, "Authentication method not supported" },
|
||||
{ LDAP_STRONG_AUTH_REQUIRED, "Strong authentication required" },
|
||||
{ LDAP_PARTIAL_RESULTS, "Partial results and referral received" },
|
||||
{ LDAP_REFERRAL, "Referral received" },
|
||||
{ LDAP_ADMINLIMIT_EXCEEDED, "Administrative limit exceeded" },
|
||||
{ LDAP_UNAVAILABLE_CRITICAL_EXTENSION, "Unavailable critical extension" },
|
||||
{ LDAP_CONFIDENTIALITY_REQUIRED, "Confidentiality required" },
|
||||
{ LDAP_SASL_BIND_IN_PROGRESS, "SASL bind in progress" },
|
||||
|
||||
{ LDAP_NO_SUCH_ATTRIBUTE, "No such attribute" },
|
||||
{ LDAP_UNDEFINED_TYPE, "Undefined attribute type" },
|
||||
{ LDAP_INAPPROPRIATE_MATCHING, "Inappropriate matching" },
|
||||
{ LDAP_CONSTRAINT_VIOLATION, "Constraint violation" },
|
||||
{ LDAP_TYPE_OR_VALUE_EXISTS, "Type or value exists" },
|
||||
{ LDAP_INVALID_SYNTAX, "Invalid syntax" },
|
||||
|
||||
{ LDAP_NO_SUCH_OBJECT, "No such object" },
|
||||
{ LDAP_ALIAS_PROBLEM, "Alias problem" },
|
||||
{ LDAP_INVALID_DN_SYNTAX, "Invalid DN syntax" },
|
||||
{ LDAP_IS_LEAF, "Object is a leaf" },
|
||||
{ LDAP_ALIAS_DEREF_PROBLEM, "Alias dereferencing problem" },
|
||||
|
||||
{ LDAP_INAPPROPRIATE_AUTH, "Inappropriate authentication" },
|
||||
{ LDAP_INVALID_CREDENTIALS, "Invalid credentials" },
|
||||
{ LDAP_INSUFFICIENT_ACCESS, "Insufficient access" },
|
||||
{ LDAP_BUSY, "DSA is busy" },
|
||||
{ LDAP_UNAVAILABLE, "DSA is unavailable" },
|
||||
{ LDAP_UNWILLING_TO_PERFORM, "DSA is unwilling to perform" },
|
||||
{ LDAP_LOOP_DETECT, "Loop detected" },
|
||||
{ LDAP_SORT_CONTROL_MISSING, "Sort Control is missing" },
|
||||
{ LDAP_INDEX_RANGE_ERROR, "Search results exceed the range specified by the offsets" },
|
||||
|
||||
{ LDAP_NAMING_VIOLATION, "Naming violation" },
|
||||
{ LDAP_OBJECT_CLASS_VIOLATION, "Object class violation" },
|
||||
{ LDAP_NOT_ALLOWED_ON_NONLEAF, "Operation not allowed on nonleaf" },
|
||||
{ LDAP_NOT_ALLOWED_ON_RDN, "Operation not allowed on RDN" },
|
||||
{ LDAP_ALREADY_EXISTS, "Already exists" },
|
||||
{ LDAP_NO_OBJECT_CLASS_MODS, "Cannot modify object class" },
|
||||
{ LDAP_RESULTS_TOO_LARGE, "Results too large" },
|
||||
{ LDAP_AFFECTS_MULTIPLE_DSAS, "Affects multiple servers" },
|
||||
|
||||
{ LDAP_OTHER, "Unknown error" },
|
||||
{ LDAP_SERVER_DOWN, "Can't contact LDAP server" },
|
||||
{ LDAP_LOCAL_ERROR, "Local error" },
|
||||
{ LDAP_ENCODING_ERROR, "Encoding error" },
|
||||
{ LDAP_DECODING_ERROR, "Decoding error" },
|
||||
{ LDAP_TIMEOUT, "Timed out" },
|
||||
{ LDAP_AUTH_UNKNOWN, "Unknown authentication method" },
|
||||
{ LDAP_FILTER_ERROR, "Bad search filter" },
|
||||
{ LDAP_USER_CANCELLED, "User cancelled operation" },
|
||||
{ LDAP_PARAM_ERROR, "Bad parameter to an ldap routine" },
|
||||
{ LDAP_NO_MEMORY, "Out of memory" },
|
||||
{ LDAP_CONNECT_ERROR, "Can't connect to the LDAP server" },
|
||||
{ LDAP_NOT_SUPPORTED, "Not supported by this version of the LDAP protocol" },
|
||||
{ LDAP_CONTROL_NOT_FOUND, "Requested LDAP control not found" },
|
||||
{ LDAP_NO_RESULTS_RETURNED, "No results returned" },
|
||||
{ LDAP_MORE_RESULTS_TO_RETURN, "More results to return" },
|
||||
{ LDAP_CLIENT_LOOP, "Client detected loop" },
|
||||
{ LDAP_REFERRAL_LIMIT_EXCEEDED, "Referral hop limit exceeded" },
|
||||
{ -1, 0 }
|
||||
};
|
||||
|
||||
char *
|
||||
LDAP_CALL
|
||||
ldap_err2string( int err )
|
||||
{
|
||||
int i;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_err2string\n", 0, 0, 0 );
|
||||
|
||||
for ( i = 0; ldap_errlist[i].e_code != -1; i++ ) {
|
||||
if ( err == ldap_errlist[i].e_code )
|
||||
return( ldap_errlist[i].e_reason );
|
||||
}
|
||||
|
||||
return( "Unknown error" );
|
||||
}
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_perror( LDAP *ld, const char *s )
|
||||
{
|
||||
int i, err;
|
||||
char *matched, *errmsg, *separator;
|
||||
char msg[1024];
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_perror\n", 0, 0, 0 );
|
||||
|
||||
if ( s == NULL ) {
|
||||
s = separator = "";
|
||||
} else {
|
||||
separator = ": ";
|
||||
}
|
||||
|
||||
if ( ld == NULL ) {
|
||||
sprintf( msg, "%s%s%s", s, separator, strerror( errno ) );
|
||||
ber_err_print( msg );
|
||||
return;
|
||||
}
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_ERR_LOCK );
|
||||
err = LDAP_GET_LDERRNO( ld, &matched, &errmsg );
|
||||
for ( i = 0; ldap_errlist[i].e_code != -1; i++ ) {
|
||||
if ( err == ldap_errlist[i].e_code ) {
|
||||
sprintf( msg, "%s%s%s", s, separator,
|
||||
ldap_errlist[i].e_reason );
|
||||
ber_err_print( msg );
|
||||
if ( err == LDAP_CONNECT_ERROR ) {
|
||||
ber_err_print( " - " );
|
||||
ber_err_print( strerror( LDAP_GET_ERRNO( ld )));
|
||||
}
|
||||
ber_err_print( "\n" );
|
||||
if ( matched != NULL && *matched != '\0' ) {
|
||||
sprintf( msg, "%s%smatched: %s\n",
|
||||
s, separator, matched );
|
||||
ber_err_print( msg );
|
||||
}
|
||||
if ( errmsg != NULL && *errmsg != '\0' ) {
|
||||
sprintf( msg, "%s%sadditional info: %s\n",
|
||||
s, separator, errmsg );
|
||||
ber_err_print( msg );
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_ERR_LOCK );
|
||||
return;
|
||||
}
|
||||
}
|
||||
sprintf( msg, "%s%sNot an LDAP errno %d\n", s, separator, err );
|
||||
ber_err_print( msg );
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_ERR_LOCK );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_result2error( LDAP *ld, LDAPMessage *r, int freeit )
|
||||
{
|
||||
int lderr_parse, lderr;
|
||||
|
||||
lderr_parse = ldap_parse_result( ld, r, &lderr, NULL, NULL, NULL,
|
||||
NULL, freeit );
|
||||
|
||||
if ( lderr_parse != LDAP_SUCCESS ) {
|
||||
return( lderr_parse );
|
||||
}
|
||||
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_get_lderrno( LDAP *ld, char **m, char **s )
|
||||
{
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR ); /* punt */
|
||||
}
|
||||
|
||||
if ( ld->ld_get_lderrno_fn == NULL ) {
|
||||
if ( m != NULL ) {
|
||||
*m = ld->ld_matched;
|
||||
}
|
||||
if ( s != NULL ) {
|
||||
*s = ld->ld_error;
|
||||
}
|
||||
return( ld->ld_errno );
|
||||
} else {
|
||||
return( ld->ld_get_lderrno_fn( m, s, ld->ld_lderrno_arg ) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Note: there is no need for callers of ldap_set_lderrno() to lock the
|
||||
* ld mutex. If applications intend to share an LDAP session handle
|
||||
* between threads they *must* perform their own locking around the
|
||||
* session handle or they must install a "set lderrno" thread callback
|
||||
* function.
|
||||
*
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_set_lderrno( LDAP *ld, int e, char *m, char *s )
|
||||
{
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( ld->ld_set_lderrno_fn != NULL ) {
|
||||
ld->ld_set_lderrno_fn( e, m, s, ld->ld_lderrno_arg );
|
||||
} else {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_ERR_LOCK );
|
||||
ld->ld_errno = e;
|
||||
if ( ld->ld_matched ) {
|
||||
NSLDAPI_FREE( ld->ld_matched );
|
||||
}
|
||||
ld->ld_matched = m;
|
||||
if ( ld->ld_error ) {
|
||||
NSLDAPI_FREE( ld->ld_error );
|
||||
}
|
||||
ld->ld_error = s;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_ERR_LOCK );
|
||||
}
|
||||
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns an LDAP error that says whether parse succeeded. The error code
|
||||
* from the LDAP result itself is returned in the errcodep result parameter.
|
||||
* If any of the result params. (errcodep, matchednp, errmsgp, referralsp,
|
||||
* or serverctrlsp) are NULL we don't return that info.
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_parse_result( LDAP *ld, LDAPMessage *res, int *errcodep, char **matchednp,
|
||||
char **errmsgp, char ***referralsp, LDAPControl ***serverctrlsp,
|
||||
int freeit )
|
||||
{
|
||||
LDAPMessage *lm;
|
||||
int err, errcode;
|
||||
char *m, *e;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_parse_result\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld ) ||
|
||||
!NSLDAPI_VALID_LDAPMESSAGE_POINTER( res )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
/* skip over entries and references to find next result in this chain */
|
||||
for ( lm = res; lm != NULL; lm = lm->lm_chain ) {
|
||||
if ( lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY &&
|
||||
lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( lm == NULL ) {
|
||||
err = LDAP_NO_RESULTS_RETURNED;
|
||||
LDAP_SET_LDERRNO( ld, err, NULL, NULL );
|
||||
return( err );
|
||||
}
|
||||
|
||||
err = nsldapi_parse_result( ld, lm->lm_msgtype, lm->lm_ber, &errcode,
|
||||
&m, &e, referralsp, serverctrlsp );
|
||||
|
||||
if ( err == LDAP_SUCCESS ) {
|
||||
if ( errcodep != NULL ) {
|
||||
*errcodep = errcode;
|
||||
}
|
||||
if ( matchednp != NULL ) {
|
||||
*matchednp = nsldapi_strdup( m );
|
||||
}
|
||||
if ( errmsgp != NULL ) {
|
||||
*errmsgp = nsldapi_strdup( e );
|
||||
}
|
||||
|
||||
/*
|
||||
* if there are more result messages in the chain, arrange to
|
||||
* return the special LDAP_MORE_RESULTS_TO_RETURN "error" code.
|
||||
*/
|
||||
for ( lm = lm->lm_chain; lm != NULL; lm = lm->lm_chain ) {
|
||||
if ( lm->lm_msgtype != LDAP_RES_SEARCH_ENTRY &&
|
||||
lm->lm_msgtype != LDAP_RES_SEARCH_REFERENCE ) {
|
||||
err = LDAP_MORE_RESULTS_TO_RETURN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
m = e = NULL;
|
||||
}
|
||||
|
||||
if ( freeit ) {
|
||||
ldap_msgfree( res );
|
||||
}
|
||||
|
||||
LDAP_SET_LDERRNO( ld, ( err == LDAP_SUCCESS ) ? errcode : err, m, e );
|
||||
|
||||
return( err );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* returns an LDAP error code indicating success or failure of parsing
|
||||
* does NOT set any error information inside "ld"
|
||||
*/
|
||||
int
|
||||
nsldapi_parse_result( LDAP *ld, int msgtype, BerElement *rber, int *errcodep,
|
||||
char **matchednp, char **errmsgp, char ***referralsp,
|
||||
LDAPControl ***serverctrlsp )
|
||||
{
|
||||
BerElement ber;
|
||||
unsigned long len;
|
||||
int berrc, err, errcode;
|
||||
long along;
|
||||
char *m, *e;
|
||||
|
||||
/*
|
||||
* Parse the result message. LDAPv3 result messages look like this:
|
||||
*
|
||||
* LDAPResult ::= SEQUENCE {
|
||||
* resultCode ENUMERATED { ... },
|
||||
* matchedDN LDAPDN,
|
||||
* errorMessage LDAPString,
|
||||
* referral [3] Referral OPTIONAL
|
||||
* opSpecificStuff OPTIONAL
|
||||
* }
|
||||
*
|
||||
* all wrapped up in an LDAPMessage sequence which looks like this:
|
||||
* LDAPMessage ::= SEQUENCE {
|
||||
* messageID MessageID,
|
||||
* LDAPResult CHOICE { ... }, // message type
|
||||
* controls [0] Controls OPTIONAL
|
||||
* }
|
||||
*
|
||||
* LDAPv2 messages don't include referrals or controls.
|
||||
* LDAPv1 messages don't include matchedDN, referrals, or controls.
|
||||
*
|
||||
* ldap_result() pulls out the message id, so by the time a result
|
||||
* message gets here we are sitting at the start of the LDAPResult.
|
||||
*/
|
||||
|
||||
err = LDAP_SUCCESS; /* optimistic */
|
||||
m = e = NULL;
|
||||
if ( matchednp != NULL ) {
|
||||
*matchednp = NULL;
|
||||
}
|
||||
if ( errmsgp != NULL ) {
|
||||
*errmsgp = NULL;
|
||||
}
|
||||
if ( referralsp != NULL ) {
|
||||
*referralsp = NULL;
|
||||
}
|
||||
if ( serverctrlsp != NULL ) {
|
||||
*serverctrlsp = NULL;
|
||||
}
|
||||
ber = *rber; /* struct copy */
|
||||
|
||||
if ( NSLDAPI_LDAP_VERSION( ld ) < LDAP_VERSION2 ) {
|
||||
berrc = ber_scanf( &ber, "{ia}", &along, &e );
|
||||
errcode = (int)along; /* XXX lossy cast */
|
||||
} else {
|
||||
if (( berrc = ber_scanf( &ber, "{iaa", &along, &m, &e ))
|
||||
!= LBER_ERROR ) {
|
||||
errcode = (int)along; /* XXX lossy cast */
|
||||
/* check for optional referrals */
|
||||
if ( ber_peek_tag( &ber, &len ) == LDAP_TAG_REFERRAL ) {
|
||||
if ( referralsp == NULL ) {
|
||||
/* skip referrals */
|
||||
berrc = ber_scanf( &ber, "x" );
|
||||
} else {
|
||||
/* suck out referrals */
|
||||
berrc = ber_scanf( &ber, "v",
|
||||
referralsp );
|
||||
}
|
||||
} else if ( referralsp != NULL ) {
|
||||
*referralsp = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if ( berrc != LBER_ERROR ) {
|
||||
/*
|
||||
* skip past optional operation-specific elements:
|
||||
* bind results - serverSASLcreds
|
||||
* extendedop results - OID plus value
|
||||
*/
|
||||
if ( msgtype == LDAP_RES_BIND ) {
|
||||
if ( ber_peek_tag( &ber, &len ) ==
|
||||
LDAP_TAG_SASL_RES_CREDS ) {
|
||||
berrc = ber_scanf( &ber, "x" );
|
||||
}
|
||||
} else if ( msgtype == LDAP_RES_EXTENDED ) {
|
||||
if ( ber_peek_tag( &ber, &len ) ==
|
||||
LDAP_TAG_EXOP_RES_OID ) {
|
||||
berrc = ber_scanf( &ber, "x" );
|
||||
}
|
||||
if ( berrc != LBER_ERROR &&
|
||||
ber_peek_tag( &ber, &len ) ==
|
||||
LDAP_TAG_EXOP_RES_VALUE ) {
|
||||
berrc = ber_scanf( &ber, "x" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* pull out controls (if requested and any are present) */
|
||||
if ( berrc != LBER_ERROR && serverctrlsp != NULL &&
|
||||
( berrc = ber_scanf( &ber, "}" )) != LBER_ERROR ) {
|
||||
err = nsldapi_get_controls( &ber, serverctrlsp );
|
||||
}
|
||||
}
|
||||
|
||||
if ( berrc == LBER_ERROR && err == LDAP_SUCCESS ) {
|
||||
err = LDAP_DECODING_ERROR;
|
||||
}
|
||||
|
||||
if ( errcodep != NULL ) {
|
||||
*errcodep = errcode;
|
||||
}
|
||||
if ( matchednp != NULL ) {
|
||||
*matchednp = m;
|
||||
} else if ( m != NULL ) {
|
||||
NSLDAPI_FREE( m );
|
||||
}
|
||||
if ( errmsgp != NULL ) {
|
||||
*errmsgp = e;
|
||||
} else if ( e != NULL ) {
|
||||
NSLDAPI_FREE( e );
|
||||
}
|
||||
|
||||
return( err );
|
||||
}
|
||||
250
mozilla/directory/c-sdk/ldap/libraries/libldap/extendop.c
Normal file
250
mozilla/directory/c-sdk/ldap/libraries/libldap/extendop.c
Normal file
@@ -0,0 +1,250 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#include "ldap-int.h"
|
||||
|
||||
/*
|
||||
* ldap_extended_operation - initiate an arbitrary ldapv3 extended operation.
|
||||
* the oid and data of the extended operation are supplied. Returns an
|
||||
* LDAP error code.
|
||||
*
|
||||
* Example:
|
||||
* struct berval exdata;
|
||||
* char *exoid;
|
||||
* int err, msgid;
|
||||
* ... fill in oid and data ...
|
||||
* err = ldap_extended_operation( ld, exoid, &exdata, NULL, NULL, &msgid );
|
||||
*/
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_extended_operation(
|
||||
LDAP *ld,
|
||||
const char *exoid,
|
||||
const struct berval *exdata,
|
||||
LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls,
|
||||
int *msgidp
|
||||
)
|
||||
{
|
||||
BerElement *ber;
|
||||
int rc, msgid;
|
||||
|
||||
/*
|
||||
* the ldapv3 extended operation request looks like this:
|
||||
*
|
||||
* ExtendedRequest ::= [APPLICATION 23] SEQUENCE {
|
||||
* requestName LDAPOID,
|
||||
* requestValue OCTET STRING
|
||||
* }
|
||||
*
|
||||
* all wrapped up in an LDAPMessage sequence.
|
||||
*/
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_extended_operation\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
|
||||
/* only ldapv3 or higher can do extended operations */
|
||||
if ( NSLDAPI_LDAP_VERSION( ld ) < LDAP_VERSION3 ) {
|
||||
rc = LDAP_NOT_SUPPORTED;
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
return( rc );
|
||||
}
|
||||
|
||||
if ( msgidp == NULL || exoid == NULL || *exoid == '\0' ) {
|
||||
rc = LDAP_PARAM_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
return( rc );
|
||||
}
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK );
|
||||
msgid = ++ld->ld_msgid;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK );
|
||||
|
||||
#if 0
|
||||
if ( ld->ld_cache_on && ld->ld_cache_extendedop != NULL ) {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
|
||||
if ( (rc = (ld->ld_cache_extendedop)( ld, msgid,
|
||||
LDAP_REQ_EXTENDED, exoid, cred )) != 0 ) {
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
return( rc );
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
}
|
||||
#endif
|
||||
|
||||
/* create a message to send */
|
||||
if (( rc = nsldapi_alloc_ber_with_options( ld, &ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
return( rc );
|
||||
}
|
||||
|
||||
/* fill it in */
|
||||
if ( ber_printf( ber, "{it{tsto}", msgid, LDAP_REQ_EXTENDED,
|
||||
LDAP_TAG_EXOP_REQ_OID, exoid, LDAP_TAG_EXOP_REQ_VALUE,
|
||||
exdata->bv_val, (int)exdata->bv_len /* XXX lossy cast */ ) == -1 ) {
|
||||
rc = LDAP_ENCODING_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( rc );
|
||||
}
|
||||
|
||||
if (( rc = nsldapi_put_controls( ld, serverctrls, 1, ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
ber_free( ber, 1 );
|
||||
return( rc );
|
||||
}
|
||||
|
||||
/* send the message */
|
||||
rc = nsldapi_send_initial_request( ld, msgid, LDAP_REQ_EXTENDED, NULL,
|
||||
ber );
|
||||
*msgidp = rc;
|
||||
return( rc < 0 ? LDAP_GET_LDERRNO( ld, NULL, NULL ) : LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ldap_extended_operation_s - perform an arbitrary ldapv3 extended operation.
|
||||
* the oid and data of the extended operation are supplied. LDAP_SUCCESS
|
||||
* is returned upon success, the ldap error code otherwise.
|
||||
*
|
||||
* Example:
|
||||
* struct berval exdata, exretval;
|
||||
* char *exoid;
|
||||
* int rc;
|
||||
* ... fill in oid and data ...
|
||||
* rc = ldap_extended_operation_s( ld, exoid, &exdata, &exretval );
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_extended_operation_s(
|
||||
LDAP *ld,
|
||||
const char *requestoid,
|
||||
const struct berval *requestdata,
|
||||
LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls,
|
||||
char **retoidp,
|
||||
struct berval **retdatap
|
||||
)
|
||||
{
|
||||
int err, msgid;
|
||||
LDAPMessage *result;
|
||||
|
||||
if (( err = ldap_extended_operation( ld, requestoid, requestdata,
|
||||
serverctrls, clientctrls, &msgid )) != LDAP_SUCCESS ) {
|
||||
return( err );
|
||||
}
|
||||
|
||||
if ( ldap_result( ld, msgid, 1, (struct timeval *) 0, &result )
|
||||
== -1 ) {
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
}
|
||||
|
||||
if (( err = ldap_parse_extended_result( ld, result, retoidp, retdatap,
|
||||
0 )) != LDAP_SUCCESS ) {
|
||||
ldap_msgfree( result );
|
||||
return( err );
|
||||
}
|
||||
|
||||
return( ldap_result2error( ld, result, 1 ) );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Pull the oid returned by the server and the data out of an extended
|
||||
* operation result. Return an LDAP error code.
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_parse_extended_result(
|
||||
LDAP *ld,
|
||||
LDAPMessage *res,
|
||||
char **retoidp, /* may be NULL */
|
||||
struct berval **retdatap, /* may be NULL */
|
||||
int freeit
|
||||
)
|
||||
{
|
||||
struct berelement ber;
|
||||
unsigned long len;
|
||||
long err;
|
||||
char *m, *e, *roid;
|
||||
struct berval *rdata;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_parse_extended_result\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAPMESSAGE_EXRESULT_POINTER( res )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
m = e = NULL;
|
||||
ber = *(res->lm_ber);
|
||||
if ( NSLDAPI_LDAP_VERSION( ld ) < LDAP_VERSION3 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NOT_SUPPORTED, NULL, NULL );
|
||||
return( LDAP_NOT_SUPPORTED );
|
||||
}
|
||||
|
||||
if ( ber_scanf( &ber, "{iaa", &err, &m, &e ) == LBER_ERROR ) {
|
||||
goto decoding_error;
|
||||
}
|
||||
roid = NULL;
|
||||
if ( ber_peek_tag( &ber, &len ) == LDAP_TAG_EXOP_RES_OID ) {
|
||||
if ( ber_scanf( &ber, "a", &roid ) == LBER_ERROR ) {
|
||||
goto decoding_error;
|
||||
}
|
||||
}
|
||||
if ( retoidp != NULL ) {
|
||||
*retoidp = roid;
|
||||
} else if ( roid != NULL ) {
|
||||
NSLDAPI_FREE( roid );
|
||||
}
|
||||
|
||||
rdata = NULL;
|
||||
if ( ber_peek_tag( &ber, &len ) == LDAP_TAG_EXOP_RES_VALUE ) {
|
||||
if ( ber_scanf( &ber, "O", &rdata ) == LBER_ERROR ) {
|
||||
goto decoding_error;
|
||||
}
|
||||
}
|
||||
if ( retdatap != NULL ) {
|
||||
*retdatap = rdata;
|
||||
} else if ( rdata != NULL ) {
|
||||
ber_bvfree( rdata );
|
||||
}
|
||||
|
||||
LDAP_SET_LDERRNO( ld, err, m, e );
|
||||
|
||||
if ( freeit ) {
|
||||
ldap_msgfree( res );
|
||||
}
|
||||
|
||||
return( LDAP_SUCCESS );
|
||||
|
||||
decoding_error:;
|
||||
LDAP_SET_LDERRNO( ld, LDAP_DECODING_ERROR, NULL, NULL );
|
||||
return( LDAP_DECODING_ERROR );
|
||||
}
|
||||
138
mozilla/directory/c-sdk/ldap/libraries/libldap/free.c
Normal file
138
mozilla/directory/c-sdk/ldap/libraries/libldap/free.c
Normal file
@@ -0,0 +1,138 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1994 The Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* free.c - some free routines are included here to avoid having to
|
||||
* link in lots of extra code when not using certain features
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1994 The Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_getfilter_free( LDAPFiltDesc *lfdp )
|
||||
{
|
||||
LDAPFiltList *flp, *nextflp;
|
||||
LDAPFiltInfo *fip, *nextfip;
|
||||
|
||||
if ( lfdp == NULL ) {
|
||||
return;
|
||||
}
|
||||
|
||||
for ( flp = lfdp->lfd_filtlist; flp != NULL; flp = nextflp ) {
|
||||
for ( fip = flp->lfl_ilist; fip != NULL; fip = nextfip ) {
|
||||
nextfip = fip->lfi_next;
|
||||
NSLDAPI_FREE( fip->lfi_filter );
|
||||
NSLDAPI_FREE( fip->lfi_desc );
|
||||
NSLDAPI_FREE( fip );
|
||||
}
|
||||
nextflp = flp->lfl_next;
|
||||
NSLDAPI_FREE( flp->lfl_pattern );
|
||||
NSLDAPI_FREE( flp->lfl_delims );
|
||||
NSLDAPI_FREE( flp->lfl_tag );
|
||||
NSLDAPI_FREE( flp );
|
||||
}
|
||||
|
||||
if ( lfdp->lfd_curvalcopy != NULL ) {
|
||||
NSLDAPI_FREE( lfdp->lfd_curvalcopy );
|
||||
}
|
||||
if ( lfdp->lfd_curvalwords != NULL ) {
|
||||
NSLDAPI_FREE( lfdp->lfd_curvalwords );
|
||||
}
|
||||
if ( lfdp->lfd_filtprefix != NULL ) {
|
||||
NSLDAPI_FREE( lfdp->lfd_filtprefix );
|
||||
}
|
||||
if ( lfdp->lfd_filtsuffix != NULL ) {
|
||||
NSLDAPI_FREE( lfdp->lfd_filtsuffix );
|
||||
}
|
||||
|
||||
NSLDAPI_FREE( lfdp );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* free a null-terminated array of pointers to mod structures. the
|
||||
* structures are freed, not the array itself, unless the freemods
|
||||
* flag is set.
|
||||
*/
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_mods_free( LDAPMod **mods, int freemods )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAPMOD_ARRAY( mods )) {
|
||||
return;
|
||||
}
|
||||
|
||||
for ( i = 0; mods[i] != NULL; i++ ) {
|
||||
if ( mods[i]->mod_op & LDAP_MOD_BVALUES ) {
|
||||
if ( mods[i]->mod_bvalues != NULL ) {
|
||||
ber_bvecfree( mods[i]->mod_bvalues );
|
||||
}
|
||||
} else if ( mods[i]->mod_values != NULL ) {
|
||||
ldap_value_free( mods[i]->mod_values );
|
||||
}
|
||||
if ( mods[i]->mod_type != NULL ) {
|
||||
NSLDAPI_FREE( mods[i]->mod_type );
|
||||
}
|
||||
NSLDAPI_FREE( (char *) mods[i] );
|
||||
}
|
||||
|
||||
if ( freemods )
|
||||
NSLDAPI_FREE( (char *) mods );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ldap_memfree() is needed to ensure that memory allocated by the C runtime
|
||||
* assocated with libldap is freed by the same runtime code.
|
||||
*/
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_memfree( void *s )
|
||||
{
|
||||
if ( s != NULL ) {
|
||||
NSLDAPI_FREE( s );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ldap_ber_free() is just a cover for ber_free()
|
||||
* ber_free() checks for ber == NULL, so we don't bother.
|
||||
*/
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_ber_free( BerElement *ber, int freebuf )
|
||||
{
|
||||
ber_free( ber, freebuf );
|
||||
}
|
||||
58
mozilla/directory/c-sdk/ldap/libraries/libldap/freevalues.c
Normal file
58
mozilla/directory/c-sdk/ldap/libraries/libldap/freevalues.c
Normal file
@@ -0,0 +1,58 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* freevalues.c
|
||||
*/
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_value_free( char **vals )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( vals == NULL )
|
||||
return;
|
||||
for ( i = 0; vals[i] != NULL; i++ )
|
||||
NSLDAPI_FREE( vals[i] );
|
||||
NSLDAPI_FREE( (char *) vals );
|
||||
}
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_value_free_len( struct berval **vals )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( vals == NULL )
|
||||
return;
|
||||
for ( i = 0; vals[i] != NULL; i++ ) {
|
||||
NSLDAPI_FREE( vals[i]->bv_val );
|
||||
NSLDAPI_FREE( vals[i] );
|
||||
}
|
||||
NSLDAPI_FREE( (char *) vals );
|
||||
}
|
||||
136
mozilla/directory/c-sdk/ldap/libraries/libldap/friendly.c
Normal file
136
mozilla/directory/c-sdk/ldap/libraries/libldap/friendly.c
Normal file
@@ -0,0 +1,136 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* friendly.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1993 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
char *
|
||||
LDAP_CALL
|
||||
ldap_friendly_name( char *filename, char *name, FriendlyMap *map )
|
||||
{
|
||||
int i, entries;
|
||||
FILE *fp;
|
||||
char *s;
|
||||
char buf[BUFSIZ];
|
||||
|
||||
if ( map == NULL ) {
|
||||
return( name );
|
||||
}
|
||||
if ( NULL == name)
|
||||
{
|
||||
return (name);
|
||||
}
|
||||
|
||||
if ( *map == NULL ) {
|
||||
if ( (fp = fopen( filename, "r" )) == NULL )
|
||||
return( name );
|
||||
|
||||
entries = 0;
|
||||
while ( fgets( buf, sizeof(buf), fp ) != NULL ) {
|
||||
if ( buf[0] != '#' )
|
||||
entries++;
|
||||
}
|
||||
rewind( fp );
|
||||
|
||||
if ( (*map = (FriendlyMap)NSLDAPI_MALLOC( (entries + 1) *
|
||||
sizeof(struct friendly) )) == NULL ) {
|
||||
fclose( fp );
|
||||
return( name );
|
||||
}
|
||||
|
||||
i = 0;
|
||||
while ( fgets( buf, sizeof(buf), fp ) != NULL && i < entries ) {
|
||||
if ( buf[0] == '#' )
|
||||
continue;
|
||||
|
||||
if ( (s = strchr( buf, '\n' )) != NULL )
|
||||
*s = '\0';
|
||||
|
||||
if ( (s = strchr( buf, '\t' )) == NULL )
|
||||
continue;
|
||||
*s++ = '\0';
|
||||
|
||||
if ( *s == '"' ) {
|
||||
int esc = 0, found = 0;
|
||||
|
||||
for ( ++s; *s && !found; s++ ) {
|
||||
switch ( *s ) {
|
||||
case '\\':
|
||||
esc = 1;
|
||||
break;
|
||||
case '"':
|
||||
if ( !esc )
|
||||
found = 1;
|
||||
/* FALL */
|
||||
default:
|
||||
esc = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
(*map)[i].f_unfriendly = nsldapi_strdup( buf );
|
||||
(*map)[i].f_friendly = nsldapi_strdup( s );
|
||||
i++;
|
||||
}
|
||||
|
||||
fclose( fp );
|
||||
(*map)[i].f_unfriendly = NULL;
|
||||
}
|
||||
|
||||
for ( i = 0; (*map)[i].f_unfriendly != NULL; i++ ) {
|
||||
if ( strcasecmp( name, (*map)[i].f_unfriendly ) == 0 )
|
||||
return( (*map)[i].f_friendly );
|
||||
}
|
||||
return( name );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_free_friendlymap( FriendlyMap *map )
|
||||
{
|
||||
struct friendly* pF;
|
||||
|
||||
if ( map == NULL || *map == NULL ) {
|
||||
return;
|
||||
}
|
||||
|
||||
for ( pF = *map; pF->f_unfriendly; pF++ ) {
|
||||
NSLDAPI_FREE( pF->f_unfriendly );
|
||||
NSLDAPI_FREE( pF->f_friendly );
|
||||
}
|
||||
NSLDAPI_FREE( *map );
|
||||
*map = NULL;
|
||||
}
|
||||
135
mozilla/directory/c-sdk/ldap/libraries/libldap/getattr.c
Normal file
135
mozilla/directory/c-sdk/ldap/libraries/libldap/getattr.c
Normal file
@@ -0,0 +1,135 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* getattr.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
|
||||
static unsigned long
|
||||
bytes_remaining( BerElement *ber )
|
||||
{
|
||||
unsigned long len;
|
||||
|
||||
if ( ber_get_option( ber, LBER_OPT_REMAINING_BYTES, &len ) != 0 ) {
|
||||
return( 0 ); /* not sure what else to do.... */
|
||||
}
|
||||
return( len );
|
||||
}
|
||||
|
||||
|
||||
char *
|
||||
LDAP_CALL
|
||||
ldap_first_attribute( LDAP *ld, LDAPMessage *entry, BerElement **ber )
|
||||
{
|
||||
char *attr;
|
||||
int err;
|
||||
long seqlength;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_first_attribute\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( NULL ); /* punt */
|
||||
}
|
||||
|
||||
if ( ber == NULL || !NSLDAPI_VALID_LDAPMESSAGE_ENTRY_POINTER( entry )) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
if ( nsldapi_alloc_ber_with_options( ld, ber ) != LDAP_SUCCESS ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
**ber = *entry->lm_ber;
|
||||
|
||||
attr = NULL; /* pessimistic */
|
||||
err = LDAP_DECODING_ERROR; /* ditto */
|
||||
|
||||
/*
|
||||
* Skip past the sequence, dn, and sequence of sequence.
|
||||
* Reset number of bytes remaining so we confine the rest of our
|
||||
* decoding to the current sequence.
|
||||
*/
|
||||
if ( ber_scanf( *ber, "{xl{", &seqlength ) != LBER_ERROR &&
|
||||
ber_set_option( *ber, LBER_OPT_REMAINING_BYTES, &seqlength )
|
||||
== 0 ) {
|
||||
/* snarf the attribute type, and skip the set of values,
|
||||
* leaving us positioned right before the next attribute
|
||||
* type/value sequence.
|
||||
*/
|
||||
if ( ber_scanf( *ber, "{ax}", &attr ) != LBER_ERROR ||
|
||||
bytes_remaining( *ber ) == 0 ) {
|
||||
err = LDAP_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
LDAP_SET_LDERRNO( ld, err, NULL, NULL );
|
||||
if ( attr == NULL || err != LDAP_SUCCESS ) {
|
||||
ber_free( *ber, 0 );
|
||||
*ber = NULL;
|
||||
}
|
||||
return( attr );
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
char *
|
||||
LDAP_CALL
|
||||
ldap_next_attribute( LDAP *ld, LDAPMessage *entry, BerElement *ber )
|
||||
{
|
||||
char *attr;
|
||||
int err;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_next_attribute\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( NULL ); /* punt */
|
||||
}
|
||||
|
||||
if ( ber == NULL || !NSLDAPI_VALID_LDAPMESSAGE_ENTRY_POINTER( entry )) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
attr = NULL; /* pessimistic */
|
||||
err = LDAP_DECODING_ERROR; /* ditto */
|
||||
|
||||
/* skip sequence, snarf attribute type, skip values */
|
||||
if ( ber_scanf( ber, "{ax}", &attr ) != LBER_ERROR ||
|
||||
bytes_remaining( ber ) == 0 ) {
|
||||
err = LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
LDAP_SET_LDERRNO( ld, err, NULL, NULL );
|
||||
return( attr );
|
||||
}
|
||||
347
mozilla/directory/c-sdk/ldap/libraries/libldap/getdn.c
Normal file
347
mozilla/directory/c-sdk/ldap/libraries/libldap/getdn.c
Normal file
@@ -0,0 +1,347 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1994 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* getdn.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
char *
|
||||
LDAP_CALL
|
||||
ldap_get_dn( LDAP *ld, LDAPMessage *entry )
|
||||
{
|
||||
char *dn;
|
||||
struct berelement tmp;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_get_dn\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( NULL ); /* punt */
|
||||
}
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAPMESSAGE_ENTRY_POINTER( entry )) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
tmp = *entry->lm_ber; /* struct copy */
|
||||
if ( ber_scanf( &tmp, "{a", &dn ) == LBER_ERROR ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_DECODING_ERROR, NULL, NULL );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( dn );
|
||||
}
|
||||
|
||||
char *
|
||||
LDAP_CALL
|
||||
ldap_dn2ufn( const char *dn )
|
||||
{
|
||||
char *p, *ufn, *r;
|
||||
size_t plen;
|
||||
int state;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_dn2ufn\n", 0, 0, 0 );
|
||||
|
||||
if ( dn == NULL ) {
|
||||
dn = "";
|
||||
}
|
||||
|
||||
if ( ldap_is_dns_dn( dn ) || ( p = strchr( dn, '=' )) == NULL )
|
||||
return( nsldapi_strdup( (char *)dn ));
|
||||
|
||||
ufn = nsldapi_strdup( ++p );
|
||||
|
||||
#define INQUOTE 1
|
||||
#define OUTQUOTE 2
|
||||
state = OUTQUOTE;
|
||||
for ( p = ufn, r = ufn; *p; p += plen ) {
|
||||
plen = 1;
|
||||
switch ( *p ) {
|
||||
case '\\':
|
||||
if ( *++p == '\0' )
|
||||
plen=0;
|
||||
else {
|
||||
*r++ = '\\';
|
||||
r += (plen = LDAP_UTF8COPY(r,p));
|
||||
}
|
||||
break;
|
||||
case '"':
|
||||
if ( state == INQUOTE )
|
||||
state = OUTQUOTE;
|
||||
else
|
||||
state = INQUOTE;
|
||||
*r++ = *p;
|
||||
break;
|
||||
case ';':
|
||||
case ',':
|
||||
if ( state == OUTQUOTE )
|
||||
*r++ = ',';
|
||||
else
|
||||
*r++ = *p;
|
||||
break;
|
||||
case '=':
|
||||
if ( state == INQUOTE )
|
||||
*r++ = *p;
|
||||
else {
|
||||
char *rsave = r;
|
||||
LDAP_UTF8DEC(r);
|
||||
*rsave = '\0';
|
||||
while ( !ldap_utf8isspace( r ) && *r != ';'
|
||||
&& *r != ',' && r > ufn )
|
||||
LDAP_UTF8DEC(r);
|
||||
LDAP_UTF8INC(r);
|
||||
|
||||
if ( strcasecmp( r, "c" )
|
||||
&& strcasecmp( r, "o" )
|
||||
&& strcasecmp( r, "ou" )
|
||||
&& strcasecmp( r, "st" )
|
||||
&& strcasecmp( r, "l" )
|
||||
&& strcasecmp( r, "cn" ) ) {
|
||||
r = rsave;
|
||||
*r++ = '=';
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
r += (plen = LDAP_UTF8COPY(r,p));
|
||||
break;
|
||||
}
|
||||
}
|
||||
*r = '\0';
|
||||
|
||||
return( ufn );
|
||||
}
|
||||
|
||||
char **
|
||||
LDAP_CALL
|
||||
ldap_explode_dns( const char *dn )
|
||||
{
|
||||
int ncomps, maxcomps;
|
||||
char *s, *cpydn;
|
||||
char **rdns;
|
||||
#ifdef HAVE_STRTOK_R /* defined in portable.h */
|
||||
char *lasts;
|
||||
#endif
|
||||
|
||||
if ( dn == NULL ) {
|
||||
dn = "";
|
||||
}
|
||||
|
||||
if ( (rdns = (char **)NSLDAPI_MALLOC( 8 * sizeof(char *) )) == NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
maxcomps = 8;
|
||||
ncomps = 0;
|
||||
cpydn = nsldapi_strdup( (char *)dn );
|
||||
for ( s = STRTOK( cpydn, "@.", &lasts ); s != NULL;
|
||||
s = STRTOK( NULL, "@.", &lasts ) ) {
|
||||
if ( ncomps == maxcomps ) {
|
||||
maxcomps *= 2;
|
||||
if ( (rdns = (char **)NSLDAPI_REALLOC( rdns, maxcomps *
|
||||
sizeof(char *) )) == NULL ) {
|
||||
NSLDAPI_FREE( cpydn );
|
||||
return( NULL );
|
||||
}
|
||||
}
|
||||
rdns[ncomps++] = nsldapi_strdup( s );
|
||||
}
|
||||
rdns[ncomps] = NULL;
|
||||
NSLDAPI_FREE( cpydn );
|
||||
|
||||
return( rdns );
|
||||
}
|
||||
|
||||
#define LDAP_DN 1
|
||||
#define LDAP_RDN 2
|
||||
|
||||
static char **
|
||||
ldap_explode( const char *dn, const int notypes, const int nametype )
|
||||
{
|
||||
char *p, *q, *rdnstart, **rdns = NULL;
|
||||
size_t plen = 0;
|
||||
int state, count = 0, endquote, len, goteq;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_explode\n", 0, 0, 0 );
|
||||
|
||||
if ( dn == NULL ) {
|
||||
dn = "";
|
||||
}
|
||||
|
||||
#if 0
|
||||
if ( ldap_is_dns_dn( dn ) ) {
|
||||
return( ldap_explode_dns( dn ) );
|
||||
}
|
||||
#endif
|
||||
|
||||
while ( ldap_utf8isspace( (char *)dn )) { /* ignore leading spaces */
|
||||
++dn;
|
||||
}
|
||||
|
||||
p = rdnstart = (char *) dn;
|
||||
state = OUTQUOTE;
|
||||
goteq = 0;
|
||||
|
||||
do {
|
||||
p += plen;
|
||||
plen = 1;
|
||||
switch ( *p ) {
|
||||
case '\\':
|
||||
if ( *++p == '\0' )
|
||||
p--;
|
||||
else
|
||||
plen = LDAP_UTF8LEN(p);
|
||||
break;
|
||||
case '"':
|
||||
if ( state == INQUOTE )
|
||||
state = OUTQUOTE;
|
||||
else
|
||||
state = INQUOTE;
|
||||
break;
|
||||
case '+': if ( nametype != LDAP_RDN ) break;
|
||||
case ';':
|
||||
case ',':
|
||||
case '\0':
|
||||
if ( state == OUTQUOTE ) {
|
||||
/*
|
||||
* semicolon and comma are not valid RDN
|
||||
* separators.
|
||||
*/
|
||||
if ( nametype == LDAP_RDN &&
|
||||
( *p == ';' || *p == ',' || !goteq)) {
|
||||
ldap_charray_free( rdns );
|
||||
return NULL;
|
||||
}
|
||||
if ( (*p == ',' || *p == ';') && !goteq ) {
|
||||
/* If we get here, we have a case similar
|
||||
* to <attr>=<value>,<string>,<attr>=<value>
|
||||
* This is not a valid dn */
|
||||
ldap_charray_free( rdns );
|
||||
return NULL;
|
||||
}
|
||||
goteq = 0;
|
||||
++count;
|
||||
if ( rdns == NULL ) {
|
||||
if (( rdns = (char **)NSLDAPI_MALLOC( 8
|
||||
* sizeof( char *))) == NULL )
|
||||
return( NULL );
|
||||
} else if ( count >= 8 ) {
|
||||
if (( rdns = (char **)NSLDAPI_REALLOC(
|
||||
rdns, (count+1) *
|
||||
sizeof( char *))) == NULL )
|
||||
return( NULL );
|
||||
}
|
||||
rdns[ count ] = NULL;
|
||||
endquote = 0;
|
||||
if ( notypes ) {
|
||||
for ( q = rdnstart;
|
||||
q < p && *q != '='; ++q ) {
|
||||
;
|
||||
}
|
||||
if ( q < p ) { /* *q == '=' */
|
||||
rdnstart = ++q;
|
||||
}
|
||||
if ( *rdnstart == '"' ) {
|
||||
++rdnstart;
|
||||
}
|
||||
|
||||
if ( *(p-1) == '"' ) {
|
||||
endquote = 1;
|
||||
--p;
|
||||
}
|
||||
}
|
||||
|
||||
len = p - rdnstart;
|
||||
if (( rdns[ count-1 ] = (char *)NSLDAPI_CALLOC(
|
||||
1, len + 1 )) != NULL ) {
|
||||
SAFEMEMCPY( rdns[ count-1 ], rdnstart,
|
||||
len );
|
||||
if ( !endquote ) {
|
||||
/* trim trailing spaces */
|
||||
while ( len > 0 &&
|
||||
ldap_utf8isspace(
|
||||
&rdns[count-1][len-1] )) {
|
||||
--len;
|
||||
}
|
||||
}
|
||||
rdns[ count-1 ][ len ] = '\0';
|
||||
}
|
||||
|
||||
/*
|
||||
* Don't forget to increment 'p' back to where
|
||||
* it should be. If we don't, then we will
|
||||
* never get past an "end quote."
|
||||
*/
|
||||
if ( endquote == 1 )
|
||||
p++;
|
||||
|
||||
rdnstart = *p ? p + 1 : p;
|
||||
while ( ldap_utf8isspace( rdnstart ))
|
||||
++rdnstart;
|
||||
}
|
||||
break;
|
||||
case '=':
|
||||
if ( state == OUTQUOTE ) {
|
||||
goteq = 1;
|
||||
}
|
||||
/* FALL */
|
||||
default:
|
||||
plen = LDAP_UTF8LEN(p);
|
||||
break;
|
||||
}
|
||||
} while ( *p );
|
||||
|
||||
return( rdns );
|
||||
}
|
||||
|
||||
char **
|
||||
LDAP_CALL
|
||||
ldap_explode_dn( const char *dn, const int notypes )
|
||||
{
|
||||
return( ldap_explode( dn, notypes, LDAP_DN ) );
|
||||
}
|
||||
|
||||
char **
|
||||
LDAP_CALL
|
||||
ldap_explode_rdn( const char *rdn, const int notypes )
|
||||
{
|
||||
return( ldap_explode( rdn, notypes, LDAP_RDN ) );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_is_dns_dn( const char *dn )
|
||||
{
|
||||
return( dn != NULL && dn[ 0 ] != '\0' && strchr( dn, '=' ) == NULL &&
|
||||
strchr( dn, ',' ) == NULL );
|
||||
}
|
||||
250
mozilla/directory/c-sdk/ldap/libraries/libldap/getdxbyname.c
Normal file
250
mozilla/directory/c-sdk/ldap/libraries/libldap/getdxbyname.c
Normal file
@@ -0,0 +1,250 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1995 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* nsldapi_getdxbyname - retrieve DX records from the DNS (from
|
||||
* TXT records for now)
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef LDAP_DNS
|
||||
|
||||
XXX not MT-safe XXX
|
||||
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#ifdef macintosh
|
||||
#include <stdlib.h>
|
||||
#include "macos.h"
|
||||
#endif /* macintosh */
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#if !defined(macintosh) && !defined(DOS) && !defined( _WINDOWS )
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/nameser.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
#include <resolv.h>
|
||||
#endif
|
||||
#include "ldap-int.h"
|
||||
|
||||
#if defined( DOS )
|
||||
#include "msdos.h"
|
||||
#endif /* DOS */
|
||||
|
||||
|
||||
#ifdef NEEDPROTOS
|
||||
static char ** decode_answer( unsigned char *answer, int len );
|
||||
#else /* NEEDPROTOS */
|
||||
static char **decode_answer();
|
||||
#endif /* NEEDPROTOS */
|
||||
|
||||
extern int h_errno;
|
||||
extern char *h_errlist[];
|
||||
|
||||
|
||||
#define MAX_TO_SORT 32
|
||||
|
||||
|
||||
/*
|
||||
* nsldapi_getdxbyname - lookup DNS DX records for domain and return an ordered
|
||||
* array.
|
||||
*/
|
||||
char **
|
||||
nsldapi_getdxbyname( char *domain )
|
||||
{
|
||||
unsigned char buf[ PACKETSZ ];
|
||||
char **dxs;
|
||||
int rc;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "nsldapi_getdxbyname( %s )\n", domain, 0, 0 );
|
||||
|
||||
memset( buf, 0, sizeof( buf ));
|
||||
|
||||
/* XXX not MT safe XXX */
|
||||
if (( rc = res_search( domain, C_IN, T_TXT, buf, sizeof( buf ))) < 0
|
||||
|| ( dxs = decode_answer( buf, rc )) == NULL ) {
|
||||
/*
|
||||
* punt: return list conisting of the original domain name only
|
||||
*/
|
||||
if (( dxs = (char **)NSLDAPI_MALLOC( 2 * sizeof( char * ))) == NULL ||
|
||||
( dxs[ 0 ] = nsldapi_strdup( domain )) == NULL ) {
|
||||
if ( dxs != NULL ) {
|
||||
NSLDAPI_FREE( dxs );
|
||||
}
|
||||
dxs = NULL;
|
||||
} else {
|
||||
dxs[ 1 ] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return( dxs );
|
||||
}
|
||||
|
||||
|
||||
static char **
|
||||
decode_answer( unsigned char *answer, int len )
|
||||
{
|
||||
HEADER *hp;
|
||||
char buf[ 256 ], **dxs;
|
||||
unsigned char *eom, *p;
|
||||
int ancount, err, rc, type, class, dx_count, rr_len;
|
||||
int dx_pref[ MAX_TO_SORT ];
|
||||
|
||||
#ifdef LDAP_DEBUG
|
||||
if ( ldap_debug & LDAP_DEBUG_PACKETS ) {
|
||||
/* __p_query( answer ); */
|
||||
}
|
||||
#endif /* LDAP_DEBUG */
|
||||
|
||||
dxs = NULL;
|
||||
hp = (HEADER *)answer;
|
||||
eom = answer + len;
|
||||
|
||||
if ( ntohs( hp->qdcount ) != 1 ) {
|
||||
h_errno = NO_RECOVERY;
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
ancount = ntohs( hp->ancount );
|
||||
if ( ancount < 1 ) {
|
||||
h_errno = NO_DATA;
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
/*
|
||||
* skip over the query
|
||||
*/
|
||||
p = answer + HFIXEDSZ;
|
||||
if (( rc = dn_expand( answer, eom, p, buf, sizeof( buf ))) < 0 ) {
|
||||
h_errno = NO_RECOVERY;
|
||||
return( NULL );
|
||||
}
|
||||
p += ( rc + QFIXEDSZ );
|
||||
|
||||
/*
|
||||
* pull out the answers we are interested in
|
||||
*/
|
||||
err = dx_count = 0;
|
||||
while ( ancount > 0 && err == 0 && p < eom ) {
|
||||
if (( rc = dn_expand( answer, eom, p, buf, sizeof( buf ))) < 0 ) {
|
||||
err = NO_RECOVERY;
|
||||
continue;
|
||||
}
|
||||
p += rc; /* skip over name */
|
||||
type = _getshort( p );
|
||||
p += INT16SZ;
|
||||
class = _getshort( p );
|
||||
p += INT16SZ;
|
||||
p += INT32SZ; /* skip over TTL */
|
||||
rr_len = _getshort( p );
|
||||
p += INT16SZ;
|
||||
if ( class == C_IN && type == T_TXT ) {
|
||||
int i, n, pref, txt_len;
|
||||
char *q, *r;
|
||||
|
||||
q = (char *)p;
|
||||
while ( q < (char *)p + rr_len && err == 0 ) {
|
||||
if ( *q >= 3 && strncasecmp( q + 1, "dx:", 3 ) == 0 ) {
|
||||
txt_len = *q - 3;
|
||||
r = q + 4;
|
||||
while ( isspace( *r )) {
|
||||
++r;
|
||||
--txt_len;
|
||||
}
|
||||
pref = 0;
|
||||
while ( isdigit( *r )) {
|
||||
pref *= 10;
|
||||
pref += ( *r - '0' );
|
||||
++r;
|
||||
--txt_len;
|
||||
}
|
||||
if ( dx_count < MAX_TO_SORT - 1 ) {
|
||||
dx_pref[ dx_count ] = pref;
|
||||
}
|
||||
while ( isspace( *r )) {
|
||||
++r;
|
||||
--txt_len;
|
||||
}
|
||||
if ( dx_count == 0 ) {
|
||||
dxs = (char **)NSLDAPI_MALLOC( 2 * sizeof( char * ));
|
||||
} else {
|
||||
dxs = (char **)NSLDAPI_REALLOC( dxs,
|
||||
( dx_count + 2 ) * sizeof( char * ));
|
||||
}
|
||||
if ( dxs == NULL || ( dxs[ dx_count ] =
|
||||
(char *)NSLDAPI_CALLOC( 1, txt_len + 1 ))
|
||||
== NULL ) {
|
||||
err = NO_RECOVERY;
|
||||
continue;
|
||||
}
|
||||
SAFEMEMCPY( dxs[ dx_count ], r, txt_len );
|
||||
dxs[ ++dx_count ] = NULL;
|
||||
}
|
||||
q += ( *q + 1 ); /* move past last TXT record */
|
||||
}
|
||||
}
|
||||
p += rr_len;
|
||||
}
|
||||
|
||||
if ( err == 0 ) {
|
||||
if ( dx_count == 0 ) {
|
||||
err = NO_DATA;
|
||||
} else {
|
||||
/*
|
||||
* sort records based on associated preference value
|
||||
*/
|
||||
int i, j, sort_count, tmp_pref;
|
||||
char *tmp_dx;
|
||||
|
||||
sort_count = ( dx_count < MAX_TO_SORT ) ? dx_count : MAX_TO_SORT;
|
||||
for ( i = 0; i < sort_count; ++i ) {
|
||||
for ( j = i + 1; j < sort_count; ++j ) {
|
||||
if ( dx_pref[ i ] > dx_pref[ j ] ) {
|
||||
tmp_pref = dx_pref[ i ];
|
||||
dx_pref[ i ] = dx_pref[ j ];
|
||||
dx_pref[ j ] = tmp_pref;
|
||||
tmp_dx = dxs[ i ];
|
||||
dxs[ i ] = dxs[ j ];
|
||||
dxs[ j ] = tmp_dx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
h_errno = err;
|
||||
return( dxs );
|
||||
}
|
||||
|
||||
#endif /* LDAP_DNS */
|
||||
126
mozilla/directory/c-sdk/ldap/libraries/libldap/getentry.c
Normal file
126
mozilla/directory/c-sdk/ldap/libraries/libldap/getentry.c
Normal file
@@ -0,0 +1,126 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* getentry.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
LDAPMessage *
|
||||
LDAP_CALL
|
||||
ldap_first_entry( LDAP *ld, LDAPMessage *chain )
|
||||
{
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld ) || chain == NULLMSG ) {
|
||||
return( NULLMSG );
|
||||
}
|
||||
|
||||
if ( chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) {
|
||||
return( chain );
|
||||
}
|
||||
|
||||
return( ldap_next_entry( ld, chain ));
|
||||
}
|
||||
|
||||
|
||||
LDAPMessage *
|
||||
LDAP_CALL
|
||||
ldap_next_entry( LDAP *ld, LDAPMessage *entry )
|
||||
{
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld ) || entry == NULLMSG ) {
|
||||
return( NULLMSG );
|
||||
}
|
||||
|
||||
for ( entry = entry->lm_chain; entry != NULLMSG;
|
||||
entry = entry->lm_chain ) {
|
||||
if ( entry->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) {
|
||||
return( entry );
|
||||
}
|
||||
}
|
||||
|
||||
return( NULLMSG );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_count_entries( LDAP *ld, LDAPMessage *chain )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
for ( i = 0; chain != NULL; chain = chain->lm_chain ) {
|
||||
if ( chain->lm_msgtype == LDAP_RES_SEARCH_ENTRY ) {
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
return( i );
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_get_entry_controls( LDAP *ld, LDAPMessage *entry,
|
||||
LDAPControl ***serverctrlsp )
|
||||
{
|
||||
int rc;
|
||||
BerElement tmpber;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_get_entry_controls\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAPMESSAGE_ENTRY_POINTER( entry )
|
||||
|| serverctrlsp == NULL ) {
|
||||
rc = LDAP_PARAM_ERROR;
|
||||
goto report_error_and_return;
|
||||
}
|
||||
|
||||
*serverctrlsp = NULL;
|
||||
tmpber = *entry->lm_ber; /* struct copy */
|
||||
|
||||
/* skip past dn and entire attribute/value list */
|
||||
if ( ber_scanf( &tmpber, "{xx" ) == LBER_ERROR ) {
|
||||
rc = LDAP_DECODING_ERROR;
|
||||
goto report_error_and_return;
|
||||
}
|
||||
|
||||
rc = nsldapi_get_controls( &tmpber, serverctrlsp );
|
||||
|
||||
report_error_and_return:
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
return( rc );
|
||||
}
|
||||
535
mozilla/directory/c-sdk/ldap/libraries/libldap/getfilter.c
Normal file
535
mozilla/directory/c-sdk/ldap/libraries/libldap/getfilter.c
Normal file
@@ -0,0 +1,535 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1993 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* getfilter.c -- optional add-on to libldap
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1993 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
#include "regex.h"
|
||||
#include <stdio.h> /* sprintf */
|
||||
|
||||
static int break_into_words( char *str, char *delims, char ***wordsp );
|
||||
int nsldapi_next_line_tokens( char **bufp, long *blenp, char ***toksp );
|
||||
void nsldapi_free_strarray( char **sap );
|
||||
|
||||
#if !defined( macintosh ) && !defined( DOS )
|
||||
extern char * LDAP_CALL re_comp();
|
||||
#endif
|
||||
|
||||
#define FILT_MAX_LINE_LEN 1024
|
||||
|
||||
LDAPFiltDesc *
|
||||
LDAP_CALL
|
||||
ldap_init_getfilter( char *fname )
|
||||
{
|
||||
FILE *fp;
|
||||
char *buf;
|
||||
long rlen, len;
|
||||
int eof;
|
||||
LDAPFiltDesc *lfdp;
|
||||
|
||||
if (( fp = fopen( fname, "r" )) == NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
if ( fseek( fp, 0L, SEEK_END ) != 0 ) { /* move to end to get len */
|
||||
fclose( fp );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
len = ftell( fp );
|
||||
|
||||
if ( fseek( fp, 0L, SEEK_SET ) != 0 ) { /* back to start of file */
|
||||
fclose( fp );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
if (( buf = NSLDAPI_MALLOC( (size_t)len )) == NULL ) {
|
||||
fclose( fp );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
rlen = fread( buf, 1, (size_t)len, fp );
|
||||
eof = feof( fp );
|
||||
fclose( fp );
|
||||
|
||||
if ( rlen != len && !eof ) { /* error: didn't get the whole file */
|
||||
NSLDAPI_FREE( buf );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
|
||||
lfdp = ldap_init_getfilter_buf( buf, rlen );
|
||||
NSLDAPI_FREE( buf );
|
||||
|
||||
return( lfdp );
|
||||
}
|
||||
|
||||
|
||||
LDAPFiltDesc *
|
||||
LDAP_CALL
|
||||
ldap_init_getfilter_buf( char *buf, long buflen )
|
||||
{
|
||||
LDAPFiltDesc *lfdp;
|
||||
LDAPFiltList *flp, *nextflp;
|
||||
LDAPFiltInfo *fip, *nextfip;
|
||||
char *tag, **tok;
|
||||
int tokcnt, i;
|
||||
|
||||
if ( buflen < 0 || ( lfdp = (LDAPFiltDesc *)NSLDAPI_CALLOC( 1,
|
||||
sizeof( LDAPFiltDesc))) == NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
flp = nextflp = NULL;
|
||||
fip = NULL;
|
||||
tag = NULL;
|
||||
|
||||
while ( buflen > 0 && ( tokcnt = nsldapi_next_line_tokens( &buf, &buflen,
|
||||
&tok )) > 0 ) {
|
||||
switch( tokcnt ) {
|
||||
case 1: /* tag line */
|
||||
if ( tag != NULL ) {
|
||||
NSLDAPI_FREE( tag );
|
||||
}
|
||||
tag = tok[ 0 ];
|
||||
NSLDAPI_FREE( tok );
|
||||
break;
|
||||
case 4:
|
||||
case 5: /* start of filter info. list */
|
||||
if (( nextflp = (LDAPFiltList *)NSLDAPI_CALLOC( 1,
|
||||
sizeof( LDAPFiltList ))) == NULL ) {
|
||||
ldap_getfilter_free( lfdp );
|
||||
return( NULL );
|
||||
}
|
||||
nextflp->lfl_tag = nsldapi_strdup( tag );
|
||||
nextflp->lfl_pattern = tok[ 0 ];
|
||||
if ( re_comp( nextflp->lfl_pattern ) != NULL ) {
|
||||
char msg[256];
|
||||
ldap_getfilter_free( lfdp );
|
||||
sprintf( msg, "bad regular expresssion %s\n",
|
||||
nextflp->lfl_pattern );
|
||||
ber_err_print( msg );
|
||||
nsldapi_free_strarray( tok );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
nextflp->lfl_delims = tok[ 1 ];
|
||||
nextflp->lfl_ilist = NULL;
|
||||
nextflp->lfl_next = NULL;
|
||||
if ( flp == NULL ) { /* first one */
|
||||
lfdp->lfd_filtlist = nextflp;
|
||||
} else {
|
||||
flp->lfl_next = nextflp;
|
||||
}
|
||||
flp = nextflp;
|
||||
fip = NULL;
|
||||
for ( i = 2; i < 5; ++i ) {
|
||||
tok[ i - 2 ] = tok[ i ];
|
||||
}
|
||||
/* fall through */
|
||||
|
||||
case 2:
|
||||
case 3: /* filter, desc, and optional search scope */
|
||||
if ( nextflp != NULL ) { /* add to info list */
|
||||
if (( nextfip = (LDAPFiltInfo *)NSLDAPI_CALLOC( 1,
|
||||
sizeof( LDAPFiltInfo ))) == NULL ) {
|
||||
ldap_getfilter_free( lfdp );
|
||||
nsldapi_free_strarray( tok );
|
||||
return( NULL );
|
||||
}
|
||||
if ( fip == NULL ) { /* first one */
|
||||
nextflp->lfl_ilist = nextfip;
|
||||
} else {
|
||||
fip->lfi_next = nextfip;
|
||||
}
|
||||
fip = nextfip;
|
||||
nextfip->lfi_next = NULL;
|
||||
nextfip->lfi_filter = tok[ 0 ];
|
||||
nextfip->lfi_desc = tok[ 1 ];
|
||||
if ( tok[ 2 ] != NULL ) {
|
||||
if ( strcasecmp( tok[ 2 ], "subtree" ) == 0 ) {
|
||||
nextfip->lfi_scope = LDAP_SCOPE_SUBTREE;
|
||||
} else if ( strcasecmp( tok[ 2 ], "onelevel" ) == 0 ) {
|
||||
nextfip->lfi_scope = LDAP_SCOPE_ONELEVEL;
|
||||
} else if ( strcasecmp( tok[ 2 ], "base" ) == 0 ) {
|
||||
nextfip->lfi_scope = LDAP_SCOPE_BASE;
|
||||
} else {
|
||||
nsldapi_free_strarray( tok );
|
||||
ldap_getfilter_free( lfdp );
|
||||
return( NULL );
|
||||
}
|
||||
NSLDAPI_FREE( tok[ 2 ] );
|
||||
tok[ 2 ] = NULL;
|
||||
} else {
|
||||
nextfip->lfi_scope = LDAP_SCOPE_SUBTREE; /* default */
|
||||
}
|
||||
nextfip->lfi_isexact = ( strchr( tok[ 0 ], '*' ) == NULL &&
|
||||
strchr( tok[ 0 ], '~' ) == NULL );
|
||||
NSLDAPI_FREE( tok );
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
nsldapi_free_strarray( tok );
|
||||
ldap_getfilter_free( lfdp );
|
||||
return( NULL );
|
||||
}
|
||||
}
|
||||
|
||||
if ( tag != NULL ) {
|
||||
NSLDAPI_FREE( tag );
|
||||
}
|
||||
|
||||
return( lfdp );
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_set_filter_additions( LDAPFiltDesc *lfdp, char *prefix, char *suffix )
|
||||
{
|
||||
if ( lfdp == NULL ) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( lfdp->lfd_filtprefix != NULL ) {
|
||||
NSLDAPI_FREE( lfdp->lfd_filtprefix );
|
||||
}
|
||||
lfdp->lfd_filtprefix = ( prefix == NULL ) ? NULL : nsldapi_strdup( prefix );
|
||||
|
||||
if ( lfdp->lfd_filtsuffix != NULL ) {
|
||||
NSLDAPI_FREE( lfdp->lfd_filtsuffix );
|
||||
}
|
||||
lfdp->lfd_filtsuffix = ( suffix == NULL ) ? NULL : nsldapi_strdup( suffix );
|
||||
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ldap_setfilteraffixes() is deprecated -- use ldap_set_filter_additions()
|
||||
*/
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_setfilteraffixes( LDAPFiltDesc *lfdp, char *prefix, char *suffix )
|
||||
{
|
||||
(void)ldap_set_filter_additions( lfdp, prefix, suffix );
|
||||
}
|
||||
|
||||
|
||||
LDAPFiltInfo *
|
||||
LDAP_CALL
|
||||
ldap_getfirstfilter( LDAPFiltDesc *lfdp, char *tagpat, char *value )
|
||||
{
|
||||
LDAPFiltList *flp;
|
||||
|
||||
if ( lfdp == NULL ) {
|
||||
return( NULL ); /* punt */
|
||||
}
|
||||
|
||||
if ( lfdp->lfd_curvalcopy != NULL ) {
|
||||
NSLDAPI_FREE( lfdp->lfd_curvalcopy );
|
||||
NSLDAPI_FREE( lfdp->lfd_curvalwords );
|
||||
}
|
||||
|
||||
lfdp->lfd_curval = value;
|
||||
lfdp->lfd_curfip = NULL;
|
||||
|
||||
for ( flp = lfdp->lfd_filtlist; flp != NULL; flp = flp->lfl_next ) {
|
||||
if ( re_comp( tagpat ) == NULL && re_exec( flp->lfl_tag ) == 1
|
||||
&& re_comp( flp->lfl_pattern ) == NULL
|
||||
&& re_exec( lfdp->lfd_curval ) == 1 ) {
|
||||
lfdp->lfd_curfip = flp->lfl_ilist;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( lfdp->lfd_curfip == NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
if (( lfdp->lfd_curvalcopy = nsldapi_strdup( value )) == NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
if ( break_into_words( lfdp->lfd_curvalcopy, flp->lfl_delims,
|
||||
&lfdp->lfd_curvalwords ) < 0 ) {
|
||||
NSLDAPI_FREE( lfdp->lfd_curvalcopy );
|
||||
lfdp->lfd_curvalcopy = NULL;
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( ldap_getnextfilter( lfdp ));
|
||||
}
|
||||
|
||||
|
||||
LDAPFiltInfo *
|
||||
LDAP_CALL
|
||||
ldap_getnextfilter( LDAPFiltDesc *lfdp )
|
||||
{
|
||||
LDAPFiltInfo *fip;
|
||||
|
||||
if ( lfdp == NULL || ( fip = lfdp->lfd_curfip ) == NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
lfdp->lfd_curfip = fip->lfi_next;
|
||||
|
||||
ldap_build_filter( lfdp->lfd_filter, LDAP_FILT_MAXSIZ, fip->lfi_filter,
|
||||
lfdp->lfd_filtprefix, lfdp->lfd_filtsuffix, NULL,
|
||||
lfdp->lfd_curval, lfdp->lfd_curvalwords );
|
||||
lfdp->lfd_retfi.lfi_filter = lfdp->lfd_filter;
|
||||
lfdp->lfd_retfi.lfi_desc = fip->lfi_desc;
|
||||
lfdp->lfd_retfi.lfi_scope = fip->lfi_scope;
|
||||
lfdp->lfd_retfi.lfi_isexact = fip->lfi_isexact;
|
||||
|
||||
return( &lfdp->lfd_retfi );
|
||||
}
|
||||
|
||||
|
||||
static char*
|
||||
filter_add_strn( char *f, char *flimit, char *v, size_t vlen )
|
||||
/* Copy v into f. If flimit is too small, return NULL;
|
||||
* otherwise return (f + vlen).
|
||||
*/
|
||||
{
|
||||
auto size_t flen = flimit - f;
|
||||
if ( vlen > flen ) { /* flimit is too small */
|
||||
if ( flen > 0 ) SAFEMEMCPY( f, v, flen );
|
||||
return NULL;
|
||||
}
|
||||
if ( vlen > 0 ) SAFEMEMCPY( f, v, vlen );
|
||||
return f + vlen;
|
||||
}
|
||||
|
||||
static char*
|
||||
filter_add_value( char *f, char *flimit, char *v, int escape_all )
|
||||
/* Copy v into f, but with parentheses escaped. But only escape * and \
|
||||
* if escape_all is non-zero so that either "*" or "\2a" can be used in
|
||||
* v, with different meanings.
|
||||
* If flimit is too small, return NULL; otherwise
|
||||
* return (f + the number of bytes copied).
|
||||
*/
|
||||
{
|
||||
auto char x[4];
|
||||
auto size_t slen;
|
||||
while ( f && *v ) {
|
||||
switch ( *v ) {
|
||||
case '*':
|
||||
if ( escape_all ) {
|
||||
f = filter_add_strn( f, flimit, "\\2a", 3 );
|
||||
v++;
|
||||
} else {
|
||||
if ( f < flimit ) {
|
||||
*f++ = *v++;
|
||||
} else {
|
||||
f = NULL; /* overflow */
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case '(':
|
||||
case ')':
|
||||
sprintf( x, "\\%02x", (unsigned)*v );
|
||||
f = filter_add_strn( f, flimit, x, 3 );
|
||||
v++;
|
||||
break;
|
||||
|
||||
case '\\':
|
||||
if ( escape_all ) {
|
||||
f = filter_add_strn( f, flimit, "\\5c", 3 );
|
||||
v++;
|
||||
} else {
|
||||
slen = (ldap_utf8isxdigit( v+1 ) &&
|
||||
ldap_utf8isxdigit( v+2 )) ? 3 : (v[1] ? 2 : 1);
|
||||
f = filter_add_strn( f, flimit, v, slen );
|
||||
v += slen;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if ( f < flimit ) {
|
||||
*f++ = *v++;
|
||||
} else {
|
||||
f = NULL; /* overflow */
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_create_filter( char *filtbuf, unsigned long buflen, char *pattern,
|
||||
char *prefix, char *suffix, char *attr, char *value, char **valwords )
|
||||
{
|
||||
char *p, *f, *flimit;
|
||||
int i, wordcount, wordnum, endwordnum, escape_all;
|
||||
|
||||
/*
|
||||
* there is some confusion on what to create for a filter if
|
||||
* attr or value are null pointers. For now we just leave them
|
||||
* as TO BE DEALT with
|
||||
*/
|
||||
|
||||
if ( filtbuf == NULL || buflen == 0 || pattern == NULL ){
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( valwords == NULL ) {
|
||||
wordcount = 0;
|
||||
} else {
|
||||
for ( wordcount = 0; valwords[ wordcount ] != NULL; ++wordcount ) {
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
f = filtbuf;
|
||||
flimit = filtbuf + buflen - 1;
|
||||
|
||||
if ( prefix != NULL ) {
|
||||
f = filter_add_strn( f, flimit, prefix, strlen( prefix ));
|
||||
}
|
||||
|
||||
for ( p = pattern; f != NULL && *p != '\0'; ++p ) {
|
||||
if ( *p == '%' ) {
|
||||
++p;
|
||||
if ( *p == 'v' || *p == 'e' ) {
|
||||
escape_all = ( *p == 'e' );
|
||||
if ( ldap_utf8isdigit( p+1 )) {
|
||||
++p;
|
||||
wordnum = *p - '1';
|
||||
if ( *(p+1) == '-' ) {
|
||||
++p;
|
||||
if ( ldap_utf8isdigit( p+1 )) {
|
||||
++p;
|
||||
endwordnum = *p - '1'; /* e.g., "%v2-4" */
|
||||
if ( endwordnum > wordcount - 1 ) {
|
||||
endwordnum = wordcount - 1;
|
||||
}
|
||||
} else {
|
||||
endwordnum = wordcount - 1; /* e.g., "%v2-" */
|
||||
}
|
||||
} else {
|
||||
endwordnum = wordnum; /* e.g., "%v2" */
|
||||
}
|
||||
|
||||
if ( wordcount > 0 ) {
|
||||
for ( i = wordnum; i <= endwordnum; ++i ) {
|
||||
if ( i > wordnum ) { /* add blank btw words */
|
||||
f = filter_add_strn( f, flimit, " ", 1 );
|
||||
if ( f == NULL ) break;
|
||||
}
|
||||
f = filter_add_value( f, flimit, valwords[ i ],
|
||||
escape_all );
|
||||
if ( f == NULL ) break;
|
||||
}
|
||||
}
|
||||
} else if ( *(p+1) == '$' ) {
|
||||
++p;
|
||||
if ( wordcount > 0 ) {
|
||||
wordnum = wordcount - 1;
|
||||
f = filter_add_value( f, flimit,
|
||||
valwords[ wordnum ], escape_all );
|
||||
}
|
||||
} else if ( value != NULL ) {
|
||||
f = filter_add_value( f, flimit, value, escape_all );
|
||||
}
|
||||
} else if ( *p == 'a' && attr != NULL ) {
|
||||
f = filter_add_strn( f, flimit, attr, strlen( attr ));
|
||||
} else {
|
||||
*f++ = *p;
|
||||
}
|
||||
} else {
|
||||
*f++ = *p;
|
||||
}
|
||||
if ( f > flimit ) { /* overflow */
|
||||
f = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if ( suffix != NULL && f != NULL) {
|
||||
f = filter_add_strn( f, flimit, suffix, strlen( suffix ));
|
||||
}
|
||||
|
||||
if ( f == NULL ) {
|
||||
*flimit = '\0';
|
||||
return( LDAP_SIZELIMIT_EXCEEDED );
|
||||
}
|
||||
*f = '\0';
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ldap_build_filter() is deprecated -- use ldap_create_filter() instead
|
||||
*/
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_build_filter( char *filtbuf, unsigned long buflen, char *pattern,
|
||||
char *prefix, char *suffix, char *attr, char *value, char **valwords )
|
||||
{
|
||||
(void)ldap_create_filter( filtbuf, buflen, pattern, prefix, suffix, attr,
|
||||
value, valwords );
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
break_into_words( char *str, char *delims, char ***wordsp )
|
||||
{
|
||||
char *word, **words;
|
||||
int count;
|
||||
char *lasts;
|
||||
|
||||
if (( words = (char **)NSLDAPI_CALLOC( 1, sizeof( char * ))) == NULL ) {
|
||||
return( -1 );
|
||||
}
|
||||
count = 0;
|
||||
words[ count ] = NULL;
|
||||
|
||||
word = ldap_utf8strtok_r( str, delims, &lasts );
|
||||
while ( word != NULL ) {
|
||||
if (( words = (char **)NSLDAPI_REALLOC( words,
|
||||
( count + 2 ) * sizeof( char * ))) == NULL ) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
words[ count ] = word;
|
||||
words[ ++count ] = NULL;
|
||||
word = ldap_utf8strtok_r( NULL, delims, &lasts );
|
||||
}
|
||||
|
||||
*wordsp = words;
|
||||
return( count );
|
||||
}
|
||||
353
mozilla/directory/c-sdk/ldap/libraries/libldap/getoption.c
Normal file
353
mozilla/directory/c-sdk/ldap/libraries/libldap/getoption.c
Normal file
@@ -0,0 +1,353 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#include "ldap-int.h"
|
||||
|
||||
#define LDAP_GET_BITOPT( ld, bit ) \
|
||||
((ld)->ld_options & bit ) != 0 ? 1 : 0
|
||||
|
||||
static int nsldapi_get_api_info( LDAPAPIInfo *aip );
|
||||
static int nsldapi_get_feature_info( LDAPAPIFeatureInfo *fip );
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_get_option( LDAP *ld, int option, void *optdata )
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if ( !nsldapi_initialized ) {
|
||||
nsldapi_initialize_defaults();
|
||||
}
|
||||
|
||||
/*
|
||||
* optdata MUST be a valid pointer...
|
||||
*/
|
||||
if (NULL == optdata)
|
||||
{
|
||||
return(LDAP_PARAM_ERROR);
|
||||
}
|
||||
/*
|
||||
* process global options (not associated with an LDAP session handle)
|
||||
*/
|
||||
if ( option == LDAP_OPT_MEMALLOC_FN_PTRS ) {
|
||||
/* struct copy */
|
||||
*((struct ldap_memalloc_fns *)optdata) = nsldapi_memalloc_fns;
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
if ( option == LDAP_OPT_API_INFO ) {
|
||||
rc = nsldapi_get_api_info( (LDAPAPIInfo *)optdata );
|
||||
if ( rc != LDAP_SUCCESS ) {
|
||||
if ( ld != NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
}
|
||||
return( -1 );
|
||||
}
|
||||
return( 0 );
|
||||
}
|
||||
/*
|
||||
* LDAP_OPT_DEBUG_LEVEL is global
|
||||
*/
|
||||
if (LDAP_OPT_DEBUG_LEVEL == option)
|
||||
{
|
||||
#ifdef LDAP_DEBUG
|
||||
*((int *) optdata) = ldap_debug;
|
||||
#endif /* LDAP_DEBUG */
|
||||
return ( 0 );
|
||||
}
|
||||
|
||||
/*
|
||||
* if ld is NULL, arrange to return options from our default settings
|
||||
*/
|
||||
if ( ld == NULL ) {
|
||||
ld = &nsldapi_ld_defaults;
|
||||
}
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( -1 ); /* punt */
|
||||
}
|
||||
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_OPTION_LOCK );
|
||||
switch( option ) {
|
||||
#ifdef LDAP_DNS
|
||||
case LDAP_OPT_DNS:
|
||||
*((int *) optdata) = LDAP_GET_BITOPT( ld, LDAP_BITOPT_DNS );
|
||||
break;
|
||||
#endif
|
||||
|
||||
case LDAP_OPT_REFERRALS:
|
||||
*((int *) optdata) =
|
||||
LDAP_GET_BITOPT( ld, LDAP_BITOPT_REFERRALS );
|
||||
break;
|
||||
|
||||
#ifdef LDAP_SSLIO_HOOKS
|
||||
case LDAP_OPT_SSL:
|
||||
*((int *) optdata) = LDAP_GET_BITOPT( ld, LDAP_BITOPT_SSL );
|
||||
break;
|
||||
#endif
|
||||
case LDAP_OPT_RESTART:
|
||||
*((int *) optdata) = LDAP_GET_BITOPT( ld, LDAP_BITOPT_RESTART );
|
||||
break;
|
||||
|
||||
case LDAP_OPT_RECONNECT:
|
||||
*((int *) optdata) =
|
||||
LDAP_GET_BITOPT( ld, LDAP_BITOPT_RECONNECT );
|
||||
break;
|
||||
|
||||
#ifdef LDAP_ASYNC_IO
|
||||
case LDAP_OPT_ASYNC_CONNECT:
|
||||
*((int *) optdata) =
|
||||
LDAP_GET_BITOPT( ld, LDAP_BITOPT_ASYNC );
|
||||
break;
|
||||
#endif /* LDAP_ASYNC_IO */
|
||||
|
||||
/* stuff in the sockbuf */
|
||||
case LDAP_OPT_DESC:
|
||||
if ( ber_sockbuf_get_option( ld->ld_sbp,
|
||||
LBER_SOCKBUF_OPT_DESC, optdata ) != 0 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_LOCAL_ERROR, NULL, NULL );
|
||||
rc = -1;
|
||||
}
|
||||
break;
|
||||
|
||||
/* fields in the LDAP structure */
|
||||
case LDAP_OPT_DEREF:
|
||||
*((int *) optdata) = ld->ld_deref;
|
||||
break;
|
||||
case LDAP_OPT_SIZELIMIT:
|
||||
*((int *) optdata) = ld->ld_sizelimit;
|
||||
break;
|
||||
case LDAP_OPT_TIMELIMIT:
|
||||
*((int *) optdata) = ld->ld_timelimit;
|
||||
break;
|
||||
case LDAP_OPT_REFERRAL_HOP_LIMIT:
|
||||
*((int *) optdata) = ld->ld_refhoplimit;
|
||||
break;
|
||||
case LDAP_OPT_PROTOCOL_VERSION:
|
||||
*((int *) optdata) = ld->ld_version;
|
||||
break;
|
||||
case LDAP_OPT_SERVER_CONTROLS:
|
||||
/* fall through */
|
||||
case LDAP_OPT_CLIENT_CONTROLS:
|
||||
*((LDAPControl ***)optdata) = NULL;
|
||||
/* nsldapi_dup_controls returns -1 and sets lderrno on error */
|
||||
rc = nsldapi_dup_controls( ld, (LDAPControl ***)optdata,
|
||||
( option == LDAP_OPT_SERVER_CONTROLS ) ?
|
||||
ld->ld_servercontrols : ld->ld_clientcontrols );
|
||||
break;
|
||||
|
||||
/* rebind proc */
|
||||
case LDAP_OPT_REBIND_FN:
|
||||
*((LDAP_REBINDPROC_CALLBACK **) optdata) = ld->ld_rebind_fn;
|
||||
break;
|
||||
case LDAP_OPT_REBIND_ARG:
|
||||
*((void **) optdata) = ld->ld_rebind_arg;
|
||||
break;
|
||||
|
||||
#ifdef LDAP_SSLIO_HOOKS
|
||||
/* i/o function pointers */
|
||||
case LDAP_OPT_IO_FN_PTRS:
|
||||
/* struct copy */
|
||||
*((struct ldap_io_fns *) optdata) = ld->ld_io;
|
||||
break;
|
||||
#endif /* LDAP_SSLIO_HOOKS */
|
||||
|
||||
/* thread function pointers */
|
||||
case LDAP_OPT_THREAD_FN_PTRS:
|
||||
/* struct copy */
|
||||
*((struct ldap_thread_fns *) optdata) = ld->ld_thread;
|
||||
break;
|
||||
|
||||
/* DNS function pointers */
|
||||
case LDAP_OPT_DNS_FN_PTRS:
|
||||
/* struct copy */
|
||||
*((struct ldap_dns_fns *) optdata) = ld->ld_dnsfn;
|
||||
break;
|
||||
|
||||
/* cache function pointers */
|
||||
case LDAP_OPT_CACHE_FN_PTRS:
|
||||
/* struct copy */
|
||||
*((struct ldap_cache_fns *) optdata) = ld->ld_cache;
|
||||
break;
|
||||
case LDAP_OPT_CACHE_STRATEGY:
|
||||
*((int *) optdata) = ld->ld_cache_strategy;
|
||||
break;
|
||||
case LDAP_OPT_CACHE_ENABLE:
|
||||
*((int *) optdata) = ld->ld_cache_on;
|
||||
break;
|
||||
|
||||
case LDAP_OPT_ERROR_NUMBER:
|
||||
*((int *) optdata) = LDAP_GET_LDERRNO( ld, NULL, NULL );
|
||||
break;
|
||||
|
||||
case LDAP_OPT_ERROR_STRING:
|
||||
(void)LDAP_GET_LDERRNO( ld, NULL, (char **)optdata );
|
||||
*((char **) optdata) = nsldapi_strdup( *((char **) optdata ));
|
||||
break;
|
||||
|
||||
case LDAP_OPT_MATCHED_DN:
|
||||
(void)LDAP_GET_LDERRNO( ld, (char **)optdata, NULL );
|
||||
*((char **) optdata) = nsldapi_strdup( *((char **) optdata ));
|
||||
break;
|
||||
|
||||
case LDAP_OPT_PREFERRED_LANGUAGE:
|
||||
if ( NULL != ld->ld_preferred_language ) {
|
||||
*((char **) optdata) =
|
||||
nsldapi_strdup(ld->ld_preferred_language);
|
||||
} else {
|
||||
*((char **) optdata) = NULL;
|
||||
}
|
||||
break;
|
||||
|
||||
case LDAP_OPT_API_FEATURE_INFO:
|
||||
rc = nsldapi_get_feature_info( (LDAPAPIFeatureInfo *)optdata );
|
||||
if ( rc != LDAP_SUCCESS ) {
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
rc = -1;
|
||||
}
|
||||
break;
|
||||
|
||||
case LDAP_OPT_HOST_NAME:
|
||||
*((char **) optdata) = nsldapi_strdup( ld->ld_defhost );
|
||||
break;
|
||||
|
||||
default:
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
rc = -1;
|
||||
}
|
||||
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_OPTION_LOCK );
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Table of extended API features we support.
|
||||
* The first field is the version of the info. strcuture itself; we do not
|
||||
* use the ones from this table so it is okay to leave as zero.
|
||||
*/
|
||||
static LDAPAPIFeatureInfo nsldapi_extensions[] = {
|
||||
{ 0, "SERVER_SIDE_SORT", LDAP_API_FEATURE_SERVER_SIDE_SORT },
|
||||
{ 0, "VIRTUAL_LIST_VIEW", LDAP_API_FEATURE_VIRTUAL_LIST_VIEW },
|
||||
{ 0, "PERSISTENT_SEARCH", LDAP_API_FEATURE_PERSISTENT_SEARCH },
|
||||
{ 0, "PROXY_AUTHORIZATION", LDAP_API_FEATURE_PROXY_AUTHORIZATION },
|
||||
{ 0, "X_LDERRNO", LDAP_API_FEATURE_X_LDERRNO },
|
||||
{ 0, "X_MEMCACHE", LDAP_API_FEATURE_X_MEMCACHE },
|
||||
{ 0, "X_IO_FUNCTIONS", LDAP_API_FEATURE_X_IO_FUNCTIONS },
|
||||
{ 0, "X_DNS_FUNCTIONS", LDAP_API_FEATURE_X_DNS_FUNCTIONS },
|
||||
{ 0, "X_MEMALLOC_FUNCTIONS", LDAP_API_FEATURE_X_MEMALLOC_FUNCTIONS },
|
||||
{ 0, "X_THREAD_FUNCTIONS", LDAP_API_FEATURE_X_THREAD_FUNCTIONS },
|
||||
{ 0, "X_EXTHREAD_FUNCTIONS", LDAP_API_FEATURE_X_EXTHREAD_FUNCTIONS },
|
||||
{ 0, "X_GETLANGVALUES", LDAP_API_FEATURE_X_GETLANGVALUES },
|
||||
{ 0, "X_CLIENT_SIDE_SORT", LDAP_API_FEATURE_X_CLIENT_SIDE_SORT },
|
||||
{ 0, "X_URL_FUNCTIONS", LDAP_API_FEATURE_X_URL_FUNCTIONS },
|
||||
{ 0, "X_FILTER_FUNCTIONS", LDAP_API_FEATURE_X_FILTER_FUNCTIONS },
|
||||
};
|
||||
|
||||
#define NSLDAPI_EXTENSIONS_COUNT \
|
||||
(sizeof(nsldapi_extensions)/sizeof(LDAPAPIFeatureInfo))
|
||||
|
||||
/*
|
||||
* Retrieve information about this implementation of the LDAP API.
|
||||
* Returns an LDAP error code.
|
||||
*/
|
||||
static int
|
||||
nsldapi_get_api_info( LDAPAPIInfo *aip )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( aip == NULL ) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
aip->ldapai_api_version = LDAP_API_VERSION;
|
||||
|
||||
if ( aip->ldapai_info_version != LDAP_API_INFO_VERSION ) {
|
||||
aip->ldapai_info_version = LDAP_API_INFO_VERSION;
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
aip->ldapai_protocol_version = LDAP_VERSION_MAX;
|
||||
aip->ldapai_vendor_version = LDAP_VENDOR_VERSION;
|
||||
|
||||
if (( aip->ldapai_vendor_name = nsldapi_strdup( LDAP_VENDOR_NAME ))
|
||||
== NULL ) {
|
||||
return( LDAP_NO_MEMORY );
|
||||
}
|
||||
|
||||
if ( NSLDAPI_EXTENSIONS_COUNT < 1 ) {
|
||||
aip->ldapai_extensions = NULL;
|
||||
} else {
|
||||
if (( aip->ldapai_extensions = NSLDAPI_CALLOC(
|
||||
NSLDAPI_EXTENSIONS_COUNT + 1, sizeof(char *))) == NULL ) {
|
||||
NSLDAPI_FREE( aip->ldapai_vendor_name );
|
||||
aip->ldapai_vendor_name = NULL;
|
||||
return( LDAP_NO_MEMORY );
|
||||
}
|
||||
|
||||
for ( i = 0; i < NSLDAPI_EXTENSIONS_COUNT; ++i ) {
|
||||
if (( aip->ldapai_extensions[i] = nsldapi_strdup(
|
||||
nsldapi_extensions[i].ldapaif_name )) == NULL ) {
|
||||
ldap_value_free( aip->ldapai_extensions );
|
||||
NSLDAPI_FREE( aip->ldapai_vendor_name );
|
||||
aip->ldapai_extensions = NULL;
|
||||
aip->ldapai_vendor_name = NULL;
|
||||
return( LDAP_NO_MEMORY );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Retrieves information about a specific extended feature of the LDAP API/
|
||||
* Returns an LDAP error code.
|
||||
*/
|
||||
static int
|
||||
nsldapi_get_feature_info( LDAPAPIFeatureInfo *fip )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( fip == NULL || fip->ldapaif_name == NULL ) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( fip->ldapaif_info_version != LDAP_FEATURE_INFO_VERSION ) {
|
||||
fip->ldapaif_info_version = LDAP_FEATURE_INFO_VERSION;
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
for ( i = 0; i < NSLDAPI_EXTENSIONS_COUNT; ++i ) {
|
||||
if ( strcmp( fip->ldapaif_name,
|
||||
nsldapi_extensions[i].ldapaif_name ) == 0 ) {
|
||||
fip->ldapaif_version =
|
||||
nsldapi_extensions[i].ldapaif_version;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return(( i < NSLDAPI_EXTENSIONS_COUNT ) ? LDAP_SUCCESS
|
||||
: LDAP_PARAM_ERROR );
|
||||
}
|
||||
465
mozilla/directory/c-sdk/ldap/libraries/libldap/getvalues.c
Normal file
465
mozilla/directory/c-sdk/ldap/libraries/libldap/getvalues.c
Normal file
@@ -0,0 +1,465 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* getvalues.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
|
||||
static void **
|
||||
internal_ldap_get_values( LDAP *ld, LDAPMessage *entry, const char *target,
|
||||
int lencall )
|
||||
{
|
||||
struct berelement ber;
|
||||
char *attr;
|
||||
int rc;
|
||||
void **vals;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_get_values\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( NULL ); /* punt */
|
||||
}
|
||||
if ( target == NULL ||
|
||||
!NSLDAPI_VALID_LDAPMESSAGE_ENTRY_POINTER( entry )) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
ber = *entry->lm_ber;
|
||||
|
||||
/* skip sequence, dn, sequence of, and snag the first attr */
|
||||
if ( ber_scanf( &ber, "{x{{a", &attr ) == LBER_ERROR ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_DECODING_ERROR, NULL, NULL );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
rc = strcasecmp( (char *)target, attr );
|
||||
NSLDAPI_FREE( attr );
|
||||
if ( rc != 0 ) {
|
||||
while ( 1 ) {
|
||||
if ( ber_scanf( &ber, "x}{a", &attr ) == LBER_ERROR ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_DECODING_ERROR,
|
||||
NULL, NULL );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
rc = strcasecmp( (char *)target, attr );
|
||||
if ( rc == 0 ) {
|
||||
NSLDAPI_FREE( attr );
|
||||
break;
|
||||
}
|
||||
NSLDAPI_FREE( attr );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* if we get this far, we've found the attribute and are sitting
|
||||
* just before the set of values.
|
||||
*/
|
||||
|
||||
if ( lencall ) {
|
||||
rc = ber_scanf( &ber, "[V]", &vals );
|
||||
} else {
|
||||
rc = ber_scanf( &ber, "[v]", &vals );
|
||||
}
|
||||
|
||||
if ( rc == LBER_ERROR ) {
|
||||
rc = LDAP_DECODING_ERROR;
|
||||
} else {
|
||||
rc = LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
|
||||
return(( rc == LDAP_SUCCESS ) ? vals : NULL );
|
||||
}
|
||||
|
||||
|
||||
/* For language-sensitive attribute matching, we are looking for a
|
||||
language tag that looks like one of the following:
|
||||
|
||||
cn
|
||||
cn;lang-en
|
||||
cn;lang-en-us
|
||||
cn;lang-ja
|
||||
cn;lang-ja-JP-kanji
|
||||
|
||||
The base language specification consists of two letters following
|
||||
"lang-". After that, there may be additional language-specific
|
||||
narrowings preceded by a "-". In our processing we go from the
|
||||
specific to the general, preferring a complete subtype match, but
|
||||
accepting a partial one. For example:
|
||||
|
||||
For a request for "cn;lang-en-us", we would return cn;lang-en-us
|
||||
if present, otherwise cn;lang-en if present, otherwise cn.
|
||||
|
||||
Besides the language subtype, there may be other subtypes:
|
||||
|
||||
cn;lang-ja;binary (Unlikely!)
|
||||
cn;lang-ja;phonetic
|
||||
|
||||
If not in the target, they are ignored. If they are in the target,
|
||||
they must be in the attribute to match.
|
||||
*/
|
||||
#define LANG_SUBTYPE_INDEX_NONE -1
|
||||
#define LANG_SUBTYPE_INDEX_DUPLICATE -2
|
||||
|
||||
typedef struct {
|
||||
int start;
|
||||
int length;
|
||||
} _SubStringIndex;
|
||||
|
||||
static int
|
||||
parse_subtypes( const char *target, int *baseLenp, char **langp,
|
||||
_SubStringIndex **subs, int *nsubtypes )
|
||||
{
|
||||
int nSubtypes = 0;
|
||||
int ind = 0;
|
||||
char *nextToken;
|
||||
_SubStringIndex *result = NULL;
|
||||
int langIndex;
|
||||
int targetLen;
|
||||
int subtypeStart;
|
||||
|
||||
langIndex = LANG_SUBTYPE_INDEX_NONE;
|
||||
*subs = NULL;
|
||||
*langp = NULL;
|
||||
*baseLenp = 0;
|
||||
*nsubtypes = 0;
|
||||
targetLen = strlen( target );
|
||||
|
||||
/* Parse past base attribute */
|
||||
nextToken = strchr( target, ';' );
|
||||
if ( NULL != nextToken ) {
|
||||
subtypeStart = nextToken - target + 1;
|
||||
*baseLenp = subtypeStart - 1;
|
||||
}
|
||||
else {
|
||||
subtypeStart = targetLen;
|
||||
*baseLenp = subtypeStart;
|
||||
}
|
||||
ind = subtypeStart;
|
||||
|
||||
/* How many subtypes? */
|
||||
nextToken = (char *)target + subtypeStart;
|
||||
while ( nextToken && *nextToken ) {
|
||||
char *thisToken = nextToken;
|
||||
nextToken = strchr( thisToken, ';' );
|
||||
if ( NULL != nextToken )
|
||||
nextToken++;
|
||||
if ( 0 == strncasecmp( thisToken, "lang-", 5 ) ) {
|
||||
/* If there was a previous lang tag, this is illegal! */
|
||||
if ( langIndex != LANG_SUBTYPE_INDEX_NONE ) {
|
||||
langIndex = LANG_SUBTYPE_INDEX_DUPLICATE;
|
||||
return langIndex;
|
||||
}
|
||||
else {
|
||||
langIndex = nSubtypes;
|
||||
}
|
||||
} else {
|
||||
nSubtypes++;
|
||||
}
|
||||
}
|
||||
/* No language subtype? */
|
||||
if ( langIndex < 0 )
|
||||
return langIndex;
|
||||
|
||||
/* Allocate array of non-language subtypes */
|
||||
if ( nSubtypes > 0 ) {
|
||||
result = (_SubStringIndex *)NSLDAPI_MALLOC( sizeof(*result)
|
||||
* nSubtypes );
|
||||
memset( result, 0, sizeof(*result) * nSubtypes );
|
||||
}
|
||||
ind = 0;
|
||||
nSubtypes = 0;
|
||||
ind = subtypeStart;
|
||||
nextToken = (char *)target + subtypeStart;
|
||||
while ( nextToken && *nextToken ) {
|
||||
char *thisToken = nextToken;
|
||||
int len;
|
||||
nextToken = strchr( thisToken, ';' );
|
||||
if ( NULL != nextToken ) {
|
||||
len = nextToken - thisToken;
|
||||
nextToken++;
|
||||
}
|
||||
else {
|
||||
nextToken = (char *)target + targetLen;
|
||||
len = nextToken - thisToken;
|
||||
}
|
||||
if ( 0 == strncasecmp( thisToken, "lang-", 5 ) ) {
|
||||
int i;
|
||||
*langp = (char *)NSLDAPI_MALLOC( len + 1 );
|
||||
for( i = 0; i < len; i++ )
|
||||
(*langp)[i] = toupper( target[ind+i] );
|
||||
(*langp)[len] = 0;
|
||||
}
|
||||
else {
|
||||
result[nSubtypes].start = thisToken - target;
|
||||
result[nSubtypes].length = len;
|
||||
nSubtypes++;
|
||||
}
|
||||
}
|
||||
*subs = result;
|
||||
*nsubtypes = nSubtypes;
|
||||
return langIndex;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
check_lang_match( const char *target, const char *baseTarget,
|
||||
_SubStringIndex *targetTypes,
|
||||
int ntargetTypes, char *targetLang, char *attr )
|
||||
{
|
||||
int langIndex;
|
||||
_SubStringIndex *subtypes;
|
||||
int baseLen;
|
||||
char *lang;
|
||||
int nsubtypes;
|
||||
int mismatch = 0;
|
||||
int match = -1;
|
||||
int i;
|
||||
|
||||
/* Get all subtypes in the attribute name */
|
||||
langIndex = parse_subtypes( attr, &baseLen, &lang, &subtypes, &nsubtypes );
|
||||
|
||||
/* Check if there any required non-language subtypes which are
|
||||
not in this attribute */
|
||||
for( i = 0; i < ntargetTypes; i++ ) {
|
||||
char *t = (char *)target+targetTypes[i].start;
|
||||
int tlen = targetTypes[i].length;
|
||||
int j;
|
||||
for( j = 0; j < nsubtypes; j++ ) {
|
||||
char *a = attr + subtypes[j].start;
|
||||
int alen = subtypes[j].length;
|
||||
if ( (tlen == alen) && !strncasecmp( t, a, tlen ) )
|
||||
break;
|
||||
}
|
||||
if ( j >= nsubtypes ) {
|
||||
mismatch = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( mismatch ) {
|
||||
if ( NULL != subtypes )
|
||||
NSLDAPI_FREE( subtypes );
|
||||
if ( NULL != lang )
|
||||
NSLDAPI_FREE( lang );
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* If there was no language subtype... */
|
||||
if ( langIndex < 0 ) {
|
||||
if ( NULL != subtypes )
|
||||
NSLDAPI_FREE( subtypes );
|
||||
if ( NULL != lang )
|
||||
NSLDAPI_FREE( lang );
|
||||
if ( LANG_SUBTYPE_INDEX_NONE == langIndex )
|
||||
return 0;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Okay, now check the language subtag */
|
||||
i = 0;
|
||||
while( targetLang[i] && lang[i] &&
|
||||
(toupper(targetLang[i]) == toupper(lang[i])) )
|
||||
i++;
|
||||
|
||||
/* The total length can't be longer than the requested subtype */
|
||||
if ( !lang[i] || (lang[i] == ';') ) {
|
||||
/* If the found subtype is shorter than the requested one, the next
|
||||
character in the requested one should be "-" */
|
||||
if ( !targetLang[i] || (targetLang[i] == '-') )
|
||||
match = i;
|
||||
}
|
||||
return match;
|
||||
}
|
||||
|
||||
static int check_base_match( const char *target, char *attr )
|
||||
{
|
||||
int i = 0;
|
||||
int rc;
|
||||
while( target[i] && attr[i] && (toupper(target[i]) == toupper(attr[i])) )
|
||||
i++;
|
||||
rc = ( !target[i] && (!attr[i] || (';' == attr[i])) );
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void **
|
||||
internal_ldap_get_lang_values( LDAP *ld, LDAPMessage *entry,
|
||||
const char *target, char **type, int lencall )
|
||||
{
|
||||
struct berelement ber;
|
||||
char *attr = NULL;
|
||||
int rc;
|
||||
void **vals = NULL;
|
||||
int langIndex;
|
||||
_SubStringIndex *subtypes;
|
||||
int nsubtypes;
|
||||
char *baseTarget = NULL;
|
||||
int bestMatch = 0;
|
||||
char *lang = NULL;
|
||||
int len;
|
||||
int firstAttr = 1;
|
||||
char *bestType = NULL;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_get_values\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( NULL );
|
||||
}
|
||||
if ( (target == NULL) ||
|
||||
!NSLDAPI_VALID_LDAPMESSAGE_ENTRY_POINTER( entry )) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
/* A language check was requested, so see if there really is a
|
||||
language subtype in the attribute spec */
|
||||
langIndex = parse_subtypes( target, &len, &lang,
|
||||
&subtypes, &nsubtypes );
|
||||
if ( langIndex < 0 ) {
|
||||
if ( NULL != subtypes ) {
|
||||
NSLDAPI_FREE( subtypes );
|
||||
subtypes = NULL;
|
||||
}
|
||||
vals = internal_ldap_get_values( ld, entry, target, lencall );
|
||||
if ( NULL != type )
|
||||
*type = nsldapi_strdup( target );
|
||||
return vals;
|
||||
} else {
|
||||
/* Get just the base attribute name */
|
||||
baseTarget = (char *)NSLDAPI_MALLOC( len + 1 );
|
||||
memcpy( baseTarget, target, len );
|
||||
baseTarget[len] = 0;
|
||||
}
|
||||
|
||||
ber = *entry->lm_ber;
|
||||
|
||||
/* Process all attributes in the entry */
|
||||
while ( 1 ) {
|
||||
int foundMatch = 0;
|
||||
if ( NULL != attr )
|
||||
NSLDAPI_FREE( attr );
|
||||
if ( firstAttr ) {
|
||||
firstAttr = 0;
|
||||
/* skip sequence, dn, sequence of, and snag the first attr */
|
||||
if ( ber_scanf( &ber, "{x{{a", &attr ) == LBER_ERROR ) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if ( ber_scanf( &ber, "{a", &attr ) == LBER_ERROR ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( check_base_match( (const char *)baseTarget, attr ) ) {
|
||||
int thisMatch = check_lang_match( target, baseTarget,
|
||||
subtypes, nsubtypes, lang, attr );
|
||||
if ( thisMatch > bestMatch ) {
|
||||
if ( vals )
|
||||
NSLDAPI_FREE( vals );
|
||||
foundMatch = 1;
|
||||
bestMatch = thisMatch;
|
||||
if ( NULL != bestType )
|
||||
NSLDAPI_FREE( bestType );
|
||||
bestType = attr;
|
||||
attr = NULL;
|
||||
}
|
||||
}
|
||||
if ( foundMatch ) {
|
||||
if ( lencall ) {
|
||||
rc = ber_scanf( &ber, "[V]}", &vals );
|
||||
} else {
|
||||
rc = ber_scanf( &ber, "[v]}", &vals );
|
||||
}
|
||||
} else {
|
||||
ber_scanf( &ber, "x}" );
|
||||
}
|
||||
}
|
||||
|
||||
NSLDAPI_FREE( lang );
|
||||
NSLDAPI_FREE( baseTarget );
|
||||
NSLDAPI_FREE( subtypes );
|
||||
|
||||
if ( NULL != type )
|
||||
*type = bestType;
|
||||
else if ( NULL != bestType )
|
||||
NSLDAPI_FREE( bestType );
|
||||
|
||||
if ( NULL == vals ) {
|
||||
rc = LDAP_DECODING_ERROR;
|
||||
} else {
|
||||
rc = LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
|
||||
return( vals );
|
||||
}
|
||||
|
||||
|
||||
char **
|
||||
LDAP_CALL
|
||||
ldap_get_values( LDAP *ld, LDAPMessage *entry, const char *target )
|
||||
{
|
||||
return( (char **) internal_ldap_get_values( ld, entry, target, 0 ) );
|
||||
}
|
||||
|
||||
struct berval **
|
||||
LDAP_CALL
|
||||
ldap_get_values_len( LDAP *ld, LDAPMessage *entry, const char *target )
|
||||
{
|
||||
return( (struct berval **) internal_ldap_get_values( ld, entry, target,
|
||||
1 ) );
|
||||
}
|
||||
|
||||
char **
|
||||
LDAP_CALL
|
||||
ldap_get_lang_values( LDAP *ld, LDAPMessage *entry, const char *target,
|
||||
char **type )
|
||||
{
|
||||
return( (char **) internal_ldap_get_lang_values( ld, entry,
|
||||
target, type, 0 ) );
|
||||
}
|
||||
|
||||
struct berval **
|
||||
LDAP_CALL
|
||||
ldap_get_lang_values_len( LDAP *ld, LDAPMessage *entry, const char *target,
|
||||
char **type )
|
||||
{
|
||||
return( (struct berval **) internal_ldap_get_lang_values( ld, entry,
|
||||
target, type, 1 ) );
|
||||
}
|
||||
|
||||
33
mozilla/directory/c-sdk/ldap/libraries/libldap/globals.c
Normal file
33
mozilla/directory/c-sdk/ldap/libraries/libldap/globals.c
Normal file
@@ -0,0 +1,33 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1996 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* LIBLDAP globals.c -- LDAP library global variables
|
||||
*/
|
||||
|
||||
|
||||
#ifdef LDAP_DEBUG
|
||||
int ldap_debug;
|
||||
#endif
|
||||
759
mozilla/directory/c-sdk/ldap/libraries/libldap/ldap-int.h
Normal file
759
mozilla/directory/c-sdk/ldap/libraries/libldap/ldap-int.h
Normal file
@@ -0,0 +1,759 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#ifndef _LDAPINT_H
|
||||
#define _LDAPINT_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
#ifdef HPUX
|
||||
#include <strings.h>
|
||||
#endif /* HPUX */
|
||||
|
||||
#ifdef _WINDOWS
|
||||
# define FD_SETSIZE 256 /* number of connections we support */
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# include <windows.h>
|
||||
#elif defined(macintosh)
|
||||
#include "ldap-macos.h"
|
||||
#else /* _WINDOWS */
|
||||
# include <sys/time.h>
|
||||
# include <sys/types.h>
|
||||
# include <sys/socket.h>
|
||||
# include <netinet/in.h>
|
||||
#if !defined(XP_OS2) && !defined(XP_BEOS)
|
||||
# include <arpa/inet.h>
|
||||
#endif
|
||||
# include <netdb.h>
|
||||
#if !defined(HPUX) && !defined(SUNOS4) && !defined(LINUX) && !defined(XP_BEOS)
|
||||
# include <sys/select.h>
|
||||
#endif /* !defined(HPUX) and others */
|
||||
#endif /* _WINDOWS */
|
||||
|
||||
#if defined(IRIX)
|
||||
#include <bstring.h>
|
||||
#endif /* IRIX */
|
||||
|
||||
#ifdef macintosh
|
||||
#include "lber-int.h"
|
||||
#else /* macintosh */
|
||||
#include "../liblber/lber-int.h"
|
||||
#endif /* macintosh */
|
||||
|
||||
#include "ldap.h"
|
||||
#include "ldaprot.h"
|
||||
#include "ldaplog.h"
|
||||
#include "portable.h"
|
||||
|
||||
#ifdef LDAP_ASYNC_IO
|
||||
#ifdef NEED_FILIO
|
||||
#include <sys/filio.h> /* to get FIONBIO for ioctl() call */
|
||||
#else /* NEED_FILIO */
|
||||
#if !defined( _WINDOWS) && !defined (macintosh)
|
||||
#include <sys/ioctl.h> /* to get FIONBIO for ioctl() call */
|
||||
#endif /* _WINDOWS && macintosh */
|
||||
#endif /* NEED_FILIO */
|
||||
#endif /* LDAP_ASYNC_IO */
|
||||
|
||||
#ifdef USE_SYSCONF
|
||||
# include <unistd.h>
|
||||
#endif /* USE_SYSCONF */
|
||||
|
||||
#if !defined(_WINDOWS) && !defined(macintosh) && !defined(LINUX) && !defined(BSDI) && !defined(XP_OS2) && !defined(XP_BEOS) && !defined(NTO) && !defined(DARWIN)
|
||||
#define NSLDAPI_HAVE_POLL 1
|
||||
#endif
|
||||
|
||||
#define SSL_VERSION 0
|
||||
|
||||
|
||||
#define LDAP_URL_URLCOLON "URL:"
|
||||
#define LDAP_URL_URLCOLON_LEN 4
|
||||
|
||||
#define LDAP_LDAP_REF_STR LDAP_URL_PREFIX
|
||||
#define LDAP_LDAP_REF_STR_LEN LDAP_URL_PREFIX_LEN
|
||||
#define LDAP_LDAPS_REF_STR LDAPS_URL_PREFIX
|
||||
#define LDAP_LDAPS_REF_STR_LEN LDAPS_URL_PREFIX_LEN
|
||||
|
||||
/* default limit on nesting of referrals */
|
||||
#define LDAP_DEFAULT_REFHOPLIMIT 5
|
||||
#ifdef LDAP_DNS
|
||||
#define LDAP_DX_REF_STR "dx://"
|
||||
#define LDAP_DX_REF_STR_LEN 5
|
||||
#endif /* LDAP_DNS */
|
||||
|
||||
typedef enum {
|
||||
LDAP_CACHE_LOCK,
|
||||
LDAP_MEMCACHE_LOCK,
|
||||
LDAP_MSGID_LOCK,
|
||||
LDAP_REQ_LOCK,
|
||||
LDAP_RESP_LOCK,
|
||||
LDAP_ABANDON_LOCK,
|
||||
LDAP_CTRL_LOCK,
|
||||
LDAP_OPTION_LOCK,
|
||||
LDAP_ERR_LOCK,
|
||||
LDAP_CONN_LOCK,
|
||||
LDAP_SELECT_LOCK,
|
||||
LDAP_RESULT_LOCK,
|
||||
LDAP_PEND_LOCK,
|
||||
LDAP_THREADID_LOCK,
|
||||
LDAP_MAX_LOCK
|
||||
} LDAPLock;
|
||||
|
||||
/*
|
||||
* This structure represents both ldap messages and ldap responses.
|
||||
* These are really the same, except in the case of search responses,
|
||||
* where a response has multiple messages.
|
||||
*/
|
||||
|
||||
struct ldapmsg {
|
||||
int lm_msgid; /* the message id */
|
||||
int lm_msgtype; /* the message type */
|
||||
BerElement *lm_ber; /* the ber encoded message contents */
|
||||
struct ldapmsg *lm_chain; /* for search - next msg in the resp */
|
||||
struct ldapmsg *lm_next; /* next response */
|
||||
int lm_fromcache; /* memcache: origin of message */
|
||||
};
|
||||
|
||||
/*
|
||||
* structure for tracking LDAP server host, ports, DNs, etc.
|
||||
*/
|
||||
typedef struct ldap_server {
|
||||
char *lsrv_host;
|
||||
char *lsrv_dn; /* if NULL, use default */
|
||||
int lsrv_port;
|
||||
unsigned long lsrv_options; /* boolean options */
|
||||
#define LDAP_SRV_OPT_SECURE 0x01
|
||||
struct ldap_server *lsrv_next;
|
||||
} LDAPServer;
|
||||
|
||||
/*
|
||||
* structure for representing an LDAP server connection
|
||||
*/
|
||||
typedef struct ldap_conn {
|
||||
Sockbuf *lconn_sb;
|
||||
BerElement *lconn_ber; /* non-NULL if in midst of msg. */
|
||||
int lconn_version; /* LDAP protocol version */
|
||||
int lconn_refcnt;
|
||||
unsigned long lconn_lastused; /* time */
|
||||
int lconn_status;
|
||||
#define LDAP_CONNST_NEEDSOCKET 1
|
||||
#define LDAP_CONNST_CONNECTING 2
|
||||
#define LDAP_CONNST_CONNECTED 3
|
||||
#define LDAP_CONNST_DEAD 4
|
||||
LDAPServer *lconn_server;
|
||||
char *lconn_binddn; /* DN of last successful bind */
|
||||
int lconn_bound; /* has a bind been done? */
|
||||
char *lconn_krbinstance;
|
||||
struct ldap_conn *lconn_next;
|
||||
} LDAPConn;
|
||||
|
||||
|
||||
/*
|
||||
* structure used to track outstanding requests
|
||||
*/
|
||||
typedef struct ldapreq {
|
||||
int lr_msgid; /* the message id */
|
||||
int lr_status; /* status of request */
|
||||
#define LDAP_REQST_INPROGRESS 1
|
||||
#define LDAP_REQST_CHASINGREFS 2
|
||||
#define LDAP_REQST_NOTCONNECTED 3
|
||||
#define LDAP_REQST_WRITING 4
|
||||
#define LDAP_REQST_CONNDEAD 5 /* associated conn. has failed */
|
||||
int lr_outrefcnt; /* count of outstanding referrals */
|
||||
int lr_origid; /* original request's message id */
|
||||
int lr_parentcnt; /* count of parent requests */
|
||||
int lr_res_msgtype; /* result message type */
|
||||
int lr_res_errno; /* result LDAP errno */
|
||||
char *lr_res_error; /* result error string */
|
||||
char *lr_res_matched;/* result matched DN string */
|
||||
BerElement *lr_ber; /* ber encoded request contents */
|
||||
LDAPConn *lr_conn; /* connection used to send request */
|
||||
char *lr_binddn; /* request is a bind for this DN */
|
||||
struct ldapreq *lr_parent; /* request that spawned this referral */
|
||||
struct ldapreq *lr_child; /* list of requests we spawned */
|
||||
struct ldapreq *lr_sibling; /* next referral spawned */
|
||||
struct ldapreq *lr_prev; /* ld->ld_requests previous request */
|
||||
struct ldapreq *lr_next; /* ld->ld_requests next request */
|
||||
} LDAPRequest;
|
||||
|
||||
typedef struct ldappend {
|
||||
void *lp_sema; /* semaphore to post */
|
||||
int lp_msgid; /* message id */
|
||||
LDAPMessage *lp_result; /* result storage */
|
||||
struct ldappend *lp_prev; /* previous pending */
|
||||
struct ldappend *lp_next; /* next pending */
|
||||
} LDAPPend;
|
||||
|
||||
/*
|
||||
* structure representing an ldap connection
|
||||
*/
|
||||
struct ldap {
|
||||
struct sockbuf *ld_sbp; /* pointer to socket desc. & buffer */
|
||||
char *ld_host;
|
||||
int ld_version; /* LDAP protocol version */
|
||||
char ld_lberoptions;
|
||||
int ld_deref;
|
||||
|
||||
int ld_timelimit;
|
||||
int ld_sizelimit;
|
||||
|
||||
struct ldap_filt_desc *ld_filtd; /* from getfilter for ufn searches */
|
||||
char *ld_ufnprefix; /* for incomplete ufn's */
|
||||
|
||||
int ld_errno;
|
||||
char *ld_error;
|
||||
char *ld_matched;
|
||||
int ld_msgid;
|
||||
|
||||
/* do not mess with these */
|
||||
LDAPRequest *ld_requests; /* list of outstanding requests */
|
||||
LDAPMessage *ld_responses; /* list of outstanding responses */
|
||||
int *ld_abandoned; /* array of abandoned requests */
|
||||
char *ld_cldapdn; /* DN used in connectionless search */
|
||||
|
||||
/* it is OK to change these next four values directly */
|
||||
int ld_cldaptries; /* connectionless search retry count */
|
||||
int ld_cldaptimeout;/* time between retries */
|
||||
int ld_refhoplimit; /* limit on referral nesting */
|
||||
unsigned long ld_options; /* boolean options */
|
||||
|
||||
#define LDAP_BITOPT_REFERRALS 0x80000000
|
||||
#define LDAP_BITOPT_SSL 0x40000000
|
||||
#define LDAP_BITOPT_DNS 0x20000000
|
||||
#define LDAP_BITOPT_RESTART 0x10000000
|
||||
#define LDAP_BITOPT_RECONNECT 0x08000000
|
||||
#define LDAP_BITOPT_ASYNC 0x04000000
|
||||
|
||||
/* do not mess with the rest though */
|
||||
char *ld_defhost; /* full name of default server */
|
||||
int ld_defport; /* port of default server */
|
||||
BERTranslateProc ld_lber_encode_translate_proc;
|
||||
BERTranslateProc ld_lber_decode_translate_proc;
|
||||
LDAPConn *ld_defconn; /* default connection */
|
||||
LDAPConn *ld_conns; /* list of all server connections */
|
||||
void *ld_selectinfo; /* platform specifics for select */
|
||||
int ld_selectreadcnt; /* count of read sockets */
|
||||
int ld_selectwritecnt; /* count of write sockets */
|
||||
LDAP_REBINDPROC_CALLBACK *ld_rebind_fn;
|
||||
void *ld_rebind_arg;
|
||||
|
||||
/* function pointers, etc. for io */
|
||||
struct ldap_io_fns ld_io;
|
||||
#define ld_read_fn ld_io.liof_read
|
||||
#define ld_write_fn ld_io.liof_write
|
||||
#define ld_select_fn ld_io.liof_select
|
||||
#define ld_socket_fn ld_io.liof_socket
|
||||
#define ld_ioctl_fn ld_io.liof_ioctl
|
||||
#define ld_connect_fn ld_io.liof_connect
|
||||
#define ld_close_fn ld_io.liof_close
|
||||
#define ld_ssl_enable_fn ld_io.liof_ssl_enable
|
||||
|
||||
/* function pointers, etc. for DNS */
|
||||
struct ldap_dns_fns ld_dnsfn;
|
||||
#define ld_dns_extradata ld_dnsfn.lddnsfn_extradata
|
||||
#define ld_dns_bufsize ld_dnsfn.lddnsfn_bufsize
|
||||
#define ld_dns_gethostbyname_fn ld_dnsfn.lddnsfn_gethostbyname
|
||||
#define ld_dns_gethostbyaddr_fn ld_dnsfn.lddnsfn_gethostbyaddr
|
||||
|
||||
/* function pointers, etc. for threading */
|
||||
struct ldap_thread_fns ld_thread;
|
||||
#define ld_mutex_alloc_fn ld_thread.ltf_mutex_alloc
|
||||
#define ld_mutex_free_fn ld_thread.ltf_mutex_free
|
||||
#define ld_mutex_lock_fn ld_thread.ltf_mutex_lock
|
||||
#define ld_mutex_unlock_fn ld_thread.ltf_mutex_unlock
|
||||
#define ld_get_errno_fn ld_thread.ltf_get_errno
|
||||
#define ld_set_errno_fn ld_thread.ltf_set_errno
|
||||
#define ld_get_lderrno_fn ld_thread.ltf_get_lderrno
|
||||
#define ld_set_lderrno_fn ld_thread.ltf_set_lderrno
|
||||
#define ld_lderrno_arg ld_thread.ltf_lderrno_arg
|
||||
void **ld_mutex;
|
||||
|
||||
/* function pointers, etc. for caching */
|
||||
int ld_cache_on;
|
||||
int ld_cache_strategy;
|
||||
struct ldap_cache_fns ld_cache;
|
||||
#define ld_cache_config ld_cache.lcf_config
|
||||
#define ld_cache_bind ld_cache.lcf_bind
|
||||
#define ld_cache_unbind ld_cache.lcf_unbind
|
||||
#define ld_cache_search ld_cache.lcf_search
|
||||
#define ld_cache_compare ld_cache.lcf_compare
|
||||
#define ld_cache_add ld_cache.lcf_add
|
||||
#define ld_cache_delete ld_cache.lcf_delete
|
||||
#if 0
|
||||
#define ld_cache_rename ld_cache.lcf_rename
|
||||
#endif
|
||||
#define ld_cache_modify ld_cache.lcf_modify
|
||||
#define ld_cache_modrdn ld_cache.lcf_modrdn
|
||||
#define ld_cache_abandon ld_cache.lcf_abandon
|
||||
#define ld_cache_result ld_cache.lcf_result
|
||||
#define ld_cache_flush ld_cache.lcf_flush
|
||||
#define ld_cache_arg ld_cache.lcf_arg
|
||||
|
||||
/* ldapv3 controls */
|
||||
LDAPControl **ld_servercontrols;
|
||||
LDAPControl **ld_clientcontrols;
|
||||
|
||||
/* Preferred language */
|
||||
char *ld_preferred_language;
|
||||
|
||||
/* MemCache */
|
||||
LDAPMemCache *ld_memcache;
|
||||
|
||||
/* Pending results */
|
||||
LDAPPend *ld_pend; /* list of pending results */
|
||||
|
||||
/* extra thread function pointers */
|
||||
struct ldap_extra_thread_fns ld_thread2;
|
||||
#define ld_mutex_trylock_fn ld_thread2.ltf_mutex_trylock
|
||||
#define ld_sema_alloc_fn ld_thread2.ltf_sema_alloc
|
||||
#define ld_sema_free_fn ld_thread2.ltf_sema_free
|
||||
#define ld_sema_wait_fn ld_thread2.ltf_sema_wait
|
||||
#define ld_sema_post_fn ld_thread2.ltf_sema_post
|
||||
#define ld_threadid_fn ld_thread2.ltf_threadid_fn
|
||||
|
||||
/* extra data for mutex handling in referrals */
|
||||
void *ld_mutex_threadid[LDAP_MAX_LOCK];
|
||||
unsigned long ld_mutex_refcnt[LDAP_MAX_LOCK];
|
||||
};
|
||||
|
||||
/* allocate/free mutex */
|
||||
#define LDAP_MUTEX_ALLOC( ld ) \
|
||||
(((ld)->ld_mutex_alloc_fn != NULL) ? (ld)->ld_mutex_alloc_fn() : NULL)
|
||||
|
||||
/* allocate/free mutex */
|
||||
#define LDAP_MUTEX_FREE( ld, m ) \
|
||||
if ( (ld)->ld_mutex_free_fn != NULL && m != NULL ) { \
|
||||
(ld)->ld_mutex_free_fn( m ); \
|
||||
}
|
||||
|
||||
/* enter/exit critical sections */
|
||||
/* The locks assume that the locks are thread safe */
|
||||
|
||||
#define LDAP_MUTEX_LOCK(ld, lock) \
|
||||
if ((ld)->ld_mutex_lock_fn != NULL) { \
|
||||
if ((ld)->ld_threadid_fn != NULL) { \
|
||||
if ((ld)->ld_mutex_threadid[lock] == (ld)->ld_threadid_fn()) { \
|
||||
(ld)->ld_mutex_refcnt[lock]++; \
|
||||
} else { \
|
||||
(ld)->ld_mutex_lock_fn(ld->ld_mutex[lock]); \
|
||||
(ld)->ld_mutex_threadid[lock] = ld->ld_threadid_fn(); \
|
||||
(ld)->ld_mutex_refcnt[lock] = 1; \
|
||||
} \
|
||||
} else { \
|
||||
(ld)->ld_mutex_lock_fn(ld->ld_mutex[lock]); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define LDAP_MUTEX_UNLOCK(ld, lock) \
|
||||
if ((ld)->ld_mutex_lock_fn != NULL) { \
|
||||
if ((ld)->ld_threadid_fn != NULL) { \
|
||||
if ((ld)->ld_mutex_threadid[lock] == (ld)->ld_threadid_fn()) { \
|
||||
(ld)->ld_mutex_refcnt[lock]--; \
|
||||
if ((ld)->ld_mutex_refcnt[lock] <= 0) { \
|
||||
(ld)->ld_mutex_threadid[lock] = (void *) -1; \
|
||||
(ld)->ld_mutex_refcnt[lock] = 0; \
|
||||
(ld)->ld_mutex_unlock_fn(ld->ld_mutex[lock]); \
|
||||
} \
|
||||
} \
|
||||
} else { \
|
||||
ld->ld_mutex_unlock_fn(ld->ld_mutex[lock]); \
|
||||
} \
|
||||
}
|
||||
|
||||
/* Backward compatibility locks */
|
||||
#define LDAP_MUTEX_BC_LOCK( ld, i ) \
|
||||
if( (ld)->ld_mutex_trylock_fn == NULL ) { \
|
||||
LDAP_MUTEX_LOCK( ld, i ) ; \
|
||||
}
|
||||
#define LDAP_MUTEX_BC_UNLOCK( ld, i ) \
|
||||
if( (ld)->ld_mutex_trylock_fn == NULL ) { \
|
||||
LDAP_MUTEX_UNLOCK( ld, i ) ; \
|
||||
}
|
||||
|
||||
/* allocate/free semaphore */
|
||||
#define LDAP_SEMA_ALLOC( ld ) \
|
||||
(((ld)->ld_sema_alloc_fn != NULL) ? (ld)->ld_sema_alloc_fn() : NULL)
|
||||
#define LDAP_SEMA_FREE( ld, m ) \
|
||||
if ( (ld)->ld_sema_free_fn != NULL && m != NULL ) { \
|
||||
(ld)->ld_sema_free_fn( m ); \
|
||||
}
|
||||
|
||||
/* wait/post binary semaphore */
|
||||
#define LDAP_SEMA_WAIT( ld, lp ) \
|
||||
if ( (ld)->ld_sema_wait_fn != NULL ) { \
|
||||
(ld)->ld_sema_wait_fn( lp->lp_sema ); \
|
||||
}
|
||||
#define LDAP_SEMA_POST( ld, lp ) \
|
||||
if ( (ld)->ld_sema_post_fn != NULL ) { \
|
||||
(ld)->ld_sema_post_fn( lp->lp_sema ); \
|
||||
}
|
||||
#define POST( ld, y, z ) \
|
||||
if( (ld)->ld_mutex_trylock_fn != NULL ) { \
|
||||
nsldapi_post_result( ld, y, z ); \
|
||||
}
|
||||
|
||||
/* get/set errno */
|
||||
#ifndef macintosh
|
||||
#define LDAP_SET_ERRNO( ld, e ) \
|
||||
if ( (ld)->ld_set_errno_fn != NULL ) { \
|
||||
(ld)->ld_set_errno_fn( e ); \
|
||||
} else { \
|
||||
errno = e; \
|
||||
}
|
||||
#define LDAP_GET_ERRNO( ld ) \
|
||||
(((ld)->ld_get_errno_fn != NULL) ? \
|
||||
(ld)->ld_get_errno_fn() : errno)
|
||||
#else /* macintosh */
|
||||
#define LDAP_SET_ERRNO( ld, e ) \
|
||||
if ( (ld)->ld_set_errno_fn != NULL ) { \
|
||||
(ld)->ld_set_errno_fn( e ); \
|
||||
}
|
||||
#define LDAP_GET_ERRNO( ld ) \
|
||||
(((ld)->ld_get_errno_fn != NULL) ? \
|
||||
(ld)->ld_get_errno_fn() : 0)
|
||||
#endif
|
||||
|
||||
|
||||
/* get/set ldap-specific errno */
|
||||
#define LDAP_SET_LDERRNO( ld, e, m, s ) ldap_set_lderrno( ld, e, m, s )
|
||||
#define LDAP_GET_LDERRNO( ld, m, s ) ldap_get_lderrno( ld, m, s )
|
||||
|
||||
/*
|
||||
* your standard "mimimum of two values" macro
|
||||
*/
|
||||
#define NSLDAPI_MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||
|
||||
/*
|
||||
* handy macro to check whether LDAP struct is set up for CLDAP or not
|
||||
*/
|
||||
#define LDAP_IS_CLDAP( ld ) ( ld->ld_sbp->sb_naddr > 0 )
|
||||
|
||||
/*
|
||||
* Some Unix error defs. Under CW 7, we can't define OTUNIXERRORS because
|
||||
* it generates many conflicts with errno.h. Define what we need here.
|
||||
*/
|
||||
|
||||
#if defined(macintosh)
|
||||
#define EWOULDBLOCK 35
|
||||
#define EHOSTUNREACH 65
|
||||
#endif
|
||||
|
||||
/*
|
||||
* handy macro to check errno "e" for an "in progress" sort of error
|
||||
*/
|
||||
#if defined(macintosh) || defined(_WINDOWS)
|
||||
#define NSLDAPI_ERRNO_IO_INPROGRESS( e ) ((e) == EWOULDBLOCK || (e) == EAGAIN)
|
||||
#else
|
||||
#ifdef EAGAIN
|
||||
#define NSLDAPI_ERRNO_IO_INPROGRESS( e ) ((e) == EWOULDBLOCK || (e) == EINPROGRESS || (e) == EAGAIN)
|
||||
#else /* EAGAIN */
|
||||
#define NSLDAPI_ERRNO_IO_INPROGRESS( e ) ((e) == EWOULDBLOCK || (e) == EINPROGRESS)
|
||||
#endif /* EAGAIN */
|
||||
#endif /* macintosh || _WINDOWS*/
|
||||
|
||||
/*
|
||||
* macro to return the LDAP protocol version we are using
|
||||
*/
|
||||
#define NSLDAPI_LDAP_VERSION( ld ) ( (ld)->ld_defconn == NULL ? \
|
||||
(ld)->ld_version : \
|
||||
(ld)->ld_defconn->lconn_version )
|
||||
|
||||
/*
|
||||
* Structures used for handling client filter lists.
|
||||
*/
|
||||
#define LDAP_FILT_MAXSIZ 1024
|
||||
|
||||
struct ldap_filt_list {
|
||||
char *lfl_tag;
|
||||
char *lfl_pattern;
|
||||
char *lfl_delims;
|
||||
struct ldap_filt_info *lfl_ilist;
|
||||
struct ldap_filt_list *lfl_next;
|
||||
};
|
||||
|
||||
struct ldap_filt_desc {
|
||||
LDAPFiltList *lfd_filtlist;
|
||||
LDAPFiltInfo *lfd_curfip;
|
||||
LDAPFiltInfo lfd_retfi;
|
||||
char lfd_filter[ LDAP_FILT_MAXSIZ ];
|
||||
char *lfd_curval;
|
||||
char *lfd_curvalcopy;
|
||||
char **lfd_curvalwords;
|
||||
char *lfd_filtprefix;
|
||||
char *lfd_filtsuffix;
|
||||
};
|
||||
|
||||
/*
|
||||
* "internal" globals used to track defaults and memory allocation callbacks:
|
||||
* (the actual definitions are in open.c)
|
||||
*/
|
||||
extern struct ldap nsldapi_ld_defaults;
|
||||
extern struct ldap_memalloc_fns nsldapi_memalloc_fns;
|
||||
extern int nsldapi_initialized;
|
||||
|
||||
|
||||
/*
|
||||
* Memory allocation done in liblber should all go through one of the
|
||||
* following macros. This is so we can plug-in alternative memory
|
||||
* allocators, etc. as the need arises.
|
||||
*/
|
||||
#define NSLDAPI_MALLOC( size ) nsldapi_malloc( size )
|
||||
#define NSLDAPI_CALLOC( nelem, elsize ) nsldapi_calloc( nelem, elsize )
|
||||
#define NSLDAPI_REALLOC( ptr, size ) nsldapi_realloc( ptr, size )
|
||||
#define NSLDAPI_FREE( ptr ) nsldapi_free( ptr )
|
||||
|
||||
|
||||
/*
|
||||
* macros used to check validity of data structures and parameters
|
||||
*/
|
||||
#define NSLDAPI_VALID_LDAP_POINTER( ld ) \
|
||||
( (ld) != NULL )
|
||||
|
||||
#define NSLDAPI_VALID_LDAPMESSAGE_POINTER( lm ) \
|
||||
( (lm) != NULL )
|
||||
|
||||
#define NSLDAPI_VALID_LDAPMESSAGE_ENTRY_POINTER( lm ) \
|
||||
( (lm) != NULL && (lm)->lm_msgtype == LDAP_RES_SEARCH_ENTRY )
|
||||
|
||||
#define NSLDAPI_VALID_LDAPMESSAGE_REFERENCE_POINTER( lm ) \
|
||||
( (lm) != NULL && (lm)->lm_msgtype == LDAP_RES_SEARCH_REFERENCE )
|
||||
|
||||
#define NSLDAPI_VALID_LDAPMESSAGE_BINDRESULT_POINTER( lm ) \
|
||||
( (lm) != NULL && (lm)->lm_msgtype == LDAP_RES_BIND )
|
||||
|
||||
#define NSLDAPI_VALID_LDAPMESSAGE_EXRESULT_POINTER( lm ) \
|
||||
( (lm) != NULL && (lm)->lm_msgtype == LDAP_RES_EXTENDED )
|
||||
|
||||
#define NSLDAPI_VALID_LDAPMOD_ARRAY( mods ) \
|
||||
( (mods) != NULL )
|
||||
|
||||
#define NSLDAPI_VALID_NONEMPTY_LDAPMOD_ARRAY( mods ) \
|
||||
( (mods) != NULL && (mods)[0] != NULL )
|
||||
|
||||
#define NSLDAPI_IS_SEARCH_ENTRY( code ) \
|
||||
((code) == LDAP_RES_SEARCH_ENTRY)
|
||||
|
||||
#define NSLDAPI_IS_SEARCH_RESULT( code ) \
|
||||
((code) == LDAP_RES_SEARCH_RESULT)
|
||||
|
||||
#define NSLDAPI_SEARCH_RELATED_RESULT( code ) \
|
||||
(NSLDAPI_IS_SEARCH_RESULT( code ) || NSLDAPI_IS_SEARCH_ENTRY( code ))
|
||||
|
||||
/*
|
||||
* in bind.c
|
||||
*/
|
||||
char *nsldapi_get_binddn( LDAP *ld );
|
||||
|
||||
/*
|
||||
* in cache.c
|
||||
*/
|
||||
void nsldapi_add_result_to_cache( LDAP *ld, LDAPMessage *result );
|
||||
|
||||
/*
|
||||
* in dsparse.c
|
||||
*/
|
||||
int nsldapi_next_line_tokens( char **bufp, long *blenp, char ***toksp );
|
||||
void nsldapi_free_strarray( char **sap );
|
||||
|
||||
/*
|
||||
* in error.c
|
||||
*/
|
||||
int nsldapi_parse_result( LDAP *ld, int msgtype, BerElement *rber,
|
||||
int *errcodep, char **matchednp, char **errmsgp, char ***referralsp,
|
||||
LDAPControl ***serverctrlsp );
|
||||
|
||||
/*
|
||||
* in open.c
|
||||
*/
|
||||
void nsldapi_initialize_defaults( void );
|
||||
int nsldapi_open_ldap_connection( LDAP *ld, Sockbuf *sb, char *host,
|
||||
int defport, char **krbinstancep, int async, int secure );
|
||||
int nsldapi_open_ldap_defconn( LDAP *ld );
|
||||
void *nsldapi_malloc( size_t size );
|
||||
void *nsldapi_calloc( size_t nelem, size_t elsize );
|
||||
void *nsldapi_realloc( void *ptr, size_t size );
|
||||
void nsldapi_free( void *ptr );
|
||||
char *nsldapi_strdup( const char *s ); /* if s is NULL, returns NULL */
|
||||
|
||||
/*
|
||||
* in os-ip.c
|
||||
*/
|
||||
int nsldapi_connect_to_host( LDAP *ld, Sockbuf *sb, char *host,
|
||||
nsldapi_in_addr_t address, int port, int async, int secure );
|
||||
void nsldapi_close_connection( LDAP *ld, Sockbuf *sb );
|
||||
|
||||
int nsldapi_do_ldap_select( LDAP *ld, struct timeval *timeout );
|
||||
void *nsldapi_new_select_info( void );
|
||||
void nsldapi_free_select_info( void *vsip );
|
||||
void nsldapi_mark_select_write( LDAP *ld, Sockbuf *sb );
|
||||
void nsldapi_mark_select_read( LDAP *ld, Sockbuf *sb );
|
||||
void nsldapi_mark_select_clear( LDAP *ld, Sockbuf *sb );
|
||||
int nsldapi_is_read_ready( LDAP *ld, Sockbuf *sb );
|
||||
int nsldapi_is_write_ready( LDAP *ld, Sockbuf *sb );
|
||||
|
||||
/*
|
||||
* if referral.c
|
||||
*/
|
||||
int nsldapi_parse_reference( LDAP *ld, BerElement *rber, char ***referralsp,
|
||||
LDAPControl ***serverctrlsp );
|
||||
|
||||
|
||||
/*
|
||||
* in result.c
|
||||
*/
|
||||
int ldap_msgdelete( LDAP *ld, int msgid );
|
||||
int nsldapi_result_nolock( LDAP *ld, int msgid, int all, int unlock_permitted,
|
||||
struct timeval *timeout, LDAPMessage **result );
|
||||
int nsldapi_wait_result( LDAP *ld, int msgid, int all, struct timeval *timeout,
|
||||
LDAPMessage **result );
|
||||
int nsldapi_post_result( LDAP *ld, int msgid, LDAPMessage *result );
|
||||
|
||||
/*
|
||||
* in request.c
|
||||
*/
|
||||
int nsldapi_send_initial_request( LDAP *ld, int msgid, unsigned long msgtype,
|
||||
char *dn, BerElement *ber );
|
||||
int nsldapi_alloc_ber_with_options( LDAP *ld, BerElement **berp );
|
||||
void nsldapi_set_ber_options( LDAP *ld, BerElement *ber );
|
||||
int nsldapi_ber_flush( LDAP *ld, Sockbuf *sb, BerElement *ber, int freeit,
|
||||
int async );
|
||||
int nsldapi_send_server_request( LDAP *ld, BerElement *ber, int msgid,
|
||||
LDAPRequest *parentreq, LDAPServer *srvlist, LDAPConn *lc,
|
||||
char *bindreqdn, int bind );
|
||||
LDAPConn *nsldapi_new_connection( LDAP *ld, LDAPServer **srvlistp, int use_ldsb,
|
||||
int connect, int bind );
|
||||
LDAPRequest *nsldapi_find_request_by_msgid( LDAP *ld, int msgid );
|
||||
void nsldapi_free_request( LDAP *ld, LDAPRequest *lr, int free_conn );
|
||||
void nsldapi_free_connection( LDAP *ld, LDAPConn *lc,
|
||||
LDAPControl **serverctrls, LDAPControl **clientctrls,
|
||||
int force, int unbind );
|
||||
void nsldapi_dump_connection( LDAP *ld, LDAPConn *lconns, int all );
|
||||
void nsldapi_dump_requests_and_responses( LDAP *ld );
|
||||
int nsldapi_chase_v2_referrals( LDAP *ld, LDAPRequest *lr, char **errstrp,
|
||||
int *totalcountp, int *chasingcountp );
|
||||
int nsldapi_chase_v3_refs( LDAP *ld, LDAPRequest *lr, char **refs,
|
||||
int is_reference, int *totalcountp, int *chasingcountp );
|
||||
int nsldapi_append_referral( LDAP *ld, char **referralsp, char *s );
|
||||
void nsldapi_connection_lost_nolock( LDAP *ld, Sockbuf *sb );
|
||||
|
||||
/*
|
||||
* in search.c
|
||||
*/
|
||||
int nsldapi_build_search_req( LDAP *ld, const char *base, int scope,
|
||||
const char *filter, char **attrs, int attrsonly,
|
||||
LDAPControl **serverctrls, LDAPControl **clientctrls,
|
||||
int timelimit, int sizelimit, int msgid, BerElement **berp );
|
||||
|
||||
/*
|
||||
* in unbind.c
|
||||
*/
|
||||
int ldap_ld_free( LDAP *ld, LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls, int close );
|
||||
int nsldapi_send_unbind( LDAP *ld, Sockbuf *sb, LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls );
|
||||
|
||||
#ifdef LDAP_DNS
|
||||
/*
|
||||
* in getdxbyname.c
|
||||
*/
|
||||
char **nsldapi_getdxbyname( char *domain );
|
||||
|
||||
#endif /* LDAP_DNS */
|
||||
|
||||
/*
|
||||
* in unescape.c
|
||||
*/
|
||||
void nsldapi_hex_unescape( char *s );
|
||||
|
||||
/*
|
||||
* in reslist.c
|
||||
*/
|
||||
LDAPMessage *ldap_delete_result_entry( LDAPMessage **list, LDAPMessage *e );
|
||||
void ldap_add_result_entry( LDAPMessage **list, LDAPMessage *e );
|
||||
|
||||
/*
|
||||
* in compat.c
|
||||
*/
|
||||
#ifdef HPUX
|
||||
char *nsldapi_compat_ctime_r( const time_t *clock, char *buf, int buflen );
|
||||
struct hostent *nsldapi_compat_gethostbyname_r( const char *name,
|
||||
struct hostent *result, char *buffer, int buflen, int *h_errnop );
|
||||
#endif /* HPUX */
|
||||
|
||||
/*
|
||||
* in control.c
|
||||
*/
|
||||
int nsldapi_put_controls( LDAP *ld, LDAPControl **ctrls, int closeseq,
|
||||
BerElement *ber );
|
||||
int nsldapi_get_controls( BerElement *ber, LDAPControl ***controlsp );
|
||||
int nsldapi_dup_controls( LDAP *ld, LDAPControl ***ldctrls,
|
||||
LDAPControl **newctrls );
|
||||
int nsldapi_build_control( char *oid, BerElement *ber, int freeber,
|
||||
char iscritical, LDAPControl **ctrlp );
|
||||
|
||||
|
||||
/*
|
||||
* in url.c
|
||||
*/
|
||||
int nsldapi_url_parse( const char *inurl, LDAPURLDesc **ludpp,
|
||||
int dn_required );
|
||||
|
||||
|
||||
/*
|
||||
* in charset.c
|
||||
*
|
||||
* If we ever want to expose character set translation functionality to
|
||||
* users of libldap, all of these prototypes will need to be moved to ldap.h
|
||||
*/
|
||||
#ifdef STR_TRANSLATION
|
||||
void ldap_set_string_translators( LDAP *ld,
|
||||
BERTranslateProc encode_proc, BERTranslateProc decode_proc );
|
||||
int ldap_translate_from_t61( LDAP *ld, char **bufp,
|
||||
unsigned long *lenp, int free_input );
|
||||
int ldap_translate_to_t61( LDAP *ld, char **bufp,
|
||||
unsigned long *lenp, int free_input );
|
||||
void ldap_enable_translation( LDAP *ld, LDAPMessage *entry,
|
||||
int enable );
|
||||
#ifdef LDAP_CHARSET_8859
|
||||
int ldap_t61_to_8859( char **bufp, unsigned long *buflenp,
|
||||
int free_input );
|
||||
int ldap_8859_to_t61( char **bufp, unsigned long *buflenp,
|
||||
int free_input );
|
||||
#endif /* LDAP_CHARSET_8859 */
|
||||
#endif /* STR_TRANSLATION */
|
||||
|
||||
/*
|
||||
* in memcache.h
|
||||
*/
|
||||
int ldap_memcache_createkey( LDAP *ld, const char *base, int scope,
|
||||
const char *filter, char **attrs, int attrsonly,
|
||||
LDAPControl **serverctrls, LDAPControl **clientctrls,
|
||||
unsigned long *keyp );
|
||||
int ldap_memcache_result( LDAP *ld, int msgid, unsigned long key );
|
||||
int ldap_memcache_new( LDAP *ld, int msgid, unsigned long key,
|
||||
const char *basedn );
|
||||
int ldap_memcache_append( LDAP *ld, int msgid, int bLast, LDAPMessage *result );
|
||||
int ldap_memcache_abandon( LDAP *ld, int msgid );
|
||||
|
||||
#endif /* _LDAPINT_H */
|
||||
105
mozilla/directory/c-sdk/ldap/libraries/libldap/ldapfilter.conf
Normal file
105
mozilla/directory/c-sdk/ldap/libraries/libldap/ldapfilter.conf
Normal file
@@ -0,0 +1,105 @@
|
||||
# ldap filter file
|
||||
#
|
||||
# lines like this that start with # or empty lines are ignored
|
||||
#
|
||||
# syntax:
|
||||
#
|
||||
# <tag>
|
||||
# <pattern1> <delimiters> <filter1-1> <desc1-1> [<scope>]
|
||||
# <filter1-2> <desc1-2> [<scope>]
|
||||
#
|
||||
# <pattern2> <delimiters> <filter2-1> <desc2-1> [<scope>] ...
|
||||
#
|
||||
# The "desc" should describe the filter and it should correctly complete
|
||||
# both of the following phrases:
|
||||
#
|
||||
# One <desc> match was found for...
|
||||
# Three <desc> matches were found for...
|
||||
#
|
||||
# The scope is optional, and should be one of:
|
||||
# "base"
|
||||
# "onelevel"
|
||||
# "subtree"
|
||||
# if it is included.
|
||||
#
|
||||
|
||||
"finger and ud and go500 and go500gw subtree and web500gw subtree and rp500 and rcpt500 and ufn last"
|
||||
"=" " " "%v" "arbitrary filter"
|
||||
|
||||
"^[0-9][0-9-]*$" " " "(telephoneNumber=*%v)" "phone number"
|
||||
|
||||
"@" " " "(mail=%v)" "email address"
|
||||
"(mail=%v*)" "start of email address"
|
||||
|
||||
"^.[. _].*" ". _" "(cn=%v1* %v2-)" "first initial"
|
||||
|
||||
".*[. _].$" ". _" "(cn=%v1-*)" "last initial"
|
||||
|
||||
"[. _]" ". _" "(|(sn=%v1-)(cn=%v1-))" "exact"
|
||||
"(|(sn~=%v1-)(cn~=%v1-))" "approximate"
|
||||
|
||||
".*" ". " "(|(cn=%v1)(sn=%v1)(uid=%v1))" "exact"
|
||||
"(|(cn~=%v1)(sn~=%v1))" "approximate"
|
||||
|
||||
"go500gw onelevel and web500gw onelevel and ufn first and ufn intermediate"
|
||||
"=" " " "%v" "arbitrary filter"
|
||||
|
||||
"^..$" " " "(|(o=%v)(c=%v)(l=%v)(co=%v))" "exact"
|
||||
"(|(o~=%v)(c~=%v)(l~=%v)(co~=%v))" "approximate"
|
||||
|
||||
" " " " "(|(o=%v)(l=%v)(co=%v)(ou=%v))" "exact"
|
||||
"(|(o~=%v)(l~=%v)(co~=%v)(ou~=%v))" "approximate"
|
||||
|
||||
"\." " " "(associatedDomain=%v)" "exact"
|
||||
|
||||
".*" " " "(|(o=%v)(l=%v)(co=%v)(ou=%v))" "exact"
|
||||
"(|(o~=%v)(l~=%v)(co~=%v)(ou~=%v))" "approximate"
|
||||
|
||||
|
||||
#
|
||||
# xax500
|
||||
#
|
||||
|
||||
"xax500"
|
||||
"=" " " "(%v)" "arbitrary filter"
|
||||
|
||||
"^[0-9][0-9-]*$" " " "(telephoneNumber=*%v)" "phone number"
|
||||
|
||||
"@" " " "(mail=%v)" "email address"
|
||||
"(mail=%v*)" "start of email address"
|
||||
|
||||
"^.[. _].*" ". _" "(cn=%v1* %v2-)" "first initial"
|
||||
|
||||
".*[. _].$" ". _" "(cn=%v1-*)" "last initial"
|
||||
|
||||
"[. _]" ". _" "(|(sn=%v1-)(cn=%v1-))" "exact"
|
||||
"(|(sn~=%v1-)(cn~=%v1-))" "approximate"
|
||||
|
||||
".*" ". " "(|(cn=%v1)(sn=%v1)(uid=%v1))" "exact"
|
||||
"(|(cn=%v1)(sn~=%v1))" "approximate"
|
||||
|
||||
|
||||
"xax500-auth"
|
||||
"=" " " "(%v)" "arbitrary filter"
|
||||
|
||||
"^[0-9][0-9-]*$" " " "(telephoneNumber=*%v)" "phone number"
|
||||
|
||||
"@" " " "(mail=%v)" "email address"
|
||||
"(mail=%v*)" "start of email address"
|
||||
|
||||
"^.[. _].*" ". _" "(cn=%v1* %v2-)" "first initial"
|
||||
|
||||
".*[. _].$" ". _" "(cn=%v1-*)" "last initial"
|
||||
|
||||
"[. _]" ". _" "(|(sn=%v1-)(cn=%v1-))" "exact"
|
||||
"(|(sn~=%v1-)(cn~=%v1-))" "approximate"
|
||||
|
||||
".*" ". " "(|(cn=%v1)(sn=%v1)(uid=%v1))" "exact"
|
||||
"(|(cn=%v1)(sn~=%v1))" "approximate"
|
||||
|
||||
"list500"
|
||||
"[. _]" ". _" "(|(sn=%v1-)(cn=%v1-))" "exact"
|
||||
"(|(sn~=%v1-)(cn~=%v1-))" "approximate"
|
||||
|
||||
".*" ". " "(|(cn=%v1)(sn=%v1)(uid=%v1))" "exact"
|
||||
"(|(cn~=%v1)(sn~=%v1))" "approximate"
|
||||
242
mozilla/directory/c-sdk/ldap/libraries/libldap/ldapfriendly
Normal file
242
mozilla/directory/c-sdk/ldap/libraries/libldap/ldapfriendly
Normal file
@@ -0,0 +1,242 @@
|
||||
AD Andorra
|
||||
AE United Arab Emirates
|
||||
AF Afghanistan
|
||||
AG Antigua and Barbuda
|
||||
AI Anguilla
|
||||
AL Albania
|
||||
AM Armenia
|
||||
AN Netherlands Antilles
|
||||
AO Angola
|
||||
AQ Antarctica
|
||||
AR Argentina
|
||||
AS American Samoa
|
||||
AT Austria
|
||||
AU Australia
|
||||
AW Aruba
|
||||
AZ Azerbaijan
|
||||
BA Bosnia and Herzegowina
|
||||
BB Barbados
|
||||
BD Bangladesh
|
||||
BE Belgium
|
||||
BF Burkina Faso
|
||||
BG Bulgaria
|
||||
BH Bahrain
|
||||
BI Burundi
|
||||
BJ Benin
|
||||
BM Bermuda
|
||||
BN Brunei Darussalam
|
||||
BO Bolivia
|
||||
BR Brazil
|
||||
BS Bahamas
|
||||
BT Bhutan
|
||||
BV Bouvet Island
|
||||
BW Botswana
|
||||
BY Belarus
|
||||
BZ Belize
|
||||
CA Canada
|
||||
CC Cocos (Keeling) Islands
|
||||
CF Central African Republic
|
||||
CG Congo
|
||||
CH Switzerland
|
||||
CI Cote d'Ivoire
|
||||
CK Cook Islands
|
||||
CL Chile
|
||||
CM Cameroon
|
||||
CN China
|
||||
CO Colombia
|
||||
CR Costa Rica
|
||||
CS Former Czechoslovakia
|
||||
CU Cuba
|
||||
CV Cape Verde
|
||||
CX Christmas Island
|
||||
CY Cyprus
|
||||
CZ Czech Republic
|
||||
DE Germany
|
||||
DJ Djibouti
|
||||
DK Denmark
|
||||
DM Dominica
|
||||
DO Dominican Republic
|
||||
DZ Algeria
|
||||
EC Ecuador
|
||||
EE Estonia
|
||||
EG Egypt
|
||||
EH Western Sahara
|
||||
ER Eritrea
|
||||
ES Spain
|
||||
ET Ethiopia
|
||||
FI Finland
|
||||
FJ Fiji
|
||||
FK Falkland Islands (Malvinas)
|
||||
FM Micronesia
|
||||
FO Faroe Islands
|
||||
FR France
|
||||
FX France, Metropolitan
|
||||
GA Gabon
|
||||
GB United Kingdom
|
||||
GD Grenada
|
||||
GE Georgia
|
||||
GF French Guiana
|
||||
GH Ghana
|
||||
GI Gibraltar
|
||||
GL Greenland
|
||||
GM Gambia
|
||||
GN Guinea
|
||||
GP Guadeloupe
|
||||
GQ Equatorial Guinea
|
||||
GR Greece
|
||||
GS South Georgia and the South Sandwich Islands
|
||||
GT Guatemala
|
||||
GU Guam
|
||||
GW Guinea-Bissau
|
||||
GY Guyana
|
||||
HK Hong Kong
|
||||
HM Heard and McDonald Islands
|
||||
HN Honduras
|
||||
HR Croatia
|
||||
HT Haiti
|
||||
HU Hungary
|
||||
ID Indonesia
|
||||
IE Ireland
|
||||
IL Israel
|
||||
IN India
|
||||
IO British Indian Ocean Territory
|
||||
IQ Iraq
|
||||
IR Iran
|
||||
IS Iceland
|
||||
IT Italy
|
||||
JM Jamaica
|
||||
JO Jordan
|
||||
JP Japan
|
||||
KE Kenya
|
||||
KG Kyrgyzstan
|
||||
KH Cambodia
|
||||
KI Kiribati
|
||||
KM Comoros
|
||||
KN Saint Kitts and Nevis
|
||||
KP Korea, Democratic People's Republic of
|
||||
KR Korea, Republic of
|
||||
KW Kuwait
|
||||
KY Cayman Islands
|
||||
KZ Kazakhstan
|
||||
LA Laos
|
||||
LB Lebanon
|
||||
LC Saint Lucia
|
||||
LI Liechtenstein
|
||||
LK Sri Lanka
|
||||
LR Liberia
|
||||
LS Lesotho
|
||||
LT Lithuania
|
||||
LU Luxembourg
|
||||
LV Latvia
|
||||
LY Libya
|
||||
MA Morocco
|
||||
MC Monaco
|
||||
MD Moldova
|
||||
MG Madagascar
|
||||
MH Marshall Islands
|
||||
MK Macedonia
|
||||
ML Mali
|
||||
MM Myanmar
|
||||
MN Mongolia
|
||||
MO Macau
|
||||
MP Northern Mariana Islands
|
||||
MQ Martinique
|
||||
MR Mauritania
|
||||
MS Montserrat
|
||||
MT Malta
|
||||
MU Mauritius
|
||||
MV Maldives
|
||||
MW Malawi
|
||||
MX Mexico
|
||||
MY Malaysia
|
||||
MZ Mozambique
|
||||
NA Namibia
|
||||
NC New Caledonia
|
||||
NE Niger
|
||||
NF Norfolk Island
|
||||
NG Nigeria
|
||||
NI Nicaragua
|
||||
NL Netherlands
|
||||
NO Norway
|
||||
NP Nepal
|
||||
NR Nauru
|
||||
NU Niue
|
||||
NZ New Zealand
|
||||
OM Oman
|
||||
PA Panama
|
||||
PE Peru
|
||||
PF French Polynesia
|
||||
PG Papua New Guinea
|
||||
PH Philippines
|
||||
PK Pakistan
|
||||
PL Poland
|
||||
PM St. Pierre and Miquelon
|
||||
PN Pitcairn
|
||||
PR Puerto Rico
|
||||
PT Portugal
|
||||
PW Palau
|
||||
PY Paraguay
|
||||
QA Qatar
|
||||
RE Reunion
|
||||
RO Romania
|
||||
RU Russian Federation
|
||||
RW Rwanda
|
||||
SA Saudi Arabia
|
||||
SB Solomon Islands
|
||||
SC Seychelles
|
||||
SD Sudan
|
||||
SE Sweden
|
||||
SG Singapore
|
||||
SH St. Helena
|
||||
SI Slovenia
|
||||
SJ Svalbard and Jan Mayen Islands
|
||||
SK Slovakia (Slovak Republic)
|
||||
SL Sierra Leone
|
||||
SM San Marino
|
||||
SN Senegal
|
||||
SO Somalia
|
||||
SR Suriname
|
||||
ST Sao Tome and Principe
|
||||
SU Former Soviet Union
|
||||
SV El Salvador
|
||||
SY Syria
|
||||
SZ Swaziland
|
||||
TC Turks and Caicos Islands
|
||||
TD Chad
|
||||
TF French Southern Territories
|
||||
TG Togo
|
||||
TH Thailand
|
||||
TJ Tajikistan
|
||||
TK Tokelau
|
||||
TM Turkmenistan
|
||||
TN Tunisia
|
||||
TO Tonga
|
||||
TP East Timor
|
||||
TR Turkey
|
||||
TT Trinidad and Tobago
|
||||
TV Tuvalu
|
||||
TW Taiwan
|
||||
TZ Tanzania
|
||||
UA Ukraine
|
||||
UG Uganda
|
||||
UK United Kingdom
|
||||
UM United States Minor Outlying Islands
|
||||
US United States of America
|
||||
UY Uruguay
|
||||
UZ Uzbekistan
|
||||
VA Vatican City State (Holy See)
|
||||
VC Saint Vincent and the Grenadines
|
||||
VE Venezuela
|
||||
VG Virgin Islands (British)
|
||||
VI Virgin Islands (U.S.)
|
||||
VN Viet Nam
|
||||
VU Vanuatu
|
||||
WF Wallis and Futuna Islands
|
||||
WS Samoa
|
||||
YE Yemen
|
||||
YT Mayotte
|
||||
YU Yugoslavia
|
||||
ZA South Africa
|
||||
ZM Zambia
|
||||
ZR Zaire
|
||||
ZW Zimbabwe
|
||||
@@ -0,0 +1,153 @@
|
||||
# Version should be 1 now
|
||||
Version 1
|
||||
#
|
||||
#
|
||||
# Name for this search object
|
||||
People
|
||||
# options (the only one supported right now is "internal" which means that
|
||||
# this search object should not be presented directly to the user)
|
||||
# use "" for none
|
||||
""
|
||||
# Label to place before text box user types in
|
||||
"Search For:"
|
||||
# Filter prefix to append to all "More Choices" searches
|
||||
"(&(objectClass=person)"
|
||||
# Tag to use for "Fewer Choices" searches - from ldapfilter.conf file
|
||||
"xax500"
|
||||
# If a search results in > 1 match, retrieve this attribute to help
|
||||
# user disambiguate the entries...
|
||||
title
|
||||
# ...and label it with this string:
|
||||
"Title"
|
||||
# Search scope to use when searching
|
||||
subtree
|
||||
# Follows a list of "More Choices" search options. Format is:
|
||||
# Label, attribute, select-bitmap, extra attr display name, extra attr ldap name
|
||||
# If last two are null, "Fewer Choices" name/attributes used
|
||||
"Common Name" cn 11111 "" ""
|
||||
"Surname" sn 11111 "" ""
|
||||
"Business Phone" "telephoneNumber" 11101 "" ""
|
||||
"E-Mail Address" "mail" 11111 "" ""
|
||||
"Uniqname" "uid" 11111 "" ""
|
||||
"Title" title 11111 "" ""
|
||||
END
|
||||
# Match types
|
||||
"exactly matches" "(%a=%v))"
|
||||
"approximately matches" "(%a~=%v))"
|
||||
"starts with" "(%a=%v*))"
|
||||
"ends with" "(%a=*%v))"
|
||||
"contains" "(%a=*%v*))"
|
||||
END
|
||||
#
|
||||
#
|
||||
#
|
||||
Groups
|
||||
""
|
||||
"Search For:"
|
||||
"(&(objectClass=rfc822MailGroup)"
|
||||
"xax500"
|
||||
multilineDescription
|
||||
"Description"
|
||||
subtree
|
||||
"Common Name" cn 11111 "" ""
|
||||
"Description" multilineDescription 11101 "" ""
|
||||
"Owner" "owner" 00001 "owner" "Owner"
|
||||
"LDAP Member" "member" 00001 "" ""
|
||||
"E-Mail Member" "mail" 00101 "" ""
|
||||
END
|
||||
"exactly matches" "(%a=%v))"
|
||||
"approximately matches" "(%a~=%v))"
|
||||
"starts with" "(%a=%v*))"
|
||||
"ends with" "(%a=*%v))"
|
||||
"contains" "(%a=*%v*))"
|
||||
END
|
||||
#
|
||||
#
|
||||
#
|
||||
"Joinable Groups"
|
||||
""
|
||||
"Search For:"
|
||||
"(&(&(objectClass=rfc822MailGroup)(joinable=TRUE))"
|
||||
"xax500"
|
||||
multilineDescription
|
||||
"Description"
|
||||
subtree
|
||||
"Common Name" cn 11111 "" ""
|
||||
"Description" multilineDescription 11101 "" ""
|
||||
"Owner" "owner" 00001 "owner" "Owner"
|
||||
"LDAP Member" "member" 00001 "" ""
|
||||
"E-Mail Member" "mail" 00101 "" ""
|
||||
END
|
||||
"exactly matches" "(%a=%v))"
|
||||
"approximately matches" "(%a~=%v))"
|
||||
"starts with" "(%a=%v*))"
|
||||
"ends with" "(%a=*%v))"
|
||||
"contains" "(%a=*%v*))"
|
||||
END
|
||||
#
|
||||
#
|
||||
#
|
||||
Services
|
||||
""
|
||||
"Search For:"
|
||||
"(&(objectClass=service)"
|
||||
"xax500"
|
||||
multilineDescription
|
||||
"Description"
|
||||
subtree
|
||||
"Common Name" cn 11111 "" ""
|
||||
"Description" multilineDescription 11101 "" ""
|
||||
"Owner" "owner" 00001 "owner" "Owner"
|
||||
"Keywords" "keywords" 11111 "" ""
|
||||
"Hours" "hoursOfOperation" 11111 "" ""
|
||||
END
|
||||
"exactly matches" "(%a=%v))"
|
||||
"approximately matches" "(%a~=%v))"
|
||||
"starts with" "(%a=%v*))"
|
||||
"ends with" "(%a=*%v))"
|
||||
"contains" "(%a=*%v*))"
|
||||
END
|
||||
#
|
||||
#
|
||||
#
|
||||
Organizations
|
||||
""
|
||||
"Search For:"
|
||||
"(&(objectClass=organization)"
|
||||
"xax500"
|
||||
multilineDescription
|
||||
"Description"
|
||||
subtree
|
||||
"Name" organizationName 01111 "" ""
|
||||
"Location" localityName 11111 "" ""
|
||||
"Phone Number" "telephoneNumber" 10111 "" ""
|
||||
"Description" description 10111 "" ""
|
||||
END
|
||||
"exactly matches" "(%a=%v))"
|
||||
"approximately matches" "(%a~=%v))"
|
||||
"starts with" "(%a=%v*))"
|
||||
"ends with" "(%a=*%v))"
|
||||
"contains" "(%a=*%v*))"
|
||||
END
|
||||
#
|
||||
#
|
||||
#
|
||||
Documents
|
||||
""
|
||||
"Search For:"
|
||||
"(&(objectClass=document)"
|
||||
"xax500"
|
||||
multilineDescription
|
||||
"Description"
|
||||
subtree
|
||||
"Document Title" cn 11111 "" ""
|
||||
"Keyword" "keywords" 11111 "" ""
|
||||
"Category" "category" 11111 "" ""
|
||||
"Document Number" "documentIdentifier" 11111 "" ""
|
||||
END
|
||||
"exactly matches" "(%a=%v))"
|
||||
"approximately matches" "(%a~=%v))"
|
||||
"starts with" "(%a=%v*))"
|
||||
"ends with" "(%a=*%v))"
|
||||
"contains" "(%a=*%v*))"
|
||||
END
|
||||
@@ -0,0 +1,677 @@
|
||||
##########################################################################
|
||||
# LDAP display templates
|
||||
##########################################################################
|
||||
|
||||
#
|
||||
# Version must be 1
|
||||
#
|
||||
Version 1
|
||||
|
||||
##########################################################################
|
||||
# U-M Person template
|
||||
##########################################################################
|
||||
#
|
||||
# template name and plural name come first
|
||||
"U-M Person"
|
||||
"U-M People"
|
||||
|
||||
# name of the icon that is associated with this template
|
||||
"person icon"
|
||||
|
||||
# blank-separated list of template options ("" for none)
|
||||
# addable - end-user should be allowed to add these types of entries
|
||||
# modrdn - end-user can change the name of these entries
|
||||
# altview - this template is referred to in another template's
|
||||
# "linkact" item
|
||||
"addable"
|
||||
|
||||
#
|
||||
# objectclass list
|
||||
umichPerson person
|
||||
END
|
||||
|
||||
#
|
||||
# name of attribute to authenticate as ("" means auth as this entry)
|
||||
""
|
||||
|
||||
#
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
#
|
||||
cn
|
||||
|
||||
#
|
||||
# default location when adding new entries (DN; "" means no default)
|
||||
"o=University of Michigan, c=US"
|
||||
|
||||
#
|
||||
# rules used to define default values for new entries
|
||||
END
|
||||
|
||||
#
|
||||
#
|
||||
# list of items for display
|
||||
# each line is either:
|
||||
# item (type) (attribute) (attr name) (extra args...)
|
||||
# to define an item or
|
||||
# samerow
|
||||
# to keep the next item on the same row as the previous
|
||||
#
|
||||
# valid types are:
|
||||
# cis - case ignore string
|
||||
# mls - multiline string
|
||||
# dn -
|
||||
# mail - case ignore string that contains an RFC822 mail address
|
||||
# bool - boolean value
|
||||
# jpeg - inlined JPEG image
|
||||
# jpegbtn - JPEG image button
|
||||
# fax - inlined Fax image
|
||||
# faxbtn - Fax image button
|
||||
# audiobtn - audio button
|
||||
# time - time value
|
||||
# date - time value displayed as a date only
|
||||
# url - labeled URL for links to items in WWW
|
||||
# searchact - search action
|
||||
# linkact - link to another template
|
||||
#
|
||||
# valid options (comma separated list appended to the type) are:
|
||||
# ro - attribute is read only; don't let user edit it
|
||||
# sort - order the values of this attribute
|
||||
# 1val - disallow entry of multiple values
|
||||
# required - this attribute should have at least one value
|
||||
# hide - don't show this item if attribute has no values
|
||||
# hideiffalse - hide item if value is FALSE (for type 'bool' only)
|
||||
#
|
||||
item jpegbtn "View Photo" jpegPhoto "Next Photo"
|
||||
item audiobtn "Play Sound" audio
|
||||
item cis,ro,sort "Also Known As" cn
|
||||
item mail "E-Mail Address" mail
|
||||
item cis "Work Phone" telephoneNumber
|
||||
item cis "Fax Number" facsimileTelephoneNumber
|
||||
item cis "Pager Number" pager
|
||||
item mls "Work Address" postalAddress
|
||||
item cis,sort "Title" title
|
||||
item cis,ro "Uniqname" uid
|
||||
item mls "Description" multiLineDescription
|
||||
item cis "Home Phone" homePhone
|
||||
item mls "Home Address" homePostalAddress
|
||||
item url "More Info (URL)" labeledURL
|
||||
item dn,sort "See Also" seeAlso
|
||||
item cis "Favorite Beverage" drink
|
||||
item cis "Notice" notice
|
||||
item bool,hideiffalse "On Vacation" onVacation
|
||||
item mls,1val "Vacation Message" vacationMessage
|
||||
item bool,hideiffalse "Do Not Allow Updates" noBatchUpdates
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
item searchact "Find Groups Added To" "" "-dnt" "(&(objectclass=rfc822mailgroup)(member=%v))" "multiLineDescription" "Description" ""
|
||||
item searchact "List Owned Groups" "" "-dnt" "(&(objectclass=rfc822mailgroup)(owner=%v))" "title" "Title" ""
|
||||
item linkact "Other Addresses" "" "other addresses"
|
||||
END
|
||||
|
||||
|
||||
##########################################################################
|
||||
# Person template
|
||||
##########################################################################
|
||||
"Person"
|
||||
"People"
|
||||
"person icon"
|
||||
|
||||
# template options
|
||||
addable
|
||||
#
|
||||
# objectclass list
|
||||
person
|
||||
END
|
||||
# name of attribute to authenticate as
|
||||
""
|
||||
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
#
|
||||
cn
|
||||
|
||||
# default location when adding new entries
|
||||
""
|
||||
|
||||
#
|
||||
# rules used to define default values for new entries
|
||||
END
|
||||
|
||||
#
|
||||
# list of items for display
|
||||
item jpegbtn "View Photo" jpegPhoto "Next Photo"
|
||||
item audiobtn "Play Sound" audio
|
||||
item cis,sort "Also Known As" cn
|
||||
item cis,sort "Title" title
|
||||
item mls "Work Address" postalAddress
|
||||
item cis "Work Phone" telephoneNumber
|
||||
item cis "Fax Number" facsimileTelephoneNumber
|
||||
item cis "Pager Number" pager
|
||||
item mls "Home Address" homePostalAddress
|
||||
item cis "Home Phone" homePhone
|
||||
item cis "User ID" uid
|
||||
item mail "E-Mail Address" mail
|
||||
item cis "Description" description
|
||||
item cis "Favorite Beverage" drink
|
||||
item dn,sort "See Also" seeAlso
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
END
|
||||
|
||||
|
||||
##########################################################################
|
||||
# Group template
|
||||
##########################################################################
|
||||
"Group"
|
||||
"Groups"
|
||||
"group icon"
|
||||
|
||||
# template options
|
||||
addable modrdn
|
||||
|
||||
# objectclass list
|
||||
rfc822MailGroup
|
||||
END
|
||||
|
||||
# name of attribute to authenticate as
|
||||
"owner"
|
||||
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
#
|
||||
cn
|
||||
|
||||
# default location when adding new entries
|
||||
"ou=User Groups, ou=Groups, o=University of Michigan, c=US"
|
||||
|
||||
#
|
||||
# rules used to define default values for new entries
|
||||
constant "associatedDomain" "umich.edu"
|
||||
constant "joinable" "FALSE"
|
||||
addersdn "owner"
|
||||
addersdn "member"
|
||||
addersdn "errorsTo"
|
||||
addersdn "requestsTo"
|
||||
END
|
||||
|
||||
#
|
||||
#
|
||||
# list of items for display
|
||||
# each line is either:
|
||||
# item (type) (attribute) (attr name) (extra args...)
|
||||
# to define an item or
|
||||
# samerow
|
||||
#
|
||||
# list of items for display
|
||||
item cis,sort "Also Known As" cn
|
||||
item mls "Description" multiLineDescription
|
||||
item cis "Phone Number" telephoneNumber
|
||||
item cis "Fax Number" facsimileTelephoneNumber
|
||||
item mls "Address" postalAddress
|
||||
item dn,required,sort "Owner" owner
|
||||
item url "More Info (URL)" labeledURL
|
||||
item dn,sort "See Also" seeAlso
|
||||
item dn,sort "Errors To" errorsTo
|
||||
item dn,sort "Requests To" requestsTo
|
||||
item cis "Associated Domain" associatedDomain
|
||||
item cis "Moderator" moderator
|
||||
item bool "Suppress 'No E-Mail Address' Errors" suppressNoEmailError
|
||||
item bool "Others May Join" joinable
|
||||
item dn,sort "LDAP Members" member
|
||||
item mail,sort "E-Mail Errors To" rfc822ErrorsTo
|
||||
item mail,sort "E-Mail Requests To" rfc822RequestsTo
|
||||
item mail,sort "E-Mail Members" mail
|
||||
item cis "Notice" notice
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
item searchact "Subscribers" "" "-dnt" "memberOfGroup=%v" "title" "Title" "joinable"
|
||||
item verifyact "Verify Members" "member" "mail" "E-Mail Address"
|
||||
END
|
||||
|
||||
##########################################################################
|
||||
# Organization template
|
||||
##########################################################################
|
||||
"Organization"
|
||||
"Organizations"
|
||||
"organization icon"
|
||||
|
||||
# template options
|
||||
""
|
||||
|
||||
# objectclass list
|
||||
organization
|
||||
END
|
||||
|
||||
# name of attribute to authenticate as
|
||||
""
|
||||
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
o
|
||||
|
||||
# default location when adding new entries
|
||||
""
|
||||
|
||||
# rules used to define default values for new entries
|
||||
constant "o" "foo"
|
||||
END
|
||||
|
||||
#
|
||||
#
|
||||
# list of items for display
|
||||
# each line is either:
|
||||
# item (type) (attribute) (attr name) (extra args...)
|
||||
# to define an item or
|
||||
# samerow
|
||||
#
|
||||
# list of items for display
|
||||
item cis,sort "Name" o
|
||||
item cis "Location" l
|
||||
item mls "Address" postalAddress
|
||||
item cis "Phone Number" telephoneNumber
|
||||
item cis "Fax Number" facsimileTelephoneNumber
|
||||
item cis "Description" description
|
||||
item dn,sort "See Also" seeAlso
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
END
|
||||
|
||||
|
||||
##########################################################################
|
||||
# Service template
|
||||
##########################################################################
|
||||
"Service"
|
||||
"Services"
|
||||
"service icon"
|
||||
|
||||
# template options
|
||||
"addable"
|
||||
|
||||
# objectclass list
|
||||
service
|
||||
END
|
||||
|
||||
# name of attribute to authenticate as
|
||||
"owner"
|
||||
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
cn
|
||||
|
||||
# default location when adding new entries
|
||||
"ou=Services, o=University of Michigan, c=US"
|
||||
|
||||
# rules used to define default values for new entries
|
||||
addersdn "owner"
|
||||
END
|
||||
|
||||
#
|
||||
#
|
||||
# list of items for display
|
||||
# each line is either:
|
||||
# item (type) (attribute) (attr name) (extra args...)
|
||||
# to define an item or
|
||||
# samerow
|
||||
#
|
||||
# list of items for display
|
||||
item jpegbtn "View Photo" jpegPhoto
|
||||
item cis,sort "Name" cn
|
||||
item mls "Description" multilineDescription
|
||||
item cis "Provider" provider
|
||||
item cis,sort "Service Area" serviceArea
|
||||
item mail "E-mail Address" mail
|
||||
item cis "Phone" telephoneNumber
|
||||
item cis "Fax Number" facsimileTelephoneNumber
|
||||
item mls "Postal Address" postalAddress
|
||||
item cis "Hours" hoursOfOperation
|
||||
item url "More Info (URL)" labeledURL
|
||||
item dn,sort "Depends On" dependentUpon
|
||||
item dn,sort "See Also" seeAlso
|
||||
item cis,sort "Platform" platform
|
||||
item cis,sort "Product" product
|
||||
item cis,sort "Keywords" keywords
|
||||
item cis "FCE Rating" serviceRating
|
||||
item date "Date Rated" ratingTime
|
||||
item mls "Rating Description" ratingDescription
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
item dn,required,sort "Owner" owner
|
||||
END
|
||||
|
||||
|
||||
##########################################################################
|
||||
# Organizational Role template
|
||||
##########################################################################
|
||||
"Organizational Role"
|
||||
"Organizational Roles"
|
||||
"person icon"
|
||||
|
||||
# template options
|
||||
""
|
||||
|
||||
# objectclass list
|
||||
organizationalRole
|
||||
END
|
||||
|
||||
# name of attribute to authenticate as
|
||||
""
|
||||
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
cn
|
||||
|
||||
# default location when adding new entries
|
||||
""
|
||||
|
||||
# rules used to define default values for new entries
|
||||
END
|
||||
|
||||
#
|
||||
#
|
||||
# list of items for display
|
||||
# each line is either:
|
||||
# item (type) (attribute) (attr name) (extra args...)
|
||||
# to define an item or
|
||||
# samerow
|
||||
#
|
||||
# list of items for display
|
||||
item cis,sort "Name" cn
|
||||
item cis "Description" description
|
||||
item dn "Role Occupant" roleOccupant
|
||||
item dn,sort "See Also" seeAlso
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
END
|
||||
|
||||
|
||||
##########################################################################
|
||||
# Organizational Unit template
|
||||
##########################################################################
|
||||
"Organizational Unit"
|
||||
"Organizational Units"
|
||||
"organization icon"
|
||||
|
||||
# template options
|
||||
""
|
||||
|
||||
# objectclass list
|
||||
organizationalUnit
|
||||
END
|
||||
|
||||
# name of attribute to authenticate as
|
||||
""
|
||||
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
cn
|
||||
|
||||
# default location when adding new entries
|
||||
""
|
||||
|
||||
# rules used to define default values for new entries
|
||||
END
|
||||
|
||||
# Item list
|
||||
item cis "Organization Unit Name" ou
|
||||
item cis "Title" title
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
END
|
||||
|
||||
|
||||
|
||||
##########################################################################
|
||||
# Application Entity template
|
||||
##########################################################################
|
||||
"Application Entity"
|
||||
"Application Entities"
|
||||
"application icon"
|
||||
|
||||
# template options
|
||||
""
|
||||
|
||||
# objectclass list
|
||||
applicationEntity
|
||||
END
|
||||
|
||||
# name of attribute to authenticate as
|
||||
""
|
||||
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
cn
|
||||
|
||||
# default location when adding new entries
|
||||
""
|
||||
|
||||
# rules used to define default values for new entries
|
||||
END
|
||||
|
||||
# Item list
|
||||
item cis,sort "Name" cn
|
||||
item cis "Location" l
|
||||
item cis "Description" description
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
END
|
||||
|
||||
##########################################################################
|
||||
# Document template
|
||||
##########################################################################
|
||||
"Document"
|
||||
"Documents"
|
||||
"document icon"
|
||||
|
||||
# template options
|
||||
""
|
||||
|
||||
# objectclass list
|
||||
document
|
||||
umichDocument
|
||||
END
|
||||
|
||||
# name of attribute to authenticate as
|
||||
""
|
||||
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
cn
|
||||
|
||||
# default location when adding new entries
|
||||
""
|
||||
|
||||
# rules used to define default values for new entries
|
||||
END
|
||||
|
||||
#
|
||||
# Item list
|
||||
item cis "Document ID" documentIdentifier
|
||||
item cis "Title" documentTitle
|
||||
item cis "Series Title" documentSeriesTitle
|
||||
item cis "Version" documentVersion
|
||||
item cis,sort "Service Area" serviceArea
|
||||
item mls "Abstract" multiLineAbstract
|
||||
item url "More Info (URL)" labeledURL
|
||||
item dn,sort "Availability" documentAvailable
|
||||
item dn,sort "See Also" seeAlso
|
||||
item cis,sort "Platform" platform
|
||||
item cis,sort "Product" product
|
||||
item cis,sort "Keyword" keywords
|
||||
item dn,sort "Author" documentAuthor
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
item dn,required "Owner" owner
|
||||
END
|
||||
|
||||
##########################################################################
|
||||
# Document description template
|
||||
##########################################################################
|
||||
"DocumentDescription"
|
||||
"DocumentDescriptions"
|
||||
"document description icon"
|
||||
|
||||
# template options
|
||||
""
|
||||
|
||||
# objectclass list
|
||||
documentDescription
|
||||
END
|
||||
|
||||
# name of attribute to authenticate as
|
||||
""
|
||||
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
cn
|
||||
|
||||
# default location when adding new entries
|
||||
""
|
||||
|
||||
# rules used to define default values for new entries
|
||||
END
|
||||
|
||||
#
|
||||
# Item list
|
||||
item mls "Description" multilineDescription
|
||||
item url "More Info (URL)" labeledURL
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
item dn,required "Owner" owner
|
||||
END
|
||||
|
||||
##########################################################################
|
||||
# Image template
|
||||
##########################################################################
|
||||
"Image"
|
||||
"Images"
|
||||
"image icon"
|
||||
|
||||
# template options
|
||||
""
|
||||
|
||||
# objectclass list
|
||||
image
|
||||
END
|
||||
|
||||
# name of attribute to authenticate as
|
||||
""
|
||||
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
cn
|
||||
|
||||
# default location when adding new entries
|
||||
""
|
||||
|
||||
# rules used to define default values for new entries
|
||||
END
|
||||
|
||||
#
|
||||
# Item list
|
||||
item cis "Name" cn
|
||||
item mls "Description" multilineDescription
|
||||
item jpegbtn "View Photo(s)" jpegPhoto
|
||||
item cis "Citation" citation
|
||||
item cis "Copyright" copyright
|
||||
item cis "Keywords" keywords
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
item dn,required "Owner" owner
|
||||
END
|
||||
|
||||
|
||||
|
||||
##########################################################################
|
||||
# Country template
|
||||
##########################################################################
|
||||
"Country"
|
||||
"Countries"
|
||||
"country icon"
|
||||
|
||||
# template options
|
||||
""
|
||||
|
||||
# objectclass list
|
||||
friendlyCountry
|
||||
END
|
||||
|
||||
# name of attribute to authenticate as
|
||||
""
|
||||
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
c
|
||||
|
||||
# default location when adding new entries
|
||||
""
|
||||
|
||||
# rules used to define default values for new entries
|
||||
END
|
||||
|
||||
# Item list
|
||||
item cis "Country Name" co
|
||||
item cis "Country Code" c
|
||||
item cis "Description" description
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
END
|
||||
|
||||
##########################################################################
|
||||
# Locality template
|
||||
##########################################################################
|
||||
"Locality"
|
||||
"Localities"
|
||||
"locality icon"
|
||||
|
||||
# template options
|
||||
""
|
||||
|
||||
# objectclass list
|
||||
locality
|
||||
END
|
||||
|
||||
# name of attribute to authenticate as
|
||||
""
|
||||
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
l
|
||||
|
||||
# default location when adding new entries
|
||||
""
|
||||
|
||||
# rules used to define default values for new entries
|
||||
END
|
||||
|
||||
#
|
||||
# Item list
|
||||
item cis "Name" l
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
END
|
||||
|
||||
|
||||
##########################################################################
|
||||
# "Other Addresses" template
|
||||
##########################################################################
|
||||
"Others Addresses"
|
||||
"Other Addresses"
|
||||
"other addr icon"
|
||||
|
||||
# template options
|
||||
"altview"
|
||||
|
||||
# objectclass list
|
||||
END
|
||||
|
||||
# name of attribute to authenticate as
|
||||
""
|
||||
|
||||
# default attribute name to use when forming RDN of a new entry
|
||||
""
|
||||
|
||||
# default location when adding new entries
|
||||
""
|
||||
|
||||
# rules used to define default values for new entries
|
||||
END
|
||||
|
||||
# Item list
|
||||
item cis "Street Address" streetAddress
|
||||
item cis "Locality" l
|
||||
item cis "State or Province" st
|
||||
item cis "Postal Code" postalCode
|
||||
item cis,hide "X.400 Address" mhsORAddresses
|
||||
item cis,hide "X.400 Address" textEncodedORAddress
|
||||
Item cis "Other Mailbox" otherMailbox
|
||||
item time,ro "Last Modified" lastModifiedTime
|
||||
item dn,ro "Modified By" lastModifiedBy
|
||||
END
|
||||
2188
mozilla/directory/c-sdk/ldap/libraries/libldap/memcache.c
Normal file
2188
mozilla/directory/c-sdk/ldap/libraries/libldap/memcache.c
Normal file
File diff suppressed because it is too large
Load Diff
90
mozilla/directory/c-sdk/ldap/libraries/libldap/message.c
Normal file
90
mozilla/directory/c-sdk/ldap/libraries/libldap/message.c
Normal file
@@ -0,0 +1,90 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#include "ldap-int.h"
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_msgid( LDAPMessage *lm )
|
||||
{
|
||||
if ( !NSLDAPI_VALID_LDAPMESSAGE_POINTER( lm )) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
return( lm->lm_msgid );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_msgtype( LDAPMessage *lm )
|
||||
{
|
||||
if ( !NSLDAPI_VALID_LDAPMESSAGE_POINTER( lm )) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
return( lm->lm_msgtype );
|
||||
}
|
||||
|
||||
|
||||
LDAPMessage *
|
||||
LDAP_CALL
|
||||
ldap_first_message( LDAP *ld, LDAPMessage *chain )
|
||||
{
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( NULLMSG ); /* punt */
|
||||
}
|
||||
|
||||
return( chain );
|
||||
}
|
||||
|
||||
|
||||
LDAPMessage *
|
||||
LDAP_CALL
|
||||
ldap_next_message( LDAP *ld, LDAPMessage *msg )
|
||||
{
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( NULLMSG ); /* punt */
|
||||
}
|
||||
|
||||
if ( msg == NULLMSG || msg->lm_chain == NULLMSG ) {
|
||||
return( NULLMSG );
|
||||
}
|
||||
|
||||
return( msg->lm_chain );
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_count_messages( LDAP *ld, LDAPMessage *chain )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
for ( i = 0; chain != NULL; chain = chain->lm_chain ) {
|
||||
i++;
|
||||
}
|
||||
|
||||
return( i );
|
||||
}
|
||||
211
mozilla/directory/c-sdk/ldap/libraries/libldap/modify.c
Normal file
211
mozilla/directory/c-sdk/ldap/libraries/libldap/modify.c
Normal file
@@ -0,0 +1,211 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* modify.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
/*
|
||||
* ldap_modify - initiate an ldap modify operation. Parameters:
|
||||
*
|
||||
* ld LDAP descriptor
|
||||
* dn DN of the object to modify
|
||||
* mods List of modifications to make. This is null-terminated
|
||||
* array of struct ldapmod's, specifying the modifications
|
||||
* to perform.
|
||||
*
|
||||
* Example:
|
||||
* LDAPMod *mods[] = {
|
||||
* { LDAP_MOD_ADD, "cn", { "babs jensen", "babs", 0 } },
|
||||
* { LDAP_MOD_REPLACE, "sn", { "jensen", 0 } },
|
||||
* 0
|
||||
* }
|
||||
* msgid = ldap_modify( ld, dn, mods );
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_modify( LDAP *ld, const char *dn, LDAPMod **mods )
|
||||
{
|
||||
int msgid;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_modify\n", 0, 0, 0 );
|
||||
|
||||
if ( ldap_modify_ext( ld, dn, mods, NULL, NULL, &msgid )
|
||||
== LDAP_SUCCESS ) {
|
||||
return( msgid );
|
||||
} else {
|
||||
return( -1 ); /* error is in ld handle */
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_modify_ext( LDAP *ld, const char *dn, LDAPMod **mods,
|
||||
LDAPControl **serverctrls, LDAPControl **clientctrls, int *msgidp )
|
||||
{
|
||||
BerElement *ber;
|
||||
int i, rc, lderr;
|
||||
|
||||
/*
|
||||
* A modify request looks like this:
|
||||
* ModifyRequet ::= SEQUENCE {
|
||||
* object DistinguishedName,
|
||||
* modifications SEQUENCE OF SEQUENCE {
|
||||
* operation ENUMERATED {
|
||||
* add (0),
|
||||
* delete (1),
|
||||
* replace (2)
|
||||
* },
|
||||
* modification SEQUENCE {
|
||||
* type AttributeType,
|
||||
* values SET OF AttributeValue
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_modify_ext\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
if ( !NSLDAPI_VALID_LDAPMESSAGE_POINTER( msgidp ))
|
||||
{
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( !NSLDAPI_VALID_NONEMPTY_LDAPMOD_ARRAY( mods )) {
|
||||
lderr = LDAP_PARAM_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
|
||||
return( lderr );
|
||||
}
|
||||
if ( dn == NULL ) {
|
||||
dn = "";
|
||||
}
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK );
|
||||
*msgidp = ++ld->ld_msgid;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK );
|
||||
|
||||
/* see if we should add to the cache */
|
||||
if ( ld->ld_cache_on && ld->ld_cache_modify != NULL ) {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
|
||||
if ( (rc = (ld->ld_cache_modify)( ld, *msgidp, LDAP_REQ_MODIFY,
|
||||
dn, mods )) != 0 ) {
|
||||
*msgidp = rc;
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
}
|
||||
|
||||
/* create a message to send */
|
||||
if (( lderr = nsldapi_alloc_ber_with_options( ld, &ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
if ( ber_printf( ber, "{it{s{", *msgidp, LDAP_REQ_MODIFY, dn )
|
||||
== -1 ) {
|
||||
lderr = LDAP_ENCODING_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
/* for each modification to be performed... */
|
||||
for ( i = 0; mods[i] != NULL; i++ ) {
|
||||
if (( mods[i]->mod_op & LDAP_MOD_BVALUES) != 0 ) {
|
||||
rc = ber_printf( ber, "{e{s[V]}}",
|
||||
mods[i]->mod_op & ~LDAP_MOD_BVALUES,
|
||||
mods[i]->mod_type, mods[i]->mod_bvalues );
|
||||
} else {
|
||||
rc = ber_printf( ber, "{e{s[v]}}", mods[i]->mod_op,
|
||||
mods[i]->mod_type, mods[i]->mod_values );
|
||||
}
|
||||
|
||||
if ( rc == -1 ) {
|
||||
lderr = LDAP_ENCODING_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( lderr );
|
||||
}
|
||||
}
|
||||
|
||||
if ( ber_printf( ber, "}}" ) == -1 ) {
|
||||
lderr = LDAP_ENCODING_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, lderr, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
if (( lderr = nsldapi_put_controls( ld, serverctrls, 1, ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
ber_free( ber, 1 );
|
||||
return( lderr );
|
||||
}
|
||||
|
||||
/* send the message */
|
||||
rc = nsldapi_send_initial_request( ld, *msgidp, LDAP_REQ_MODIFY,
|
||||
(char *)dn, ber );
|
||||
*msgidp = rc;
|
||||
return( rc < 0 ? LDAP_GET_LDERRNO( ld, NULL, NULL ) : LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_modify_s( LDAP *ld, const char *dn, LDAPMod **mods )
|
||||
{
|
||||
return( ldap_modify_ext_s( ld, dn, mods, NULL, NULL ));
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_modify_ext_s( LDAP *ld, const char *dn, LDAPMod **mods,
|
||||
LDAPControl **serverctrls, LDAPControl **clientctrls )
|
||||
{
|
||||
int msgid, err;
|
||||
LDAPMessage *res;
|
||||
|
||||
if (( err = ldap_modify_ext( ld, dn, mods, serverctrls, clientctrls,
|
||||
&msgid )) != LDAP_SUCCESS ) {
|
||||
return( err );
|
||||
}
|
||||
|
||||
if ( ldap_result( ld, msgid, 1, (struct timeval *)NULL, &res ) == -1 ) {
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
}
|
||||
|
||||
return( ldap_result2error( ld, res, 1 ) );
|
||||
}
|
||||
694
mozilla/directory/c-sdk/ldap/libraries/libldap/mozock.c
Normal file
694
mozilla/directory/c-sdk/ldap/libraries/libldap/mozock.c
Normal file
@@ -0,0 +1,694 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#include <windows.h>
|
||||
#include <winsock.h>
|
||||
#include <string.h>
|
||||
|
||||
// Purpose of this file is to implement an intermediate layer to our network
|
||||
// services, the winsock.
|
||||
// This intermediate layer will be able to function with and without a working
|
||||
// winsock being present.
|
||||
// The attempt to activate the winsock happens as would normally be expected,
|
||||
// through the calling application's entry point to us, WSAStartup.
|
||||
|
||||
|
||||
// Name of the winsock we would like to load.
|
||||
// Diffs between OSs, Win32s is out in the cold if running 32 bits unless
|
||||
// they also have a winsock name wsock32.dll.
|
||||
#ifndef _WIN32
|
||||
#define SZWINSOCK "winsock.dll"
|
||||
#else
|
||||
#define SZWINSOCK "wsock32.dll"
|
||||
#endif
|
||||
|
||||
// Here is the enumeration for the winsock functions we have currently
|
||||
// overridden (needed to run). Add more when needed.
|
||||
// We use these to access proc addresses, and to hold a table of strings
|
||||
// to obtain the proc addresses.
|
||||
enum SockProc {
|
||||
sp_WSAAsyncGetHostByName = 0,
|
||||
sp_WSAAsyncSelect,
|
||||
sp_WSACleanup,
|
||||
sp_WSAGetLastError,
|
||||
sp_WSASetLastError,
|
||||
sp_WSAStartup,
|
||||
sp___WSAFDIsSet,
|
||||
sp_accept,
|
||||
sp_bind,
|
||||
sp_closesocket,
|
||||
sp_connect,
|
||||
sp_gethostbyname,
|
||||
sp_gethostbyaddr,
|
||||
sp_gethostname,
|
||||
sp_getpeername,
|
||||
sp_getsockname,
|
||||
sp_getsockopt,
|
||||
sp_getprotobyname,
|
||||
sp_htonl,
|
||||
sp_htons,
|
||||
sp_inet_addr,
|
||||
sp_ioctlsocket,
|
||||
sp_listen,
|
||||
sp_ntohl,
|
||||
sp_ntohs,
|
||||
sp_recv,
|
||||
sp_select,
|
||||
sp_send,
|
||||
sp_setsockopt,
|
||||
sp_shutdown,
|
||||
sp_socket,
|
||||
sp_inet_ntoa,
|
||||
|
||||
sp_MaxProcs // Total count.
|
||||
};
|
||||
|
||||
// Array of function names used in GetProcAddress to fill in our
|
||||
// proc array when needed.
|
||||
// This array must match the enumerations exactly.
|
||||
char *spName[(int)sp_MaxProcs] = {
|
||||
"WSAAsyncGetHostByName",
|
||||
"WSAAsyncSelect",
|
||||
"WSACleanup",
|
||||
"WSAGetLastError",
|
||||
"WSASetLastError",
|
||||
"WSAStartup",
|
||||
"__WSAFDIsSet",
|
||||
"accept",
|
||||
"bind",
|
||||
"closesocket",
|
||||
"connect",
|
||||
"gethostbyname",
|
||||
"gethostbyaddr",
|
||||
"gethostname",
|
||||
"getpeername",
|
||||
"getsockname",
|
||||
"getsockopt",
|
||||
"getprotobyname",
|
||||
"htonl",
|
||||
"htons",
|
||||
"inet_addr",
|
||||
"ioctlsocket",
|
||||
"listen",
|
||||
"ntohl",
|
||||
"ntohs",
|
||||
"recv",
|
||||
"select",
|
||||
"send",
|
||||
"setsockopt",
|
||||
"shutdown",
|
||||
"socket",
|
||||
"inet_ntoa"
|
||||
};
|
||||
|
||||
// Array of proc addresses to the winsock functions.
|
||||
// These can be NULL, indicating their absence (as in the case we couldn't
|
||||
// load the winsock.dll or one of the functions wasn't loaded).
|
||||
// The procs assigned in must corellate with the enumerations exactly.
|
||||
FARPROC spArray[(int)sp_MaxProcs];
|
||||
|
||||
// Typedef all the different types of functions that we must cast the
|
||||
// procs to in order to call without the compiler barfing.
|
||||
// Prefix is always sp.
|
||||
// Retval is next, spelled out.
|
||||
// Parameters in their order are next, spelled out.
|
||||
typedef int (PASCAL FAR *sp_int_WORD_LPWSADATA)(WORD, LPWSADATA);
|
||||
typedef int (PASCAL FAR *sp_int_void)(void);
|
||||
typedef HANDLE (PASCAL FAR *sp_HANDLE_HWND_uint_ccharFARp_charFARp_int)(HWND, unsigned int, const char FAR *, char FAR *, int);
|
||||
typedef int (PASCAL FAR *sp_int_SOCKET_HWND_uint_long)(SOCKET, HWND, unsigned int, long);
|
||||
typedef void (PASCAL FAR *sp_void_int)(int);
|
||||
typedef int (PASCAL FAR *sp_int_SOCKET_fdsetFARp)(SOCKET, fd_set FAR *);
|
||||
typedef SOCKET(PASCAL FAR *sp_SOCKET_SOCKET_sockaddrFARp_intFARp)(SOCKET, struct sockaddr FAR *, int FAR *);
|
||||
typedef int (PASCAL FAR *sp_int_SOCKET_csockaddrFARp_int)(SOCKET, const struct sockaddr FAR *, int);
|
||||
typedef int (PASCAL FAR *sp_int_SOCKET)(SOCKET);
|
||||
typedef struct hostent FAR *(PASCAL FAR *sp_hostentFARp_ccharFARp)(const char FAR *);
|
||||
typedef struct hostent FAR *(PASCAL FAR *sp_hostentFARp_ccharFARp_int_int)(const char FAR *, int, int);
|
||||
typedef int (PASCAL FAR *sp_int_charFARp_int)(char FAR *, int);
|
||||
typedef int (PASCAL FAR *sp_int_SOCKET_sockaddrFARp_intFARp)(SOCKET, struct sockaddr FAR *, int FAR *);
|
||||
typedef int (PASCAL FAR *sp_int_SOCKET_int_int_charFARp_intFARp)(SOCKET, int, int, char FAR *, int FAR *);
|
||||
typedef u_long (PASCAL FAR *sp_ulong_ulong)(u_long);
|
||||
typedef u_short (PASCAL FAR *sp_ushort_ushort)(u_short);
|
||||
typedef unsigned long (PASCAL FAR *sp_ulong_ccharFARp)(const char FAR *);
|
||||
typedef int (PASCAL FAR *sp_int_SOCKET_long_ulongFARp)(SOCKET, long, u_long FAR *);
|
||||
typedef int (PASCAL FAR *sp_int_SOCKET_int)(SOCKET, int);
|
||||
typedef int (PASCAL FAR *sp_int_SOCKET_charFARp_int_int)(SOCKET, char FAR *, int, int);
|
||||
typedef int (PASCAL FAR *sp_int_int_fdsetFARp_fdsetFARp_fdsetFARp_ctimevalFARp)(int,fd_set FAR *,fd_set FAR *,fd_set FAR *,const struct timeval FAR*);
|
||||
typedef int (PASCAL FAR *sp_int_SOCKET_ccharFARp_int_int)(SOCKET, const char FAR *, int, int);
|
||||
typedef int (PASCAL FAR *sp_int_SOCKET_int_int_ccharFARp_int)(SOCKET, int, int, const char FAR *, int);
|
||||
typedef SOCKET (PASCAL FAR *sp_SOCKET_int_int_int)(int, int, int);
|
||||
typedef char FAR * (PASCAL FAR *sp_charFARp_in_addr)(struct in_addr in);
|
||||
typedef struct protoent FAR * (PASCAL FAR *sp_protoentFARcchar)(const char FAR *);
|
||||
|
||||
// Handle to the winsock, if loaded.
|
||||
HINSTANCE hWinsock = NULL;
|
||||
|
||||
#ifndef _WIN32
|
||||
// Last error code for the winsock.
|
||||
int ispError = 0;
|
||||
#endif
|
||||
|
||||
|
||||
BOOL IsWinsockLoaded (int sp)
|
||||
{
|
||||
if (hWinsock == NULL)
|
||||
{
|
||||
WSADATA wsaData;
|
||||
#ifdef _WIN32
|
||||
static LONG sc_init = 0;
|
||||
static DWORD sc_done = 0;
|
||||
static CRITICAL_SECTION sc;
|
||||
#endif
|
||||
/* We need to wait here because another thread might be
|
||||
in the routine already */
|
||||
#ifdef _WIN32
|
||||
if (0 == InterlockedExchange(&sc_init,1)) {
|
||||
InitializeCriticalSection(&sc);
|
||||
sc_done = 1;
|
||||
}
|
||||
while (0 == sc_done) Sleep(0);
|
||||
EnterCriticalSection(&sc);
|
||||
if (hWinsock == NULL) {
|
||||
#endif
|
||||
WSAStartup(0x0101, &wsaData);
|
||||
#ifdef _WIN32
|
||||
}
|
||||
LeaveCriticalSection(&sc);
|
||||
#endif
|
||||
}
|
||||
// Quick macro to tell if the winsock has actually loaded for a particular
|
||||
// function.
|
||||
// Debug version is a little more strict to make sure you get the names right.
|
||||
#ifdef DEBUG
|
||||
return hWinsock != NULL && spArray[(int)(sp)] != NULL;
|
||||
#else // A little faster
|
||||
return hWinsock != NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
// Here are the functions that we have taken over by not directly linking
|
||||
// with the winsock import library or importing through the def file.
|
||||
|
||||
/* In win16 we simulate blocking commands as follows. Prior to issuing the
|
||||
* command we make the socket not-blocking (WSAAsyncSelect does that).
|
||||
* We then issue the command and see if it would have blocked. If so, we
|
||||
* yield the processor and go to sleep until an event occurs that unblocks
|
||||
* us (WSAAsyncSelect allowed us to register what that condition is). We
|
||||
* keep repeating until we do not get a would-block indication when issuing
|
||||
* the command. At that time we unregister the notification condition and
|
||||
* return the result of the command to the caller.
|
||||
*/
|
||||
|
||||
//#ifndef _WIN32
|
||||
#if 0
|
||||
#define NON_BLOCKING(command,condition,index,type) \
|
||||
type iret; \
|
||||
HWND hWndFrame = AfxGetApp()->m_pMainWnd->m_hWnd; \
|
||||
while (TRUE) { \
|
||||
if (WSAAsyncSelect(s, hWndFrame, msg_NetActivity, condition) \
|
||||
== SOCKET_ERROR) { \
|
||||
break; \
|
||||
} \
|
||||
if(IsWinsockLoaded(index)) { \
|
||||
iret=command; \
|
||||
if (!(iret==SOCKET_ERROR && WSAGetLastError()==WSAEWOULDBLOCK)) { \
|
||||
WSAAsyncSelect(s, hWndFrame, msg_NetActivity, 0); \
|
||||
return iret; \
|
||||
} \
|
||||
PR_Yield(); \
|
||||
} else { \
|
||||
break; \
|
||||
} \
|
||||
}
|
||||
#else
|
||||
#define NON_BLOCKING(command,condition,index,type) \
|
||||
if(IsWinsockLoaded(index)) { \
|
||||
return command; \
|
||||
}
|
||||
#endif
|
||||
|
||||
int PASCAL FAR WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) {
|
||||
// Our default return value is failure, though we change this regardless.
|
||||
int iRetval = WSAVERNOTSUPPORTED;
|
||||
HINSTANCE MyHandle;
|
||||
|
||||
// Before doing anything, clear out our proc array.
|
||||
memset(spArray, 0, sizeof(spArray));
|
||||
|
||||
// attempt to load the real winsock.
|
||||
MyHandle = LoadLibrary(SZWINSOCK);
|
||||
#ifdef _WIN32
|
||||
if(MyHandle != NULL) {
|
||||
#else
|
||||
if(MyHandle > HINSTANCE_ERROR) {
|
||||
#endif
|
||||
// Winsock was loaded.
|
||||
// Get the proc addresses for each needed function next.
|
||||
int spTraverse;
|
||||
for(spTraverse = 0; spTraverse < (int)sp_MaxProcs; spTraverse++) {
|
||||
spArray[spTraverse] = GetProcAddress(MyHandle, spName[spTraverse]);
|
||||
if ( NULL == spArray[spTraverse] )
|
||||
return iRetval;// Bad winsock? Bad function name?
|
||||
}
|
||||
|
||||
hWinsock = MyHandle;
|
||||
// AllRight, attempt to make our first proxied call.
|
||||
if(IsWinsockLoaded(sp_WSAStartup)) {
|
||||
iRetval = ((sp_int_WORD_LPWSADATA)spArray[sp_WSAStartup])(wVersionRequested, lpWSAData);
|
||||
}
|
||||
|
||||
// If the return value is still an error at this point, we unload the DLL,
|
||||
// so that we can act as though nothing happened and the user
|
||||
// gets no network access.
|
||||
if(iRetval != 0) {
|
||||
// Clear out our proc array.
|
||||
memset(spArray, 0, sizeof(spArray));
|
||||
|
||||
// Free up the winsock.
|
||||
FreeLibrary(MyHandle);
|
||||
MyHandle = NULL;
|
||||
}
|
||||
}
|
||||
#ifndef _WIN32
|
||||
else {
|
||||
// Failed to load.
|
||||
// Set this to NULL so it is clear.
|
||||
hWinsock = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// Check our return value, if it isn't success, then we need to fake
|
||||
// our own winsock implementation.
|
||||
if(iRetval != 0) {
|
||||
// We always return success.
|
||||
iRetval = 0;
|
||||
|
||||
// Fill in the structure.
|
||||
// Return the version requested as the version supported.
|
||||
lpWSAData->wVersion = wVersionRequested;
|
||||
lpWSAData->wHighVersion = wVersionRequested;
|
||||
|
||||
// Fill in a discription.
|
||||
strcpy(lpWSAData->szDescription, "Mozock DLL internal implementation.");
|
||||
strcpy(lpWSAData->szSystemStatus, "Winsock running, allowing no network access.");
|
||||
|
||||
// Report a nice round number for sockets and datagram sizes.
|
||||
lpWSAData->iMaxSockets = 4096;
|
||||
lpWSAData->iMaxUdpDg = 4096;
|
||||
|
||||
// No vendor information.
|
||||
lpWSAData->lpVendorInfo = NULL;
|
||||
}
|
||||
|
||||
return(iRetval);
|
||||
}
|
||||
|
||||
int PASCAL FAR WSACleanup(void) {
|
||||
int iRetval = 0;
|
||||
|
||||
// Handling normally or internally.
|
||||
// When IsWinsockLoaded() is called and hWinsock is NULL, it winds up calling WSAStartup
|
||||
// which wedges rpcrt4.dll on win95 with some winsock implementations. Bug: 81359.
|
||||
if(hWinsock && IsWinsockLoaded(sp_WSACleanup)) {
|
||||
// Call their cleanup routine.
|
||||
// We could set the return value here, but it is meaning less.
|
||||
// We always return success.
|
||||
iRetval = ((sp_int_void)spArray[sp_WSACleanup])();
|
||||
//ASSERT(iRetval == 0);
|
||||
iRetval = 0;
|
||||
}
|
||||
|
||||
// Wether or not it succeeded, we free off the library here.
|
||||
// Clear out our proc table too.
|
||||
memset(spArray, 0, sizeof(spArray));
|
||||
if(hWinsock != NULL) {
|
||||
FreeLibrary(hWinsock);
|
||||
hWinsock = NULL;
|
||||
}
|
||||
|
||||
return(iRetval);
|
||||
}
|
||||
|
||||
HANDLE PASCAL FAR WSAAsyncGetHostByName(HWND hWnd, unsigned int wMsg, const char FAR *name, char FAR *buf, int buflen) {
|
||||
// Normal or shim.
|
||||
if(IsWinsockLoaded(sp_WSAAsyncGetHostByName)) {
|
||||
return(((sp_HANDLE_HWND_uint_ccharFARp_charFARp_int)spArray[sp_WSAAsyncGetHostByName])(hWnd, wMsg, name, buf, buflen));
|
||||
}
|
||||
|
||||
// Must return error here.
|
||||
// Set our last error value to be that the net is down.
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
int PASCAL FAR WSAAsyncSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent) {
|
||||
// Normal or shim.
|
||||
if(IsWinsockLoaded(sp_WSAAsyncSelect)) {
|
||||
return(((sp_int_SOCKET_HWND_uint_long)spArray[sp_WSAAsyncSelect])(s, hWnd, wMsg, lEvent));
|
||||
}
|
||||
|
||||
// Must return error here.
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
int PASCAL FAR WSAGetLastError(void) {
|
||||
// See if someone else can handle.
|
||||
if(IsWinsockLoaded(sp_WSAGetLastError)) {
|
||||
return(((sp_int_void)spArray[sp_WSAGetLastError])());
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
{
|
||||
// Fake it.
|
||||
int iRetval = ispError;
|
||||
ispError = 0;
|
||||
return(iRetval);
|
||||
}
|
||||
#else
|
||||
// Use default OS handler.
|
||||
return(GetLastError());
|
||||
#endif
|
||||
}
|
||||
|
||||
void PASCAL FAR WSASetLastError(int iError) {
|
||||
// See if someone else can handle.
|
||||
if(IsWinsockLoaded(sp_WSASetLastError)) {
|
||||
((sp_void_int)spArray[sp_WSASetLastError])(iError);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
// Fake it.
|
||||
ispError = iError;
|
||||
return;
|
||||
#else
|
||||
// Use default OS handler.
|
||||
SetLastError(iError);
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
int PASCAL FAR __WSAFDIsSet(SOCKET fd, fd_set FAR *set) {
|
||||
int i;
|
||||
|
||||
// See if someone else will handle.
|
||||
if(IsWinsockLoaded(sp___WSAFDIsSet)) {
|
||||
return(((sp_int_SOCKET_fdsetFARp)spArray[sp___WSAFDIsSet])(fd, set));
|
||||
}
|
||||
|
||||
// Default implementation.
|
||||
i = set->fd_count;
|
||||
while (i--) {
|
||||
if (set->fd_array[i] == fd) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen) {
|
||||
// Internally or shim
|
||||
NON_BLOCKING(
|
||||
(((sp_SOCKET_SOCKET_sockaddrFARp_intFARp)spArray[sp_accept])(s, addr, addrlen)),
|
||||
FD_ACCEPT, sp_accept, SOCKET);
|
||||
|
||||
// Fail.
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(INVALID_SOCKET);
|
||||
}
|
||||
|
||||
int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR *name, int namelen) {
|
||||
// Internally or shim
|
||||
if(IsWinsockLoaded(sp_bind)) {
|
||||
return(((sp_int_SOCKET_csockaddrFARp_int)spArray[sp_bind])(s, name, namelen));
|
||||
}
|
||||
|
||||
// Fail.
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
int PASCAL FAR closesocket(SOCKET s) {
|
||||
// Internally or shim.
|
||||
NON_BLOCKING(
|
||||
(((sp_int_SOCKET)spArray[sp_closesocket])(s)),
|
||||
FD_CLOSE, sp_closesocket, int);
|
||||
|
||||
// Error.
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR *name, int namelen) {
|
||||
// Internally or shim.
|
||||
if(IsWinsockLoaded(sp_connect)) {
|
||||
/* This could block and so it would seem that the NON_BLOCK
|
||||
* macro should be used here. However it was causing a crash
|
||||
* and so it was decided to allow blocking here instead
|
||||
*/
|
||||
return (((sp_int_SOCKET_csockaddrFARp_int)spArray[sp_connect])(s, name, namelen));
|
||||
}
|
||||
|
||||
// Err.
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
struct hostent FAR * PASCAL FAR gethostbyname(const char FAR *name) {
|
||||
if(IsWinsockLoaded(sp_gethostbyname)) {
|
||||
return(((sp_hostentFARp_ccharFARp)spArray[sp_gethostbyname])(name));
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
struct hostent FAR * PASCAL FAR gethostbyaddr(const char FAR *addr, int len, int type) {
|
||||
if(IsWinsockLoaded(sp_gethostbyaddr)) {
|
||||
return(((sp_hostentFARp_ccharFARp_int_int)spArray[sp_gethostbyaddr])(addr, len, type));
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
int PASCAL FAR gethostname(char FAR *name, int namelen) {
|
||||
if(IsWinsockLoaded(sp_gethostname)) {
|
||||
return(((sp_int_charFARp_int)spArray[sp_gethostname])(name, namelen));
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
int PASCAL FAR getpeername(SOCKET s, struct sockaddr FAR *name, int FAR *namelen) {
|
||||
if(IsWinsockLoaded(sp_getpeername)) {
|
||||
return(((sp_int_SOCKET_sockaddrFARp_intFARp)spArray[sp_getpeername])(s, name, namelen));
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
int PASCAL FAR getsockname(SOCKET s, struct sockaddr FAR *name, int FAR *namelen) {
|
||||
if(IsWinsockLoaded(sp_getsockname)) {
|
||||
return(((sp_int_SOCKET_sockaddrFARp_intFARp)spArray[sp_getsockname])(s, name, namelen));
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
int PASCAL FAR getsockopt(SOCKET s, int level, int optname, char FAR *optval, int FAR *optlen) {
|
||||
if(IsWinsockLoaded(sp_getsockopt)) {
|
||||
return(((sp_int_SOCKET_int_int_charFARp_intFARp)spArray[sp_getsockopt])(s, level, optname, optval, optlen));
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
struct protoent FAR * PASCAL getprotobyname(const char FAR * name) {
|
||||
if(IsWinsockLoaded(sp_getprotobyname)) {
|
||||
return(((sp_protoentFARcchar)spArray[sp_getprotobyname])(name));
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
u_long PASCAL FAR htonl(u_long hostlong) {
|
||||
if(IsWinsockLoaded(sp_htonl)) {
|
||||
return(((sp_ulong_ulong)spArray[sp_htonl])(hostlong));
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
return
|
||||
(((hostlong&0xff)<<24) + ((hostlong&0xff00)<<8) +
|
||||
((hostlong&0xff0000)>>8) + ((hostlong&0xff000000)>>24));
|
||||
|
||||
#else
|
||||
// Just return what was passed in.
|
||||
return(hostlong);
|
||||
#endif
|
||||
}
|
||||
|
||||
u_short PASCAL FAR htons(u_short hostshort) {
|
||||
if(IsWinsockLoaded(sp_htons)) {
|
||||
return(((sp_ushort_ushort)spArray[sp_htons])(hostshort));
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
return (((hostshort&0xff)<<8) + ((hostshort&0xff00)>>8));
|
||||
|
||||
#else
|
||||
// Just return what was passed in.
|
||||
return(hostshort);
|
||||
#endif
|
||||
}
|
||||
|
||||
u_long PASCAL FAR ntohl(u_long hostlong) {
|
||||
if(IsWinsockLoaded(sp_ntohl)) {
|
||||
return(((sp_ulong_ulong)spArray[sp_ntohl])(hostlong));
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
return
|
||||
(((hostlong&0xff)<<24) + ((hostlong&0xff00)<<8) +
|
||||
((hostlong&0xff0000)>>8) + ((hostlong&0xff000000)>>24));
|
||||
|
||||
#else
|
||||
// Just return what was passed in.
|
||||
return(hostlong);
|
||||
#endif
|
||||
}
|
||||
|
||||
u_short PASCAL FAR ntohs(u_short hostshort) {
|
||||
if(IsWinsockLoaded(sp_ntohs)) {
|
||||
return(((sp_ushort_ushort)spArray[sp_ntohs])(hostshort));
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
return (((hostshort&0xff)<<8) + ((hostshort&0xff00)>>8));
|
||||
|
||||
#else
|
||||
// Just return what was passed in.
|
||||
return(hostshort);
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned long PASCAL FAR inet_addr(const char FAR *cp) {
|
||||
if(IsWinsockLoaded(sp_inet_addr)) {
|
||||
return(((sp_ulong_ccharFARp)spArray[sp_inet_addr])(cp));
|
||||
}
|
||||
|
||||
return(INADDR_NONE);
|
||||
}
|
||||
|
||||
int PASCAL FAR ioctlsocket(SOCKET s, long cmd, u_long FAR *argp) {
|
||||
if(IsWinsockLoaded(sp_ioctlsocket)) {
|
||||
return(((sp_int_SOCKET_long_ulongFARp)spArray[sp_ioctlsocket])(s, cmd, argp));
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
int PASCAL FAR listen(SOCKET s, int backlog) {
|
||||
if(IsWinsockLoaded(sp_listen)) {
|
||||
return(((sp_int_SOCKET_int)spArray[sp_listen])(s, backlog));
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
int PASCAL FAR recv(SOCKET s, char FAR *buf, int len, int flags) {
|
||||
NON_BLOCKING(
|
||||
(((sp_int_SOCKET_charFARp_int_int)spArray[sp_recv])(s, buf, len, flags)),
|
||||
FD_READ, sp_recv, int);
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
int PASCAL FAR select(int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout) {
|
||||
// If there's nothing to do, stop now before we go off into dll land.
|
||||
// Optimization, boyz.
|
||||
if((readfds && readfds->fd_count) || (writefds && writefds->fd_count) || (exceptfds && exceptfds->fd_count)) {
|
||||
if(IsWinsockLoaded(sp_select)) {
|
||||
return(((sp_int_int_fdsetFARp_fdsetFARp_fdsetFARp_ctimevalFARp)spArray[sp_select])(nfds,readfds,writefds,exceptfds,timeout));
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
// No need to go to the DLL, there is nothing to do.
|
||||
return(0);
|
||||
}
|
||||
|
||||
int PASCAL FAR send(SOCKET s, const char FAR *buf, int len, int flags) {
|
||||
NON_BLOCKING(
|
||||
|
||||
(((sp_int_SOCKET_ccharFARp_int_int)spArray[sp_send])(s, buf, len, flags)),
|
||||
FD_WRITE, sp_send, int);
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
int PASCAL FAR setsockopt(SOCKET s, int level, int optname, const char FAR *optval, int optlen) {
|
||||
if(IsWinsockLoaded(sp_setsockopt)) {
|
||||
return(((sp_int_SOCKET_int_int_ccharFARp_int)spArray[sp_setsockopt])(s, level, optname, optval, optlen));
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
int PASCAL FAR shutdown(SOCKET s, int how) {
|
||||
if(IsWinsockLoaded(sp_shutdown)) {
|
||||
return(((sp_int_SOCKET_int)spArray[sp_shutdown])(s, how));
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(SOCKET_ERROR);
|
||||
}
|
||||
|
||||
SOCKET PASCAL FAR socket(int af, int type, int protocol) {
|
||||
if(IsWinsockLoaded(sp_socket)) {
|
||||
return(((sp_SOCKET_int_int_int)spArray[sp_socket])(af, type, protocol));
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return(INVALID_SOCKET);
|
||||
}
|
||||
|
||||
char FAR * PASCAL FAR inet_ntoa(struct in_addr in) {
|
||||
if(IsWinsockLoaded(sp_inet_ntoa)) {
|
||||
return ((sp_charFARp_in_addr)spArray[sp_inet_ntoa])(in);
|
||||
}
|
||||
|
||||
WSASetLastError(WSAENETDOWN);
|
||||
return NULL;
|
||||
}
|
||||
606
mozilla/directory/c-sdk/ldap/libraries/libldap/nsprthreadtest.c
Normal file
606
mozilla/directory/c-sdk/ldap/libraries/libldap/nsprthreadtest.c
Normal file
@@ -0,0 +1,606 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#include <nspr.h>
|
||||
#include <stdio.h>
|
||||
#include <ldap.h>
|
||||
|
||||
#define NAME "cn=Directory Manager"
|
||||
#define PASSWORD "secret99"
|
||||
#define BASE "o=Airius.com"
|
||||
|
||||
static int simplebind( LDAP *ld, char *msg, int tries );
|
||||
static void search_thread( void * );
|
||||
static void modify_thread( void * );
|
||||
static void add_thread( void * );
|
||||
static void delete_thread( void * );
|
||||
static void set_ld_error();
|
||||
static int get_ld_error();
|
||||
static void set_errno();
|
||||
static int get_errno();
|
||||
static void tsd_setup();
|
||||
static void *my_mutex_alloc( void );
|
||||
static void my_mutex_free( void * );
|
||||
static int my_mutex_lock( void * );
|
||||
static int my_mutex_unlock( void * );
|
||||
static LDAPHostEnt *my_gethostbyname( const char *name, LDAPHostEnt *result,
|
||||
char *buffer, int buflen, int *statusp, void *extradata );
|
||||
static LDAPHostEnt *my_gethostbyaddr( const char *addr, int length,
|
||||
int type, LDAPHostEnt *result, char *buffer, int buflen,
|
||||
int *statusp, void *extradata );
|
||||
static LDAPHostEnt *copyPRHostEnt2LDAPHostEnt( LDAPHostEnt *ldhp,
|
||||
PRHostEnt *prhp );
|
||||
|
||||
typedef struct ldapmsgwrapper {
|
||||
LDAPMessage *lmw_messagep;
|
||||
struct ldapmsgwrapper *lmw_next;
|
||||
} ldapmsgwrapper;
|
||||
|
||||
|
||||
#define CONNECTION_ERROR( lderr ) ( (lderr) == LDAP_SERVER_DOWN || \
|
||||
(lderr) == LDAP_CONNECT_ERROR )
|
||||
|
||||
|
||||
LDAP *ld;
|
||||
PRUintn tsdindex;
|
||||
#ifdef LDAP_MEMCACHE
|
||||
LDAPMemCache *memcache = NULL;
|
||||
#define MEMCACHE_SIZE (256*1024) /* 256K bytes */
|
||||
#define MEMCACHE_TTL (15*60) /* 15 minutes */
|
||||
#endif
|
||||
|
||||
|
||||
main( int argc, char **argv )
|
||||
{
|
||||
PRThread *search_tid, *search_tid2, *search_tid3;
|
||||
PRThread *search_tid4, *modify_tid, *add_tid;
|
||||
PRThread *delete_tid;
|
||||
struct ldap_thread_fns tfns;
|
||||
struct ldap_dns_fns dnsfns;
|
||||
int rc;
|
||||
|
||||
if ( argc != 3 ) {
|
||||
fprintf( stderr, "usage: %s host port\n", argv[0] );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
PR_Init( PR_USER_THREAD, PR_PRIORITY_NORMAL, 0 );
|
||||
if ( PR_NewThreadPrivateIndex( &tsdindex, NULL ) != PR_SUCCESS ) {
|
||||
perror( "PR_NewThreadPrivateIndex" );
|
||||
exit( 1 );
|
||||
}
|
||||
tsd_setup(); /* for main thread */
|
||||
|
||||
if ( (ld = ldap_init( argv[1], atoi( argv[2] ) )) == NULL ) {
|
||||
perror( "ldap_open" );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
/* set thread function pointers */
|
||||
memset( &tfns, '\0', sizeof(struct ldap_thread_fns) );
|
||||
tfns.ltf_mutex_alloc = my_mutex_alloc;
|
||||
tfns.ltf_mutex_free = my_mutex_free;
|
||||
tfns.ltf_mutex_lock = my_mutex_lock;
|
||||
tfns.ltf_mutex_unlock = my_mutex_unlock;
|
||||
tfns.ltf_get_errno = get_errno;
|
||||
tfns.ltf_set_errno = set_errno;
|
||||
tfns.ltf_get_lderrno = get_ld_error;
|
||||
tfns.ltf_set_lderrno = set_ld_error;
|
||||
tfns.ltf_lderrno_arg = NULL;
|
||||
if ( ldap_set_option( ld, LDAP_OPT_THREAD_FN_PTRS, (void *) &tfns )
|
||||
!= 0 ) {
|
||||
ldap_perror( ld, "ldap_set_option: thread functions" );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
/* set DNS function pointers */
|
||||
memset( &dnsfns, '\0', sizeof(struct ldap_dns_fns) );
|
||||
dnsfns.lddnsfn_bufsize = PR_NETDB_BUF_SIZE;
|
||||
dnsfns.lddnsfn_gethostbyname = my_gethostbyname;
|
||||
dnsfns.lddnsfn_gethostbyaddr = my_gethostbyaddr;
|
||||
if ( ldap_set_option( ld, LDAP_OPT_DNS_FN_PTRS, (void *)&dnsfns )
|
||||
!= 0 ) {
|
||||
ldap_perror( ld, "ldap_set_option: DNS functions" );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
#ifdef LDAP_MEMCACHE
|
||||
/* create the in-memory cache */
|
||||
if (( rc = ldap_memcache_init( MEMCACHE_TTL, MEMCACHE_SIZE, NULL,
|
||||
&tfns, &memcache )) != LDAP_SUCCESS ) {
|
||||
fprintf( stderr, "ldap_memcache_init failed - %s\n",
|
||||
ldap_err2string( rc ));
|
||||
exit( 1 );
|
||||
}
|
||||
if (( rc = ldap_memcache_set( ld, memcache )) != LDAP_SUCCESS ) {
|
||||
fprintf( stderr, "ldap_memcache_set failed - %s\n",
|
||||
ldap_err2string( rc ));
|
||||
exit( 1 );
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* set option so that the next call to ldap_simple_bind_s() after
|
||||
* the server connection is lost will attempt to reconnect.
|
||||
*/
|
||||
if ( ldap_set_option( ld, LDAP_OPT_RECONNECT, LDAP_OPT_ON ) != 0 ) {
|
||||
ldap_perror( ld, "ldap_set_option: reconnect" );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
/* initial bind */
|
||||
if ( simplebind( ld, "ldap_simple_bind_s/main", 1 ) != LDAP_SUCCESS ) {
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
/* create the operation threads */
|
||||
if ( (search_tid = PR_CreateThread( PR_USER_THREAD, search_thread,
|
||||
"1", PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, PR_UNJOINABLE_THREAD,
|
||||
0 )) == NULL ) {
|
||||
perror( "PR_CreateThread search_thread" );
|
||||
exit( 1 );
|
||||
}
|
||||
if ( (modify_tid = PR_CreateThread( PR_USER_THREAD, modify_thread,
|
||||
"2", PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, PR_UNJOINABLE_THREAD,
|
||||
0 )) == NULL ) {
|
||||
perror( "PR_CreateThread modify_thread" );
|
||||
exit( 1 );
|
||||
}
|
||||
if ( (search_tid2 = PR_CreateThread( PR_USER_THREAD, search_thread,
|
||||
"3", PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, PR_UNJOINABLE_THREAD,
|
||||
0 )) == NULL ) {
|
||||
perror( "PR_CreateThread search_thread 2" );
|
||||
exit( 1 );
|
||||
}
|
||||
if ( (add_tid = PR_CreateThread( PR_USER_THREAD, add_thread,
|
||||
"4", PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, PR_UNJOINABLE_THREAD,
|
||||
0 )) == NULL ) {
|
||||
perror( "PR_CreateThread add_thread" );
|
||||
exit( 1 );
|
||||
}
|
||||
if ( (search_tid3 = PR_CreateThread( PR_USER_THREAD, search_thread,
|
||||
"5", PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, PR_UNJOINABLE_THREAD,
|
||||
0 )) == NULL ) {
|
||||
perror( "PR_CreateThread search_thread 3" );
|
||||
exit( 1 );
|
||||
}
|
||||
if ( (delete_tid = PR_CreateThread( PR_USER_THREAD, delete_thread,
|
||||
"6", PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, PR_UNJOINABLE_THREAD,
|
||||
0 )) == NULL ) {
|
||||
perror( "PR_CreateThread delete_thread" );
|
||||
exit( 1 );
|
||||
}
|
||||
if ( (search_tid4 = PR_CreateThread( PR_USER_THREAD, search_thread,
|
||||
"7", PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD, PR_UNJOINABLE_THREAD,
|
||||
0 )) == NULL ) {
|
||||
perror( "PR_CreateThread search_thread 4" );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
PR_Cleanup();
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
simplebind( LDAP *ld, char *msg, int tries )
|
||||
{
|
||||
int rc;
|
||||
|
||||
while ( tries-- > 0 ) {
|
||||
rc = ldap_simple_bind_s( ld, NAME, PASSWORD );
|
||||
if ( rc != LDAP_SUCCESS ) {
|
||||
ldap_perror( ld, msg );
|
||||
}
|
||||
if ( tries == 0 || !CONNECTION_ERROR( rc )) {
|
||||
return( rc );
|
||||
}
|
||||
fprintf( stderr,
|
||||
"%s: sleeping for 5 secs - will try %d more time(s)...\n",
|
||||
msg, tries );
|
||||
sleep( 5 );
|
||||
}
|
||||
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
search_thread( void *arg1 )
|
||||
{
|
||||
LDAPMessage *res;
|
||||
LDAPMessage *e;
|
||||
char *a;
|
||||
char **v;
|
||||
char *dn;
|
||||
BerElement *ber;
|
||||
int i, rc, msgid;
|
||||
void *tsd;
|
||||
char *id = arg1;
|
||||
|
||||
printf( "search_thread\n" );
|
||||
tsd_setup();
|
||||
for ( ;; ) {
|
||||
printf( "%sSearching...\n", id );
|
||||
if ( (msgid = ldap_search( ld, BASE, LDAP_SCOPE_SUBTREE,
|
||||
"(objectclass=*)", NULL, 0 )) == -1 ) {
|
||||
ldap_perror( ld, "ldap_search_s" );
|
||||
rc = ldap_get_lderrno( ld, NULL, NULL );
|
||||
if ( CONNECTION_ERROR( rc ) && simplebind( ld,
|
||||
"bind-search_thread", 5 ) != LDAP_SUCCESS ) {
|
||||
return;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
while ( (rc = ldap_result( ld, msgid, 0, NULL, &res ))
|
||||
== LDAP_RES_SEARCH_ENTRY ) {
|
||||
for ( e = ldap_first_entry( ld, res ); e != NULL;
|
||||
e = ldap_next_entry( ld, e ) ) {
|
||||
dn = ldap_get_dn( ld, e );
|
||||
/* printf( "%sdn: %s\n", id, dn ); */
|
||||
free( dn );
|
||||
for ( a = ldap_first_attribute( ld, e, &ber );
|
||||
a != NULL; a = ldap_next_attribute( ld, e,
|
||||
ber ) ) {
|
||||
v = ldap_get_values( ld, e, a );
|
||||
for ( i = 0; v && v[i] != 0; i++ ) {
|
||||
/*
|
||||
printf( "%s%s: %s\n", id, a,
|
||||
v[i] );
|
||||
*/
|
||||
}
|
||||
ldap_value_free( v );
|
||||
ldap_memfree( a );
|
||||
}
|
||||
if ( ber != NULL ) {
|
||||
ber_free( ber, 0 );
|
||||
}
|
||||
}
|
||||
ldap_msgfree( res );
|
||||
/* printf( "%s\n", id ); */
|
||||
}
|
||||
|
||||
if ( rc == -1 || ldap_result2error( ld, res, 0 ) !=
|
||||
LDAP_SUCCESS ) {
|
||||
ldap_perror( ld, "ldap_search" );
|
||||
} else {
|
||||
printf( "%sDone with one round\n", id );
|
||||
}
|
||||
|
||||
if ( rc == -1 ) {
|
||||
rc = ldap_get_lderrno( ld, NULL, NULL );
|
||||
if ( CONNECTION_ERROR( rc ) && simplebind( ld,
|
||||
"bind-search_thread", 5 ) != LDAP_SUCCESS ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
modify_thread( void *arg1 )
|
||||
{
|
||||
LDAPMessage *res;
|
||||
LDAPMessage *e;
|
||||
int i, modentry, entries, msgid, rc;
|
||||
LDAPMod mod;
|
||||
LDAPMod *mods[2];
|
||||
char *vals[2];
|
||||
char *dn;
|
||||
char *id = arg1;
|
||||
ldapmsgwrapper *list, *lmwp, *lastlmwp;
|
||||
|
||||
printf( "modify_thread\n" );
|
||||
tsd_setup();
|
||||
if ( (msgid = ldap_search( ld, BASE, LDAP_SCOPE_SUBTREE,
|
||||
"(objectclass=*)", NULL, 0 )) == -1 ) {
|
||||
ldap_perror( ld, "ldap_search_s" );
|
||||
exit( 1 );
|
||||
}
|
||||
entries = 0;
|
||||
list = lastlmwp = NULL;
|
||||
while ( (rc = ldap_result( ld, msgid, 0, NULL, &res ))
|
||||
== LDAP_RES_SEARCH_ENTRY ) {
|
||||
entries++;
|
||||
if (( lmwp = (ldapmsgwrapper *)
|
||||
malloc( sizeof( ldapmsgwrapper ))) == NULL ) {
|
||||
perror( "modify_thread: malloc" );
|
||||
exit( 1 );
|
||||
}
|
||||
lmwp->lmw_messagep = res;
|
||||
lmwp->lmw_next = NULL;
|
||||
if ( lastlmwp == NULL ) {
|
||||
list = lastlmwp = lmwp;
|
||||
} else {
|
||||
lastlmwp->lmw_next = lmwp;
|
||||
}
|
||||
lastlmwp = lmwp;
|
||||
}
|
||||
if ( rc == -1 || ldap_result2error( ld, res, 0 ) != LDAP_SUCCESS ) {
|
||||
ldap_perror( ld, "modify_thread: ldap_search" );
|
||||
exit( 1 );
|
||||
} else {
|
||||
entries++;
|
||||
printf( "%sModify got %d entries\n", id, entries );
|
||||
}
|
||||
|
||||
mods[0] = &mod;
|
||||
mods[1] = NULL;
|
||||
vals[0] = "bar";
|
||||
vals[1] = NULL;
|
||||
for ( ;; ) {
|
||||
modentry = rand() % entries;
|
||||
for ( i = 0, lmwp = list; lmwp != NULL && i < modentry;
|
||||
i++, lmwp = lmwp->lmw_next ) {
|
||||
/* NULL */
|
||||
}
|
||||
|
||||
if ( lmwp == NULL ) {
|
||||
fprintf( stderr,
|
||||
"%sModify could not find entry %d of %d\n",
|
||||
id, modentry, entries );
|
||||
continue;
|
||||
}
|
||||
e = lmwp->lmw_messagep;
|
||||
printf( "%sPicked entry %d of %d\n", id, i, entries );
|
||||
dn = ldap_get_dn( ld, e );
|
||||
mod.mod_op = LDAP_MOD_REPLACE;
|
||||
mod.mod_type = "description";
|
||||
mod.mod_values = vals;
|
||||
printf( "%sModifying (%s)\n", id, dn );
|
||||
if (( rc = ldap_modify_s( ld, dn, mods )) != LDAP_SUCCESS ) {
|
||||
ldap_perror( ld, "ldap_modify_s" );
|
||||
if ( CONNECTION_ERROR( rc ) && simplebind( ld,
|
||||
"bind-modify_thread", 5 ) != LDAP_SUCCESS ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
free( dn );
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
add_thread( void *arg1 )
|
||||
{
|
||||
LDAPMod mod[5];
|
||||
LDAPMod *mods[6];
|
||||
char dn[BUFSIZ], name[40];
|
||||
char *cnvals[2], *snvals[2], *ocvals[2];
|
||||
int i, rc;
|
||||
char *id = arg1;
|
||||
|
||||
printf( "add_thread\n" );
|
||||
tsd_setup();
|
||||
for ( i = 0; i < 5; i++ ) {
|
||||
mods[i] = &mod[i];
|
||||
}
|
||||
mods[5] = NULL;
|
||||
mod[0].mod_op = 0;
|
||||
mod[0].mod_type = "cn";
|
||||
mod[0].mod_values = cnvals;
|
||||
cnvals[1] = NULL;
|
||||
mod[1].mod_op = 0;
|
||||
mod[1].mod_type = "sn";
|
||||
mod[1].mod_values = snvals;
|
||||
snvals[1] = NULL;
|
||||
mod[2].mod_op = 0;
|
||||
mod[2].mod_type = "objectclass";
|
||||
mod[2].mod_values = ocvals;
|
||||
ocvals[0] = "person";
|
||||
ocvals[1] = NULL;
|
||||
mods[3] = NULL;
|
||||
|
||||
for ( ;; ) {
|
||||
sprintf( name, "%d", rand() );
|
||||
sprintf( dn, "cn=%s, " BASE, name );
|
||||
cnvals[0] = name;
|
||||
snvals[0] = name;
|
||||
|
||||
printf( "%sAdding entry (%s)\n", id, dn );
|
||||
if (( rc = ldap_add_s( ld, dn, mods )) != LDAP_SUCCESS ) {
|
||||
ldap_perror( ld, "ldap_add_s" );
|
||||
if ( CONNECTION_ERROR( rc ) && simplebind( ld,
|
||||
"bind-add_thread", 5 ) != LDAP_SUCCESS ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
delete_thread( void *arg1 )
|
||||
{
|
||||
LDAPMessage *res;
|
||||
char dn[BUFSIZ], name[40];
|
||||
int entries, msgid, rc;
|
||||
char *id = arg1;
|
||||
|
||||
printf( "delete_thread\n" );
|
||||
tsd_setup();
|
||||
if ( (msgid = ldap_search( ld, BASE, LDAP_SCOPE_SUBTREE,
|
||||
"(objectclass=*)", NULL, 0 )) == -1 ) {
|
||||
ldap_perror( ld, "delete_thread: ldap_search_s" );
|
||||
exit( 1 );
|
||||
}
|
||||
entries = 0;
|
||||
while ( (rc = ldap_result( ld, msgid, 0, NULL, &res ))
|
||||
== LDAP_RES_SEARCH_ENTRY ) {
|
||||
entries++;
|
||||
ldap_msgfree( res );
|
||||
}
|
||||
entries++;
|
||||
if ( rc == -1 || ldap_result2error( ld, res, 1 ) != LDAP_SUCCESS ) {
|
||||
ldap_perror( ld, "delete_thread: ldap_search" );
|
||||
} else {
|
||||
printf( "%sDelete got %d entries\n", id, entries );
|
||||
}
|
||||
|
||||
for ( ;; ) {
|
||||
sprintf( name, "%d", rand() );
|
||||
sprintf( dn, "cn=%s, " BASE, name );
|
||||
|
||||
printf( "%sDeleting entry (%s)\n", id, dn );
|
||||
if (( rc = ldap_delete_s( ld, dn )) != LDAP_SUCCESS ) {
|
||||
ldap_perror( ld, "ldap_delete_s" );
|
||||
if ( CONNECTION_ERROR( rc ) && simplebind( ld,
|
||||
"bind-delete_thread", 5 ) != LDAP_SUCCESS ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct ldap_error {
|
||||
int le_errno;
|
||||
char *le_matched;
|
||||
char *le_errmsg;
|
||||
};
|
||||
|
||||
static void
|
||||
tsd_setup()
|
||||
{
|
||||
void *tsd;
|
||||
|
||||
tsd = (void *) PR_GetThreadPrivate( tsdindex );
|
||||
if ( tsd != NULL ) {
|
||||
fprintf( stderr, "tsd non-null!\n" );
|
||||
exit( 1 );
|
||||
}
|
||||
tsd = (void *) calloc( 1, sizeof(struct ldap_error) );
|
||||
if ( PR_SetThreadPrivate( tsdindex, tsd ) != 0 ) {
|
||||
perror( "PR_SetThreadPrivate" );
|
||||
exit( 1 );
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
set_ld_error( int err, char *matched, char *errmsg, void *dummy )
|
||||
{
|
||||
struct ldap_error *le;
|
||||
|
||||
le = (void *) PR_GetThreadPrivate( tsdindex );
|
||||
le->le_errno = err;
|
||||
if ( le->le_matched != NULL ) {
|
||||
ldap_memfree( le->le_matched );
|
||||
}
|
||||
le->le_matched = matched;
|
||||
if ( le->le_errmsg != NULL ) {
|
||||
ldap_memfree( le->le_errmsg );
|
||||
}
|
||||
le->le_errmsg = errmsg;
|
||||
}
|
||||
|
||||
static int
|
||||
get_ld_error( char **matched, char **errmsg, void *dummy )
|
||||
{
|
||||
struct ldap_error *le;
|
||||
|
||||
le = PR_GetThreadPrivate( tsdindex );
|
||||
if ( matched != NULL ) {
|
||||
*matched = le->le_matched;
|
||||
}
|
||||
if ( errmsg != NULL ) {
|
||||
*errmsg = le->le_errmsg;
|
||||
}
|
||||
return( le->le_errno );
|
||||
}
|
||||
|
||||
static void
|
||||
set_errno( int oserrno )
|
||||
{
|
||||
/* XXXmcs: should this be PR_SetError( oserrno, 0 )? */
|
||||
PR_SetError( PR_UNKNOWN_ERROR, oserrno );
|
||||
}
|
||||
|
||||
static int
|
||||
get_errno( void )
|
||||
{
|
||||
/* XXXmcs: should this be PR_GetError()? */
|
||||
return( PR_GetOSError());
|
||||
}
|
||||
|
||||
static void *
|
||||
my_mutex_alloc( void )
|
||||
{
|
||||
return( (void *)PR_NewLock());
|
||||
}
|
||||
|
||||
static void
|
||||
my_mutex_free( void *mutex )
|
||||
{
|
||||
PR_DestroyLock( (PRLock *)mutex );
|
||||
}
|
||||
|
||||
static int
|
||||
my_mutex_lock( void *mutex )
|
||||
{
|
||||
PR_Lock( (PRLock *)mutex );
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
static int
|
||||
my_mutex_unlock( void *mutex )
|
||||
{
|
||||
if ( PR_Unlock( (PRLock *)mutex ) == PR_FAILURE ) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
static LDAPHostEnt *
|
||||
my_gethostbyname( const char *name, LDAPHostEnt *result,
|
||||
char *buffer, int buflen, int *statusp, void *extradata )
|
||||
{
|
||||
PRHostEnt prhent;
|
||||
|
||||
if ( PR_GetHostByName( name, buffer, buflen,
|
||||
&prhent ) != PR_SUCCESS ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( copyPRHostEnt2LDAPHostEnt( result, &prhent ));
|
||||
}
|
||||
|
||||
static LDAPHostEnt *
|
||||
my_gethostbyaddr( const char *addr, int length, int type, LDAPHostEnt *result,
|
||||
char *buffer, int buflen, int *statusp, void *extradata )
|
||||
{
|
||||
PRHostEnt prhent;
|
||||
|
||||
if ( PR_GetHostByAddr( (PRNetAddr *)addr, buffer, buflen,
|
||||
&prhent ) != PR_SUCCESS ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
return( copyPRHostEnt2LDAPHostEnt( result, &prhent ));
|
||||
}
|
||||
|
||||
static LDAPHostEnt *
|
||||
copyPRHostEnt2LDAPHostEnt( LDAPHostEnt *ldhp, PRHostEnt *prhp )
|
||||
{
|
||||
ldhp->ldaphe_name = prhp->h_name;
|
||||
ldhp->ldaphe_aliases = prhp->h_aliases;
|
||||
ldhp->ldaphe_addrtype = prhp->h_addrtype;
|
||||
ldhp->ldaphe_length = prhp->h_length;
|
||||
ldhp->ldaphe_addr_list = prhp->h_addr_list;
|
||||
return( ldhp );
|
||||
}
|
||||
417
mozilla/directory/c-sdk/ldap/libraries/libldap/open.c
Normal file
417
mozilla/directory/c-sdk/ldap/libraries/libldap/open.c
Normal file
@@ -0,0 +1,417 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1995 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* open.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1995 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
/* OK, this stuff broke the Macintosh Dogbert build. Please fix it.
|
||||
** The files you included do not exist for client builds on macintosh.
|
||||
** XXXmcs: noted.
|
||||
*/
|
||||
#if defined(XP_MAC) && defined(MOZILLA_CLIENT)
|
||||
#define VI_PRODUCTVERSION 3 /* fixme */
|
||||
#else
|
||||
#include "sdkver.h"
|
||||
#endif
|
||||
|
||||
#ifndef INADDR_LOOPBACK
|
||||
#define INADDR_LOOPBACK ((unsigned long) 0x7f000001)
|
||||
#endif
|
||||
|
||||
#ifndef MAXHOSTNAMELEN
|
||||
#define MAXHOSTNAMELEN 64
|
||||
#endif
|
||||
|
||||
#ifdef LDAP_DEBUG
|
||||
int ldap_debug;
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* global defaults for callbacks are stored here. callers of the API set
|
||||
* these by passing a NULL "ld" to ldap_set_option(). Everything in
|
||||
* nsldapi_ld_defaults can be overridden on a per-ld basis as well (the
|
||||
* memory allocation functions are global to all ld's).
|
||||
*/
|
||||
struct ldap nsldapi_ld_defaults;
|
||||
struct ldap_memalloc_fns nsldapi_memalloc_fns = { 0, 0, 0, 0 };
|
||||
int nsldapi_initialized = 0;
|
||||
|
||||
|
||||
void
|
||||
nsldapi_initialize_defaults( void )
|
||||
{
|
||||
|
||||
if ( nsldapi_initialized ) {
|
||||
return;
|
||||
}
|
||||
|
||||
nsldapi_initialized = 1;
|
||||
memset( &nsldapi_memalloc_fns, 0, sizeof( nsldapi_memalloc_fns ));
|
||||
memset( &nsldapi_ld_defaults, 0, sizeof( nsldapi_ld_defaults ));
|
||||
nsldapi_ld_defaults.ld_options = LDAP_BITOPT_REFERRALS;
|
||||
nsldapi_ld_defaults.ld_version = LDAP_VERSION;
|
||||
nsldapi_ld_defaults.ld_lberoptions = LBER_OPT_USE_DER;
|
||||
nsldapi_ld_defaults.ld_refhoplimit = LDAP_DEFAULT_REFHOPLIMIT;
|
||||
|
||||
#if defined( STR_TRANSLATION ) && defined( LDAP_DEFAULT_CHARSET )
|
||||
nsldapi_ld_defaults.ld_lberoptions |= LBER_OPT_TRANSLATE_STRINGS;
|
||||
#if LDAP_CHARSET_8859 == LDAP_DEFAULT_CHARSET
|
||||
ldap_set_string_translators( &nsldapi_ld_defaults, ldap_8859_to_t61,
|
||||
ldap_t61_to_8859 );
|
||||
#endif /* LDAP_CHARSET_8859 == LDAP_DEFAULT_CHARSET */
|
||||
#endif /* STR_TRANSLATION && LDAP_DEFAULT_CHARSET */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ldap_version - report version levels for important properties
|
||||
* This function is deprecated. Use ldap_get_option( ..., LDAP_OPT_API_INFO,
|
||||
* ... ) instead.
|
||||
*
|
||||
* Example:
|
||||
* LDAPVersion ver;
|
||||
* ldap_version( &ver );
|
||||
* if ( (ver.sdk_version < 100) || (ver.SSL_version < 300) )
|
||||
* fprintf( stderr, "LDAP SDK level insufficient\n" );
|
||||
*
|
||||
* or:
|
||||
* if ( ldap_version(NULL) < 100 )
|
||||
* fprintf( stderr, "LDAP SDK level insufficient\n" );
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_version( LDAPVersion *ver )
|
||||
{
|
||||
if ( NULL != ver )
|
||||
{
|
||||
memset( ver, 0, sizeof(*ver) );
|
||||
ver->sdk_version = (int)(VI_PRODUCTVERSION * 100);
|
||||
ver->protocol_version = LDAP_VERSION_MAX * 100;
|
||||
ver->SSL_version = SSL_VERSION * 100;
|
||||
/*
|
||||
* set security to none by default
|
||||
*/
|
||||
|
||||
ver->security_level = LDAP_SECURITY_NONE;
|
||||
#if defined(LINK_SSL)
|
||||
#if defined(NS_DOMESTIC)
|
||||
ver->security_level = 128;
|
||||
#elif defined(NSS_EXPORT)
|
||||
ver->security_level = 40;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
}
|
||||
return (int)(VI_PRODUCTVERSION * 100);
|
||||
}
|
||||
|
||||
/*
|
||||
* ldap_open - initialize and connect to an ldap server. A magic cookie to
|
||||
* be used for future communication is returned on success, NULL on failure.
|
||||
* "host" may be a space-separated list of hosts or IP addresses
|
||||
*
|
||||
* Example:
|
||||
* LDAP *ld;
|
||||
* ld = ldap_open( hostname, port );
|
||||
*/
|
||||
|
||||
LDAP *
|
||||
LDAP_CALL
|
||||
ldap_open( const char *host, int port )
|
||||
{
|
||||
LDAP *ld;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_open\n", 0, 0, 0 );
|
||||
|
||||
if (( ld = ldap_init( host, port )) == NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CONN_LOCK );
|
||||
if ( nsldapi_open_ldap_defconn( ld ) < 0 ) {
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CONN_LOCK );
|
||||
ldap_ld_free( ld, NULL, NULL, 0 );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CONN_LOCK );
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_open successful, ld_host is %s\n",
|
||||
( ld->ld_host == NULL ) ? "(null)" : ld->ld_host, 0, 0 );
|
||||
|
||||
return( ld );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ldap_init - initialize the LDAP library. A magic cookie to be used for
|
||||
* future communication is returned on success, NULL on failure.
|
||||
* "defhost" may be a space-separated list of hosts or IP addresses
|
||||
*
|
||||
* Example:
|
||||
* LDAP *ld;
|
||||
* ld = ldap_init( default_hostname, default_port );
|
||||
*/
|
||||
LDAP *
|
||||
LDAP_CALL
|
||||
ldap_init( const char *defhost, int defport )
|
||||
{
|
||||
LDAP *ld;
|
||||
int i;
|
||||
|
||||
if ( !nsldapi_initialized ) {
|
||||
nsldapi_initialize_defaults();
|
||||
}
|
||||
|
||||
if ( defport < 0 || defport > LDAP_PORT_MAX ) {
|
||||
LDAPDebug( LDAP_DEBUG_ANY,
|
||||
"ldap_init: port %d is invalid (port numbers must range from 1 to %d)\n",
|
||||
defport, LDAP_PORT_MAX, 0 );
|
||||
#if !defined( macintosh ) && !defined( DOS )
|
||||
errno = EINVAL;
|
||||
#endif
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_init\n", 0, 0, 0 );
|
||||
|
||||
if ( (ld = (LDAP*)NSLDAPI_MALLOC( sizeof(struct ldap) )) == NULL ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
/* copy defaults */
|
||||
SAFEMEMCPY( ld, &nsldapi_ld_defaults, sizeof( struct ldap ));
|
||||
|
||||
if (( ld->ld_selectinfo = nsldapi_new_select_info()) == NULL ||
|
||||
( ld->ld_sbp = ber_sockbuf_alloc()) == NULL ||
|
||||
( defhost != NULL &&
|
||||
( ld->ld_defhost = nsldapi_strdup( defhost )) == NULL ) ||
|
||||
((ld->ld_mutex = (void **) NSLDAPI_CALLOC( LDAP_MAX_LOCK, sizeof(void *))) == NULL )) {
|
||||
if ( ld->ld_sbp != NULL ) {
|
||||
ber_sockbuf_free( ld->ld_sbp );
|
||||
}
|
||||
if ( ld->ld_selectinfo != NULL ) {
|
||||
nsldapi_free_select_info( ld->ld_selectinfo );
|
||||
}
|
||||
if( ld->ld_mutex != NULL )
|
||||
NSLDAPI_FREE( ld->ld_mutex );
|
||||
NSLDAPI_FREE( (char*)ld );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
/* install Sockbuf I/O functions if set in LDAP * */
|
||||
if ( ld->ld_read_fn != NULL ) {
|
||||
ber_sockbuf_set_option( ld->ld_sbp, LBER_SOCKBUF_OPT_READ_FN,
|
||||
(void *)ld->ld_read_fn );
|
||||
}
|
||||
if ( ld->ld_write_fn != NULL ) {
|
||||
ber_sockbuf_set_option( ld->ld_sbp, LBER_SOCKBUF_OPT_WRITE_FN,
|
||||
(void *)ld->ld_write_fn );
|
||||
}
|
||||
|
||||
/* allocate mutexes */
|
||||
for( i=0; i<LDAP_MAX_LOCK; i++ ) {
|
||||
ld->ld_mutex[i] = LDAP_MUTEX_ALLOC( ld );
|
||||
ld->ld_mutex_threadid[i] = (void *) -1;
|
||||
ld->ld_mutex_refcnt[i] = 0;
|
||||
}
|
||||
|
||||
/* set default port */
|
||||
ld->ld_defport = ( defport == 0 ) ? LDAP_PORT : defport;
|
||||
|
||||
return( ld );
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
nsldapi_open_ldap_connection( LDAP *ld, Sockbuf *sb, char *host, int defport,
|
||||
char **krbinstancep, int async, int secure )
|
||||
{
|
||||
int rc = 0, port;
|
||||
char *p, *q, *r;
|
||||
char *curhost, hostname[ 2*MAXHOSTNAMELEN ];
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "nsldapi_open_ldap_connection\n", 0, 0,
|
||||
0 );
|
||||
|
||||
defport = htons( (unsigned short)defport );
|
||||
|
||||
if ( host != NULL && *host != '\0' ) {
|
||||
for ( p = host; p != NULL && *p != '\0'; p = q ) {
|
||||
if (( q = strchr( p, ' ' )) != NULL ) {
|
||||
strncpy( hostname, p, q - p );
|
||||
hostname[ q - p ] = '\0';
|
||||
curhost = hostname;
|
||||
while ( *q == ' ' ) {
|
||||
++q;
|
||||
}
|
||||
} else {
|
||||
curhost = p; /* avoid copy if possible */
|
||||
q = NULL;
|
||||
}
|
||||
|
||||
if (( r = strchr( curhost, ':' )) != NULL ) {
|
||||
if ( curhost != hostname ) {
|
||||
strcpy( hostname, curhost ); /* now copy */
|
||||
r = hostname + ( r - curhost );
|
||||
curhost = hostname;
|
||||
}
|
||||
*r++ = '\0';
|
||||
port = htons( (short)atoi( r ));
|
||||
} else {
|
||||
port = defport;
|
||||
}
|
||||
|
||||
if (( rc = nsldapi_connect_to_host( ld, sb, curhost,
|
||||
0, port, async, secure )) != -1 ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
rc = nsldapi_connect_to_host( ld, sb, NULL, htonl( INADDR_LOOPBACK ),
|
||||
defport, async, secure );
|
||||
}
|
||||
|
||||
if ( rc == -1 ) {
|
||||
return( rc );
|
||||
}
|
||||
|
||||
if ( krbinstancep != NULL ) {
|
||||
#ifdef KERBEROS
|
||||
if (( *krbinstancep = nsldapi_host_connected_to( sb )) != NULL &&
|
||||
( p = strchr( *krbinstancep, '.' )) != NULL ) {
|
||||
*p = '\0';
|
||||
}
|
||||
#else /* KERBEROS */
|
||||
krbinstancep = NULL;
|
||||
#endif /* KERBEROS */
|
||||
}
|
||||
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
/* returns 0 if connection opened and -1 if an error occurs */
|
||||
int
|
||||
nsldapi_open_ldap_defconn( LDAP *ld )
|
||||
{
|
||||
LDAPServer *srv;
|
||||
|
||||
if (( srv = (LDAPServer *)NSLDAPI_CALLOC( 1, sizeof( LDAPServer ))) ==
|
||||
NULL || ( ld->ld_defhost != NULL && ( srv->lsrv_host =
|
||||
nsldapi_strdup( ld->ld_defhost )) == NULL )) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL, NULL );
|
||||
return( -1 );
|
||||
}
|
||||
srv->lsrv_port = ld->ld_defport;
|
||||
|
||||
#ifdef LDAP_SSLIO_HOOKS
|
||||
if (( ld->ld_options & LDAP_BITOPT_SSL ) != 0 ) {
|
||||
srv->lsrv_options |= LDAP_SRV_OPT_SECURE;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (( ld->ld_defconn = nsldapi_new_connection( ld, &srv, 1, 1, 0 ))
|
||||
== NULL ) {
|
||||
if ( ld->ld_defhost != NULL ) {
|
||||
NSLDAPI_FREE( srv->lsrv_host );
|
||||
}
|
||||
NSLDAPI_FREE( (char *)srv );
|
||||
return( -1 );
|
||||
}
|
||||
++ld->ld_defconn->lconn_refcnt; /* so it never gets closed/freed */
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* memory allocation functions. we include these in open.c since every
|
||||
* LDAP application is likely to pull the rest of the code in this file
|
||||
* in anyways.
|
||||
*/
|
||||
void *
|
||||
nsldapi_malloc( size_t size )
|
||||
{
|
||||
return( nsldapi_memalloc_fns.ldapmem_malloc == NULL ?
|
||||
malloc( size ) :
|
||||
nsldapi_memalloc_fns.ldapmem_malloc( size ));
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
nsldapi_calloc( size_t nelem, size_t elsize )
|
||||
{
|
||||
return( nsldapi_memalloc_fns.ldapmem_calloc == NULL ?
|
||||
calloc( nelem, elsize ) :
|
||||
nsldapi_memalloc_fns.ldapmem_calloc( nelem, elsize ));
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
nsldapi_realloc( void *ptr, size_t size )
|
||||
{
|
||||
return( nsldapi_memalloc_fns.ldapmem_realloc == NULL ?
|
||||
realloc( ptr, size ) :
|
||||
nsldapi_memalloc_fns.ldapmem_realloc( ptr, size ));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nsldapi_free( void *ptr )
|
||||
{
|
||||
if ( nsldapi_memalloc_fns.ldapmem_free == NULL ) {
|
||||
free( ptr );
|
||||
} else {
|
||||
nsldapi_memalloc_fns.ldapmem_free( ptr );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* if s is NULL, returns NULL */
|
||||
char *
|
||||
nsldapi_strdup( const char *s )
|
||||
{
|
||||
char *p;
|
||||
|
||||
if ( s == NULL ||
|
||||
(p = (char *)NSLDAPI_MALLOC( strlen( s ) + 1 )) == NULL )
|
||||
return( NULL );
|
||||
|
||||
strcpy( p, s );
|
||||
|
||||
return( p );
|
||||
}
|
||||
757
mozilla/directory/c-sdk/ldap/libraries/libldap/os-ip.c
Normal file
757
mozilla/directory/c-sdk/ldap/libraries/libldap/os-ip.c
Normal file
@@ -0,0 +1,757 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1995 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* os-ip.c -- platform-specific TCP & UDP related code
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1995 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
#ifdef LDAP_CONNECT_MUST_NOT_BE_INTERRUPTED
|
||||
#include <signal.h>
|
||||
#endif
|
||||
|
||||
#ifdef NSLDAPI_HAVE_POLL
|
||||
#include <poll.h>
|
||||
#endif
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#define CLOSESOCKET(_s) closesocket((_s))
|
||||
#else
|
||||
#define CLOSESOCKET(_s) close((_s))
|
||||
#endif
|
||||
|
||||
struct selectinfo {
|
||||
fd_set si_readfds;
|
||||
fd_set si_writefds;
|
||||
fd_set si_use_readfds;
|
||||
fd_set si_use_writefds;
|
||||
#ifdef NSLDAPI_HAVE_POLL
|
||||
struct pollfd *si_pollfds;
|
||||
int si_pollfds_size;
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef NSLDAPI_HAVE_POLL
|
||||
static int add_to_pollfds( int fd, struct selectinfo *sip, short events );
|
||||
static int clear_from_pollfds( int fd, struct selectinfo *sip,
|
||||
short events );
|
||||
static int find_in_pollfds( int fd, struct selectinfo *sip, short revents );
|
||||
#endif
|
||||
|
||||
#ifdef irix
|
||||
#ifndef _PR_THREADS
|
||||
/*
|
||||
* XXXmcs: on IRIX NSPR's poll() and select() wrappers will crash if NSPR
|
||||
* has not been initialized. We work around the problem by bypassing
|
||||
* the NSPR wrapper functions and going directly to the OS' functions.
|
||||
*/
|
||||
#define NSLDAPI_POLL _poll
|
||||
#define NSLDAPI_SELECT _select
|
||||
extern int _poll(struct pollfd *fds, unsigned long nfds, int timeout);
|
||||
extern int _select(int nfds, fd_set *readfds, fd_set *writefds,
|
||||
fd_set *exceptfds, struct timeval *timeout);
|
||||
#else
|
||||
#define NSLDAPI_POLL poll
|
||||
#define NSLDAPI_SELECT select
|
||||
#endif
|
||||
#else
|
||||
#define NSLDAPI_POLL poll
|
||||
#define NSLDAPI_SELECT select
|
||||
#endif
|
||||
|
||||
|
||||
int
|
||||
nsldapi_connect_to_host( LDAP *ld, Sockbuf *sb, char *host,
|
||||
nsldapi_in_addr_t address, int port, int async, int secure )
|
||||
/*
|
||||
* if host == NULL, connect using address
|
||||
* "address" and "port" must be in network byte order
|
||||
* zero is returned upon success, -1 if fatal error, -2 EINPROGRESS
|
||||
* if -1 is returned, ld_errno is set
|
||||
* non-zero async means don't wait for connect
|
||||
*/
|
||||
{
|
||||
int rc, i, s, connected, use_hp;
|
||||
struct sockaddr_in sin;
|
||||
char **addrlist, *ldhpbuf, *ldhpbuf_allocd;
|
||||
LDAPHostEnt ldhent, *ldhp;
|
||||
struct hostent *hp;
|
||||
#ifdef GETHOSTBYNAME_BUF_T
|
||||
GETHOSTBYNAME_BUF_T hbuf;
|
||||
struct hostent hent;
|
||||
#endif
|
||||
int err;
|
||||
|
||||
|
||||
#ifdef _WINDOWS
|
||||
u_long iostatus; /* for ioctl call */
|
||||
#else
|
||||
int iostatus; /* for ioctl call */
|
||||
#endif
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "nsldapi_connect_to_host: %s:%d\n",
|
||||
( host == NULL ) ? "(by address)" : host,
|
||||
ntohs( (unsigned short)port ), 0 );
|
||||
|
||||
if ( secure && ld->ld_ssl_enable_fn == NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_LOCAL_ERROR, NULL, NULL );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
ldhpbuf_allocd = NULL;
|
||||
ldhp = NULL;
|
||||
hp = NULL;
|
||||
s = 0;
|
||||
connected = use_hp = 0;
|
||||
addrlist = NULL;
|
||||
|
||||
if ( host != NULL && ( address = inet_addr( host )) == -1 ) {
|
||||
if ( ld->ld_dns_gethostbyname_fn == NULL ) {
|
||||
if (( hp = GETHOSTBYNAME( host, &hent, hbuf,
|
||||
sizeof(hbuf), &err )) != NULL ) {
|
||||
addrlist = hp->h_addr_list;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* DNS callback installed... use it.
|
||||
*/
|
||||
#ifdef GETHOSTBYNAME_buf_t
|
||||
/* avoid allocation by using hbuf if large enough */
|
||||
if ( sizeof( hbuf ) < ld->ld_dns_bufsize ) {
|
||||
ldhpbuf = ldhpbuf_allocd
|
||||
= NSLDAPI_MALLOC( ld->ld_dns_bufsize );
|
||||
} else {
|
||||
ldhpbuf = (char *)hbuf;
|
||||
}
|
||||
#else /* GETHOSTBYNAME_buf_t */
|
||||
ldhpbuf = ldhpbuf_allocd = NSLDAPI_MALLOC(
|
||||
ld->ld_dns_bufsize );
|
||||
#endif /* GETHOSTBYNAME_buf_t */
|
||||
|
||||
if ( ldhpbuf == NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL,
|
||||
NULL );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
if (( ldhp = ld->ld_dns_gethostbyname_fn( host,
|
||||
&ldhent, ldhpbuf, ld->ld_dns_bufsize, &err,
|
||||
ld->ld_dns_extradata )) != NULL ) {
|
||||
addrlist = ldhp->ldaphe_addr_list;
|
||||
}
|
||||
}
|
||||
|
||||
if ( addrlist == NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_CONNECT_ERROR, NULL, NULL );
|
||||
LDAP_SET_ERRNO( ld, EHOSTUNREACH ); /* close enough */
|
||||
if ( ldhpbuf_allocd != NULL ) {
|
||||
NSLDAPI_FREE( ldhpbuf_allocd );
|
||||
}
|
||||
return( -1 );
|
||||
}
|
||||
use_hp = 1;
|
||||
}
|
||||
|
||||
rc = -1;
|
||||
for ( i = 0; !use_hp || ( addrlist[ i ] != 0 ); i++ ) {
|
||||
if ( ld->ld_socket_fn == NULL ) {
|
||||
s = socket( AF_INET, SOCK_STREAM, 0 );
|
||||
} else {
|
||||
s = ld->ld_socket_fn( AF_INET, SOCK_STREAM, 0 );
|
||||
}
|
||||
|
||||
/*
|
||||
* if the socket() call failed or it returned a socket larger
|
||||
* than we can deal with, return a "local error."
|
||||
*/
|
||||
#ifdef _WINDOWS
|
||||
if ( s < 0 ) {
|
||||
#elif NSLDAPI_HAVE_POLL
|
||||
if ( s < 0 || ( ld->ld_select_fn != NULL && s >= FD_SETSIZE )) {
|
||||
#else /* not on Windows and do not have poll() */
|
||||
if ( s < 0 || s >= FD_SETSIZE ) {
|
||||
#endif
|
||||
char *errmsg;
|
||||
|
||||
if ( s < 0 ) {
|
||||
errmsg = "unable to create a socket";
|
||||
} else {
|
||||
errmsg = "can't use socket >= FD_SETSIZE";
|
||||
if ( ld->ld_close_fn == NULL ) {
|
||||
CLOSESOCKET( s );
|
||||
} else {
|
||||
ld->ld_close_fn( s );
|
||||
}
|
||||
}
|
||||
errmsg = nsldapi_strdup( errmsg );
|
||||
LDAP_SET_LDERRNO( ld, LDAP_LOCAL_ERROR, NULL, errmsg );
|
||||
if ( ldhpbuf_allocd != NULL ) {
|
||||
NSLDAPI_FREE( ldhpbuf_allocd );
|
||||
}
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
|
||||
if ( async && ld->ld_options & LDAP_BITOPT_ASYNC ) {
|
||||
iostatus = 1;
|
||||
#ifdef FIONBIO
|
||||
if ( ld->ld_ioctl_fn == NULL ) {
|
||||
#ifdef _WINDOWS
|
||||
err = ioctlsocket( s, FIONBIO, &iostatus );
|
||||
#else
|
||||
#ifdef XP_OS2
|
||||
err = ioctl( s, FIONBIO, (caddr_t)&iostatus, sizeof(iostatus) );
|
||||
#else
|
||||
err = ioctl( s, FIONBIO, (caddr_t)&iostatus );
|
||||
#endif
|
||||
#endif /* _WINDOWS */
|
||||
} else {
|
||||
#ifdef _WINDOWS
|
||||
err = ld->ld_ioctl_fn( s, FIONBIO, &iostatus );
|
||||
#else
|
||||
err = ld->ld_ioctl_fn( s, FIONBIO, (caddr_t)&iostatus );
|
||||
#endif /* _WINDOWS */
|
||||
}
|
||||
if ( err == -1 ) {
|
||||
LDAPDebug( LDAP_DEBUG_ANY,
|
||||
"FIONBIO ioctl failed on %d\n", s, 0, 0 );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
(void)memset( (char *)&sin, 0, sizeof( struct sockaddr_in ));
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_port = port;
|
||||
|
||||
if ( secure && ld->ld_ssl_enable_fn( s ) < 0 ) {
|
||||
if ( ld->ld_close_fn == NULL ) {
|
||||
CLOSESOCKET( s );
|
||||
} else {
|
||||
ld->ld_close_fn( s );
|
||||
}
|
||||
LDAP_SET_LDERRNO( ld, LDAP_LOCAL_ERROR, NULL, NULL );
|
||||
if ( ldhpbuf_allocd != NULL ) {
|
||||
NSLDAPI_FREE( ldhpbuf_allocd );
|
||||
}
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
SAFEMEMCPY( (char *) &sin.sin_addr.s_addr,
|
||||
( use_hp ? (char *) addrlist[ i ] :
|
||||
(char *) &address ), sizeof( sin.sin_addr.s_addr) );
|
||||
|
||||
if ( ld->ld_connect_fn == NULL ) {
|
||||
#ifdef LDAP_CONNECT_MUST_NOT_BE_INTERRUPTED
|
||||
/*
|
||||
* Block all of the signals that might interrupt connect() since there
|
||||
* is an OS bug that causes connect() to fail if it is restarted. Look in
|
||||
* ns/netsite/ldap/include/portable.h for the definition of
|
||||
* LDAP_CONNECT_MUST_NOT_BE_INTERRUPTED
|
||||
*/
|
||||
sigset_t ints_off, oldset;
|
||||
|
||||
sigemptyset( &ints_off );
|
||||
sigaddset( &ints_off, SIGALRM );
|
||||
sigaddset( &ints_off, SIGIO );
|
||||
sigaddset( &ints_off, SIGCLD );
|
||||
|
||||
sigprocmask( SIG_BLOCK, &ints_off, &oldset );
|
||||
#endif
|
||||
err = connect( s, (struct sockaddr *)&sin,
|
||||
sizeof( struct sockaddr_in ));
|
||||
#ifdef LDAP_CONNECT_MUST_NOT_BE_INTERRUPTED
|
||||
/*
|
||||
* restore original signal mask
|
||||
*/
|
||||
sigprocmask( SIG_SETMASK, &oldset, 0 );
|
||||
#endif
|
||||
} else {
|
||||
if (ld->ld_options & LDAP_BITOPT_ASYNC)
|
||||
{
|
||||
err = 0;
|
||||
}
|
||||
else {
|
||||
err = ld->ld_connect_fn( s,
|
||||
(struct sockaddr *)&sin,
|
||||
sizeof( struct sockaddr_in ));
|
||||
}
|
||||
|
||||
}
|
||||
if ( err >= 0 ) {
|
||||
connected = 1;
|
||||
rc = 0;
|
||||
break;
|
||||
} else
|
||||
{
|
||||
if ( async && ld->ld_options & LDAP_BITOPT_ASYNC) {
|
||||
#ifdef _WINDOWS
|
||||
if (err == -1 && WSAGetLastError() == WSAEWOULDBLOCK)
|
||||
LDAP_SET_ERRNO( ld, EWOULDBLOCK );
|
||||
#endif /* _WINDOWS */
|
||||
err = LDAP_GET_ERRNO( ld );
|
||||
if ( NSLDAPI_ERRNO_IO_INPROGRESS( err )) {
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "connect would block...\n",
|
||||
0, 0, 0 );
|
||||
rc = -2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef LDAP_DEBUG
|
||||
if ( ldap_debug & LDAP_DEBUG_TRACE ) {
|
||||
perror( (char *)inet_ntoa( sin.sin_addr ));
|
||||
}
|
||||
#endif
|
||||
if ( ld->ld_close_fn == NULL ) {
|
||||
CLOSESOCKET( s );
|
||||
|
||||
} else {
|
||||
ld->ld_close_fn( s );
|
||||
}
|
||||
if ( !use_hp ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( ldhpbuf_allocd != NULL ) {
|
||||
NSLDAPI_FREE( ldhpbuf_allocd );
|
||||
}
|
||||
|
||||
sb->sb_sd = s;
|
||||
|
||||
if ( connected ) {
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "sd %d connected to: %s\n",
|
||||
s, inet_ntoa( sin.sin_addr ), 0 );
|
||||
}
|
||||
|
||||
if ( rc == -1 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_CONNECT_ERROR, NULL, NULL );
|
||||
}
|
||||
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nsldapi_close_connection( LDAP *ld, Sockbuf *sb )
|
||||
{
|
||||
if ( ld->ld_close_fn == NULL ) {
|
||||
CLOSESOCKET( sb->sb_sd );
|
||||
} else {
|
||||
ld->ld_close_fn( sb->sb_sd );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef KERBEROS
|
||||
char *
|
||||
nsldapi_host_connected_to( Sockbuf *sb )
|
||||
{
|
||||
struct hostent *hp;
|
||||
char *p;
|
||||
int len;
|
||||
struct sockaddr_in sin;
|
||||
|
||||
(void)memset( (char *)&sin, 0, sizeof( struct sockaddr_in ));
|
||||
len = sizeof( sin );
|
||||
if ( getpeername( sb->sb_sd, (struct sockaddr *)&sin, &len ) == -1 ) {
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
/*
|
||||
* do a reverse lookup on the addr to get the official hostname.
|
||||
* this is necessary for kerberos to work right, since the official
|
||||
* hostname is used as the kerberos instance.
|
||||
*/
|
||||
/* XXXmcs: need to use DNS callbacks here XXX */
|
||||
XXX
|
||||
if (( hp = gethostbyaddr( (char *) &sin.sin_addr,
|
||||
sizeof( sin.sin_addr ), AF_INET )) != NULL ) {
|
||||
if ( hp->h_name != NULL ) {
|
||||
return( nsldapi_strdup( hp->h_name ));
|
||||
}
|
||||
}
|
||||
|
||||
return( NULL );
|
||||
}
|
||||
#endif /* KERBEROS */
|
||||
|
||||
|
||||
void
|
||||
nsldapi_mark_select_write( LDAP *ld, Sockbuf *sb )
|
||||
{
|
||||
struct selectinfo *sip;
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_SELECT_LOCK );
|
||||
sip = (struct selectinfo *)ld->ld_selectinfo;
|
||||
|
||||
#ifdef NSLDAPI_HAVE_POLL
|
||||
if ( ld->ld_select_fn == NULL ) {
|
||||
if ( add_to_pollfds( sb->sb_sd, sip, POLLOUT )) {
|
||||
++ld->ld_selectwritecnt;
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_SELECT_LOCK );
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ( !FD_ISSET( sb->sb_sd, &sip->si_writefds )) {
|
||||
FD_SET( sb->sb_sd, &sip->si_writefds );
|
||||
++ld->ld_selectwritecnt;
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_SELECT_LOCK );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nsldapi_mark_select_read( LDAP *ld, Sockbuf *sb )
|
||||
{
|
||||
struct selectinfo *sip;
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_SELECT_LOCK );
|
||||
sip = (struct selectinfo *)ld->ld_selectinfo;
|
||||
|
||||
#ifdef NSLDAPI_HAVE_POLL
|
||||
if ( ld->ld_select_fn == NULL ) {
|
||||
if ( add_to_pollfds( sb->sb_sd, sip, POLLIN )) {
|
||||
++ld->ld_selectreadcnt;
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_SELECT_LOCK );
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ( !FD_ISSET( sb->sb_sd, &sip->si_readfds )) {
|
||||
FD_SET( sb->sb_sd, &sip->si_readfds );
|
||||
++ld->ld_selectreadcnt;
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_SELECT_LOCK );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nsldapi_mark_select_clear( LDAP *ld, Sockbuf *sb )
|
||||
{
|
||||
struct selectinfo *sip;
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_SELECT_LOCK );
|
||||
sip = (struct selectinfo *)ld->ld_selectinfo;
|
||||
|
||||
#ifdef NSLDAPI_HAVE_POLL
|
||||
if ( ld->ld_select_fn == NULL ) {
|
||||
if ( clear_from_pollfds( sb->sb_sd, sip, POLLIN )) {
|
||||
--ld->ld_selectreadcnt;
|
||||
}
|
||||
if ( clear_from_pollfds( sb->sb_sd, sip, POLLOUT )) {
|
||||
--ld->ld_selectwritecnt;
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_SELECT_LOCK );
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if ( FD_ISSET( sb->sb_sd, &sip->si_writefds )) {
|
||||
FD_CLR( sb->sb_sd, &sip->si_writefds );
|
||||
--ld->ld_selectwritecnt;
|
||||
}
|
||||
if ( FD_ISSET( sb->sb_sd, &sip->si_readfds )) {
|
||||
FD_CLR( sb->sb_sd, &sip->si_readfds );
|
||||
--ld->ld_selectreadcnt;
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_SELECT_LOCK );
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
nsldapi_is_write_ready( LDAP *ld, Sockbuf *sb )
|
||||
{
|
||||
struct selectinfo *sip;
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_SELECT_LOCK );
|
||||
sip = (struct selectinfo *)ld->ld_selectinfo;
|
||||
|
||||
#ifdef NSLDAPI_HAVE_POLL
|
||||
if ( ld->ld_select_fn == NULL ) {
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_SELECT_LOCK );
|
||||
/*
|
||||
* if we are using poll() we do something a little tricky: if
|
||||
* any bits in the socket's returned events field other than
|
||||
* POLLIN (ready for read) are set, we return true. This
|
||||
* is done so we notice when a server closes a connection
|
||||
* or when another error occurs. The actual error will be
|
||||
* noticed later when we call write() or send().
|
||||
*/
|
||||
return( find_in_pollfds( sb->sb_sd, sip, ~POLLIN ));
|
||||
}
|
||||
#endif
|
||||
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_SELECT_LOCK );
|
||||
return( FD_ISSET( sb->sb_sd, &sip->si_use_writefds ));
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
nsldapi_is_read_ready( LDAP *ld, Sockbuf *sb )
|
||||
{
|
||||
struct selectinfo *sip;
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_SELECT_LOCK );
|
||||
sip = (struct selectinfo *)ld->ld_selectinfo;
|
||||
|
||||
#ifdef NSLDAPI_HAVE_POLL
|
||||
if ( ld->ld_select_fn == NULL ) {
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_SELECT_LOCK );
|
||||
/*
|
||||
* if we are using poll() we do something a little tricky: if
|
||||
* any bits in the socket's returned events field other than
|
||||
* POLLOUT (ready for write) are set, we return true. This
|
||||
* is done so we notice when a server closes a connection
|
||||
* or when another error occurs. The actual error will be
|
||||
* noticed later when we call read() or recv().
|
||||
*/
|
||||
return( find_in_pollfds( sb->sb_sd, sip, ~POLLOUT ));
|
||||
}
|
||||
#endif
|
||||
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_SELECT_LOCK );
|
||||
return( FD_ISSET( sb->sb_sd, &sip->si_use_readfds ));
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
nsldapi_new_select_info()
|
||||
{
|
||||
struct selectinfo *sip;
|
||||
|
||||
if (( sip = (struct selectinfo *)NSLDAPI_CALLOC( 1,
|
||||
sizeof( struct selectinfo ))) != NULL ) {
|
||||
FD_ZERO( &sip->si_readfds );
|
||||
FD_ZERO( &sip->si_writefds );
|
||||
}
|
||||
|
||||
return( (void *)sip );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
nsldapi_free_select_info( void *vsip )
|
||||
{
|
||||
struct selectinfo *sip = (struct selectinfo *)vsip;
|
||||
|
||||
#ifdef NSLDAPI_HAVE_POLL
|
||||
if ( sip->si_pollfds != NULL ) {
|
||||
NSLDAPI_FREE( sip->si_pollfds );
|
||||
}
|
||||
#endif
|
||||
NSLDAPI_FREE( sip );
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
nsldapi_do_ldap_select( LDAP *ld, struct timeval *timeout )
|
||||
{
|
||||
struct selectinfo *sip;
|
||||
static int tblsize = 0;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "nsldapi_do_ldap_select\n", 0, 0, 0 );
|
||||
|
||||
if ( tblsize == 0 ) {
|
||||
#if defined(_WINDOWS) || defined(XP_OS2)
|
||||
tblsize = FOPEN_MAX; /* ANSI spec. */
|
||||
#else
|
||||
#ifdef USE_SYSCONF
|
||||
tblsize = sysconf( _SC_OPEN_MAX );
|
||||
#else /* USE_SYSCONF */
|
||||
tblsize = getdtablesize();
|
||||
#endif /* USE_SYSCONF */
|
||||
#endif /* _WINDOWS */
|
||||
|
||||
if ( tblsize >= FD_SETSIZE ) {
|
||||
/*
|
||||
* clamp value so we don't overrun the fd_set structure
|
||||
*/
|
||||
tblsize = FD_SETSIZE - 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ld->ld_selectreadcnt <= 0 && ld->ld_selectwritecnt <= 0 ) {
|
||||
return( 0 ); /* simulate a timeout */
|
||||
}
|
||||
|
||||
sip = (struct selectinfo *)ld->ld_selectinfo;
|
||||
|
||||
#ifdef NSLDAPI_HAVE_POLL
|
||||
if ( ld->ld_select_fn == NULL ) {
|
||||
int to;
|
||||
|
||||
if ( timeout == NULL ) {
|
||||
to = -1;
|
||||
} else {
|
||||
to = timeout->tv_sec * 1000 + timeout->tv_usec / 1000;
|
||||
}
|
||||
return( NSLDAPI_POLL( sip->si_pollfds, sip->si_pollfds_size,
|
||||
to ));
|
||||
}
|
||||
#endif
|
||||
|
||||
sip->si_use_readfds = sip->si_readfds;
|
||||
sip->si_use_writefds = sip->si_writefds;
|
||||
|
||||
if ( ld->ld_select_fn != NULL ) {
|
||||
return( ld->ld_select_fn( tblsize, &sip->si_use_readfds,
|
||||
&sip->si_use_writefds, NULL, timeout ));
|
||||
} else {
|
||||
#ifdef HPUX9
|
||||
return( NSLDAPI_SELECT( tblsize, (int *)&sip->si_use_readfds,
|
||||
(int *)&sip->si_use_writefds, NULL, timeout ));
|
||||
#else
|
||||
return( NSLDAPI_SELECT( tblsize, &sip->si_use_readfds,
|
||||
&sip->si_use_writefds, NULL, timeout ));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NSLDAPI_HAVE_POLL
|
||||
|
||||
/*
|
||||
* returns 1 if "fd" was added to pollfds.
|
||||
* returns 1 if some of the bits in "events" were added to pollfds.
|
||||
* returns 0 if no changes were made.
|
||||
*/
|
||||
static int
|
||||
add_to_pollfds( int fd, struct selectinfo *sip, short events )
|
||||
{
|
||||
int i, openslot;
|
||||
|
||||
/* first we check to see if "fd" is already in our pollfds */
|
||||
openslot = -1;
|
||||
for ( i = 0; i < sip->si_pollfds_size; ++i ) {
|
||||
if ( sip->si_pollfds[ i ].fd == fd ) {
|
||||
if (( sip->si_pollfds[ i ].events & events )
|
||||
!= events ) {
|
||||
sip->si_pollfds[ i ].events |= events;
|
||||
return( 1 );
|
||||
} else {
|
||||
return( 0 );
|
||||
}
|
||||
}
|
||||
if ( sip->si_pollfds[ i ].fd == -1 && openslot == -1 ) {
|
||||
openslot = i; /* remember for later */
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* "fd" is not currently being poll'd on -- add to array.
|
||||
* if we need to expand the pollfds array, we do it in increments of 5.
|
||||
*/
|
||||
if ( openslot == -1 ) {
|
||||
struct pollfd *newpollfds;
|
||||
|
||||
if ( sip->si_pollfds_size == 0 ) {
|
||||
newpollfds = (struct pollfd *)NSLDAPI_MALLOC(
|
||||
5 * sizeof( struct pollfd ));
|
||||
} else {
|
||||
newpollfds = (struct pollfd *)NSLDAPI_REALLOC(
|
||||
sip->si_pollfds, (5 + sip->si_pollfds_size) *
|
||||
sizeof( struct pollfd ));
|
||||
}
|
||||
if ( newpollfds == NULL ) { /* XXXmcs: no way to return err! */
|
||||
return( 0 );
|
||||
}
|
||||
sip->si_pollfds = newpollfds;
|
||||
openslot = sip->si_pollfds_size;
|
||||
sip->si_pollfds_size += 5;
|
||||
for ( i = openslot + 1; i < sip->si_pollfds_size; ++i ) {
|
||||
sip->si_pollfds[ i ].fd = -1;
|
||||
sip->si_pollfds[ i ].events =
|
||||
sip->si_pollfds[ i ].revents = 0;
|
||||
}
|
||||
}
|
||||
sip->si_pollfds[ openslot ].fd = fd;
|
||||
sip->si_pollfds[ openslot ].events = events;
|
||||
sip->si_pollfds[ openslot ].revents = 0;
|
||||
return( 1 );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* returns 1 if any "events" from "fd" were removed from pollfds
|
||||
* returns 0 of "fd" wasn't in pollfds or if events did not overlap.
|
||||
*/
|
||||
static int
|
||||
clear_from_pollfds( int fd, struct selectinfo *sip,
|
||||
short events )
|
||||
{
|
||||
int i;
|
||||
|
||||
for ( i = 0; i < sip->si_pollfds_size; ++i ) {
|
||||
if ( sip->si_pollfds[i].fd == fd ) {
|
||||
if (( sip->si_pollfds[ i ].events & events ) != 0 ) {
|
||||
sip->si_pollfds[ i ].events &= ~events;
|
||||
if ( sip->si_pollfds[ i ].events == 0 ) {
|
||||
sip->si_pollfds[i].fd = -1;
|
||||
}
|
||||
return( 1 ); /* events overlap */
|
||||
} else {
|
||||
return( 0 ); /* events do not overlap */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return( 0 ); /* "fd" was not found */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* returns 1 if any "revents" from "fd" were set in pollfds revents field.
|
||||
* returns 0 if not.
|
||||
*/
|
||||
static int
|
||||
find_in_pollfds( int fd, struct selectinfo *sip, short revents )
|
||||
{
|
||||
int i;
|
||||
|
||||
for ( i = 0; i < sip->si_pollfds_size; ++i ) {
|
||||
if ( sip->si_pollfds[i].fd == fd ) {
|
||||
if (( sip->si_pollfds[ i ].revents & revents ) != 0 ) {
|
||||
return( 1 ); /* revents overlap */
|
||||
} else {
|
||||
return( 0 ); /* revents do not overlap */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return( 0 ); /* "fd" was not found */
|
||||
}
|
||||
#endif /* NSLDAPI_HAVE_POLL */
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#include "ldap-int.h"
|
||||
|
||||
/* ldap_create_proxyauth_control:
|
||||
|
||||
Parameters are
|
||||
|
||||
ld LDAP pointer to the desired connection
|
||||
|
||||
dn The dn used in the proxy auth
|
||||
|
||||
ctl_iscritical Indicates whether the control is critical of not. If
|
||||
this field is non-zero, the operation will only be car-
|
||||
ried out if the control is recognized by the server
|
||||
and/or client
|
||||
|
||||
ctrlp the address of a place to put the constructed control
|
||||
*/
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_create_proxyauth_control (
|
||||
LDAP *ld,
|
||||
const char *dn,
|
||||
const char ctl_iscritical,
|
||||
LDAPControl **ctrlp
|
||||
)
|
||||
{
|
||||
BerElement *ber;
|
||||
int rc;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( ctrlp == NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return ( LDAP_PARAM_ERROR );
|
||||
}
|
||||
if (NULL == dn)
|
||||
{
|
||||
dn = "";
|
||||
}
|
||||
|
||||
/* create a ber package to hold the controlValue */
|
||||
if ( ( nsldapi_alloc_ber_with_options( ld, &ber ) ) != LDAP_SUCCESS ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL, NULL );
|
||||
return( LDAP_NO_MEMORY );
|
||||
}
|
||||
|
||||
|
||||
|
||||
if ( LBER_ERROR == ber_printf( ber,
|
||||
"{s}",
|
||||
dn ) )
|
||||
{
|
||||
LDAP_SET_LDERRNO( ld, LDAP_ENCODING_ERROR, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( LDAP_ENCODING_ERROR );
|
||||
}
|
||||
|
||||
rc = nsldapi_build_control( LDAP_CONTROL_PROXYAUTH, ber, 1,
|
||||
ctl_iscritical, ctrlp );
|
||||
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
return( rc );
|
||||
|
||||
}
|
||||
174
mozilla/directory/c-sdk/ldap/libraries/libldap/psearch.c
Normal file
174
mozilla/directory/c-sdk/ldap/libraries/libldap/psearch.c
Normal file
@@ -0,0 +1,174 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* psearch.c - Persistent search and "Entry Change Notification" support.
|
||||
*/
|
||||
#include "ldap-int.h"
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_create_persistentsearch_control( LDAP *ld, int changetypes,
|
||||
int changesonly, int return_echg_ctls, char ctl_iscritical,
|
||||
LDAPControl **ctrlp )
|
||||
{
|
||||
BerElement *ber;
|
||||
int rc;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( ctrlp == NULL || ( changetypes & ~LDAP_CHANGETYPE_ANY ) != 0 ) {
|
||||
rc = LDAP_PARAM_ERROR;
|
||||
goto report_error_and_return;
|
||||
}
|
||||
|
||||
/*
|
||||
* create a Persistent Search control. The control value looks like this:
|
||||
*
|
||||
* PersistentSearch ::= SEQUENCE {
|
||||
* changeTypes INTEGER,
|
||||
* -- the changeTypes field is the logical OR of
|
||||
* -- one or more of these values: add (1), delete (2),
|
||||
* -- modify (4), modDN (8). It specifies which types of
|
||||
* -- changes will cause an entry to be returned.
|
||||
* changesOnly BOOLEAN, -- skip initial search?
|
||||
* returnECs BOOLEAN, -- return "Entry Change" controls?
|
||||
* }
|
||||
*/
|
||||
if (( nsldapi_alloc_ber_with_options( ld, &ber )) != LDAP_SUCCESS ) {
|
||||
rc = LDAP_NO_MEMORY;
|
||||
goto report_error_and_return;
|
||||
}
|
||||
|
||||
if ( ber_printf( ber, "{ibb}", changetypes, changesonly,
|
||||
return_echg_ctls ) == -1 ) {
|
||||
ber_free( ber, 1 );
|
||||
rc = LDAP_ENCODING_ERROR;
|
||||
goto report_error_and_return;
|
||||
}
|
||||
|
||||
rc = nsldapi_build_control( LDAP_CONTROL_PERSISTENTSEARCH, ber, 1,
|
||||
ctl_iscritical, ctrlp );
|
||||
|
||||
report_error_and_return:
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_parse_entrychange_control( LDAP *ld, LDAPControl **ctrls, int *chgtypep,
|
||||
char **prevdnp, int *chgnumpresentp, long *chgnump )
|
||||
{
|
||||
BerElement *ber;
|
||||
int rc, i, changetype;
|
||||
unsigned long len;
|
||||
long along;
|
||||
char *previousdn;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
/*
|
||||
* find the entry change notification in the list of controls
|
||||
*/
|
||||
for ( i = 0; ctrls != NULL && ctrls[i] != NULL; ++i ) {
|
||||
if ( strcmp( ctrls[i]->ldctl_oid, LDAP_CONTROL_ENTRYCHANGE ) == 0 ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ctrls == NULL || ctrls[i] == NULL ) {
|
||||
rc = LDAP_CONTROL_NOT_FOUND;
|
||||
goto report_error_and_return;
|
||||
}
|
||||
|
||||
/*
|
||||
* allocate a BER element from the control value and parse it. The control
|
||||
* value should look like this:
|
||||
*
|
||||
* EntryChangeNotification ::= SEQUENCE {
|
||||
* changeType ENUMERATED {
|
||||
* add (1), -- these values match the
|
||||
* delete (2), -- values used for changeTypes
|
||||
* modify (4), -- in the PersistentSearch control.
|
||||
* modDN (8),
|
||||
* },
|
||||
* previousDN LDAPDN OPTIONAL, -- modDN ops. only
|
||||
* changeNumber INTEGER OPTIONAL, -- if supported
|
||||
* }
|
||||
*/
|
||||
if (( ber = ber_init( &(ctrls[i]->ldctl_value))) == NULL ) {
|
||||
rc = LDAP_NO_MEMORY;
|
||||
goto report_error_and_return;
|
||||
}
|
||||
|
||||
if ( ber_scanf( ber, "{e", &along ) == LBER_ERROR ) {
|
||||
ber_free( ber, 1 );
|
||||
rc = LDAP_DECODING_ERROR;
|
||||
goto report_error_and_return;
|
||||
}
|
||||
changetype = (int)along; /* XXX lossy cast */
|
||||
|
||||
if ( changetype == LDAP_CHANGETYPE_MODDN ) {
|
||||
if ( ber_scanf( ber, "a", &previousdn ) == LBER_ERROR ) {
|
||||
ber_free( ber, 1 );
|
||||
rc = LDAP_DECODING_ERROR;
|
||||
goto report_error_and_return;
|
||||
}
|
||||
} else {
|
||||
previousdn = NULL;
|
||||
}
|
||||
|
||||
if ( chgtypep != NULL ) {
|
||||
*chgtypep = changetype;
|
||||
}
|
||||
if ( prevdnp != NULL ) {
|
||||
*prevdnp = previousdn;
|
||||
} else if ( previousdn != NULL ) {
|
||||
NSLDAPI_FREE( previousdn );
|
||||
}
|
||||
|
||||
if ( chgnump != NULL ) { /* check for optional changenumber */
|
||||
if ( ber_peek_tag( ber, &len ) == LBER_INTEGER
|
||||
&& ber_get_int( ber, chgnump ) != LBER_ERROR ) {
|
||||
if ( chgnumpresentp != NULL ) {
|
||||
*chgnumpresentp = 1;
|
||||
}
|
||||
} else {
|
||||
if ( chgnumpresentp != NULL ) {
|
||||
*chgnumpresentp = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ber_free( ber, 1 );
|
||||
rc = LDAP_SUCCESS;
|
||||
|
||||
report_error_and_return:
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
return( rc );
|
||||
}
|
||||
1012
mozilla/directory/c-sdk/ldap/libraries/libldap/pthreadtest.c
Normal file
1012
mozilla/directory/c-sdk/ldap/libraries/libldap/pthreadtest.c
Normal file
File diff suppressed because it is too large
Load Diff
162
mozilla/directory/c-sdk/ldap/libraries/libldap/referral.c
Normal file
162
mozilla/directory/c-sdk/ldap/libraries/libldap/referral.c
Normal file
@@ -0,0 +1,162 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* referral.c - routines for handling LDAPv3 referrals and references.
|
||||
*/
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
|
||||
LDAPMessage *
|
||||
LDAP_CALL
|
||||
ldap_first_reference( LDAP *ld, LDAPMessage *res )
|
||||
{
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld ) || res == NULLMSG ) {
|
||||
return( NULLMSG );
|
||||
}
|
||||
|
||||
if ( res->lm_msgtype == LDAP_RES_SEARCH_REFERENCE ) {
|
||||
return( res );
|
||||
}
|
||||
|
||||
return( ldap_next_reference( ld, res ));
|
||||
}
|
||||
|
||||
|
||||
LDAPMessage *
|
||||
LDAP_CALL
|
||||
ldap_next_reference( LDAP *ld, LDAPMessage *ref )
|
||||
{
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld ) || ref == NULLMSG ) {
|
||||
return( NULLMSG ); /* punt */
|
||||
}
|
||||
|
||||
for ( ref = ref->lm_chain; ref != NULLMSG; ref = ref->lm_chain ) {
|
||||
if ( ref->lm_msgtype == LDAP_RES_SEARCH_REFERENCE ) {
|
||||
return( ref );
|
||||
}
|
||||
}
|
||||
|
||||
return( NULLMSG );
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_count_references( LDAP *ld, LDAPMessage *res )
|
||||
{
|
||||
int i;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
for ( i = 0; res != NULL; res = res->lm_chain ) {
|
||||
if ( res->lm_msgtype == LDAP_RES_SEARCH_REFERENCE ) {
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
return( i );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* returns an LDAP error code.
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_parse_reference( LDAP *ld, LDAPMessage *ref, char ***referralsp,
|
||||
LDAPControl ***serverctrlsp, int freeit )
|
||||
{
|
||||
int err;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld ) ||
|
||||
!NSLDAPI_VALID_LDAPMESSAGE_REFERENCE_POINTER( ref )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
err = nsldapi_parse_reference( ld, ref->lm_ber, referralsp,
|
||||
serverctrlsp );
|
||||
|
||||
LDAP_SET_LDERRNO( ld, err, NULL, NULL );
|
||||
|
||||
if ( freeit ) {
|
||||
ldap_msgfree( ref );
|
||||
}
|
||||
|
||||
return( err );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* returns an LDAP error code indicating success or failure of parsing
|
||||
* does NOT set any error information inside "ld"
|
||||
*/
|
||||
int
|
||||
nsldapi_parse_reference( LDAP *ld, BerElement *rber, char ***referralsp,
|
||||
LDAPControl ***serverctrlsp )
|
||||
{
|
||||
int err;
|
||||
BerElement ber;
|
||||
char **refs;
|
||||
|
||||
/*
|
||||
* Parse a searchResultReference message. These are used in LDAPv3
|
||||
* and beyond and look like this:
|
||||
*
|
||||
* SearchResultReference ::= [APPLICATION 19] SEQUENCE OF LDAPURL
|
||||
*
|
||||
* all wrapped up in an LDAPMessage sequence which looks like this:
|
||||
*
|
||||
* LDAPMessage ::= SEQUENCE {
|
||||
* messageID MessageID,
|
||||
* SearchResultReference
|
||||
* controls [0] Controls OPTIONAL
|
||||
* }
|
||||
*
|
||||
* ldap_result() pulls out the message id, so by the time a result
|
||||
* message gets here we are conveniently sitting at the start of the
|
||||
* SearchResultReference itself.
|
||||
*/
|
||||
err = LDAP_SUCCESS; /* optimistic */
|
||||
ber = *rber; /* struct copy */
|
||||
|
||||
if ( ber_scanf( &ber, "{v", &refs ) == LBER_ERROR ) {
|
||||
err = LDAP_DECODING_ERROR;
|
||||
} else if ( serverctrlsp != NULL ) {
|
||||
/* pull out controls (if requested and any are present) */
|
||||
if ( ber_scanf( &ber, "}" ) == LBER_ERROR ) {
|
||||
err = LDAP_DECODING_ERROR;
|
||||
} else {
|
||||
err = nsldapi_get_controls( &ber, serverctrlsp );
|
||||
}
|
||||
}
|
||||
|
||||
if ( referralsp == NULL ) {
|
||||
ldap_value_free( refs );
|
||||
} else {
|
||||
*referralsp = refs;
|
||||
}
|
||||
|
||||
return( err );
|
||||
}
|
||||
900
mozilla/directory/c-sdk/ldap/libraries/libldap/regex.c
Normal file
900
mozilla/directory/c-sdk/ldap/libraries/libldap/regex.c
Normal file
@@ -0,0 +1,900 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#include "ldap-int.h"
|
||||
#if defined( macintosh ) || defined( DOS ) || defined( _WINDOWS ) || defined( NEED_BSDREGEX ) || defined( XP_OS2)
|
||||
#include "regex.h"
|
||||
|
||||
/*
|
||||
* regex - Regular expression pattern matching and replacement
|
||||
*
|
||||
* By: Ozan S. Yigit (oz)
|
||||
* Dept. of Computer Science
|
||||
* York University
|
||||
*
|
||||
* These routines are the PUBLIC DOMAIN equivalents of regex
|
||||
* routines as found in 4.nBSD UN*X, with minor extensions.
|
||||
*
|
||||
* These routines are derived from various implementations found
|
||||
* in software tools books, and Conroy's grep. They are NOT derived
|
||||
* from licensed/restricted software.
|
||||
* For more interesting/academic/complicated implementations,
|
||||
* see Henry Spencer's regexp routines, or GNU Emacs pattern
|
||||
* matching module.
|
||||
*
|
||||
* Use the actual CCL code in the CLO
|
||||
* section of pmatch. No need for a recursive
|
||||
* pmatch call.
|
||||
*
|
||||
* Use a bitmap table to set char bits in an
|
||||
* 8-bit chunk.
|
||||
*
|
||||
* Interfaces:
|
||||
* re_comp: compile a regular expression into a NFA.
|
||||
*
|
||||
* char *re_comp(s)
|
||||
* char *s;
|
||||
*
|
||||
* re_exec: execute the NFA to match a pattern.
|
||||
*
|
||||
* int re_exec(s)
|
||||
* char *s;
|
||||
*
|
||||
* re_modw change re_exec's understanding of what a "word"
|
||||
* looks like (for \< and \>) by adding into the
|
||||
* hidden word-syntax table.
|
||||
*
|
||||
* void re_modw(s)
|
||||
* char *s;
|
||||
*
|
||||
* re_subs: substitute the matched portions in a new string.
|
||||
*
|
||||
* int re_subs(src, dst)
|
||||
* char *src;
|
||||
* char *dst;
|
||||
*
|
||||
* re_fail: failure routine for re_exec.
|
||||
*
|
||||
* void re_fail(msg, op)
|
||||
* char *msg;
|
||||
* char op;
|
||||
*
|
||||
* Regular Expressions:
|
||||
*
|
||||
* [1] char matches itself, unless it is a special
|
||||
* character (metachar): . \ [ ] * + ^ $
|
||||
*
|
||||
* [2] . matches any character.
|
||||
*
|
||||
* [3] \ matches the character following it, except
|
||||
* when followed by a left or right round bracket,
|
||||
* a digit 1 to 9 or a left or right angle bracket.
|
||||
* (see [7], [8] and [9])
|
||||
* It is used as an escape character for all
|
||||
* other meta-characters, and itself. When used
|
||||
* in a set ([4]), it is treated as an ordinary
|
||||
* character.
|
||||
*
|
||||
* [4] [set] matches one of the characters in the set.
|
||||
* If the first character in the set is "^",
|
||||
* it matches a character NOT in the set, i.e.
|
||||
* complements the set. A shorthand S-E is
|
||||
* used to specify a set of characters S upto
|
||||
* E, inclusive. The special characters "]" and
|
||||
* "-" have no special meaning if they appear
|
||||
* as the first chars in the set.
|
||||
* examples: match:
|
||||
*
|
||||
* [a-z] any lowercase alpha
|
||||
*
|
||||
* [^]-] any char except ] and -
|
||||
*
|
||||
* [^A-Z] any char except uppercase
|
||||
* alpha
|
||||
*
|
||||
* [a-zA-Z] any alpha
|
||||
*
|
||||
* [5] * any regular expression form [1] to [4], followed by
|
||||
* closure char (*) matches zero or more matches of
|
||||
* that form.
|
||||
*
|
||||
* [6] + same as [5], except it matches one or more.
|
||||
*
|
||||
* [7] a regular expression in the form [1] to [10], enclosed
|
||||
* as \(form\) matches what form matches. The enclosure
|
||||
* creates a set of tags, used for [8] and for
|
||||
* pattern substution. The tagged forms are numbered
|
||||
* starting from 1.
|
||||
*
|
||||
* [8] a \ followed by a digit 1 to 9 matches whatever a
|
||||
* previously tagged regular expression ([7]) matched.
|
||||
*
|
||||
* [9] \< a regular expression starting with a \< construct
|
||||
* \> and/or ending with a \> construct, restricts the
|
||||
* pattern matching to the beginning of a word, and/or
|
||||
* the end of a word. A word is defined to be a character
|
||||
* string beginning and/or ending with the characters
|
||||
* A-Z a-z 0-9 and _. It must also be preceded and/or
|
||||
* followed by any character outside those mentioned.
|
||||
*
|
||||
* [10] a composite regular expression xy where x and y
|
||||
* are in the form [1] to [10] matches the longest
|
||||
* match of x followed by a match for y.
|
||||
*
|
||||
* [11] ^ a regular expression starting with a ^ character
|
||||
* $ and/or ending with a $ character, restricts the
|
||||
* pattern matching to the beginning of the line,
|
||||
* or the end of line. [anchors] Elsewhere in the
|
||||
* pattern, ^ and $ are treated as ordinary characters.
|
||||
*
|
||||
*
|
||||
* Acknowledgements:
|
||||
*
|
||||
* HCR's Hugh Redelmeier has been most helpful in various
|
||||
* stages of development. He convinced me to include BOW
|
||||
* and EOW constructs, originally invented by Rob Pike at
|
||||
* the University of Toronto.
|
||||
*
|
||||
* References:
|
||||
* Software tools Kernighan & Plauger
|
||||
* Software tools in Pascal Kernighan & Plauger
|
||||
* Grep [rsx-11 C dist] David Conroy
|
||||
* ed - text editor Un*x Programmer's Manual
|
||||
* Advanced editing on Un*x B. W. Kernighan
|
||||
* RegExp routines Henry Spencer
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
* This implementation uses a bit-set representation for character
|
||||
* classes for speed and compactness. Each character is represented
|
||||
* by one bit in a 128-bit block. Thus, CCL always takes a
|
||||
* constant 16 bytes in the internal nfa, and re_exec does a single
|
||||
* bit comparison to locate the character in the set.
|
||||
*
|
||||
* Examples:
|
||||
*
|
||||
* pattern: foo*.*
|
||||
* compile: CHR f CHR o CLO CHR o END CLO ANY END END
|
||||
* matches: fo foo fooo foobar fobar foxx ...
|
||||
*
|
||||
* pattern: fo[ob]a[rz]
|
||||
* compile: CHR f CHR o CCL bitset CHR a CCL bitset END
|
||||
* matches: fobar fooar fobaz fooaz
|
||||
*
|
||||
* pattern: foo\\+
|
||||
* compile: CHR f CHR o CHR o CHR \ CLO CHR \ END END
|
||||
* matches: foo\ foo\\ foo\\\ ...
|
||||
*
|
||||
* pattern: \(foo\)[1-3]\1 (same as foo[1-3]foo)
|
||||
* compile: BOT 1 CHR f CHR o CHR o EOT 1 CCL bitset REF 1 END
|
||||
* matches: foo1foo foo2foo foo3foo
|
||||
*
|
||||
* pattern: \(fo.*\)-\1
|
||||
* compile: BOT 1 CHR f CHR o CLO ANY END EOT 1 CHR - REF 1 END
|
||||
* matches: foo-foo fo-fo fob-fob foobar-foobar ...
|
||||
*/
|
||||
|
||||
#define MAXNFA 1024
|
||||
#define MAXTAG 10
|
||||
|
||||
#define OKP 1
|
||||
#define NOP 0
|
||||
|
||||
#define CHR 1
|
||||
#define ANY 2
|
||||
#define CCL 3
|
||||
#define BOL 4
|
||||
#define EOL 5
|
||||
#define BOT 6
|
||||
#define EOT 7
|
||||
#define BOW 8
|
||||
#define EOW 9
|
||||
#define REF 10
|
||||
#define CLO 11
|
||||
|
||||
#define END 0
|
||||
|
||||
/*
|
||||
* The following defines are not meant to be changeable.
|
||||
* They are for readability only.
|
||||
*/
|
||||
#define MAXCHR 128
|
||||
#define CHRBIT 8
|
||||
#define BITBLK MAXCHR/CHRBIT
|
||||
#define BLKIND 0170
|
||||
#define BITIND 07
|
||||
|
||||
#define ASCIIB 0177
|
||||
|
||||
/* Plain char, on the other hand, may be signed or unsigned; it depends on
|
||||
* the platform and perhaps a compiler option. A hard fact of life, in C.
|
||||
*
|
||||
* 6-April-1999 mcs@netscape.com: replaced CHAR with REGEXCHAR to avoid
|
||||
* conflicts with system types on Win32. Changed typedef
|
||||
* for REGEXCHAR to always be unsigned, which seems right.
|
||||
*/
|
||||
typedef unsigned char REGEXCHAR;
|
||||
|
||||
static int tagstk[MAXTAG]; /* subpat tag stack..*/
|
||||
static REGEXCHAR nfa[MAXNFA]; /* automaton.. */
|
||||
static int sta = NOP; /* status of lastpat */
|
||||
|
||||
static REGEXCHAR bittab[BITBLK]; /* bit table for CCL */
|
||||
/* pre-set bits... */
|
||||
static REGEXCHAR bitarr[] = {1,2,4,8,16,32,64,128};
|
||||
|
||||
static void nfadump( REGEXCHAR *ap);
|
||||
|
||||
static void
|
||||
chset(REGEXCHAR c)
|
||||
{
|
||||
bittab[((c) & (unsigned)BLKIND) >> 3] |= bitarr[(c) & BITIND];
|
||||
}
|
||||
|
||||
#define badpat(x) (*nfa = END, x)
|
||||
#define store(x) *mp++ = x
|
||||
|
||||
char *
|
||||
LDAP_CALL
|
||||
re_comp( char *pat )
|
||||
{
|
||||
register REGEXCHAR *p; /* pattern pointer */
|
||||
register REGEXCHAR *mp=nfa; /* nfa pointer */
|
||||
register REGEXCHAR *lp; /* saved pointer.. */
|
||||
register REGEXCHAR *sp=nfa; /* another one.. */
|
||||
|
||||
register int tagi = 0; /* tag stack index */
|
||||
register int tagc = 1; /* actual tag count */
|
||||
|
||||
register int n;
|
||||
register REGEXCHAR mask; /* xor mask -CCL/NCL */
|
||||
int c1, c2;
|
||||
|
||||
if (!pat || !*pat)
|
||||
if (sta)
|
||||
return 0;
|
||||
else
|
||||
return badpat("No previous regular expression");
|
||||
sta = NOP;
|
||||
|
||||
for (p = (REGEXCHAR*)pat; *p; p++) {
|
||||
lp = mp;
|
||||
switch(*p) {
|
||||
|
||||
case '.': /* match any char.. */
|
||||
store(ANY);
|
||||
break;
|
||||
|
||||
case '^': /* match beginning.. */
|
||||
if (p == (REGEXCHAR*)pat)
|
||||
store(BOL);
|
||||
else {
|
||||
store(CHR);
|
||||
store(*p);
|
||||
}
|
||||
break;
|
||||
|
||||
case '$': /* match endofline.. */
|
||||
if (!*(p+1))
|
||||
store(EOL);
|
||||
else {
|
||||
store(CHR);
|
||||
store(*p);
|
||||
}
|
||||
break;
|
||||
|
||||
case '[': /* match char class..*/
|
||||
store(CCL);
|
||||
|
||||
if (*++p == '^') {
|
||||
mask = 0377;
|
||||
p++;
|
||||
}
|
||||
else
|
||||
mask = 0;
|
||||
|
||||
if (*p == '-') /* real dash */
|
||||
chset(*p++);
|
||||
if (*p == ']') /* real brac */
|
||||
chset(*p++);
|
||||
while (*p && *p != ']') {
|
||||
if (*p == '-' && *(p+1) && *(p+1) != ']') {
|
||||
p++;
|
||||
c1 = *(p-2) + 1;
|
||||
c2 = *p++;
|
||||
while (c1 <= c2)
|
||||
chset((REGEXCHAR)c1++);
|
||||
}
|
||||
#ifdef EXTEND
|
||||
else if (*p == '\\' && *(p+1)) {
|
||||
p++;
|
||||
chset(*p++);
|
||||
}
|
||||
#endif
|
||||
else
|
||||
chset(*p++);
|
||||
}
|
||||
if (!*p)
|
||||
return badpat("Missing ]");
|
||||
|
||||
for (n = 0; n < BITBLK; bittab[n++] = (REGEXCHAR) 0)
|
||||
store(mask ^ bittab[n]);
|
||||
|
||||
break;
|
||||
|
||||
case '*': /* match 0 or more.. */
|
||||
case '+': /* match 1 or more.. */
|
||||
if (p == (REGEXCHAR*)pat)
|
||||
return badpat("Empty closure");
|
||||
lp = sp; /* previous opcode */
|
||||
if (*lp == CLO) /* equivalence.. */
|
||||
break;
|
||||
switch(*lp) {
|
||||
|
||||
case BOL:
|
||||
case BOT:
|
||||
case EOT:
|
||||
case BOW:
|
||||
case EOW:
|
||||
case REF:
|
||||
return badpat("Illegal closure");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (*p == '+')
|
||||
for (sp = mp; lp < sp; lp++)
|
||||
store(*lp);
|
||||
|
||||
store(END);
|
||||
store(END);
|
||||
sp = mp;
|
||||
while (--mp > lp)
|
||||
*mp = mp[-1];
|
||||
store(CLO);
|
||||
mp = sp;
|
||||
break;
|
||||
|
||||
case '\\': /* tags, backrefs .. */
|
||||
switch(*++p) {
|
||||
|
||||
case '(':
|
||||
if (tagc < MAXTAG) {
|
||||
tagstk[++tagi] = tagc;
|
||||
store(BOT);
|
||||
store(tagc++);
|
||||
}
|
||||
else
|
||||
return badpat("Too many \\(\\) pairs");
|
||||
break;
|
||||
case ')':
|
||||
if (*sp == BOT)
|
||||
return badpat("Null pattern inside \\(\\)");
|
||||
if (tagi > 0) {
|
||||
store(EOT);
|
||||
store(tagstk[tagi--]);
|
||||
}
|
||||
else
|
||||
return badpat("Unmatched \\)");
|
||||
break;
|
||||
case '<':
|
||||
store(BOW);
|
||||
break;
|
||||
case '>':
|
||||
if (*sp == BOW)
|
||||
return badpat("Null pattern inside \\<\\>");
|
||||
store(EOW);
|
||||
break;
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
n = *p-'0';
|
||||
if (tagi > 0 && tagstk[tagi] == n)
|
||||
return badpat("Cyclical reference");
|
||||
if (tagc > n) {
|
||||
store(REF);
|
||||
store(n);
|
||||
}
|
||||
else
|
||||
return badpat("Undetermined reference");
|
||||
break;
|
||||
#ifdef EXTEND
|
||||
case 'b':
|
||||
store(CHR);
|
||||
store('\b');
|
||||
break;
|
||||
case 'n':
|
||||
store(CHR);
|
||||
store('\n');
|
||||
break;
|
||||
case 'f':
|
||||
store(CHR);
|
||||
store('\f');
|
||||
break;
|
||||
case 'r':
|
||||
store(CHR);
|
||||
store('\r');
|
||||
break;
|
||||
case 't':
|
||||
store(CHR);
|
||||
store('\t');
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
store(CHR);
|
||||
store(*p);
|
||||
}
|
||||
break;
|
||||
|
||||
default : /* an ordinary char */
|
||||
store(CHR);
|
||||
store(*p);
|
||||
break;
|
||||
}
|
||||
sp = lp;
|
||||
}
|
||||
if (tagi > 0)
|
||||
return badpat("Unmatched \\(");
|
||||
store(END);
|
||||
sta = OKP;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static REGEXCHAR *bol;
|
||||
static REGEXCHAR *bopat[MAXTAG];
|
||||
static REGEXCHAR *eopat[MAXTAG];
|
||||
#ifdef NEEDPROTOS
|
||||
static REGEXCHAR *pmatch( REGEXCHAR *lp, REGEXCHAR *ap );
|
||||
#else /* NEEDPROTOS */
|
||||
static REGEXCHAR *pmatch();
|
||||
#endif /* NEEDPROTOS */
|
||||
|
||||
/*
|
||||
* re_exec:
|
||||
* execute nfa to find a match.
|
||||
*
|
||||
* special cases: (nfa[0])
|
||||
* BOL
|
||||
* Match only once, starting from the
|
||||
* beginning.
|
||||
* CHR
|
||||
* First locate the character without
|
||||
* calling pmatch, and if found, call
|
||||
* pmatch for the remaining string.
|
||||
* END
|
||||
* re_comp failed, poor luser did not
|
||||
* check for it. Fail fast.
|
||||
*
|
||||
* If a match is found, bopat[0] and eopat[0] are set
|
||||
* to the beginning and the end of the matched fragment,
|
||||
* respectively.
|
||||
*
|
||||
*/
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
re_exec( char *lp )
|
||||
{
|
||||
register REGEXCHAR c;
|
||||
register REGEXCHAR *ep = 0;
|
||||
register REGEXCHAR *ap = nfa;
|
||||
|
||||
bol = (REGEXCHAR*)lp;
|
||||
|
||||
bopat[0] = 0;
|
||||
bopat[1] = 0;
|
||||
bopat[2] = 0;
|
||||
bopat[3] = 0;
|
||||
bopat[4] = 0;
|
||||
bopat[5] = 0;
|
||||
bopat[6] = 0;
|
||||
bopat[7] = 0;
|
||||
bopat[8] = 0;
|
||||
bopat[9] = 0;
|
||||
|
||||
switch(*ap) {
|
||||
|
||||
case BOL: /* anchored: match from BOL only */
|
||||
ep = pmatch((REGEXCHAR*)lp,ap);
|
||||
break;
|
||||
case CHR: /* ordinary char: locate it fast */
|
||||
c = *(ap+1);
|
||||
while (*lp && *(REGEXCHAR*)lp != c)
|
||||
lp++;
|
||||
if (!*lp) /* if EOS, fail, else fall thru. */
|
||||
return 0;
|
||||
default: /* regular matching all the way. */
|
||||
do {
|
||||
if ((ep = pmatch((REGEXCHAR*)lp,ap)))
|
||||
break;
|
||||
lp++;
|
||||
} while (*lp);
|
||||
|
||||
break;
|
||||
case END: /* munged automaton. fail always */
|
||||
return 0;
|
||||
}
|
||||
if (!ep)
|
||||
return 0;
|
||||
|
||||
bopat[0] = (REGEXCHAR*)lp;
|
||||
eopat[0] = ep;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* pmatch: internal routine for the hard part
|
||||
*
|
||||
* This code is partly snarfed from an early grep written by
|
||||
* David Conroy. The backref and tag stuff, and various other
|
||||
* innovations are by oz.
|
||||
*
|
||||
* special case optimizations: (nfa[n], nfa[n+1])
|
||||
* CLO ANY
|
||||
* We KNOW .* will match everything upto the
|
||||
* end of line. Thus, directly go to the end of
|
||||
* line, without recursive pmatch calls. As in
|
||||
* the other closure cases, the remaining pattern
|
||||
* must be matched by moving backwards on the
|
||||
* string recursively, to find a match for xy
|
||||
* (x is ".*" and y is the remaining pattern)
|
||||
* where the match satisfies the LONGEST match for
|
||||
* x followed by a match for y.
|
||||
* CLO CHR
|
||||
* We can again scan the string forward for the
|
||||
* single char and at the point of failure, we
|
||||
* execute the remaining nfa recursively, same as
|
||||
* above.
|
||||
*
|
||||
* At the end of a successful match, bopat[n] and eopat[n]
|
||||
* are set to the beginning and end of subpatterns matched
|
||||
* by tagged expressions (n = 1 to 9).
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef re_fail
|
||||
extern void re_fail();
|
||||
#endif /* re_fail */
|
||||
|
||||
/*
|
||||
* character classification table for word boundary operators BOW
|
||||
* and EOW. the reason for not using ctype macros is that we can
|
||||
* let the user add into our own table. see re_modw. This table
|
||||
* is not in the bitset form, since we may wish to extend it in the
|
||||
* future for other character classifications.
|
||||
*
|
||||
* TRUE for 0-9 A-Z a-z _
|
||||
*/
|
||||
static char chrtyp[MAXCHR] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
|
||||
0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 0, 0, 0, 0, 1, 0, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
#define HIBIT 0200
|
||||
#define inascii(x) (0177&(x))
|
||||
#define iswordc(x) chrtyp[inascii(x)]
|
||||
#define isinset(x,y) (((y)&HIBIT)?0:((x)[((y)&BLKIND)>>3] & bitarr[(y)&BITIND]))
|
||||
|
||||
/*
|
||||
* skip values for CLO XXX to skip past the closure
|
||||
*/
|
||||
|
||||
#define ANYSKIP 2 /* [CLO] ANY END ... */
|
||||
#define CHRSKIP 3 /* [CLO] CHR chr END ... */
|
||||
#define CCLSKIP 18 /* [CLO] CCL 16bytes END ... */
|
||||
|
||||
static REGEXCHAR *
|
||||
pmatch( REGEXCHAR *lp, REGEXCHAR *ap)
|
||||
{
|
||||
register int op, c, n;
|
||||
register REGEXCHAR *e; /* extra pointer for CLO */
|
||||
register REGEXCHAR *bp; /* beginning of subpat.. */
|
||||
register REGEXCHAR *ep; /* ending of subpat.. */
|
||||
REGEXCHAR *are; /* to save the line ptr. */
|
||||
|
||||
while ((op = *ap++) != END)
|
||||
switch(op) {
|
||||
|
||||
case CHR:
|
||||
if (*lp++ != *ap++)
|
||||
return 0;
|
||||
break;
|
||||
case ANY:
|
||||
if (!*lp++)
|
||||
return 0;
|
||||
break;
|
||||
case CCL:
|
||||
c = *lp++;
|
||||
if (!isinset(ap,c))
|
||||
return 0;
|
||||
ap += BITBLK;
|
||||
break;
|
||||
case BOL:
|
||||
if (lp != bol)
|
||||
return 0;
|
||||
break;
|
||||
case EOL:
|
||||
if (*lp)
|
||||
return 0;
|
||||
break;
|
||||
case BOT:
|
||||
bopat[*ap++] = lp;
|
||||
break;
|
||||
case EOT:
|
||||
eopat[*ap++] = lp;
|
||||
break;
|
||||
case BOW:
|
||||
if ((lp!=bol && iswordc(lp[-1])) || !iswordc(*lp))
|
||||
return 0;
|
||||
break;
|
||||
case EOW:
|
||||
if (lp==bol || !iswordc(lp[-1]) || iswordc(*lp))
|
||||
return 0;
|
||||
break;
|
||||
case REF:
|
||||
n = *ap++;
|
||||
bp = bopat[n];
|
||||
ep = eopat[n];
|
||||
while (bp < ep)
|
||||
if (*bp++ != *lp++)
|
||||
return 0;
|
||||
break;
|
||||
case CLO:
|
||||
are = lp;
|
||||
switch(*ap) {
|
||||
|
||||
case ANY:
|
||||
while (*lp)
|
||||
lp++;
|
||||
n = ANYSKIP;
|
||||
break;
|
||||
case CHR:
|
||||
c = *(ap+1);
|
||||
while (*lp && c == *lp)
|
||||
lp++;
|
||||
n = CHRSKIP;
|
||||
break;
|
||||
case CCL:
|
||||
while ((c = *lp) && isinset(ap+1,c))
|
||||
lp++;
|
||||
n = CCLSKIP;
|
||||
break;
|
||||
default:
|
||||
re_fail("closure: bad nfa.", *ap);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ap += n;
|
||||
|
||||
while (lp >= are) {
|
||||
if ((e = pmatch(lp, ap)))
|
||||
return e;
|
||||
--lp;
|
||||
}
|
||||
return 0;
|
||||
default:
|
||||
re_fail("re_exec: bad nfa.", op);
|
||||
return 0;
|
||||
}
|
||||
return lp;
|
||||
}
|
||||
|
||||
/*
|
||||
* re_modw:
|
||||
* add new characters into the word table to change re_exec's
|
||||
* understanding of what a word should look like. Note that we
|
||||
* only accept additions into the word definition.
|
||||
*
|
||||
* If the string parameter is 0 or null string, the table is
|
||||
* reset back to the default containing A-Z a-z 0-9 _. [We use
|
||||
* the compact bitset representation for the default table]
|
||||
*/
|
||||
|
||||
static REGEXCHAR deftab[16] = {
|
||||
0, 0, 0, 0, 0, 0, 0377, 003, 0376, 0377, 0377, 0207,
|
||||
0376, 0377, 0377, 007
|
||||
};
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
re_modw( char *s )
|
||||
{
|
||||
register int i;
|
||||
|
||||
if (!s || !*s) {
|
||||
for (i = 0; i < MAXCHR; i++)
|
||||
if (!isinset(deftab,i))
|
||||
iswordc(i) = 0;
|
||||
}
|
||||
else
|
||||
while(*s)
|
||||
iswordc(*s++) = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* re_subs:
|
||||
* substitute the matched portions of the src in dst.
|
||||
*
|
||||
* & substitute the entire matched pattern.
|
||||
*
|
||||
* \digit substitute a subpattern, with the given tag number.
|
||||
* Tags are numbered from 1 to 9. If the particular
|
||||
* tagged subpattern does not exist, null is substituted.
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
re_subs( char *src, char *dst)
|
||||
{
|
||||
register char c;
|
||||
register int pin;
|
||||
register REGEXCHAR *bp;
|
||||
register REGEXCHAR *ep;
|
||||
|
||||
if (!*src || !bopat[0])
|
||||
return 0;
|
||||
|
||||
while ((c = *src++)) {
|
||||
switch(c) {
|
||||
|
||||
case '&':
|
||||
pin = 0;
|
||||
break;
|
||||
|
||||
case '\\':
|
||||
c = *src++;
|
||||
if (c >= '0' && c <= '9') {
|
||||
pin = c - '0';
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
*dst++ = c;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((bp = bopat[pin]) && (ep = eopat[pin])) {
|
||||
while (*bp && bp < ep)
|
||||
*dst++ = *(char*)bp++;
|
||||
if (bp < ep)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
*dst = (char) 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef LDAP_REGEX_DEBUG
|
||||
|
||||
/* No printf or exit in 16-bit Windows */
|
||||
#if defined( _WINDOWS ) && !defined( _WIN32 )
|
||||
static int LDAP_C printf( const char* pszFormat, ...)
|
||||
{
|
||||
char buf[1024];
|
||||
va_list arglist;
|
||||
va_start(arglist, pszFormat);
|
||||
vsprintf(buf, pszFormat, arglist);
|
||||
va_end(arglist);
|
||||
OutputDebugString(buf);
|
||||
return 0;
|
||||
}
|
||||
#define exit(v) return
|
||||
#endif
|
||||
|
||||
/*
|
||||
* symbolic - produce a symbolic dump of the nfa
|
||||
*/
|
||||
void
|
||||
symbolic( char *s )
|
||||
{
|
||||
printf("pattern: %s\n", s);
|
||||
printf("nfacode:\n");
|
||||
nfadump(nfa);
|
||||
}
|
||||
|
||||
static void
|
||||
nfadump( REGEXCHAR *ap)
|
||||
{
|
||||
register int n;
|
||||
|
||||
while (*ap != END)
|
||||
switch(*ap++) {
|
||||
case CLO:
|
||||
printf("CLOSURE");
|
||||
nfadump(ap);
|
||||
switch(*ap) {
|
||||
case CHR:
|
||||
n = CHRSKIP;
|
||||
break;
|
||||
case ANY:
|
||||
n = ANYSKIP;
|
||||
break;
|
||||
case CCL:
|
||||
n = CCLSKIP;
|
||||
break;
|
||||
}
|
||||
ap += n;
|
||||
break;
|
||||
case CHR:
|
||||
printf("\tCHR %c\n",*ap++);
|
||||
break;
|
||||
case ANY:
|
||||
printf("\tANY .\n");
|
||||
break;
|
||||
case BOL:
|
||||
printf("\tBOL -\n");
|
||||
break;
|
||||
case EOL:
|
||||
printf("\tEOL -\n");
|
||||
break;
|
||||
case BOT:
|
||||
printf("BOT: %d\n",*ap++);
|
||||
break;
|
||||
case EOT:
|
||||
printf("EOT: %d\n",*ap++);
|
||||
break;
|
||||
case BOW:
|
||||
printf("BOW\n");
|
||||
break;
|
||||
case EOW:
|
||||
printf("EOW\n");
|
||||
break;
|
||||
case REF:
|
||||
printf("REF: %d\n",*ap++);
|
||||
break;
|
||||
case CCL:
|
||||
printf("\tCCL [");
|
||||
for (n = 0; n < MAXCHR; n++)
|
||||
if (isinset(ap,(REGEXCHAR)n)) {
|
||||
if (n < ' ')
|
||||
printf("^%c", n ^ 0x040);
|
||||
else
|
||||
printf("%c", n);
|
||||
}
|
||||
printf("]\n");
|
||||
ap += BITBLK;
|
||||
break;
|
||||
default:
|
||||
printf("bad nfa. opcode %o\n", ap[-1]);
|
||||
exit(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif /* LDAP_REGEX_DEBUG */
|
||||
|
||||
#endif /* macintosh or DOS or _WINDOWS or NEED_BSDREGEX */
|
||||
250
mozilla/directory/c-sdk/ldap/libraries/libldap/rename.c
Normal file
250
mozilla/directory/c-sdk/ldap/libraries/libldap/rename.c
Normal file
@@ -0,0 +1,250 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* rename.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
/*
|
||||
* ldap_rename - initiate an ldap modifyDN operation. Parameters:
|
||||
*
|
||||
* ld LDAP descriptor
|
||||
* dn DN of the object to modify
|
||||
* newrdn RDN that will form leftmost component of entry's new name
|
||||
* newparent if present, this is the Distinguished Name of the entry
|
||||
* which becomes the immediate parent of the existing entry
|
||||
* deleteoldrdn nonzero means to delete old rdn values from the entry
|
||||
* while zero means to retain them as attributes of the entry
|
||||
* serverctrls list of LDAP server controls
|
||||
* clientctrls list of client controls
|
||||
* msgidp this result parameter will be set to the message id of the
|
||||
* request if the ldap_rename() call succeeds
|
||||
*
|
||||
* Example:
|
||||
* int rc;
|
||||
* rc = ldap_rename( ld, dn, newrdn, newparent, deleteoldrdn, serverctrls, clientctrls, &msgid );
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_rename(
|
||||
LDAP *ld,
|
||||
const char *dn,
|
||||
const char *newrdn,
|
||||
const char *newparent,
|
||||
int deleteoldrdn,
|
||||
LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls, /* not used for anything yet */
|
||||
int *msgidp
|
||||
)
|
||||
{
|
||||
BerElement *ber;
|
||||
int rc, err;
|
||||
|
||||
/*
|
||||
* A modify dn request looks like this:
|
||||
* ModifyDNRequest ::= SEQUENCE {
|
||||
* entry LDAPDN,
|
||||
* newrdn RelativeLDAPDN,
|
||||
* newparent [0] LDAPDN OPTIONAL,
|
||||
* deleteoldrdn BOOLEAN
|
||||
* }
|
||||
*/
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_rename\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
if ( NULL == newrdn) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
/* only ldapv3 or higher can do a proper rename
|
||||
* (i.e. with non-NULL newparent and/or controls)
|
||||
*/
|
||||
|
||||
if (( NSLDAPI_LDAP_VERSION( ld ) < LDAP_VERSION3 )
|
||||
&& ((newparent != NULL) || (serverctrls != NULL)
|
||||
|| (clientctrls != NULL))) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NOT_SUPPORTED, NULL, NULL );
|
||||
return( LDAP_NOT_SUPPORTED );
|
||||
}
|
||||
|
||||
if ( msgidp == NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK );
|
||||
*msgidp = ++ld->ld_msgid;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK );
|
||||
|
||||
/* see if modRDN or modDN is handled by the cache */
|
||||
if ( ld->ld_cache_on ) {
|
||||
if ( newparent == NULL && ld->ld_cache_modrdn != NULL ) {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
|
||||
if ( (rc = (ld->ld_cache_modrdn)( ld, *msgidp,
|
||||
LDAP_REQ_MODRDN, dn, newrdn, deleteoldrdn ))
|
||||
!= 0 ) {
|
||||
*msgidp = rc;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
#if 0
|
||||
} else if ( ld->ld_cache_rename != NULL ) {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
|
||||
if ( (rc = (ld->ld_cache_rename)( ld, *msgidp,
|
||||
LDAP_REQ_MODDN, dn, newrdn, newparent,
|
||||
deleteoldrdn )) != 0 ) {
|
||||
*msgidp = rc;
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
/* create a message to send */
|
||||
if (( err = nsldapi_alloc_ber_with_options( ld, &ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
return( err );
|
||||
}
|
||||
|
||||
/* fill it in */
|
||||
if ( ber_printf( ber, "{it{ssb", *msgidp, LDAP_REQ_MODDN, dn,
|
||||
newrdn, deleteoldrdn ) == -1 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_ENCODING_ERROR, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( LDAP_ENCODING_ERROR );
|
||||
}
|
||||
|
||||
if ( newparent == NULL ) {
|
||||
if ( ber_printf( ber, "}" ) == -1 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_ENCODING_ERROR, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( LDAP_ENCODING_ERROR );
|
||||
}
|
||||
} else {
|
||||
if ( ber_printf( ber, "ts}", LDAP_TAG_NEWSUPERIOR, newparent )
|
||||
== -1 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_ENCODING_ERROR, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( LDAP_ENCODING_ERROR );
|
||||
}
|
||||
}
|
||||
|
||||
if (( rc = nsldapi_put_controls( ld, serverctrls, 1, ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
ber_free( ber, 1 );
|
||||
return( rc );
|
||||
}
|
||||
|
||||
/* send the message */
|
||||
rc = nsldapi_send_initial_request( ld, *msgidp, LDAP_REQ_MODDN,
|
||||
(char *) dn, ber );
|
||||
*msgidp = rc;
|
||||
return( rc < 0 ? LDAP_GET_LDERRNO( ld, NULL, NULL ) : LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_modrdn2( LDAP *ld, const char *dn, const char *newrdn, int deleteoldrdn )
|
||||
{
|
||||
int msgid;
|
||||
|
||||
if ( ldap_rename( ld, dn, newrdn, NULL, deleteoldrdn, NULL, NULL, &msgid ) == LDAP_SUCCESS ) {
|
||||
return( msgid );
|
||||
} else {
|
||||
return( -1 ); /* error is in ld handle */
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_modrdn( LDAP *ld, const char *dn, const char *newrdn )
|
||||
{
|
||||
return( ldap_modrdn2( ld, dn, newrdn, 1 ) );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_rename_s(
|
||||
LDAP *ld,
|
||||
const char *dn,
|
||||
const char *newrdn,
|
||||
const char *newparent,
|
||||
int deleteoldrdn,
|
||||
LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls /* not used for anything yet */
|
||||
)
|
||||
{
|
||||
int msgid;
|
||||
LDAPMessage *res;
|
||||
|
||||
if ( ldap_rename( ld, dn, newrdn, newparent, deleteoldrdn, serverctrls, clientctrls, &msgid ) != LDAP_SUCCESS ) {
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
}
|
||||
|
||||
if ( msgid == -1 )
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
|
||||
if ( ldap_result( ld, msgid, 1, (struct timeval *) NULL, &res ) == -1 )
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
|
||||
return( ldap_result2error( ld, res, 1 ) );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_modrdn2_s( LDAP *ld, const char *dn, const char *newrdn, int deleteoldrdn )
|
||||
{
|
||||
int msgid;
|
||||
LDAPMessage *res;
|
||||
|
||||
if ( (msgid = ldap_modrdn2( ld, dn, newrdn, deleteoldrdn )) == -1 )
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
|
||||
if ( ldap_result( ld, msgid, 1, (struct timeval *) NULL, &res ) == -1 )
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
|
||||
return( ldap_result2error( ld, res, 1 ) );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_modrdn_s( LDAP *ld, const char *dn, const char *newrdn )
|
||||
{
|
||||
return( ldap_modrdn2_s( ld, dn, newrdn, 1 ) );
|
||||
}
|
||||
1319
mozilla/directory/c-sdk/ldap/libraries/libldap/request.c
Normal file
1319
mozilla/directory/c-sdk/ldap/libraries/libldap/request.c
Normal file
File diff suppressed because it is too large
Load Diff
63
mozilla/directory/c-sdk/ldap/libraries/libldap/reslist.c
Normal file
63
mozilla/directory/c-sdk/ldap/libraries/libldap/reslist.c
Normal file
@@ -0,0 +1,63 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* reslist.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
LDAPMessage *
|
||||
ldap_delete_result_entry( LDAPMessage **list, LDAPMessage *e )
|
||||
{
|
||||
LDAPMessage *tmp, *prev = NULL;
|
||||
|
||||
for ( tmp = *list; tmp != NULL && tmp != e; tmp = tmp->lm_chain )
|
||||
prev = tmp;
|
||||
|
||||
if ( tmp == NULL )
|
||||
return( NULL );
|
||||
|
||||
if ( prev == NULL )
|
||||
*list = tmp->lm_chain;
|
||||
else
|
||||
prev->lm_chain = tmp->lm_chain;
|
||||
tmp->lm_chain = NULL;
|
||||
|
||||
return( tmp );
|
||||
}
|
||||
|
||||
void
|
||||
ldap_add_result_entry( LDAPMessage **list, LDAPMessage *e )
|
||||
{
|
||||
e->lm_chain = *list;
|
||||
*list = e;
|
||||
}
|
||||
1545
mozilla/directory/c-sdk/ldap/libraries/libldap/result.c
Normal file
1545
mozilla/directory/c-sdk/ldap/libraries/libldap/result.c
Normal file
File diff suppressed because it is too large
Load Diff
276
mozilla/directory/c-sdk/ldap/libraries/libldap/saslbind.c
Normal file
276
mozilla/directory/c-sdk/ldap/libraries/libldap/saslbind.c
Normal file
@@ -0,0 +1,276 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#include "ldap-int.h"
|
||||
|
||||
/*
|
||||
* ldap_sasl_bind - authenticate to the ldap server. The dn, mechanism,
|
||||
* and credentials of the entry to which to bind are supplied. An LDAP
|
||||
* error code is returned and if LDAP_SUCCESS is returned *msgidp is set
|
||||
* to the id of the request initiated.
|
||||
*
|
||||
* Example:
|
||||
* struct berval creds;
|
||||
* LDAPControl **ctrls;
|
||||
* int err, msgid;
|
||||
* ... fill in creds with credentials ...
|
||||
* ... fill in ctrls with server controls ...
|
||||
* err = ldap_sasl_bind( ld, "cn=manager, o=university of michigan, c=us",
|
||||
* "mechanismname", &creds, ctrls, NULL, &msgid );
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_sasl_bind(
|
||||
LDAP *ld,
|
||||
const char *dn,
|
||||
const char *mechanism,
|
||||
const struct berval *cred,
|
||||
LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls,
|
||||
int *msgidp
|
||||
)
|
||||
{
|
||||
BerElement *ber;
|
||||
int rc, simple, msgid, ldapversion;
|
||||
|
||||
/*
|
||||
* The ldapv3 bind request looks like this:
|
||||
* BindRequest ::= SEQUENCE {
|
||||
* version INTEGER,
|
||||
* name DistinguishedName, -- who
|
||||
* authentication CHOICE {
|
||||
* simple [0] OCTET STRING, -- passwd
|
||||
* sasl [3] SaslCredentials -- v3 only
|
||||
* }
|
||||
* }
|
||||
* SaslCredentials ::= SEQUENCE {
|
||||
* mechanism LDAPString,
|
||||
* credentials OCTET STRING
|
||||
* }
|
||||
* all wrapped up in an LDAPMessage sequence.
|
||||
*/
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_sasl_bind\n", 0, 0, 0 );
|
||||
|
||||
if ( msgidp == NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
simple = ( mechanism == LDAP_SASL_SIMPLE );
|
||||
ldapversion = NSLDAPI_LDAP_VERSION( ld );
|
||||
|
||||
/* only ldapv3 or higher can do sasl binds */
|
||||
if ( !simple && ldapversion < LDAP_VERSION3 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NOT_SUPPORTED, NULL, NULL );
|
||||
return( LDAP_NOT_SUPPORTED );
|
||||
}
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK );
|
||||
msgid = ++ld->ld_msgid;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK );
|
||||
|
||||
if ( dn == NULL )
|
||||
dn = "";
|
||||
|
||||
if ( ld->ld_cache_on && ld->ld_cache_bind != NULL ) {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
|
||||
if ( (rc = (ld->ld_cache_bind)( ld, msgid, LDAP_REQ_BIND, dn,
|
||||
cred, LDAP_AUTH_SASL )) != 0 ) {
|
||||
*msgidp = rc;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
}
|
||||
|
||||
/* create a message to send */
|
||||
if (( rc = nsldapi_alloc_ber_with_options( ld, &ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
return( rc );
|
||||
}
|
||||
|
||||
/* fill it in */
|
||||
if ( simple ) { /* simple bind; works in LDAPv2 or v3 */
|
||||
struct berval tmpcred;
|
||||
|
||||
if ( cred == NULL ) {
|
||||
tmpcred.bv_val = "";
|
||||
tmpcred.bv_len = 0;
|
||||
cred = &tmpcred;
|
||||
}
|
||||
rc = ber_printf( ber, "{it{isto}", msgid, LDAP_REQ_BIND,
|
||||
ldapversion, dn, LDAP_AUTH_SIMPLE, cred->bv_val,
|
||||
(int)cred->bv_len /* XXX lossy cast */ );
|
||||
|
||||
} else { /* SASL bind; requires LDAPv3 or better */
|
||||
if ( cred == NULL ) {
|
||||
rc = ber_printf( ber, "{it{ist{s}}", msgid,
|
||||
LDAP_REQ_BIND, ldapversion, dn, LDAP_AUTH_SASL,
|
||||
mechanism );
|
||||
} else {
|
||||
rc = ber_printf( ber, "{it{ist{so}}", msgid,
|
||||
LDAP_REQ_BIND, ldapversion, dn, LDAP_AUTH_SASL,
|
||||
mechanism, cred->bv_val,
|
||||
(int)cred->bv_len /* XXX lossy cast */ );
|
||||
}
|
||||
}
|
||||
|
||||
if ( rc == -1 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_ENCODING_ERROR, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( LDAP_ENCODING_ERROR );
|
||||
}
|
||||
|
||||
if ( (rc = nsldapi_put_controls( ld, serverctrls, 1, ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
ber_free( ber, 1 );
|
||||
return( rc );
|
||||
}
|
||||
|
||||
/* send the message */
|
||||
rc = nsldapi_send_initial_request( ld, msgid, LDAP_REQ_BIND,
|
||||
(char *)dn, ber );
|
||||
*msgidp = rc;
|
||||
return( rc < 0 ? LDAP_GET_LDERRNO( ld, NULL, NULL ) : LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
/*
|
||||
* ldap_sasl_bind_s - bind to the ldap server using sasl authentication
|
||||
* The dn, mechanism, and credentials of the entry to which to bind are
|
||||
* supplied. LDAP_SUCCESS is returned upon success, the ldap error code
|
||||
* otherwise.
|
||||
*
|
||||
* Example:
|
||||
* struct berval creds;
|
||||
* ... fill in creds with credentials ...
|
||||
* ldap_sasl_bind_s( ld, "cn=manager, o=university of michigan, c=us",
|
||||
* "mechanismname", &creds )
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_sasl_bind_s(
|
||||
LDAP *ld,
|
||||
const char *dn,
|
||||
const char *mechanism,
|
||||
const struct berval *cred,
|
||||
LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls,
|
||||
struct berval **servercredp
|
||||
)
|
||||
{
|
||||
int err, msgid;
|
||||
LDAPMessage *result;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_sasl_bind_s\n", 0, 0, 0 );
|
||||
|
||||
if ( ( err = ldap_sasl_bind( ld, dn, mechanism, cred, serverctrls,
|
||||
clientctrls, &msgid )) != LDAP_SUCCESS )
|
||||
return( err );
|
||||
|
||||
if ( ldap_result( ld, msgid, 1, (struct timeval *) 0, &result ) == -1 )
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
|
||||
if (( err = ldap_parse_sasl_bind_result( ld, result, servercredp, 0 ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
ldap_msgfree( result );
|
||||
return( err );
|
||||
}
|
||||
|
||||
return( ldap_result2error( ld, result, 1 ) );
|
||||
}
|
||||
|
||||
|
||||
/* returns an LDAP error code that indicates if parse succeeded or not */
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_parse_sasl_bind_result(
|
||||
LDAP *ld,
|
||||
LDAPMessage *res,
|
||||
struct berval **servercredp,
|
||||
int freeit
|
||||
)
|
||||
{
|
||||
BerElement ber;
|
||||
int rc, err;
|
||||
long along;
|
||||
unsigned long len;
|
||||
char *m, *e;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_parse_sasl_bind_result\n", 0, 0, 0 );
|
||||
|
||||
/*
|
||||
* the ldapv3 SASL bind response looks like this:
|
||||
*
|
||||
* BindResponse ::= [APPLICATION 1] SEQUENCE {
|
||||
* COMPONENTS OF LDAPResult,
|
||||
* serverSaslCreds [7] OCTET STRING OPTIONAL
|
||||
* }
|
||||
*
|
||||
* all wrapped up in an LDAPMessage sequence.
|
||||
*/
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld ) ||
|
||||
!NSLDAPI_VALID_LDAPMESSAGE_BINDRESULT_POINTER( res )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
/* only ldapv3 or higher can do sasl binds */
|
||||
if ( NSLDAPI_LDAP_VERSION( ld ) < LDAP_VERSION3 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NOT_SUPPORTED, NULL, NULL );
|
||||
return( LDAP_NOT_SUPPORTED );
|
||||
}
|
||||
|
||||
if ( servercredp != NULL ) {
|
||||
*servercredp = NULL;
|
||||
}
|
||||
|
||||
ber = *(res->lm_ber); /* struct copy */
|
||||
|
||||
/* skip past message id, matched dn, error message ... */
|
||||
rc = ber_scanf( &ber, "{iaa}", &along, &m, &e );
|
||||
|
||||
if ( rc != LBER_ERROR &&
|
||||
ber_peek_tag( &ber, &len ) == LDAP_TAG_SASL_RES_CREDS ) {
|
||||
rc = ber_get_stringal( &ber, servercredp );
|
||||
}
|
||||
|
||||
if ( freeit ) {
|
||||
ldap_msgfree( res );
|
||||
}
|
||||
|
||||
if ( rc == LBER_ERROR ) {
|
||||
err = LDAP_DECODING_ERROR;
|
||||
} else {
|
||||
err = (int) along;
|
||||
}
|
||||
|
||||
LDAP_SET_LDERRNO( ld, err, m, e );
|
||||
/* this is a little kludge for the 3.0 Barracuda/hammerhead relese */
|
||||
/* the docs state that the return is either LDAP_DECODING_ERROR */
|
||||
/* or LDAP_SUCCESS. Here we match the docs... it's cleaner in 3.1 */
|
||||
|
||||
if ( LDAP_DECODING_ERROR == err ) {
|
||||
return (LDAP_DECODING_ERROR);
|
||||
} else {
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
}
|
||||
256
mozilla/directory/c-sdk/ldap/libraries/libldap/sbind.c
Normal file
256
mozilla/directory/c-sdk/ldap/libraries/libldap/sbind.c
Normal file
@@ -0,0 +1,256 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1993 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* sbind.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1993 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
static int simple_bind_nolock( LDAP *ld, const char *dn, const char *passwd,
|
||||
int unlock_permitted );
|
||||
static int simple_bindifnot_s( LDAP *ld, const char *dn, const char *passwd );
|
||||
|
||||
/*
|
||||
* ldap_simple_bind - bind to the ldap server. The dn and
|
||||
* password of the entry to which to bind are supplied. The message id
|
||||
* of the request initiated is returned.
|
||||
*
|
||||
* Example:
|
||||
* ldap_simple_bind( ld, "cn=manager, o=university of michigan, c=us",
|
||||
* "secret" )
|
||||
*/
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_simple_bind( LDAP *ld, const char *dn, const char *passwd )
|
||||
{
|
||||
int rc;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_simple_bind\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
rc = simple_bind_nolock( ld, dn, passwd, 1 );
|
||||
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
simple_bind_nolock( LDAP *ld, const char *dn, const char *passwd,
|
||||
int unlock_permitted )
|
||||
{
|
||||
BerElement *ber;
|
||||
int rc, msgid;
|
||||
|
||||
/*
|
||||
* The bind request looks like this:
|
||||
* BindRequest ::= SEQUENCE {
|
||||
* version INTEGER,
|
||||
* name DistinguishedName, -- who
|
||||
* authentication CHOICE {
|
||||
* simple [0] OCTET STRING -- passwd
|
||||
* }
|
||||
* }
|
||||
* all wrapped up in an LDAPMessage sequence.
|
||||
*/
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK );
|
||||
msgid = ++ld->ld_msgid;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK );
|
||||
|
||||
if ( dn == NULL )
|
||||
dn = "";
|
||||
if ( passwd == NULL )
|
||||
passwd = "";
|
||||
|
||||
if ( ld->ld_cache_on && ld->ld_cache_bind != NULL ) {
|
||||
struct berval bv;
|
||||
|
||||
bv.bv_val = (char *)passwd;
|
||||
bv.bv_len = strlen( passwd );
|
||||
/* if ( unlock_permitted ) LDAP_MUTEX_UNLOCK( ld ); */
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
|
||||
rc = (ld->ld_cache_bind)( ld, msgid, LDAP_REQ_BIND, dn, &bv,
|
||||
LDAP_AUTH_SIMPLE );
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
/* if ( unlock_permitted ) LDAP_MUTEX_LOCK( ld ); */
|
||||
if ( rc != 0 ) {
|
||||
return( rc );
|
||||
}
|
||||
}
|
||||
|
||||
/* create a message to send */
|
||||
if (( rc = nsldapi_alloc_ber_with_options( ld, &ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
/* fill it in */
|
||||
if ( ber_printf( ber, "{it{ists}", msgid, LDAP_REQ_BIND,
|
||||
NSLDAPI_LDAP_VERSION( ld ), dn, LDAP_AUTH_SIMPLE, passwd ) == -1 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_ENCODING_ERROR, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
if ( nsldapi_put_controls( ld, NULL, 1, ber ) != LDAP_SUCCESS ) {
|
||||
ber_free( ber, 1 );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
/* send the message */
|
||||
return( nsldapi_send_initial_request( ld, msgid, LDAP_REQ_BIND,
|
||||
(char *)dn, ber ));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ldap_simple_bind - bind to the ldap server using simple
|
||||
* authentication. The dn and password of the entry to which to bind are
|
||||
* supplied. LDAP_SUCCESS is returned upon success, the ldap error code
|
||||
* otherwise.
|
||||
*
|
||||
* Example:
|
||||
* ldap_simple_bind_s( ld, "cn=manager, o=university of michigan, c=us",
|
||||
* "secret" )
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_simple_bind_s( LDAP *ld, const char *dn, const char *passwd )
|
||||
{
|
||||
int msgid;
|
||||
LDAPMessage *result;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_simple_bind_s\n", 0, 0, 0 );
|
||||
|
||||
if ( NSLDAPI_VALID_LDAP_POINTER( ld ) &&
|
||||
( ld->ld_options & LDAP_BITOPT_RECONNECT ) != 0 ) {
|
||||
return( simple_bindifnot_s( ld, dn, passwd ));
|
||||
}
|
||||
|
||||
if ( (msgid = ldap_simple_bind( ld, dn, passwd )) == -1 )
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
|
||||
if ( ldap_result( ld, msgid, 1, (struct timeval *) 0, &result ) == -1 )
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
|
||||
return( ldap_result2error( ld, result, 1 ) );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* simple_bindifnot_s() is like ldap_simple_bind_s() except that it only does
|
||||
* a bind if the default connection is not currently bound.
|
||||
* If a successful bind using the same DN has already taken place we just
|
||||
* return LDAP_SUCCESS without conversing with the server at all.
|
||||
*/
|
||||
static int
|
||||
simple_bindifnot_s( LDAP *ld, const char *dn, const char *passwd )
|
||||
{
|
||||
int msgid, rc;
|
||||
LDAPMessage *result;
|
||||
char *binddn;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "simple_bindifnot_s\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( dn == NULL ) {
|
||||
dn = ""; /* to make comparisons simpler */
|
||||
}
|
||||
|
||||
/*
|
||||
* if we are already bound using the same DN, just return LDAP_SUCCESS.
|
||||
*/
|
||||
if ( NULL != ( binddn = nsldapi_get_binddn( ld ))
|
||||
&& 0 == strcmp( dn, binddn )) {
|
||||
rc = LDAP_SUCCESS;
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
goto unlock_and_return;
|
||||
}
|
||||
|
||||
/*
|
||||
* if the default connection has been lost and is now marked dead,
|
||||
* dispose of the default connection so it will get re-established.
|
||||
*
|
||||
* if not, clear the bind DN and status to ensure that we don't
|
||||
* report the wrong bind DN to a different thread while waiting
|
||||
* for our bind result to return from the server.
|
||||
*/
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CONN_LOCK );
|
||||
if ( NULL != ld->ld_defconn ) {
|
||||
if ( LDAP_CONNST_DEAD == ld->ld_defconn->lconn_status ) {
|
||||
nsldapi_free_connection( ld, ld->ld_defconn, NULL, NULL, 1, 0 );
|
||||
ld->ld_defconn = NULL;
|
||||
} else if ( ld->ld_defconn->lconn_binddn != NULL ) {
|
||||
NSLDAPI_FREE( ld->ld_defconn->lconn_binddn );
|
||||
ld->ld_defconn->lconn_binddn = NULL;
|
||||
ld->ld_defconn->lconn_bound = 0;
|
||||
}
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CONN_LOCK );
|
||||
|
||||
/*
|
||||
* finally, bind (this will open a new connection if necessary)
|
||||
*/
|
||||
if ( (msgid = simple_bind_nolock( ld, dn, passwd, 0 )) == -1 ) {
|
||||
rc = LDAP_GET_LDERRNO( ld, NULL, NULL );
|
||||
goto unlock_and_return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Note that at this point the bind request is on its way to the
|
||||
* server and at any time now we will either be bound as the new
|
||||
* DN (if the bind succeeded) or we will be bound as anonymous (if
|
||||
* the bind failed).
|
||||
*/
|
||||
|
||||
/*
|
||||
* Wait for the bind result. Code inside result.c:read1msg()
|
||||
* takes care of setting the connection's bind DN and status.
|
||||
*/
|
||||
if ( nsldapi_result_nolock( ld, msgid, 1, 0, (struct timeval *) 0,
|
||||
&result ) == -1 ) {
|
||||
rc = LDAP_GET_LDERRNO( ld, NULL, NULL );
|
||||
goto unlock_and_return;
|
||||
}
|
||||
|
||||
rc = ldap_result2error( ld, result, 1 );
|
||||
|
||||
unlock_and_return:
|
||||
return( rc );
|
||||
}
|
||||
997
mozilla/directory/c-sdk/ldap/libraries/libldap/search.c
Normal file
997
mozilla/directory/c-sdk/ldap/libraries/libldap/search.c
Normal file
@@ -0,0 +1,997 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* search.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
static int nsldapi_timeval2ldaplimit( struct timeval *timeoutp,
|
||||
int defaultvalue );
|
||||
static int nsldapi_search( LDAP *ld, const char *base, int scope,
|
||||
const char *filter, char **attrs, int attrsonly,
|
||||
LDAPControl **serverctrls, LDAPControl **clientctrls,
|
||||
int timelimit, int sizelimit, int *msgidp );
|
||||
static char *find_right_paren( char *s );
|
||||
static char *put_complex_filter( BerElement *ber, char *str,
|
||||
unsigned long tag, int not );
|
||||
static int put_filter( BerElement *ber, char *str );
|
||||
static int unescape_filterval( char *str );
|
||||
static int hexchar2int( char c );
|
||||
static int is_valid_attr( char *a );
|
||||
static int put_simple_filter( BerElement *ber, char *str );
|
||||
static int put_substring_filter( BerElement *ber, char *type,
|
||||
char *str );
|
||||
static int put_filter_list( BerElement *ber, char *str );
|
||||
static int nsldapi_search_s( LDAP *ld, const char *base, int scope,
|
||||
const char *filter, char **attrs, int attrsonly,
|
||||
LDAPControl **serverctrls, LDAPControl **clientctrls,
|
||||
struct timeval *localtimeoutp, int timelimit, int sizelimit,
|
||||
LDAPMessage **res );
|
||||
|
||||
/*
|
||||
* ldap_search - initiate an ldap search operation. Parameters:
|
||||
*
|
||||
* ld LDAP descriptor
|
||||
* base DN of the base object
|
||||
* scope the search scope - one of LDAP_SCOPE_BASE,
|
||||
* LDAP_SCOPE_ONELEVEL, LDAP_SCOPE_SUBTREE
|
||||
* filter a string containing the search filter
|
||||
* (e.g., "(|(cn=bob)(sn=bob))")
|
||||
* attrs list of attribute types to return for matches
|
||||
* attrsonly 1 => attributes only 0 => attributes and values
|
||||
*
|
||||
* Example:
|
||||
* char *attrs[] = { "mail", "title", 0 };
|
||||
* msgid = ldap_search( ld, "c=us@o=UM", LDAP_SCOPE_SUBTREE, "cn~=bob",
|
||||
* attrs, attrsonly );
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_search(
|
||||
LDAP *ld,
|
||||
const char *base,
|
||||
int scope,
|
||||
const char *filter,
|
||||
char **attrs,
|
||||
int attrsonly
|
||||
)
|
||||
{
|
||||
int msgid;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_search\n", 0, 0, 0 );
|
||||
|
||||
if ( ldap_search_ext( ld, base, scope, filter, attrs, attrsonly, NULL,
|
||||
NULL, NULL, -1, &msgid ) == LDAP_SUCCESS ) {
|
||||
return( msgid );
|
||||
} else {
|
||||
return( -1 ); /* error is in ld handle */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* LDAPv3 extended search.
|
||||
* Returns an LDAP error code.
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_search_ext(
|
||||
LDAP *ld,
|
||||
const char *base,
|
||||
int scope,
|
||||
const char *filter,
|
||||
char **attrs,
|
||||
int attrsonly,
|
||||
LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls,
|
||||
struct timeval *timeoutp, /* NULL means use ld->ld_timelimit */
|
||||
int sizelimit,
|
||||
int *msgidp
|
||||
)
|
||||
{
|
||||
/*
|
||||
* It is an error to pass in a zero'd timeval.
|
||||
*/
|
||||
if ( timeoutp != NULL && timeoutp->tv_sec == 0 &&
|
||||
timeoutp->tv_usec == 0 ) {
|
||||
if ( ld != NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
}
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
return( nsldapi_search( ld, base, scope, filter, attrs, attrsonly,
|
||||
serverctrls, clientctrls,
|
||||
nsldapi_timeval2ldaplimit( timeoutp, -1 ), sizelimit, msgidp ));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Like ldap_search_ext() except an integer timelimit is passed instead of
|
||||
* using the overloaded struct timeval *timeoutp.
|
||||
*/
|
||||
static int
|
||||
nsldapi_search(
|
||||
LDAP *ld,
|
||||
const char *base,
|
||||
int scope,
|
||||
const char *filter,
|
||||
char **attrs,
|
||||
int attrsonly,
|
||||
LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls,
|
||||
int timelimit, /* -1 means use ld->ld_timelimit */
|
||||
int sizelimit, /* -1 means use ld->ld_sizelimit */
|
||||
int *msgidp
|
||||
)
|
||||
{
|
||||
BerElement *ber;
|
||||
int rc, rc_key;
|
||||
unsigned long key; /* XXXmcs: memcache */
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_search_ext\n", 0, 0, 0 );
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( base == NULL ) {
|
||||
base = "";
|
||||
}
|
||||
|
||||
if ( filter == NULL ) {
|
||||
filter = "(objectclass=*)";
|
||||
}
|
||||
|
||||
if ( msgidp == NULL || ( scope != LDAP_SCOPE_BASE
|
||||
&& scope != LDAP_SCOPE_ONELEVEL && scope != LDAP_SCOPE_SUBTREE )) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK );
|
||||
*msgidp = ++ld->ld_msgid;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK );
|
||||
|
||||
/*
|
||||
* XXXmcs: should use cache function pointers to hook in memcache
|
||||
*/
|
||||
if ( ld->ld_memcache == NULL ) {
|
||||
rc_key = LDAP_NOT_SUPPORTED;
|
||||
} else if (( rc_key = ldap_memcache_createkey( ld, base, scope, filter,
|
||||
attrs, attrsonly, serverctrls, clientctrls, &key)) == LDAP_SUCCESS
|
||||
&& ldap_memcache_result( ld, *msgidp, key ) == LDAP_SUCCESS ) {
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
/* check the cache */
|
||||
if ( ld->ld_cache_on && ld->ld_cache_search != NULL ) {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
|
||||
if ( (rc = (ld->ld_cache_search)( ld, *msgidp, LDAP_REQ_SEARCH,
|
||||
base, scope, filter, attrs, attrsonly )) != 0 ) {
|
||||
*msgidp = rc;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
}
|
||||
|
||||
/* caching off or did not find it in the cache - check the net */
|
||||
if (( rc = nsldapi_build_search_req( ld, base, scope, filter, attrs,
|
||||
attrsonly, serverctrls, clientctrls, timelimit, sizelimit,
|
||||
*msgidp, &ber )) != LDAP_SUCCESS ) {
|
||||
return( rc );
|
||||
}
|
||||
|
||||
/* send the message */
|
||||
rc = nsldapi_send_initial_request( ld, *msgidp, LDAP_REQ_SEARCH,
|
||||
(char *) base, ber );
|
||||
|
||||
/*
|
||||
* XXXmcs: should use cache function pointers to hook in memcache
|
||||
*/
|
||||
if ( (rc_key == LDAP_SUCCESS) && (rc >= 0) ) {
|
||||
ldap_memcache_new( ld, rc, key, base );
|
||||
}
|
||||
|
||||
*msgidp = rc;
|
||||
return( rc < 0 ? LDAP_GET_LDERRNO( ld, NULL, NULL ) : LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Convert a non-NULL timeoutp to a value in seconds that is appropriate to
|
||||
* send in an LDAP search request. If timeoutp is NULL, return defaultvalue.
|
||||
*/
|
||||
static int
|
||||
nsldapi_timeval2ldaplimit( struct timeval *timeoutp, int defaultvalue )
|
||||
{
|
||||
int timelimit;
|
||||
|
||||
if ( NULL == timeoutp ) {
|
||||
timelimit = defaultvalue;
|
||||
} else if ( timeoutp->tv_sec > 0 ) {
|
||||
timelimit = timeoutp->tv_sec;
|
||||
} else if ( timeoutp->tv_usec > 0 ) {
|
||||
timelimit = 1; /* minimum we can express in LDAP */
|
||||
} else {
|
||||
/*
|
||||
* both tv_sec and tv_usec are less than one (zero?) so
|
||||
* to maintain compatiblity with our "zero means no limit"
|
||||
* convention we pass no limit to the server.
|
||||
*/
|
||||
timelimit = 0; /* no limit */
|
||||
}
|
||||
|
||||
return( timelimit );
|
||||
}
|
||||
|
||||
|
||||
/* returns an LDAP error code and also sets it in ld */
|
||||
int
|
||||
nsldapi_build_search_req(
|
||||
LDAP *ld,
|
||||
const char *base,
|
||||
int scope,
|
||||
const char *filter,
|
||||
char **attrs,
|
||||
int attrsonly,
|
||||
LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls, /* not used for anything yet */
|
||||
int timelimit, /* if -1, ld->ld_timelimit is used */
|
||||
int sizelimit, /* if -1, ld->ld_sizelimit is used */
|
||||
int msgid,
|
||||
BerElement **berp
|
||||
)
|
||||
{
|
||||
BerElement *ber;
|
||||
int err;
|
||||
char *fdup;
|
||||
|
||||
/*
|
||||
* Create the search request. It looks like this:
|
||||
* SearchRequest := [APPLICATION 3] SEQUENCE {
|
||||
* baseObject DistinguishedName,
|
||||
* scope ENUMERATED {
|
||||
* baseObject (0),
|
||||
* singleLevel (1),
|
||||
* wholeSubtree (2)
|
||||
* },
|
||||
* derefAliases ENUMERATED {
|
||||
* neverDerefaliases (0),
|
||||
* derefInSearching (1),
|
||||
* derefFindingBaseObj (2),
|
||||
* alwaysDerefAliases (3)
|
||||
* },
|
||||
* sizelimit INTEGER (0 .. 65535),
|
||||
* timelimit INTEGER (0 .. 65535),
|
||||
* attrsOnly BOOLEAN,
|
||||
* filter Filter,
|
||||
* attributes SEQUENCE OF AttributeType
|
||||
* }
|
||||
* wrapped in an ldap message.
|
||||
*/
|
||||
|
||||
/* create a message to send */
|
||||
if (( err = nsldapi_alloc_ber_with_options( ld, &ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
return( err );
|
||||
}
|
||||
|
||||
if ( base == NULL ) {
|
||||
base = "";
|
||||
}
|
||||
|
||||
if ( sizelimit == -1 ) {
|
||||
sizelimit = ld->ld_sizelimit;
|
||||
}
|
||||
|
||||
if ( timelimit == -1 ) {
|
||||
timelimit = ld->ld_timelimit;
|
||||
}
|
||||
|
||||
#ifdef CLDAP
|
||||
if ( ld->ld_sbp->sb_naddr > 0 ) {
|
||||
err = ber_printf( ber, "{ist{seeiib", msgid,
|
||||
ld->ld_cldapdn, LDAP_REQ_SEARCH, base, scope, ld->ld_deref,
|
||||
sizelimit, timelimit, attrsonly );
|
||||
} else {
|
||||
#endif /* CLDAP */
|
||||
err = ber_printf( ber, "{it{seeiib", msgid,
|
||||
LDAP_REQ_SEARCH, base, scope, ld->ld_deref,
|
||||
sizelimit, timelimit, attrsonly );
|
||||
#ifdef CLDAP
|
||||
}
|
||||
#endif /* CLDAP */
|
||||
|
||||
if ( err == -1 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_ENCODING_ERROR, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( LDAP_ENCODING_ERROR );
|
||||
}
|
||||
|
||||
fdup = nsldapi_strdup( filter );
|
||||
err = put_filter( ber, fdup );
|
||||
NSLDAPI_FREE( fdup );
|
||||
|
||||
if ( err == -1 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_FILTER_ERROR, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( LDAP_FILTER_ERROR );
|
||||
}
|
||||
|
||||
if ( ber_printf( ber, "{v}}", attrs ) == -1 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_ENCODING_ERROR, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( LDAP_ENCODING_ERROR );
|
||||
}
|
||||
|
||||
if ( (err = nsldapi_put_controls( ld, serverctrls, 1, ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
ber_free( ber, 1 );
|
||||
return( err );
|
||||
}
|
||||
|
||||
*berp = ber;
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
static char *
|
||||
find_right_paren( char *s )
|
||||
{
|
||||
int balance, escape;
|
||||
|
||||
balance = 1;
|
||||
escape = 0;
|
||||
while ( *s && balance ) {
|
||||
if ( escape == 0 ) {
|
||||
if ( *s == '(' )
|
||||
balance++;
|
||||
else if ( *s == ')' )
|
||||
balance--;
|
||||
}
|
||||
if ( *s == '\\' && ! escape )
|
||||
escape = 1;
|
||||
else
|
||||
escape = 0;
|
||||
if ( balance )
|
||||
s++;
|
||||
}
|
||||
|
||||
return( *s ? s : NULL );
|
||||
}
|
||||
|
||||
static char *
|
||||
put_complex_filter(
|
||||
BerElement *ber,
|
||||
char *str,
|
||||
unsigned long tag,
|
||||
int not
|
||||
)
|
||||
{
|
||||
char *next;
|
||||
|
||||
/*
|
||||
* We have (x(filter)...) with str sitting on
|
||||
* the x. We have to find the paren matching
|
||||
* the one before the x and put the intervening
|
||||
* filters by calling put_filter_list().
|
||||
*/
|
||||
|
||||
/* put explicit tag */
|
||||
if ( ber_printf( ber, "t{", tag ) == -1 )
|
||||
return( NULL );
|
||||
|
||||
str++;
|
||||
if ( (next = find_right_paren( str )) == NULL )
|
||||
return( NULL );
|
||||
|
||||
*next = '\0';
|
||||
if ( put_filter_list( ber, str ) == -1 )
|
||||
return( NULL );
|
||||
*next++ = ')';
|
||||
|
||||
/* flush explicit tagged thang */
|
||||
if ( ber_printf( ber, "}" ) == -1 )
|
||||
return( NULL );
|
||||
|
||||
return( next );
|
||||
}
|
||||
|
||||
static int
|
||||
put_filter( BerElement *ber, char *str )
|
||||
{
|
||||
char *next;
|
||||
int parens, balance, escape;
|
||||
|
||||
/*
|
||||
* A Filter looks like this:
|
||||
* Filter ::= CHOICE {
|
||||
* and [0] SET OF Filter,
|
||||
* or [1] SET OF Filter,
|
||||
* not [2] Filter,
|
||||
* equalityMatch [3] AttributeValueAssertion,
|
||||
* substrings [4] SubstringFilter,
|
||||
* greaterOrEqual [5] AttributeValueAssertion,
|
||||
* lessOrEqual [6] AttributeValueAssertion,
|
||||
* present [7] AttributeType,,
|
||||
* approxMatch [8] AttributeValueAssertion
|
||||
* }
|
||||
*
|
||||
* SubstringFilter ::= SEQUENCE {
|
||||
* type AttributeType,
|
||||
* SEQUENCE OF CHOICE {
|
||||
* initial [0] IA5String,
|
||||
* any [1] IA5String,
|
||||
* final [2] IA5String
|
||||
* }
|
||||
* }
|
||||
* Note: tags in a choice are always explicit
|
||||
*/
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "put_filter \"%s\"\n", str, 0, 0 );
|
||||
|
||||
parens = 0;
|
||||
while ( *str ) {
|
||||
switch ( *str ) {
|
||||
case '(':
|
||||
str++;
|
||||
parens++;
|
||||
switch ( *str ) {
|
||||
case '&':
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "put_filter: AND\n",
|
||||
0, 0, 0 );
|
||||
|
||||
if ( (str = put_complex_filter( ber, str,
|
||||
LDAP_FILTER_AND, 0 )) == NULL )
|
||||
return( -1 );
|
||||
|
||||
parens--;
|
||||
break;
|
||||
|
||||
case '|':
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "put_filter: OR\n",
|
||||
0, 0, 0 );
|
||||
|
||||
if ( (str = put_complex_filter( ber, str,
|
||||
LDAP_FILTER_OR, 0 )) == NULL )
|
||||
return( -1 );
|
||||
|
||||
parens--;
|
||||
break;
|
||||
|
||||
case '!':
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "put_filter: NOT\n",
|
||||
0, 0, 0 );
|
||||
|
||||
if ( (str = put_complex_filter( ber, str,
|
||||
LDAP_FILTER_NOT, 1 )) == NULL )
|
||||
return( -1 );
|
||||
|
||||
parens--;
|
||||
break;
|
||||
|
||||
default:
|
||||
LDAPDebug( LDAP_DEBUG_TRACE,
|
||||
"put_filter: simple\n", 0, 0, 0 );
|
||||
|
||||
balance = 1;
|
||||
escape = 0;
|
||||
next = str;
|
||||
while ( *next && balance ) {
|
||||
if ( escape == 0 ) {
|
||||
if ( *next == '(' )
|
||||
balance++;
|
||||
else if ( *next == ')' )
|
||||
balance--;
|
||||
}
|
||||
if ( *next == '\\' && ! escape )
|
||||
escape = 1;
|
||||
else
|
||||
escape = 0;
|
||||
if ( balance )
|
||||
next++;
|
||||
}
|
||||
if ( balance != 0 )
|
||||
return( -1 );
|
||||
|
||||
*next = '\0';
|
||||
if ( put_simple_filter( ber, str ) == -1 ) {
|
||||
return( -1 );
|
||||
}
|
||||
*next++ = ')';
|
||||
str = next;
|
||||
parens--;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case ')':
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "put_filter: end\n", 0, 0,
|
||||
0 );
|
||||
if ( ber_printf( ber, "]" ) == -1 )
|
||||
return( -1 );
|
||||
str++;
|
||||
parens--;
|
||||
break;
|
||||
|
||||
case ' ':
|
||||
str++;
|
||||
break;
|
||||
|
||||
default: /* assume it's a simple type=value filter */
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "put_filter: default\n", 0, 0,
|
||||
0 );
|
||||
next = strchr( str, '\0' );
|
||||
if ( put_simple_filter( ber, str ) == -1 ) {
|
||||
return( -1 );
|
||||
}
|
||||
str = next;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return( parens ? -1 : 0 );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Put a list of filters like this "(filter1)(filter2)..."
|
||||
*/
|
||||
|
||||
static int
|
||||
put_filter_list( BerElement *ber, char *str )
|
||||
{
|
||||
char *next;
|
||||
char save;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "put_filter_list \"%s\"\n", str, 0, 0 );
|
||||
|
||||
while ( *str ) {
|
||||
while ( *str && isspace( *str ) )
|
||||
str++;
|
||||
if ( *str == '\0' )
|
||||
break;
|
||||
|
||||
if ( (next = find_right_paren( str + 1 )) == NULL )
|
||||
return( -1 );
|
||||
save = *++next;
|
||||
|
||||
/* now we have "(filter)" with str pointing to it */
|
||||
*next = '\0';
|
||||
if ( put_filter( ber, str ) == -1 )
|
||||
return( -1 );
|
||||
*next = save;
|
||||
|
||||
str = next;
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* is_valid_attr - returns 1 if a is a syntactically valid left-hand side
|
||||
* of a filter expression, 0 otherwise. A valid string may contain only
|
||||
* letters, numbers, hyphens, semi-colons, colons and periods. examples:
|
||||
* cn
|
||||
* cn;lang-fr
|
||||
* 1.2.3.4;binary;dynamic
|
||||
* mail;dynamic
|
||||
* cn:dn:1.2.3.4
|
||||
*
|
||||
* For compatibility with older servers, we also allow underscores in
|
||||
* attribute types, even through they are not allowed by the LDAPv3 RFCs.
|
||||
*/
|
||||
static int
|
||||
is_valid_attr( char *a )
|
||||
{
|
||||
for ( ; *a; a++ ) {
|
||||
if ( !isascii( *a ) ) {
|
||||
return( 0 );
|
||||
} else if ( !isalnum( *a ) ) {
|
||||
switch ( *a ) {
|
||||
case '-':
|
||||
case '.':
|
||||
case ';':
|
||||
case ':':
|
||||
case '_':
|
||||
break; /* valid */
|
||||
default:
|
||||
return( 0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return( 1 );
|
||||
}
|
||||
|
||||
static char *
|
||||
find_star( char *s )
|
||||
{
|
||||
for ( ; *s; ++s ) {
|
||||
switch ( *s ) {
|
||||
case '*': return s;
|
||||
case '\\':
|
||||
++s;
|
||||
if ( hexchar2int(s[0]) >= 0 && hexchar2int(s[1]) >= 0 ) ++s;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
put_simple_filter( BerElement *ber, char *str )
|
||||
{
|
||||
char *s, *s2, *s3, filterop;
|
||||
char *value;
|
||||
unsigned long ftype;
|
||||
int rc, len;
|
||||
char *oid; /* for v3 extended filter */
|
||||
int dnattr; /* for v3 extended filter */
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "put_simple_filter \"%s\"\n", str, 0, 0 );
|
||||
|
||||
rc = -1; /* pessimistic */
|
||||
|
||||
if (( str = nsldapi_strdup( str )) == NULL ) {
|
||||
return( rc );
|
||||
}
|
||||
|
||||
if ( (s = strchr( str, '=' )) == NULL ) {
|
||||
goto free_and_return;
|
||||
}
|
||||
value = s + 1;
|
||||
*s-- = '\0';
|
||||
filterop = *s;
|
||||
if ( filterop == '<' || filterop == '>' || filterop == '~' ||
|
||||
filterop == ':' ) {
|
||||
*s = '\0';
|
||||
}
|
||||
|
||||
if ( ! is_valid_attr( str ) ) {
|
||||
goto free_and_return;
|
||||
}
|
||||
|
||||
switch ( filterop ) {
|
||||
case '<':
|
||||
ftype = LDAP_FILTER_LE;
|
||||
break;
|
||||
case '>':
|
||||
ftype = LDAP_FILTER_GE;
|
||||
break;
|
||||
case '~':
|
||||
ftype = LDAP_FILTER_APPROX;
|
||||
break;
|
||||
case ':': /* extended filter - v3 only */
|
||||
/*
|
||||
* extended filter looks like this:
|
||||
*
|
||||
* [type][':dn'][':'oid]':='value
|
||||
*
|
||||
* where one of type or :oid is required.
|
||||
*
|
||||
*/
|
||||
ftype = LDAP_FILTER_EXTENDED;
|
||||
s2 = s3 = NULL;
|
||||
if ( (s2 = strrchr( str, ':' )) == NULL ) {
|
||||
goto free_and_return;
|
||||
}
|
||||
if ( strcasecmp( s2, ":dn" ) == 0 ) {
|
||||
oid = NULL;
|
||||
dnattr = 1;
|
||||
*s2 = '\0';
|
||||
} else {
|
||||
oid = s2 + 1;
|
||||
dnattr = 0;
|
||||
*s2 = '\0';
|
||||
if ( (s3 = strrchr( str, ':' )) != NULL ) {
|
||||
if ( strcasecmp( s3, ":dn" ) == 0 ) {
|
||||
dnattr = 1;
|
||||
} else {
|
||||
goto free_and_return;
|
||||
}
|
||||
*s3 = '\0';
|
||||
}
|
||||
}
|
||||
if ( (rc = ber_printf( ber, "t{", ftype )) == -1 ) {
|
||||
goto free_and_return;
|
||||
}
|
||||
if ( oid != NULL ) {
|
||||
if ( (rc = ber_printf( ber, "ts", LDAP_TAG_MRA_OID,
|
||||
oid )) == -1 ) {
|
||||
goto free_and_return;
|
||||
}
|
||||
}
|
||||
if ( *str != '\0' ) {
|
||||
if ( (rc = ber_printf( ber, "ts",
|
||||
LDAP_TAG_MRA_TYPE, str )) == -1 ) {
|
||||
goto free_and_return;
|
||||
}
|
||||
}
|
||||
if (( len = unescape_filterval( value )) < 0 ||
|
||||
( rc = ber_printf( ber, "totb}", LDAP_TAG_MRA_VALUE,
|
||||
value, len, LDAP_TAG_MRA_DNATTRS, dnattr )) == -1 ) {
|
||||
goto free_and_return;
|
||||
}
|
||||
rc = 0;
|
||||
goto free_and_return;
|
||||
break;
|
||||
default:
|
||||
if ( find_star( value ) == NULL ) {
|
||||
ftype = LDAP_FILTER_EQUALITY;
|
||||
} else if ( strcmp( value, "*" ) == 0 ) {
|
||||
ftype = LDAP_FILTER_PRESENT;
|
||||
} else {
|
||||
rc = put_substring_filter( ber, str, value );
|
||||
goto free_and_return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if ( ftype == LDAP_FILTER_PRESENT ) {
|
||||
rc = ber_printf( ber, "ts", ftype, str );
|
||||
} else if (( len = unescape_filterval( value )) >= 0 ) {
|
||||
rc = ber_printf( ber, "t{so}", ftype, str, value, len );
|
||||
}
|
||||
if ( rc != -1 ) {
|
||||
rc = 0;
|
||||
}
|
||||
|
||||
free_and_return:
|
||||
NSLDAPI_FREE( str );
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Undo in place both LDAPv2 (RFC-1960) and LDAPv3 (hexadecimal) escape
|
||||
* sequences within the null-terminated string 'val'. The resulting value
|
||||
* may contain null characters.
|
||||
*
|
||||
* If 'val' contains invalid escape sequences we return -1.
|
||||
* Otherwise the length of the unescaped value is returned.
|
||||
*/
|
||||
static int
|
||||
unescape_filterval( char *val )
|
||||
{
|
||||
int escape, firstdigit, ival;
|
||||
char *s, *d;
|
||||
|
||||
escape = 0;
|
||||
for ( s = d = val; *s; s++ ) {
|
||||
if ( escape ) {
|
||||
/*
|
||||
* first try LDAPv3 escape (hexadecimal) sequence
|
||||
*/
|
||||
if (( ival = hexchar2int( *s )) < 0 ) {
|
||||
if ( firstdigit ) {
|
||||
/*
|
||||
* LDAPv2 (RFC1960) escape sequence
|
||||
*/
|
||||
*d++ = *s;
|
||||
escape = 0;
|
||||
} else {
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
if ( firstdigit ) {
|
||||
*d = ( ival<<4 );
|
||||
firstdigit = 0;
|
||||
} else {
|
||||
*d++ |= ival;
|
||||
escape = 0;
|
||||
}
|
||||
|
||||
} else if ( *s != '\\' ) {
|
||||
*d++ = *s;
|
||||
escape = 0;
|
||||
|
||||
} else {
|
||||
escape = 1;
|
||||
firstdigit = 1;
|
||||
}
|
||||
}
|
||||
|
||||
return( d - val );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* convert character 'c' that represents a hexadecimal digit to an integer.
|
||||
* if 'c' is not a hexidecimal digit [0-9A-Fa-f], -1 is returned.
|
||||
* otherwise the converted value is returned.
|
||||
*/
|
||||
static int
|
||||
hexchar2int( char c )
|
||||
{
|
||||
if ( c >= '0' && c <= '9' ) {
|
||||
return( c - '0' );
|
||||
}
|
||||
if ( c >= 'A' && c <= 'F' ) {
|
||||
return( c - 'A' + 10 );
|
||||
}
|
||||
if ( c >= 'a' && c <= 'f' ) {
|
||||
return( c - 'a' + 10 );
|
||||
}
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
static int
|
||||
put_substring_filter( BerElement *ber, char *type, char *val )
|
||||
{
|
||||
char *nextstar, gotstar = 0;
|
||||
unsigned long ftype;
|
||||
int len;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "put_substring_filter \"%s=%s\"\n", type,
|
||||
val, 0 );
|
||||
|
||||
if ( ber_printf( ber, "t{s{", LDAP_FILTER_SUBSTRINGS, type ) == -1 ) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
for ( ; val != NULL; val = nextstar ) {
|
||||
if ( (nextstar = find_star( val )) != NULL ) {
|
||||
*nextstar++ = '\0';
|
||||
}
|
||||
|
||||
if ( gotstar == 0 ) {
|
||||
ftype = LDAP_SUBSTRING_INITIAL;
|
||||
} else if ( nextstar == NULL ) {
|
||||
ftype = LDAP_SUBSTRING_FINAL;
|
||||
} else {
|
||||
ftype = LDAP_SUBSTRING_ANY;
|
||||
}
|
||||
if ( *val != '\0' ) {
|
||||
if (( len = unescape_filterval( val )) < 0 ||
|
||||
ber_printf( ber, "to", ftype, val, len ) == -1 ) {
|
||||
return( -1 );
|
||||
}
|
||||
}
|
||||
|
||||
gotstar = 1;
|
||||
}
|
||||
|
||||
if ( ber_printf( ber, "}}" ) == -1 ) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_search_st(
|
||||
LDAP *ld,
|
||||
const char *base,
|
||||
int scope,
|
||||
const char *filter,
|
||||
char **attrs,
|
||||
int attrsonly,
|
||||
struct timeval *timeout,
|
||||
LDAPMessage **res
|
||||
)
|
||||
{
|
||||
return( nsldapi_search_s( ld, base, scope, filter, attrs, attrsonly,
|
||||
NULL, NULL, timeout, -1, -1, res ));
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_search_s(
|
||||
LDAP *ld,
|
||||
const char *base,
|
||||
int scope,
|
||||
const char *filter,
|
||||
char **attrs,
|
||||
int attrsonly,
|
||||
LDAPMessage **res
|
||||
)
|
||||
{
|
||||
return( nsldapi_search_s( ld, base, scope, filter, attrs, attrsonly,
|
||||
NULL, NULL, NULL, -1, -1, res ));
|
||||
}
|
||||
|
||||
int LDAP_CALL
|
||||
ldap_search_ext_s(
|
||||
LDAP *ld,
|
||||
const char *base,
|
||||
int scope,
|
||||
const char *filter,
|
||||
char **attrs,
|
||||
int attrsonly,
|
||||
LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls,
|
||||
struct timeval *timeoutp,
|
||||
int sizelimit,
|
||||
LDAPMessage **res
|
||||
)
|
||||
{
|
||||
return( nsldapi_search_s( ld, base, scope, filter, attrs, attrsonly,
|
||||
serverctrls, clientctrls, timeoutp,
|
||||
nsldapi_timeval2ldaplimit( timeoutp, -1 ), sizelimit, res ));
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
nsldapi_search_s(
|
||||
LDAP *ld,
|
||||
const char *base,
|
||||
int scope,
|
||||
const char *filter,
|
||||
char **attrs,
|
||||
int attrsonly,
|
||||
LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls,
|
||||
struct timeval *localtimeoutp,
|
||||
int timelimit, /* -1 means use ld->ld_timelimit */
|
||||
int sizelimit, /* -1 means use ld->ld_sizelimit */
|
||||
LDAPMessage **res
|
||||
)
|
||||
{
|
||||
int err, msgid;
|
||||
|
||||
/*
|
||||
* It is an error to pass in a zero'd timeval.
|
||||
*/
|
||||
if ( localtimeoutp != NULL && localtimeoutp->tv_sec == 0 &&
|
||||
localtimeoutp->tv_usec == 0 ) {
|
||||
if ( ld != NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
}
|
||||
if ( res != NULL ) {
|
||||
*res = NULL;
|
||||
}
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if (( err = nsldapi_search( ld, base, scope, filter, attrs, attrsonly,
|
||||
serverctrls, clientctrls, timelimit, sizelimit, &msgid ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
return( err );
|
||||
}
|
||||
|
||||
if ( ldap_result( ld, msgid, 1, localtimeoutp, res ) == -1 ) {
|
||||
return( LDAP_GET_LDERRNO( ld, NULL, NULL ) );
|
||||
}
|
||||
|
||||
if ( LDAP_GET_LDERRNO( ld, NULL, NULL ) == LDAP_TIMEOUT ) {
|
||||
(void) ldap_abandon( ld, msgid );
|
||||
err = LDAP_TIMEOUT;
|
||||
LDAP_SET_LDERRNO( ld, err, NULL, NULL );
|
||||
return( err );
|
||||
}
|
||||
|
||||
return( ldap_result2error( ld, *res, 0 ) );
|
||||
}
|
||||
314
mozilla/directory/c-sdk/ldap/libraries/libldap/setoption.c
Normal file
314
mozilla/directory/c-sdk/ldap/libraries/libldap/setoption.c
Normal file
@@ -0,0 +1,314 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* setoption.c - ldap_set_option implementation
|
||||
*/
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
#define LDAP_SETCLR_BITOPT( ld, bit, optdata ) \
|
||||
if ( optdata != NULL ) { \
|
||||
(ld)->ld_options |= bit; \
|
||||
} else { \
|
||||
(ld)->ld_options &= ~bit; \
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_set_option( LDAP *ld, int option, const void *optdata )
|
||||
{
|
||||
int rc;
|
||||
char *matched, *errstr;
|
||||
|
||||
if ( !nsldapi_initialized ) {
|
||||
nsldapi_initialize_defaults();
|
||||
}
|
||||
|
||||
/*
|
||||
* process global options (not associated with an LDAP session handle)
|
||||
*/
|
||||
if ( option == LDAP_OPT_MEMALLOC_FN_PTRS ) {
|
||||
struct lber_memalloc_fns memalloc_fns;
|
||||
|
||||
/* set libldap ones via a struct copy */
|
||||
nsldapi_memalloc_fns = *((struct ldap_memalloc_fns *)optdata);
|
||||
|
||||
/* also set liblber memory allocation callbacks */
|
||||
memalloc_fns.lbermem_malloc =
|
||||
nsldapi_memalloc_fns.ldapmem_malloc;
|
||||
memalloc_fns.lbermem_calloc =
|
||||
nsldapi_memalloc_fns.ldapmem_calloc;
|
||||
memalloc_fns.lbermem_realloc =
|
||||
nsldapi_memalloc_fns.ldapmem_realloc;
|
||||
memalloc_fns.lbermem_free =
|
||||
nsldapi_memalloc_fns.ldapmem_free;
|
||||
if ( ber_set_option( NULL, LBER_OPT_MEMALLOC_FN_PTRS,
|
||||
&memalloc_fns ) != 0 ) {
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
/*
|
||||
* LDAP_OPT_DEBUG_LEVEL is global
|
||||
*/
|
||||
if (LDAP_OPT_DEBUG_LEVEL == option)
|
||||
{
|
||||
#ifdef LDAP_DEBUG
|
||||
ldap_debug = *((int *) optdata);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* if ld is NULL, arrange to modify our default settings
|
||||
*/
|
||||
if ( ld == NULL ) {
|
||||
ld = &nsldapi_ld_defaults;
|
||||
#ifdef LDAP_DEBUG
|
||||
ldap_debug = 0;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* process options that are associated with an LDAP session handle
|
||||
*/
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( -1 ); /* punt */
|
||||
}
|
||||
|
||||
rc = 0;
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_OPTION_LOCK );
|
||||
switch( option ) {
|
||||
/* options that can be turned on and off */
|
||||
#ifdef LDAP_DNS
|
||||
case LDAP_OPT_DNS:
|
||||
LDAP_SETCLR_BITOPT( ld, LDAP_BITOPT_DNS, optdata );
|
||||
break;
|
||||
#endif
|
||||
|
||||
case LDAP_OPT_REFERRALS:
|
||||
LDAP_SETCLR_BITOPT( ld, LDAP_BITOPT_REFERRALS, optdata );
|
||||
break;
|
||||
|
||||
#ifdef LDAP_SSLIO_HOOKS
|
||||
case LDAP_OPT_SSL:
|
||||
LDAP_SETCLR_BITOPT( ld, LDAP_BITOPT_SSL, optdata );
|
||||
break;
|
||||
#endif
|
||||
|
||||
case LDAP_OPT_RESTART:
|
||||
LDAP_SETCLR_BITOPT( ld, LDAP_BITOPT_RESTART, optdata );
|
||||
break;
|
||||
|
||||
case LDAP_OPT_RECONNECT:
|
||||
LDAP_SETCLR_BITOPT( ld, LDAP_BITOPT_RECONNECT, optdata );
|
||||
break;
|
||||
|
||||
#ifdef LDAP_ASYNC_IO
|
||||
case LDAP_OPT_ASYNC_CONNECT:
|
||||
LDAP_SETCLR_BITOPT(ld, LDAP_BITOPT_ASYNC, optdata );
|
||||
break;
|
||||
#endif /* LDAP_ASYNC_IO */
|
||||
|
||||
/* fields in the LDAP structure */
|
||||
case LDAP_OPT_DEREF:
|
||||
ld->ld_deref = *((int *) optdata);
|
||||
break;
|
||||
case LDAP_OPT_SIZELIMIT:
|
||||
ld->ld_sizelimit = *((int *) optdata);
|
||||
break;
|
||||
case LDAP_OPT_TIMELIMIT:
|
||||
ld->ld_timelimit = *((int *) optdata);
|
||||
break;
|
||||
case LDAP_OPT_REFERRAL_HOP_LIMIT:
|
||||
ld->ld_refhoplimit = *((int *) optdata);
|
||||
break;
|
||||
case LDAP_OPT_PROTOCOL_VERSION:
|
||||
ld->ld_version = *((int *) optdata);
|
||||
if ( ld->ld_defconn != NULL ) { /* also set in default conn. */
|
||||
ld->ld_defconn->lconn_version = ld->ld_version;
|
||||
}
|
||||
break;
|
||||
case LDAP_OPT_SERVER_CONTROLS:
|
||||
/* nsldapi_dup_controls returns -1 and sets lderrno on error */
|
||||
rc = nsldapi_dup_controls( ld, &ld->ld_servercontrols,
|
||||
(LDAPControl **)optdata );
|
||||
break;
|
||||
case LDAP_OPT_CLIENT_CONTROLS:
|
||||
/* nsldapi_dup_controls returns -1 and sets lderrno on error */
|
||||
rc = nsldapi_dup_controls( ld, &ld->ld_clientcontrols,
|
||||
(LDAPControl **)optdata );
|
||||
break;
|
||||
|
||||
/* rebind proc */
|
||||
case LDAP_OPT_REBIND_FN:
|
||||
ld->ld_rebind_fn = (LDAP_REBINDPROC_CALLBACK *) optdata;
|
||||
break;
|
||||
case LDAP_OPT_REBIND_ARG:
|
||||
ld->ld_rebind_arg = (void *) optdata;
|
||||
break;
|
||||
|
||||
#ifdef LDAP_SSLIO_HOOKS
|
||||
/* i/o function pointers */
|
||||
case LDAP_OPT_IO_FN_PTRS:
|
||||
/* struct copy */
|
||||
ld->ld_io = *((struct ldap_io_fns *) optdata);
|
||||
if ( NULL != ld->ld_sbp ) {
|
||||
rc = ber_sockbuf_set_option( ld->ld_sbp,
|
||||
LBER_SOCKBUF_OPT_READ_FN,
|
||||
(void *) ld->ld_read_fn );
|
||||
rc |= ber_sockbuf_set_option( ld->ld_sbp,
|
||||
LBER_SOCKBUF_OPT_WRITE_FN,
|
||||
(void *) ld->ld_write_fn );
|
||||
if ( rc != 0 ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_LOCAL_ERROR,
|
||||
NULL, NULL );
|
||||
rc = -1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
/* thread function pointers */
|
||||
case LDAP_OPT_THREAD_FN_PTRS:
|
||||
/* struct copy */
|
||||
ld->ld_thread = *((struct ldap_thread_fns *) optdata);
|
||||
if ( ld->ld_mutex_alloc_fn != NULL &&
|
||||
ld != &nsldapi_ld_defaults &&
|
||||
ld->ld_mutex != NULL ) {
|
||||
int i;
|
||||
for( i=0; i<LDAP_MAX_LOCK; i++ )
|
||||
ld->ld_mutex[i] = (ld->ld_mutex_alloc_fn)();
|
||||
}
|
||||
/*
|
||||
* Because we have just replaced the locking functions,
|
||||
* we return here without unlocking the LDAP_OPTION_LOCK.
|
||||
*/
|
||||
return (rc);
|
||||
|
||||
/* extra thread function pointers */
|
||||
case LDAP_OPT_EXTRA_THREAD_FN_PTRS:
|
||||
/*
|
||||
* XXXceb removing the full deal extra thread funcs to only
|
||||
* pick up the threadid. Should this assumes that the LD
|
||||
* was nulled prior to setting the functions.?
|
||||
*
|
||||
* this is how it previously went.
|
||||
* ld->ld_thread2 = *((struct ldap_extra_thread_fns *) optdata);
|
||||
*/
|
||||
|
||||
/* structure copy */
|
||||
ld->ld_thread2 = *((struct ldap_extra_thread_fns *) optdata);
|
||||
|
||||
/*
|
||||
*
|
||||
ld->ld_threadid_fn = *((struct ldap_extra_thread_fns *) optdata)ltf_threadid_fn;
|
||||
*/
|
||||
|
||||
ld->ld_mutex_trylock_fn = (LDAP_TF_MUTEX_TRYLOCK_CALLBACK *)NULL;
|
||||
ld->ld_sema_alloc_fn = (LDAP_TF_SEMA_ALLOC_CALLBACK *) NULL;
|
||||
ld->ld_sema_free_fn = (LDAP_TF_SEMA_FREE_CALLBACK *) NULL;
|
||||
ld->ld_sema_wait_fn = (LDAP_TF_SEMA_WAIT_CALLBACK *) NULL;
|
||||
ld->ld_sema_post_fn = (LDAP_TF_SEMA_POST_CALLBACK *) NULL;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* In the case where the threadid function is being set, the
|
||||
* LDAP_OPTION_LOCK was acquired without recording the lock
|
||||
* owner and updating the reference count. We set that
|
||||
* information here.
|
||||
*/
|
||||
if (ld->ld_mutex_lock_fn != NULL
|
||||
&& ld->ld_threadid_fn != NULL) {
|
||||
ld->ld_mutex_threadid[LDAP_OPTION_LOCK] =
|
||||
ld->ld_threadid_fn();
|
||||
ld->ld_mutex_refcnt[LDAP_OPTION_LOCK] = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
/* DNS function pointers */
|
||||
case LDAP_OPT_DNS_FN_PTRS:
|
||||
/* struct copy */
|
||||
ld->ld_dnsfn = *((struct ldap_dns_fns *) optdata);
|
||||
break;
|
||||
|
||||
/* cache function pointers */
|
||||
case LDAP_OPT_CACHE_FN_PTRS:
|
||||
/* struct copy */
|
||||
ld->ld_cache = *((struct ldap_cache_fns *) optdata);
|
||||
break;
|
||||
case LDAP_OPT_CACHE_STRATEGY:
|
||||
ld->ld_cache_strategy = *((int *) optdata);
|
||||
break;
|
||||
case LDAP_OPT_CACHE_ENABLE:
|
||||
ld->ld_cache_on = *((int *) optdata);
|
||||
break;
|
||||
|
||||
case LDAP_OPT_ERROR_NUMBER:
|
||||
LDAP_GET_LDERRNO( ld, &matched, &errstr );
|
||||
matched = nsldapi_strdup( matched );
|
||||
errstr = nsldapi_strdup( errstr );
|
||||
LDAP_SET_LDERRNO( ld, *((int *) optdata), matched, errstr );
|
||||
break;
|
||||
|
||||
case LDAP_OPT_ERROR_STRING:
|
||||
rc = LDAP_GET_LDERRNO( ld, &matched, NULL );
|
||||
matched = nsldapi_strdup( matched );
|
||||
LDAP_SET_LDERRNO( ld, rc, matched,
|
||||
nsldapi_strdup((char *) optdata));
|
||||
rc = LDAP_SUCCESS;
|
||||
break;
|
||||
|
||||
case LDAP_OPT_MATCHED_DN:
|
||||
rc = LDAP_GET_LDERRNO( ld, NULL, &errstr );
|
||||
errstr = nsldapi_strdup( errstr );
|
||||
LDAP_SET_LDERRNO( ld, rc,
|
||||
nsldapi_strdup((char *) optdata), errstr );
|
||||
rc = LDAP_SUCCESS;
|
||||
break;
|
||||
|
||||
case LDAP_OPT_PREFERRED_LANGUAGE:
|
||||
if ( NULL != ld->ld_preferred_language ) {
|
||||
NSLDAPI_FREE(ld->ld_preferred_language);
|
||||
}
|
||||
ld->ld_preferred_language = nsldapi_strdup((char *) optdata);
|
||||
break;
|
||||
|
||||
case LDAP_OPT_HOST_NAME:
|
||||
if ( NULL != ld->ld_defhost ) {
|
||||
NSLDAPI_FREE(ld->ld_defhost);
|
||||
}
|
||||
ld->ld_defhost = nsldapi_strdup((char *) optdata);
|
||||
break;
|
||||
|
||||
default:
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
rc = -1;
|
||||
}
|
||||
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_OPTION_LOCK );
|
||||
return( rc );
|
||||
}
|
||||
318
mozilla/directory/c-sdk/ldap/libraries/libldap/sort.c
Normal file
318
mozilla/directory/c-sdk/ldap/libraries/libldap/sort.c
Normal file
@@ -0,0 +1,318 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1994 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*/
|
||||
/*
|
||||
* sort.c: LDAP library entry and value sort routines
|
||||
*/
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
/* This xp_qsort fixes a memory problem (ABR) on Solaris for the client.
|
||||
* Server is welcome to use it too, but I wasn't sure if it
|
||||
* would be ok to use XP code here. -slamm
|
||||
*
|
||||
* We don't want to require use of libxp when linking with libldap, so
|
||||
* I'll leave use of xp_qsort as a MOZILLA_CLIENT-only thing for now. --mcs
|
||||
*/
|
||||
#if defined(MOZILLA_CLIENT) && defined(SOLARIS)
|
||||
#include "xp_qsort.h"
|
||||
#else
|
||||
#define XP_QSORT qsort
|
||||
#endif
|
||||
|
||||
typedef struct keycmp {
|
||||
void *kc_arg;
|
||||
LDAP_KEYCMP_CALLBACK *kc_cmp;
|
||||
} keycmp_t;
|
||||
|
||||
typedef struct keything {
|
||||
keycmp_t *kt_cmp;
|
||||
const struct berval *kt_key;
|
||||
LDAPMessage *kt_msg;
|
||||
} keything_t;
|
||||
|
||||
static int LDAP_C LDAP_CALLBACK
|
||||
ldapi_keycmp( const void *Lv, const void *Rv )
|
||||
{
|
||||
auto keything_t **L = (keything_t**)Lv;
|
||||
auto keything_t **R = (keything_t**)Rv;
|
||||
auto keycmp_t *cmp = (*L)->kt_cmp;
|
||||
return cmp->kc_cmp( cmp->kc_arg, (*L)->kt_key, (*R)->kt_key );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_keysort_entries(
|
||||
LDAP *ld,
|
||||
LDAPMessage **chain,
|
||||
void *arg,
|
||||
LDAP_KEYGEN_CALLBACK *gen,
|
||||
LDAP_KEYCMP_CALLBACK *cmp,
|
||||
LDAP_KEYFREE_CALLBACK *fre)
|
||||
{
|
||||
size_t count, i;
|
||||
keycmp_t kc = {0};
|
||||
keything_t **kt;
|
||||
LDAPMessage *e, *last;
|
||||
LDAPMessage **ep;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )
|
||||
|| chain == NULL || cmp == NULL ) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
count = ldap_count_entries( ld, *chain );
|
||||
|
||||
kt = (keything_t**)NSLDAPI_MALLOC( count * (sizeof(keything_t*) + sizeof(keything_t)) );
|
||||
if ( kt == NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL, NULL );
|
||||
return( -1 );
|
||||
}
|
||||
for ( i = 0; i < count; i++ ) {
|
||||
kt[i] = i + (keything_t*)(kt + count);
|
||||
}
|
||||
kc.kc_arg = arg;
|
||||
kc.kc_cmp = cmp;
|
||||
|
||||
for ( e = *chain, i = 0; i < count; i++, e = e->lm_chain ) {
|
||||
kt[i]->kt_msg = e;
|
||||
kt[i]->kt_cmp = &kc;
|
||||
kt[i]->kt_key = gen( arg, ld, e );
|
||||
if ( kt[i]->kt_key == NULL ) {
|
||||
if ( fre ) while ( i-- > 0 ) fre( arg, kt[i]->kt_key );
|
||||
NSLDAPI_FREE( (char*)kt );
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL, NULL );
|
||||
return( -1 );
|
||||
}
|
||||
}
|
||||
last = e;
|
||||
|
||||
XP_QSORT( (void*)kt, count, (size_t)sizeof(keything_t*), ldapi_keycmp );
|
||||
|
||||
ep = chain;
|
||||
for ( i = 0; i < count; i++ ) {
|
||||
*ep = kt[i]->kt_msg;
|
||||
ep = &(*ep)->lm_chain;
|
||||
if ( fre ) fre( arg, kt[i]->kt_key );
|
||||
}
|
||||
*ep = last;
|
||||
NSLDAPI_FREE( (char*)kt );
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
|
||||
struct entrything {
|
||||
char **et_vals;
|
||||
LDAPMessage *et_msg;
|
||||
};
|
||||
|
||||
typedef int (LDAP_C LDAP_CALLBACK LDAP_CHARCMP_CALLBACK)(char*, char*);
|
||||
typedef int (LDAP_C LDAP_CALLBACK LDAP_VOIDCMP_CALLBACK)(const void*,
|
||||
const void*);
|
||||
|
||||
static LDAP_CHARCMP_CALLBACK *et_cmp_fn;
|
||||
static LDAP_VOIDCMP_CALLBACK et_cmp;
|
||||
|
||||
int
|
||||
LDAP_C
|
||||
LDAP_CALLBACK
|
||||
ldap_sort_strcasecmp(
|
||||
const char **a,
|
||||
const char **b
|
||||
)
|
||||
{
|
||||
/* XXXceb
|
||||
* I am not 100% sure this is the way this should be handled.
|
||||
* For now we will return a 0 on invalid.
|
||||
*/
|
||||
if (NULL == a || NULL == b)
|
||||
return (0);
|
||||
return( strcasecmp( (char *)*a, (char *)*b ) );
|
||||
}
|
||||
|
||||
static int
|
||||
LDAP_C
|
||||
LDAP_CALLBACK
|
||||
et_cmp(
|
||||
const void *aa,
|
||||
const void *bb
|
||||
)
|
||||
{
|
||||
int i, rc;
|
||||
struct entrything *a = (struct entrything *)aa;
|
||||
struct entrything *b = (struct entrything *)bb;
|
||||
|
||||
if ( a->et_vals == NULL && b->et_vals == NULL )
|
||||
return( 0 );
|
||||
if ( a->et_vals == NULL )
|
||||
return( -1 );
|
||||
if ( b->et_vals == NULL )
|
||||
return( 1 );
|
||||
|
||||
for ( i = 0; a->et_vals[i] && b->et_vals[i]; i++ ) {
|
||||
if ( (rc = (*et_cmp_fn)( a->et_vals[i], b->et_vals[i] ))
|
||||
!= 0 ) {
|
||||
return( rc );
|
||||
}
|
||||
}
|
||||
|
||||
if ( a->et_vals[i] == NULL && b->et_vals[i] == NULL )
|
||||
return( 0 );
|
||||
if ( a->et_vals[i] == NULL )
|
||||
return( -1 );
|
||||
return( 1 );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_multisort_entries(
|
||||
LDAP *ld,
|
||||
LDAPMessage **chain,
|
||||
char **attr, /* NULL => sort by DN */
|
||||
LDAP_CMP_CALLBACK *cmp
|
||||
)
|
||||
{
|
||||
int i, count;
|
||||
struct entrything *et;
|
||||
LDAPMessage *e, *last;
|
||||
LDAPMessage **ep;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )
|
||||
|| chain == NULL || cmp == NULL ) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
count = ldap_count_entries( ld, *chain );
|
||||
|
||||
if ( (et = (struct entrything *)NSLDAPI_MALLOC( count *
|
||||
sizeof(struct entrything) )) == NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL, NULL );
|
||||
return( -1 );
|
||||
}
|
||||
|
||||
e = *chain;
|
||||
for ( i = 0; i < count; i++ ) {
|
||||
et[i].et_msg = e;
|
||||
et[i].et_vals = NULL;
|
||||
if ( attr == NULL ) {
|
||||
char *dn;
|
||||
|
||||
dn = ldap_get_dn( ld, e );
|
||||
et[i].et_vals = ldap_explode_dn( dn, 1 );
|
||||
NSLDAPI_FREE( dn );
|
||||
} else {
|
||||
int attrcnt;
|
||||
char **vals;
|
||||
|
||||
for ( attrcnt = 0; attr[attrcnt] != NULL; attrcnt++ ) {
|
||||
vals = ldap_get_values( ld, e, attr[attrcnt] );
|
||||
if ( ldap_charray_merge( &(et[i].et_vals), vals )
|
||||
!= 0 ) {
|
||||
int j;
|
||||
|
||||
/* XXX risky: ldap_value_free( vals ); */
|
||||
for ( j = 0; j <= i; j++ )
|
||||
ldap_value_free( et[j].et_vals );
|
||||
NSLDAPI_FREE( (char *) et );
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL,
|
||||
NULL );
|
||||
return( -1 );
|
||||
}
|
||||
if ( vals != NULL ) {
|
||||
NSLDAPI_FREE( (char *)vals );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
e = e->lm_chain;
|
||||
}
|
||||
last = e;
|
||||
|
||||
et_cmp_fn = (LDAP_CHARCMP_CALLBACK *)cmp;
|
||||
XP_QSORT( (void *) et, (size_t) count,
|
||||
(size_t) sizeof(struct entrything), et_cmp );
|
||||
|
||||
ep = chain;
|
||||
for ( i = 0; i < count; i++ ) {
|
||||
*ep = et[i].et_msg;
|
||||
ep = &(*ep)->lm_chain;
|
||||
|
||||
ldap_value_free( et[i].et_vals );
|
||||
}
|
||||
*ep = last;
|
||||
NSLDAPI_FREE( (char *) et );
|
||||
|
||||
return( 0 );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_sort_entries(
|
||||
LDAP *ld,
|
||||
LDAPMessage **chain,
|
||||
char *attr, /* NULL => sort by DN */
|
||||
LDAP_CMP_CALLBACK *cmp
|
||||
)
|
||||
{
|
||||
char *attrs[2];
|
||||
|
||||
attrs[0] = attr;
|
||||
attrs[1] = NULL;
|
||||
return( ldap_multisort_entries( ld, chain, attr ? attrs : NULL, cmp ) );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_sort_values(
|
||||
LDAP *ld,
|
||||
char **vals,
|
||||
LDAP_VALCMP_CALLBACK *cmp
|
||||
)
|
||||
{
|
||||
int nel;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld ) || cmp == NULL ) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( NULL == vals)
|
||||
{
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
for ( nel = 0; vals[nel] != NULL; nel++ )
|
||||
; /* NULL */
|
||||
|
||||
XP_QSORT( vals, nel, sizeof(char *), (LDAP_VOIDCMP_CALLBACK *)cmp );
|
||||
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
437
mozilla/directory/c-sdk/ldap/libraries/libldap/sortctrl.c
Normal file
437
mozilla/directory/c-sdk/ldap/libraries/libldap/sortctrl.c
Normal file
@@ -0,0 +1,437 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
#include "ldap-int.h"
|
||||
|
||||
/* ldap_create_sort_control:
|
||||
|
||||
Parameters are
|
||||
|
||||
ld LDAP pointer to the desired connection
|
||||
|
||||
sortKeyList an array of sortkeys
|
||||
|
||||
ctl_iscritical Indicates whether the control is critical of not. If
|
||||
this field is non-zero, the operation will only be car-
|
||||
ried out if the control is recognized by the server
|
||||
and/or client
|
||||
|
||||
ctrlp the address of a place to put the constructed control
|
||||
*/
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_create_sort_control (
|
||||
LDAP *ld,
|
||||
LDAPsortkey **sortKeyList,
|
||||
const char ctl_iscritical,
|
||||
LDAPControl **ctrlp
|
||||
)
|
||||
{
|
||||
BerElement *ber;
|
||||
int i, rc;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( sortKeyList == NULL || ctrlp == NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_PARAM_ERROR, NULL, NULL );
|
||||
return ( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
/* create a ber package to hold the controlValue */
|
||||
if ( ( nsldapi_alloc_ber_with_options( ld, &ber ) ) != LDAP_SUCCESS ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL, NULL );
|
||||
return( LDAP_NO_MEMORY );
|
||||
}
|
||||
|
||||
/* encode the start of the sequence of sequences into the ber */
|
||||
if ( ber_printf( ber, "{" ) == -1 ) {
|
||||
goto encoding_error_exit;
|
||||
}
|
||||
|
||||
/* the sort control value will be encoded as a sequence of sequences
|
||||
which are each encoded as one of the following: {s} or {sts} or {stb} or {ststb}
|
||||
since the orderingRule and reverseOrder flag are both optional */
|
||||
for ( i = 0; sortKeyList[i] != NULL; i++ ) {
|
||||
|
||||
/* encode the attributeType into the ber */
|
||||
if ( ber_printf( ber, "{s", (sortKeyList[i])->sk_attrtype )
|
||||
== -1 ) {
|
||||
goto encoding_error_exit;
|
||||
}
|
||||
|
||||
/* encode the optional orderingRule into the ber */
|
||||
if ( (sortKeyList[i])->sk_matchruleoid != NULL ) {
|
||||
if ( ber_printf( ber, "ts", LDAP_TAG_SK_MATCHRULE,
|
||||
(sortKeyList[i])->sk_matchruleoid )
|
||||
== -1 ) {
|
||||
goto encoding_error_exit;
|
||||
}
|
||||
}
|
||||
|
||||
/* Encode the optional reverseOrder flag into the ber. */
|
||||
/* If the flag is false, it should be absent. */
|
||||
if ( (sortKeyList[i])->sk_reverseorder ) {
|
||||
if ( ber_printf( ber, "tb}", LDAP_TAG_SK_REVERSE,
|
||||
(sortKeyList[i])->sk_reverseorder ) == -1 ) {
|
||||
goto encoding_error_exit;
|
||||
}
|
||||
} else {
|
||||
if ( ber_printf( ber, "}" ) == -1 ) {
|
||||
goto encoding_error_exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* encode the end of the sequence of sequences into the ber */
|
||||
if ( ber_printf( ber, "}" ) == -1 ) {
|
||||
goto encoding_error_exit;
|
||||
}
|
||||
|
||||
rc = nsldapi_build_control( LDAP_CONTROL_SORTREQUEST, ber, 1,
|
||||
ctl_iscritical, ctrlp );
|
||||
|
||||
LDAP_SET_LDERRNO( ld, rc, NULL, NULL );
|
||||
return( rc );
|
||||
|
||||
encoding_error_exit:
|
||||
LDAP_SET_LDERRNO( ld, LDAP_ENCODING_ERROR, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( LDAP_ENCODING_ERROR );
|
||||
}
|
||||
|
||||
/* ldap_parse_sort_control:
|
||||
|
||||
Parameters are
|
||||
|
||||
ld LDAP pointer to the desired connection
|
||||
|
||||
ctrlp An array of controls obtained from calling
|
||||
ldap_parse_result on the set of results returned by
|
||||
the server
|
||||
|
||||
result the address of a place to put the result code
|
||||
|
||||
attribute the address of a place to put the name of the
|
||||
attribute which cause the operation to fail, optionally
|
||||
returned by the server */
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_parse_sort_control (
|
||||
LDAP *ld,
|
||||
LDAPControl **ctrlp,
|
||||
unsigned long *result,
|
||||
char **attribute
|
||||
)
|
||||
{
|
||||
BerElement *ber;
|
||||
int i, foundSortControl;
|
||||
LDAPControl *sortCtrlp;
|
||||
unsigned long len, tag;
|
||||
char *attr;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld ) || result == NULL ||
|
||||
attribute == NULL ) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
|
||||
/* find the sortControl in the list of controls if it exists */
|
||||
if ( ctrlp == NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_CONTROL_NOT_FOUND, NULL, NULL );
|
||||
return ( LDAP_CONTROL_NOT_FOUND );
|
||||
}
|
||||
foundSortControl = 0;
|
||||
for ( i = 0; (( ctrlp[i] != NULL ) && ( !foundSortControl )); i++ ) {
|
||||
foundSortControl = !strcmp( ctrlp[i]->ldctl_oid, LDAP_CONTROL_SORTRESPONSE );
|
||||
}
|
||||
if ( !foundSortControl ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_CONTROL_NOT_FOUND, NULL, NULL );
|
||||
return ( LDAP_CONTROL_NOT_FOUND );
|
||||
} else {
|
||||
/* let local var point to the sortControl */
|
||||
sortCtrlp = ctrlp[i-1];
|
||||
}
|
||||
|
||||
/* allocate a Ber element with the contents of the sort_control's struct berval */
|
||||
if ( ( ber = ber_init( &sortCtrlp->ldctl_value ) ) == NULL ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_NO_MEMORY, NULL, NULL );
|
||||
return( LDAP_NO_MEMORY );
|
||||
}
|
||||
|
||||
/* decode the result from the Berelement */
|
||||
if ( ber_scanf( ber, "{i", result ) == LBER_ERROR ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_DECODING_ERROR, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( LDAP_DECODING_ERROR );
|
||||
}
|
||||
|
||||
/* if the server returned one, decode the attribute from the Ber element */
|
||||
if ( ber_peek_tag( ber, &len ) == LDAP_TAG_SR_ATTRTYPE ) {
|
||||
if ( ber_scanf( ber, "ta", &tag, &attr ) == LBER_ERROR ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_DECODING_ERROR, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( LDAP_DECODING_ERROR );
|
||||
}
|
||||
*attribute = attr;
|
||||
} else {
|
||||
*attribute = NULL;
|
||||
}
|
||||
|
||||
if ( ber_scanf( ber, "}" ) == LBER_ERROR ) {
|
||||
LDAP_SET_LDERRNO( ld, LDAP_DECODING_ERROR, NULL, NULL );
|
||||
ber_free( ber, 1 );
|
||||
return( LDAP_DECODING_ERROR );
|
||||
}
|
||||
|
||||
/* the ber encoding is no longer needed */
|
||||
ber_free(ber,1);
|
||||
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
|
||||
/* Routines for the manipulation of string-representations of sort control keylists */
|
||||
|
||||
static int count_tokens(const char *s)
|
||||
{
|
||||
int count = 0;
|
||||
const char *p = s;
|
||||
int whitespace = 1;
|
||||
/* Loop along the string counting the number of times we see the
|
||||
* beginning of non-whitespace. This tells us
|
||||
* the number of tokens in the string
|
||||
*/
|
||||
while (*p != '\0') {
|
||||
if (whitespace) {
|
||||
if (!isspace(*p)) {
|
||||
whitespace = 0;
|
||||
count++;
|
||||
}
|
||||
} else {
|
||||
if (isspace(*p)) {
|
||||
whitespace = 1;
|
||||
}
|
||||
}
|
||||
p++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
/* Is this character a valid attribute description character ? */
|
||||
static int isattrdescchar(char c)
|
||||
{
|
||||
/* Alphanumeric chars are in */
|
||||
if (isalnum(c)) {
|
||||
return 1;
|
||||
}
|
||||
/* As is ';' */
|
||||
if (';' == c) {
|
||||
return 1;
|
||||
}
|
||||
/* Everything else is out */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int read_next_token(const char **s,LDAPsortkey **key)
|
||||
{
|
||||
char c = 0;
|
||||
const char *pos = *s;
|
||||
int retval = 0;
|
||||
LDAPsortkey *new_key = NULL;
|
||||
|
||||
const char *matchrule_source = NULL;
|
||||
int matchrule_size = 0;
|
||||
const char *attrdesc_source = NULL;
|
||||
int attrdesc_size = 0;
|
||||
int reverse = 0;
|
||||
|
||||
int state = 0;
|
||||
|
||||
while ( ((c = *pos++) != '\0') && (state != 4) ) {
|
||||
switch (state) {
|
||||
case 0:
|
||||
/* case where we've not seen the beginning of the attr yet */
|
||||
/* If we still see whitespace, nothing to do */
|
||||
if (!isspace(c)) {
|
||||
/* Otherwise, something to look at */
|
||||
/* Is it a minus sign ? */
|
||||
if ('-' == c) {
|
||||
reverse = 1;
|
||||
} else {
|
||||
attrdesc_source = pos - 1;
|
||||
state = 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
/* case where we've seen the beginning of the attr, but not the end */
|
||||
/* Is this char either whitespace or a ';' ? */
|
||||
if ( isspace(c) || (':' == c)) {
|
||||
attrdesc_size = (pos - attrdesc_source) - 1;
|
||||
if (':' == c) {
|
||||
state = 2;
|
||||
} else {
|
||||
state = 4;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
/* case where we've seen the end of the attr and want the beginning of match rule */
|
||||
if (!isspace(c)) {
|
||||
matchrule_source = pos - 1;
|
||||
state = 3;
|
||||
} else {
|
||||
state = 4;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
/* case where we've seen the beginning of match rule and want to find the end */
|
||||
if (isspace(c)) {
|
||||
matchrule_size = (pos - matchrule_source) - 1;
|
||||
state = 4;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (3 == state) {
|
||||
/* means we fell off the end of the string looking for the end of the marching rule */
|
||||
matchrule_size = (pos - matchrule_source) - 1;
|
||||
}
|
||||
|
||||
if (1 == state) {
|
||||
/* means we fell of the end of the string looking for the end of the attribute */
|
||||
attrdesc_size = (pos - attrdesc_source) - 1;
|
||||
}
|
||||
|
||||
if (NULL == attrdesc_source) {
|
||||
/* Didn't find anything */
|
||||
return -1;
|
||||
}
|
||||
|
||||
new_key = (LDAPsortkey*)NSLDAPI_MALLOC(sizeof(LDAPsortkey));
|
||||
if (0 == new_key) {
|
||||
return LDAP_NO_MEMORY;
|
||||
}
|
||||
|
||||
/* Allocate the strings */
|
||||
new_key->sk_attrtype = (char *)NSLDAPI_MALLOC(attrdesc_size + 1);
|
||||
if (NULL != matchrule_source) {
|
||||
new_key->sk_matchruleoid = (char *)NSLDAPI_MALLOC(
|
||||
matchrule_size + 1);
|
||||
} else {
|
||||
new_key->sk_matchruleoid = NULL;
|
||||
}
|
||||
/* Copy over the strings */
|
||||
memcpy(new_key->sk_attrtype,attrdesc_source,attrdesc_size);
|
||||
*(new_key->sk_attrtype + attrdesc_size) = '\0';
|
||||
if (NULL != matchrule_source) {
|
||||
memcpy(new_key->sk_matchruleoid,matchrule_source,matchrule_size);
|
||||
*(new_key->sk_matchruleoid + matchrule_size) = '\0';
|
||||
}
|
||||
|
||||
new_key->sk_reverseorder = reverse;
|
||||
|
||||
*s = pos - 1;
|
||||
*key = new_key;
|
||||
return retval;
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_create_sort_keylist (
|
||||
LDAPsortkey ***sortKeyList,
|
||||
const char *string_rep
|
||||
)
|
||||
{
|
||||
int count = 0;
|
||||
LDAPsortkey **pointer_array = NULL;
|
||||
const char *current_position = NULL;
|
||||
char *s = NULL;
|
||||
int retval = 0;
|
||||
int i = 0;
|
||||
|
||||
/* Figure out how many there are */
|
||||
if (NULL == string_rep) {
|
||||
return LDAP_PARAM_ERROR;
|
||||
}
|
||||
if (NULL == sortKeyList) {
|
||||
return LDAP_PARAM_ERROR;
|
||||
}
|
||||
count = count_tokens(string_rep);
|
||||
if (0 == count) {
|
||||
*sortKeyList = NULL;
|
||||
return LDAP_PARAM_ERROR;
|
||||
}
|
||||
/* Allocate enough memory for the pointers */
|
||||
pointer_array = (LDAPsortkey**)NSLDAPI_MALLOC(sizeof(LDAPsortkey*)
|
||||
* (count + 1) );
|
||||
if (NULL == pointer_array) {
|
||||
return LDAP_NO_MEMORY;
|
||||
}
|
||||
/* Now walk along the string, allocating and filling in the LDAPsearchkey structure */
|
||||
current_position = string_rep;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (0 != (retval = read_next_token(¤t_position,&(pointer_array[i])))) {
|
||||
pointer_array[count] = NULL;
|
||||
ldap_free_sort_keylist(pointer_array);
|
||||
*sortKeyList = NULL;
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
pointer_array[count] = NULL;
|
||||
*sortKeyList = pointer_array;
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_free_sort_keylist (
|
||||
LDAPsortkey **sortKeyList
|
||||
)
|
||||
{
|
||||
LDAPsortkey *this_one = NULL;
|
||||
int i = 0;
|
||||
|
||||
if ( NULL == sortKeyList ) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Walk down the list freeing the LDAPsortkey structures */
|
||||
for (this_one = sortKeyList[0]; this_one ; this_one = sortKeyList[++i]) {
|
||||
/* Free the strings, if present */
|
||||
if (NULL != this_one->sk_attrtype) {
|
||||
NSLDAPI_FREE(this_one->sk_attrtype);
|
||||
}
|
||||
if (NULL != this_one->sk_matchruleoid) {
|
||||
NSLDAPI_FREE(this_one->sk_matchruleoid);
|
||||
}
|
||||
NSLDAPI_FREE(this_one);
|
||||
}
|
||||
/* Free the pointer list */
|
||||
NSLDAPI_FREE(sortKeyList);
|
||||
}
|
||||
421
mozilla/directory/c-sdk/ldap/libraries/libldap/srchpref.c
Normal file
421
mozilla/directory/c-sdk/ldap/libraries/libldap/srchpref.c
Normal file
@@ -0,0 +1,421 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1993, 1994 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that this notice is preserved and that due credit is given
|
||||
* to the University of Michigan at Ann Arbor. The name of the University
|
||||
* may not be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission. This software
|
||||
* is provided ``as is'' without express or implied warranty.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* searchpref.c: search preferences library routines for LDAP clients
|
||||
*/
|
||||
|
||||
#include "ldap-int.h"
|
||||
#include "srchpref.h"
|
||||
|
||||
int nsldapi_next_line_tokens( char **bufp, long *blenp, char ***toksp );
|
||||
void nsldapi_free_strarray( char **sap );
|
||||
static void free_searchobj( struct ldap_searchobj *so );
|
||||
static int read_next_searchobj( char **bufp, long *blenp,
|
||||
struct ldap_searchobj **sop, int soversion );
|
||||
|
||||
|
||||
static char *sobjoptions[] = {
|
||||
"internal",
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
static unsigned long sobjoptvals[] = {
|
||||
LDAP_SEARCHOBJ_OPT_INTERNAL,
|
||||
};
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_init_searchprefs( char *file, struct ldap_searchobj **solistp )
|
||||
{
|
||||
FILE *fp;
|
||||
char *buf;
|
||||
long rlen, len;
|
||||
int rc, eof;
|
||||
|
||||
if (( fp = fopen( file, "r" )) == NULL ) {
|
||||
return( LDAP_SEARCHPREF_ERR_FILE );
|
||||
}
|
||||
|
||||
if ( fseek( fp, 0L, SEEK_END ) != 0 ) { /* move to end to get len */
|
||||
fclose( fp );
|
||||
return( LDAP_SEARCHPREF_ERR_FILE );
|
||||
}
|
||||
|
||||
len = ftell( fp );
|
||||
|
||||
if ( fseek( fp, 0L, SEEK_SET ) != 0 ) { /* back to start of file */
|
||||
fclose( fp );
|
||||
return( LDAP_SEARCHPREF_ERR_FILE );
|
||||
}
|
||||
|
||||
if (( buf = NSLDAPI_MALLOC( (size_t)len )) == NULL ) {
|
||||
fclose( fp );
|
||||
return( LDAP_SEARCHPREF_ERR_MEM );
|
||||
}
|
||||
|
||||
rlen = fread( buf, 1, (size_t)len, fp );
|
||||
eof = feof( fp );
|
||||
fclose( fp );
|
||||
|
||||
if ( rlen != len && !eof ) { /* error: didn't get the whole file */
|
||||
NSLDAPI_FREE( buf );
|
||||
return( LDAP_SEARCHPREF_ERR_FILE );
|
||||
}
|
||||
|
||||
rc = ldap_init_searchprefs_buf( buf, rlen, solistp );
|
||||
NSLDAPI_FREE( buf );
|
||||
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_init_searchprefs_buf( char *buf, long buflen,
|
||||
struct ldap_searchobj **solistp )
|
||||
{
|
||||
int rc = 0, version;
|
||||
char **toks;
|
||||
struct ldap_searchobj *prevso, *so;
|
||||
|
||||
*solistp = prevso = NULLSEARCHOBJ;
|
||||
|
||||
if ( nsldapi_next_line_tokens( &buf, &buflen, &toks ) != 2 ||
|
||||
strcasecmp( toks[ 0 ], "version" ) != 0 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
return( LDAP_SEARCHPREF_ERR_SYNTAX );
|
||||
}
|
||||
version = atoi( toks[ 1 ] );
|
||||
nsldapi_free_strarray( toks );
|
||||
if ( version != LDAP_SEARCHPREF_VERSION &&
|
||||
version != LDAP_SEARCHPREF_VERSION_ZERO ) {
|
||||
return( LDAP_SEARCHPREF_ERR_VERSION );
|
||||
}
|
||||
|
||||
while ( buflen > 0 && ( rc = read_next_searchobj( &buf, &buflen, &so,
|
||||
version )) == 0 && so != NULLSEARCHOBJ ) {
|
||||
if ( prevso == NULLSEARCHOBJ ) {
|
||||
*solistp = so;
|
||||
} else {
|
||||
prevso->so_next = so;
|
||||
}
|
||||
prevso = so;
|
||||
}
|
||||
|
||||
if ( rc != 0 ) {
|
||||
ldap_free_searchprefs( *solistp );
|
||||
}
|
||||
|
||||
return( rc );
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_free_searchprefs( struct ldap_searchobj *solist )
|
||||
{
|
||||
struct ldap_searchobj *so, *nextso;
|
||||
|
||||
if ( solist != NULL ) {
|
||||
for ( so = solist; so != NULL; so = nextso ) {
|
||||
nextso = so->so_next;
|
||||
free_searchobj( so );
|
||||
}
|
||||
}
|
||||
/* XXX XXX need to do some work here */
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
free_searchobj( struct ldap_searchobj *so )
|
||||
{
|
||||
if ( so != NULL ) {
|
||||
if ( so->so_objtypeprompt != NULL ) {
|
||||
NSLDAPI_FREE( so->so_objtypeprompt );
|
||||
}
|
||||
if ( so->so_prompt != NULL ) {
|
||||
NSLDAPI_FREE( so->so_prompt );
|
||||
}
|
||||
if ( so->so_filterprefix != NULL ) {
|
||||
NSLDAPI_FREE( so->so_filterprefix );
|
||||
}
|
||||
if ( so->so_filtertag != NULL ) {
|
||||
NSLDAPI_FREE( so->so_filtertag );
|
||||
}
|
||||
if ( so->so_defaultselectattr != NULL ) {
|
||||
NSLDAPI_FREE( so->so_defaultselectattr );
|
||||
}
|
||||
if ( so->so_defaultselecttext != NULL ) {
|
||||
NSLDAPI_FREE( so->so_defaultselecttext );
|
||||
}
|
||||
if ( so->so_salist != NULL ) {
|
||||
struct ldap_searchattr *sa, *nextsa;
|
||||
for ( sa = so->so_salist; sa != NULL; sa = nextsa ) {
|
||||
nextsa = sa->sa_next;
|
||||
if ( sa->sa_attrlabel != NULL ) {
|
||||
NSLDAPI_FREE( sa->sa_attrlabel );
|
||||
}
|
||||
if ( sa->sa_attr != NULL ) {
|
||||
NSLDAPI_FREE( sa->sa_attr );
|
||||
}
|
||||
if ( sa->sa_selectattr != NULL ) {
|
||||
NSLDAPI_FREE( sa->sa_selectattr );
|
||||
}
|
||||
if ( sa->sa_selecttext != NULL ) {
|
||||
NSLDAPI_FREE( sa->sa_selecttext );
|
||||
}
|
||||
NSLDAPI_FREE( sa );
|
||||
}
|
||||
}
|
||||
if ( so->so_smlist != NULL ) {
|
||||
struct ldap_searchmatch *sm, *nextsm;
|
||||
for ( sm = so->so_smlist; sm != NULL; sm = nextsm ) {
|
||||
nextsm = sm->sm_next;
|
||||
if ( sm->sm_matchprompt != NULL ) {
|
||||
NSLDAPI_FREE( sm->sm_matchprompt );
|
||||
}
|
||||
if ( sm->sm_filter != NULL ) {
|
||||
NSLDAPI_FREE( sm->sm_filter );
|
||||
}
|
||||
NSLDAPI_FREE( sm );
|
||||
}
|
||||
}
|
||||
NSLDAPI_FREE( so );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
struct ldap_searchobj *
|
||||
LDAP_CALL
|
||||
ldap_first_searchobj( struct ldap_searchobj *solist )
|
||||
{
|
||||
return( solist );
|
||||
}
|
||||
|
||||
|
||||
struct ldap_searchobj *
|
||||
LDAP_CALL
|
||||
ldap_next_searchobj( struct ldap_searchobj *solist, struct ldap_searchobj *so )
|
||||
{
|
||||
return( so == NULLSEARCHOBJ ? so : so->so_next );
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
read_next_searchobj( char **bufp, long *blenp, struct ldap_searchobj **sop,
|
||||
int soversion )
|
||||
{
|
||||
int i, j, tokcnt;
|
||||
char **toks;
|
||||
struct ldap_searchobj *so;
|
||||
struct ldap_searchattr **sa;
|
||||
struct ldap_searchmatch **sm;
|
||||
|
||||
*sop = NULL;
|
||||
|
||||
/*
|
||||
* Object type prompt comes first
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) != 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
return( tokcnt == 0 ? 0 : LDAP_SEARCHPREF_ERR_SYNTAX );
|
||||
}
|
||||
|
||||
if (( so = (struct ldap_searchobj *)NSLDAPI_CALLOC( 1,
|
||||
sizeof( struct ldap_searchobj ))) == NULL ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
return( LDAP_SEARCHPREF_ERR_MEM );
|
||||
}
|
||||
so->so_objtypeprompt = toks[ 0 ];
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
/*
|
||||
* if this is post-version zero, options come next
|
||||
*/
|
||||
if ( soversion > LDAP_SEARCHPREF_VERSION_ZERO ) {
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) < 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
ldap_free_searchprefs( so );
|
||||
return( LDAP_SEARCHPREF_ERR_SYNTAX );
|
||||
}
|
||||
for ( i = 0; toks[ i ] != NULL; ++i ) {
|
||||
for ( j = 0; sobjoptions[ j ] != NULL; ++j ) {
|
||||
if ( strcasecmp( toks[ i ], sobjoptions[ j ] ) == 0 ) {
|
||||
so->so_options |= sobjoptvals[ j ];
|
||||
}
|
||||
}
|
||||
}
|
||||
nsldapi_free_strarray( toks );
|
||||
}
|
||||
|
||||
/*
|
||||
* "Fewer choices" prompt is next
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) != 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
ldap_free_searchprefs( so );
|
||||
return( LDAP_SEARCHPREF_ERR_SYNTAX );
|
||||
}
|
||||
so->so_prompt = toks[ 0 ];
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
/*
|
||||
* Filter prefix for "More Choices" searching is next
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) != 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
ldap_free_searchprefs( so );
|
||||
return( LDAP_SEARCHPREF_ERR_SYNTAX );
|
||||
}
|
||||
so->so_filterprefix = toks[ 0 ];
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
/*
|
||||
* "Fewer Choices" filter tag comes next
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) != 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
ldap_free_searchprefs( so );
|
||||
return( LDAP_SEARCHPREF_ERR_SYNTAX );
|
||||
}
|
||||
so->so_filtertag = toks[ 0 ];
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
/*
|
||||
* Selection (disambiguation) attribute comes next
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) != 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
ldap_free_searchprefs( so );
|
||||
return( LDAP_SEARCHPREF_ERR_SYNTAX );
|
||||
}
|
||||
so->so_defaultselectattr = toks[ 0 ];
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
/*
|
||||
* Label for selection (disambiguation) attribute
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) != 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
ldap_free_searchprefs( so );
|
||||
return( LDAP_SEARCHPREF_ERR_SYNTAX );
|
||||
}
|
||||
so->so_defaultselecttext = toks[ 0 ];
|
||||
NSLDAPI_FREE( (char *)toks );
|
||||
|
||||
/*
|
||||
* Search scope is next
|
||||
*/
|
||||
if (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) != 1 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
ldap_free_searchprefs( so );
|
||||
return( LDAP_SEARCHPREF_ERR_SYNTAX );
|
||||
}
|
||||
if ( !strcasecmp(toks[ 0 ], "subtree" )) {
|
||||
so->so_defaultscope = LDAP_SCOPE_SUBTREE;
|
||||
} else if ( !strcasecmp(toks[ 0 ], "onelevel" )) {
|
||||
so->so_defaultscope = LDAP_SCOPE_ONELEVEL;
|
||||
} else if ( !strcasecmp(toks[ 0 ], "base" )) {
|
||||
so->so_defaultscope = LDAP_SCOPE_BASE;
|
||||
} else {
|
||||
ldap_free_searchprefs( so );
|
||||
return( LDAP_SEARCHPREF_ERR_SYNTAX );
|
||||
}
|
||||
nsldapi_free_strarray( toks );
|
||||
|
||||
|
||||
/*
|
||||
* "More Choices" search option list comes next
|
||||
*/
|
||||
sa = &( so->so_salist );
|
||||
while (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) > 0 ) {
|
||||
if ( tokcnt < 5 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
ldap_free_searchprefs( so );
|
||||
return( LDAP_SEARCHPREF_ERR_SYNTAX );
|
||||
}
|
||||
if (( *sa = ( struct ldap_searchattr * )NSLDAPI_CALLOC( 1,
|
||||
sizeof( struct ldap_searchattr ))) == NULL ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
ldap_free_searchprefs( so );
|
||||
return( LDAP_SEARCHPREF_ERR_MEM );
|
||||
}
|
||||
( *sa )->sa_attrlabel = toks[ 0 ];
|
||||
( *sa )->sa_attr = toks[ 1 ];
|
||||
( *sa )->sa_selectattr = toks[ 3 ];
|
||||
( *sa )->sa_selecttext = toks[ 4 ];
|
||||
/* Deal with bitmap */
|
||||
( *sa )->sa_matchtypebitmap = 0;
|
||||
for ( i = strlen( toks[ 2 ] ) - 1, j = 0; i >= 0; i--, j++ ) {
|
||||
if ( toks[ 2 ][ i ] == '1' ) {
|
||||
( *sa )->sa_matchtypebitmap |= (1 << j);
|
||||
}
|
||||
}
|
||||
NSLDAPI_FREE( toks[ 2 ] );
|
||||
NSLDAPI_FREE( ( char * ) toks );
|
||||
sa = &(( *sa )->sa_next);
|
||||
}
|
||||
*sa = NULL;
|
||||
|
||||
/*
|
||||
* Match types are last
|
||||
*/
|
||||
sm = &( so->so_smlist );
|
||||
while (( tokcnt = nsldapi_next_line_tokens( bufp, blenp, &toks )) > 0 ) {
|
||||
if ( tokcnt < 2 ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
ldap_free_searchprefs( so );
|
||||
return( LDAP_SEARCHPREF_ERR_SYNTAX );
|
||||
}
|
||||
if (( *sm = ( struct ldap_searchmatch * )NSLDAPI_CALLOC( 1,
|
||||
sizeof( struct ldap_searchmatch ))) == NULL ) {
|
||||
nsldapi_free_strarray( toks );
|
||||
ldap_free_searchprefs( so );
|
||||
return( LDAP_SEARCHPREF_ERR_MEM );
|
||||
}
|
||||
( *sm )->sm_matchprompt = toks[ 0 ];
|
||||
( *sm )->sm_filter = toks[ 1 ];
|
||||
NSLDAPI_FREE( ( char * ) toks );
|
||||
sm = &(( *sm )->sm_next );
|
||||
}
|
||||
*sm = NULL;
|
||||
|
||||
*sop = so;
|
||||
return( 0 );
|
||||
}
|
||||
1787
mozilla/directory/c-sdk/ldap/libraries/libldap/test.c
Normal file
1787
mozilla/directory/c-sdk/ldap/libraries/libldap/test.c
Normal file
File diff suppressed because it is too large
Load Diff
1145
mozilla/directory/c-sdk/ldap/libraries/libldap/tmplout.c
Normal file
1145
mozilla/directory/c-sdk/ldap/libraries/libldap/tmplout.c
Normal file
File diff suppressed because it is too large
Load Diff
303
mozilla/directory/c-sdk/ldap/libraries/libldap/tmpltest.c
Normal file
303
mozilla/directory/c-sdk/ldap/libraries/libldap/tmpltest.c
Normal file
@@ -0,0 +1,303 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/* tmpltest.c - implements a test/config templates. */
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
#include "disptmpl.h"
|
||||
#include "srchpref.h"
|
||||
|
||||
#ifdef MACOS
|
||||
#include <stdlib.h>
|
||||
#include <console.h>
|
||||
#endif /* MACOS */
|
||||
|
||||
#ifdef NEEDPROTOS
|
||||
void dump_tmpl( struct ldap_disptmpl *tmpl );
|
||||
void dump_srchpref( struct ldap_searchobj *sp );
|
||||
#else /* NEEDPROTOS */
|
||||
void dump_tmpl();
|
||||
void dump_srchpref();
|
||||
#endif /* NEEDPROTOS */
|
||||
|
||||
|
||||
#define NULLSTRINGIFNULL( s ) ( s == NULL ? "(null)" : s )
|
||||
|
||||
|
||||
int
|
||||
main( int argc, char **argv )
|
||||
{
|
||||
struct ldap_disptmpl *templates, *dtp;
|
||||
struct ldap_searchobj *so, *sop;
|
||||
int err;
|
||||
|
||||
#ifdef MACOS
|
||||
ccommand( &argv );
|
||||
for ( argc = 0; argv[ argc ] != NULL; ++argc ) {
|
||||
;
|
||||
}
|
||||
cshow( stdout );
|
||||
#endif /* MACOS */
|
||||
|
||||
if (( err = ldap_init_templates( "ldaptemplates.conf", &templates ))
|
||||
!= 0 ) {
|
||||
fprintf( stderr, "ldap_init_templates failed (%d)\n", err );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
if (( err = ldap_init_searchprefs( "ldapsearchprefs.conf", &so ))
|
||||
!= 0 ) {
|
||||
fprintf( stderr, "ldap_init_searchprefs failed (%d)\n", err );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
if ( argc == 1 ) {
|
||||
printf( "*** Display Templates:\n" );
|
||||
for ( dtp = ldap_first_disptmpl( templates ); dtp != NULLDISPTMPL;
|
||||
dtp = ldap_next_disptmpl( templates, dtp )) {
|
||||
dump_tmpl( dtp );
|
||||
printf( "\n\n" );
|
||||
}
|
||||
|
||||
printf( "\n\n*** Search Objects:\n" );
|
||||
for ( sop = ldap_first_searchobj( so ); sop != NULLSEARCHOBJ;
|
||||
sop = ldap_next_searchobj( so, sop )) {
|
||||
dump_srchpref( sop );
|
||||
printf( "\n\n" );
|
||||
}
|
||||
|
||||
} else {
|
||||
if (( dtp = ldap_oc2template( ++argv, templates )) == NULL ) {
|
||||
fprintf( stderr, "no matching template found\n" );
|
||||
} else {
|
||||
dump_tmpl( dtp );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ldap_free_templates( templates );
|
||||
ldap_free_searchprefs( so );
|
||||
|
||||
exit( 0 );
|
||||
}
|
||||
|
||||
|
||||
static char *syn_name[] = {
|
||||
"?", "CIS", "MLS", "DN", "BOOL", "JPEG", "JPEGBTN", "FAX", "FAXBTN",
|
||||
"AUDIOBTN", "TIME", "DATE", "URL", "SEARCHACT", "LINKACT", "ADDDNACT",
|
||||
"VERIFYACT",
|
||||
};
|
||||
|
||||
static char *syn_type[] = {
|
||||
"?", "txt", "img", "?", "bool", "?", "?", "?", "btn",
|
||||
"?", "?", "?", "?", "?", "?", "?",
|
||||
"action", "?"
|
||||
};
|
||||
|
||||
static char *includeattrs[] = { "objectClass", "sn", NULL };
|
||||
|
||||
static char *item_opts[] = {
|
||||
"ro", "sort", "1val", "hide", "required", "hideiffalse", NULL
|
||||
};
|
||||
|
||||
static unsigned long item_opt_vals[] = {
|
||||
LDAP_DITEM_OPT_READONLY, LDAP_DITEM_OPT_SORTVALUES,
|
||||
LDAP_DITEM_OPT_SINGLEVALUED, LDAP_DITEM_OPT_HIDEIFEMPTY,
|
||||
LDAP_DITEM_OPT_VALUEREQUIRED, LDAP_DITEM_OPT_HIDEIFFALSE,
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
dump_tmpl( struct ldap_disptmpl *tmpl )
|
||||
{
|
||||
struct ldap_tmplitem *rowp, *colp;
|
||||
int i, rowcnt, colcnt;
|
||||
char **fetchattrs;
|
||||
struct ldap_oclist *ocp;
|
||||
struct ldap_adddeflist *adp;
|
||||
|
||||
printf( "** Template \"%s\" (plural \"%s\", icon \"%s\")\n",
|
||||
NULLSTRINGIFNULL( tmpl->dt_name ),
|
||||
NULLSTRINGIFNULL( tmpl->dt_pluralname ),
|
||||
NULLSTRINGIFNULL( tmpl->dt_iconname ));
|
||||
|
||||
printf( "object class list:\n" );
|
||||
for ( ocp = tmpl->dt_oclist; ocp != NULL; ocp = ocp->oc_next ) {
|
||||
for ( i = 0; ocp->oc_objclasses[ i ] != NULL; ++i ) {
|
||||
printf( "%s%s", i == 0 ? " " : " & ",
|
||||
NULLSTRINGIFNULL( ocp->oc_objclasses[ i ] ));
|
||||
}
|
||||
putchar( '\n' );
|
||||
}
|
||||
putchar( '\n' );
|
||||
|
||||
printf( "template options: " );
|
||||
if ( tmpl->dt_options == 0L ) {
|
||||
printf( "NONE\n" );
|
||||
} else {
|
||||
printf( "%s %s %s\n", LDAP_IS_DISPTMPL_OPTION_SET( tmpl,
|
||||
LDAP_DTMPL_OPT_ADDABLE ) ? "addable" : "",
|
||||
LDAP_IS_DISPTMPL_OPTION_SET( tmpl, LDAP_DTMPL_OPT_ALLOWMODRDN )
|
||||
? "modrdn" : "",
|
||||
LDAP_IS_DISPTMPL_OPTION_SET( tmpl, LDAP_DTMPL_OPT_ALTVIEW )
|
||||
? "altview" : "" );
|
||||
}
|
||||
|
||||
printf( "authenticate as attribute: %s\n", tmpl->dt_authattrname != NULL ?
|
||||
tmpl->dt_authattrname : "<default>" );
|
||||
|
||||
printf( "default RDN attribute: %s\n", tmpl->dt_defrdnattrname != NULL ?
|
||||
tmpl->dt_defrdnattrname : "NONE" );
|
||||
|
||||
printf( "default add location: %s\n", tmpl->dt_defaddlocation != NULL ?
|
||||
tmpl->dt_defaddlocation : "NONE" );
|
||||
|
||||
printf( "\nnew entry value default rules:\n" );
|
||||
for ( adp = tmpl->dt_adddeflist; adp != NULL; adp = adp->ad_next ) {
|
||||
if ( adp->ad_source == LDAP_ADSRC_CONSTANTVALUE ) {
|
||||
printf( " attribute %s <-- constant value \"%s\"\n",
|
||||
NULLSTRINGIFNULL( adp->ad_attrname),
|
||||
NULLSTRINGIFNULL( adp->ad_value ));
|
||||
} else {
|
||||
printf( " attribute %s <-- adder's DN\n",
|
||||
NULLSTRINGIFNULL( adp->ad_attrname ));
|
||||
}
|
||||
}
|
||||
putchar( '\n' );
|
||||
|
||||
printf( "\nfetch attributes & values:\n" );
|
||||
if (( fetchattrs = ldap_tmplattrs( tmpl, includeattrs, 1,
|
||||
LDAP_SYN_OPT_DEFER )) == NULL ) {
|
||||
printf( " <none>\n" );
|
||||
} else {
|
||||
for ( i = 0; fetchattrs[ i ] != NULL; ++i ) {
|
||||
printf( " %s\n", fetchattrs[ i ] );
|
||||
free( fetchattrs[ i ] );
|
||||
}
|
||||
free( (char *)fetchattrs );
|
||||
}
|
||||
|
||||
printf( "\nfetch attributes only:\n" );
|
||||
if (( fetchattrs = ldap_tmplattrs( tmpl, NULL, 0,
|
||||
LDAP_SYN_OPT_DEFER )) == NULL ) {
|
||||
printf( " <none>\n" );
|
||||
} else {
|
||||
for ( i = 0; fetchattrs[ i ] != NULL; ++i ) {
|
||||
printf( " %s\n", fetchattrs[ i ] );
|
||||
free( fetchattrs[ i ] );
|
||||
}
|
||||
free( (char *)fetchattrs );
|
||||
}
|
||||
|
||||
printf( "\ntemplate items:\n" );
|
||||
rowcnt = 0;
|
||||
for ( rowp = ldap_first_tmplrow( tmpl ); rowp != NULLTMPLITEM;
|
||||
rowp = ldap_next_tmplrow( tmpl, rowp )) {
|
||||
++rowcnt;
|
||||
colcnt = 0;
|
||||
for ( colp = ldap_first_tmplcol( tmpl, rowp ); colp != NULLTMPLITEM;
|
||||
colp = ldap_next_tmplcol( tmpl, rowp, colp )) {
|
||||
++colcnt;
|
||||
printf( " %2d-%d: %s (%s%s", rowcnt, colcnt,
|
||||
syn_name[ colp->ti_syntaxid & 0x0000FFFF ],
|
||||
syn_type[ LDAP_GET_SYN_TYPE( colp->ti_syntaxid ) >> 24 ],
|
||||
(( LDAP_GET_SYN_OPTIONS( colp->ti_syntaxid ) &
|
||||
LDAP_SYN_OPT_DEFER ) != 0 ) ? ",defer" : "" );
|
||||
|
||||
for ( i = 0; item_opts[ i ] != NULL; ++i ) {
|
||||
if ( LDAP_IS_TMPLITEM_OPTION_SET( colp, item_opt_vals[ i ] )) {
|
||||
printf( ",%s", NULLSTRINGIFNULL( item_opts[ i ] ));
|
||||
}
|
||||
}
|
||||
|
||||
printf( "), %s, %s", NULLSTRINGIFNULL( colp->ti_attrname ),
|
||||
NULLSTRINGIFNULL( colp->ti_label ));
|
||||
if ( colp->ti_args != NULL ) {
|
||||
printf( ",args=" );
|
||||
for ( i = 0; colp->ti_args[ i ] != NULL; ++i ) {
|
||||
printf( "<%s>", NULLSTRINGIFNULL( colp->ti_args[ i ] ));
|
||||
}
|
||||
}
|
||||
|
||||
putchar( '\n' );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
dump_srchpref( struct ldap_searchobj *so )
|
||||
{
|
||||
int i;
|
||||
struct ldap_searchattr *sa;
|
||||
struct ldap_searchmatch *sm;
|
||||
|
||||
printf( "Object type prompt: %s\n",
|
||||
NULLSTRINGIFNULL( so->so_objtypeprompt ));
|
||||
printf( "Options: %s\n",
|
||||
LDAP_IS_SEARCHOBJ_OPTION_SET( so, LDAP_SEARCHOBJ_OPT_INTERNAL ) ?
|
||||
"internal" : "NONE" );
|
||||
printf( "Prompt: %s\n", NULLSTRINGIFNULL( so->so_prompt ));
|
||||
printf( "Scope: " );
|
||||
switch ( so->so_defaultscope ) {
|
||||
case LDAP_SCOPE_BASE:
|
||||
printf( "LDAP_SCOPE_BASE" );
|
||||
break;
|
||||
case LDAP_SCOPE_ONELEVEL:
|
||||
printf( "LDAP_SCOPE_ONELEVEL" );
|
||||
break;
|
||||
case LDAP_SCOPE_SUBTREE:
|
||||
printf( "LDAP_SCOPE_SUBTREE" );
|
||||
break;
|
||||
default:
|
||||
printf("*** unknown!" );
|
||||
}
|
||||
puts( "\n" );
|
||||
printf( "Filter prefix: %s\n",
|
||||
NULLSTRINGIFNULL( so->so_filterprefix ));
|
||||
printf( "Filter tag: %s\n",
|
||||
NULLSTRINGIFNULL( so->so_filtertag ));
|
||||
printf( "Default select attr: %s\n",
|
||||
NULLSTRINGIFNULL( so->so_defaultselectattr ));
|
||||
printf( "Default select text: %s\n",
|
||||
NULLSTRINGIFNULL( so->so_defaultselecttext ));
|
||||
printf( "Searchable attributes ---- \n" );
|
||||
for ( sa = so->so_salist; sa != NULL; sa = sa->sa_next ) {
|
||||
printf( " Label: %s\n", NULLSTRINGIFNULL( sa->sa_attrlabel ));
|
||||
printf( " Attribute: %s\n", NULLSTRINGIFNULL( sa->sa_attr ));
|
||||
printf( " Select attr: %s\n", NULLSTRINGIFNULL( sa->sa_selectattr ));
|
||||
printf( " Select text: %s\n", NULLSTRINGIFNULL( sa->sa_selecttext ));
|
||||
printf( " Match types ---- \n" );
|
||||
for ( i = 0, sm = so->so_smlist; sm != NULL; i++, sm = sm->sm_next ) {
|
||||
if (( sa->sa_matchtypebitmap >> i ) & 1 ) {
|
||||
printf( " %s (%s)\n",
|
||||
NULLSTRINGIFNULL( sm->sm_matchprompt ),
|
||||
NULLSTRINGIFNULL( sm->sm_filter ));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
534
mozilla/directory/c-sdk/ldap/libraries/libldap/ufn.c
Normal file
534
mozilla/directory/c-sdk/ldap/libraries/libldap/ufn.c
Normal file
@@ -0,0 +1,534 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* ufn.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1993 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
typedef int (LDAP_CALL *cancelptype)( void *cancelparm );
|
||||
|
||||
static int ldap_ufn_search_ctx( LDAP *ld, char **ufncomp, int ncomp,
|
||||
char *prefix, char **attrs, int attrsonly,
|
||||
LDAPMessage **res, LDAP_CANCELPROC_CALLBACK *cancelproc, void *cancelparm,
|
||||
char *tag1, char *tag2, char *tag3 );
|
||||
static LDAPMessage *ldap_msg_merge( LDAP *ld, LDAPMessage *a, LDAPMessage *b );
|
||||
static LDAPMessage *ldap_ufn_expand( LDAP *ld,
|
||||
LDAP_CANCELPROC_CALLBACK *cancelproc, void *cancelparm, char **dns,
|
||||
char *filter, int scope, char **attrs, int aonly, int *err );
|
||||
|
||||
/*
|
||||
* ldap_ufn_search_ctx - do user friendly searching; provide cancel feature;
|
||||
* specify ldapfilter.conf tags for each phase of search
|
||||
*
|
||||
* ld LDAP descriptor
|
||||
* ufncomp the exploded user friendly name to look for
|
||||
* ncomp number of elements in ufncomp
|
||||
* prefix where to start searching
|
||||
* attrs list of attribute types to return for matches
|
||||
* attrsonly 1 => attributes only 0 => attributes and values
|
||||
* res will contain the result of the search
|
||||
* cancelproc routine that returns non-zero if operation should be
|
||||
* cancelled. This can be NULL. If it is non-NULL, the
|
||||
* routine will be called periodically.
|
||||
* cancelparm void * that is passed to cancelproc
|
||||
* tag[123] the ldapfilter.conf tag that will be used in phases
|
||||
* 1, 2, and 3 of the search, respectively
|
||||
*
|
||||
* Example:
|
||||
* char *attrs[] = { "mail", "title", 0 };
|
||||
* char *ufncomp[] = { "howes", "umich", "us", 0 }
|
||||
* LDAPMessage *res;
|
||||
* error = ldap_ufn_search_ctx( ld, ufncomp, 3, NULL, attrs, attrsonly,
|
||||
* &res, acancelproc, along, "ufn first",
|
||||
* "ufn intermediate", "ufn last" );
|
||||
*/
|
||||
|
||||
static int
|
||||
ldap_ufn_search_ctx(
|
||||
LDAP *ld,
|
||||
char **ufncomp,
|
||||
int ncomp,
|
||||
char *prefix,
|
||||
char **attrs,
|
||||
int attrsonly,
|
||||
LDAPMessage **res,
|
||||
LDAP_CANCELPROC_CALLBACK *cancelproc,
|
||||
void *cancelparm,
|
||||
char *tag1,
|
||||
char *tag2,
|
||||
char *tag3
|
||||
)
|
||||
{
|
||||
char *dn, *ftag = NULL;
|
||||
char **dns = NULL;
|
||||
int max, i, err, scope = 0, phase, tries;
|
||||
LDAPFiltInfo *fi;
|
||||
LDAPMessage *tmpcand;
|
||||
LDAPMessage *candidates;
|
||||
static char *objattrs[] = { "objectClass", NULL };
|
||||
|
||||
/*
|
||||
* look up ufn components from most to least significant.
|
||||
* there are 3 phases.
|
||||
* phase 1 search the root for orgs or countries
|
||||
* phase 2 search for orgs
|
||||
* phase 3 search for a person
|
||||
* in phases 1 and 2, we are building a list of candidate DNs,
|
||||
* below which we will search for the final component of the ufn.
|
||||
* for each component we try the filters listed in the
|
||||
* filterconfig file, first one-level (except the last compoment),
|
||||
* then subtree. if any of them produce any results, we go on to
|
||||
* the next component.
|
||||
*/
|
||||
|
||||
*res = NULL;
|
||||
candidates = NULL;
|
||||
phase = 1;
|
||||
for ( ncomp--; ncomp != -1; ncomp-- ) {
|
||||
if ( *ufncomp[ncomp] == '"' ) {
|
||||
char *quote;
|
||||
|
||||
if ( (quote = strrchr( ufncomp[ncomp], '"' )) != NULL )
|
||||
*quote = '\0';
|
||||
strcpy( ufncomp[ncomp], ufncomp[ncomp] + 1 );
|
||||
}
|
||||
if ( ncomp == 0 )
|
||||
phase = 3;
|
||||
|
||||
switch ( phase ) {
|
||||
case 1:
|
||||
ftag = tag1;
|
||||
scope = LDAP_SCOPE_ONELEVEL;
|
||||
break;
|
||||
case 2:
|
||||
ftag = tag2;
|
||||
scope = LDAP_SCOPE_ONELEVEL;
|
||||
break;
|
||||
case 3:
|
||||
ftag = tag3;
|
||||
scope = LDAP_SCOPE_SUBTREE;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* construct an array of DN's to search below from the
|
||||
* list of candidates.
|
||||
*/
|
||||
|
||||
if ( candidates == NULL ) {
|
||||
if ( prefix != NULL ) {
|
||||
if ( (dns = (char **)NSLDAPI_MALLOC(
|
||||
sizeof(char *) * 2 )) == NULL ) {
|
||||
err = LDAP_NO_MEMORY;
|
||||
LDAP_SET_LDERRNO( ld, err, NULL, NULL );
|
||||
return( err );
|
||||
}
|
||||
dns[0] = nsldapi_strdup( prefix );
|
||||
dns[1] = NULL;
|
||||
} else {
|
||||
dns = NULL;
|
||||
}
|
||||
} else {
|
||||
i = 0, max = 0;
|
||||
for ( tmpcand = candidates; tmpcand != NULL &&
|
||||
tmpcand->lm_msgtype != LDAP_RES_SEARCH_RESULT;
|
||||
tmpcand = tmpcand->lm_chain )
|
||||
{
|
||||
if ( (dn = ldap_get_dn( ld, tmpcand )) == NULL )
|
||||
continue;
|
||||
|
||||
if ( dns == NULL ) {
|
||||
if ( (dns = (char **)NSLDAPI_MALLOC(
|
||||
sizeof(char *) * 8 )) == NULL ) {
|
||||
err = LDAP_NO_MEMORY;
|
||||
LDAP_SET_LDERRNO( ld, err,
|
||||
NULL, NULL );
|
||||
return( err );
|
||||
}
|
||||
max = 8;
|
||||
} else if ( i >= max ) {
|
||||
if ( (dns = (char **)NSLDAPI_REALLOC(
|
||||
dns, sizeof(char *) * 2 * max ))
|
||||
== NULL ) {
|
||||
err = LDAP_NO_MEMORY;
|
||||
LDAP_SET_LDERRNO( ld, err,
|
||||
NULL, NULL );
|
||||
return( err );
|
||||
}
|
||||
max *= 2;
|
||||
}
|
||||
dns[i++] = dn;
|
||||
dns[i] = NULL;
|
||||
}
|
||||
ldap_msgfree( candidates );
|
||||
candidates = NULL;
|
||||
}
|
||||
tries = 0;
|
||||
tryagain:
|
||||
tries++;
|
||||
for ( fi = ldap_getfirstfilter( ld->ld_filtd, ftag,
|
||||
ufncomp[ncomp] ); fi != NULL;
|
||||
fi = ldap_getnextfilter( ld->ld_filtd ) )
|
||||
{
|
||||
if ( (candidates = ldap_ufn_expand( ld, cancelproc,
|
||||
cancelparm, dns, fi->lfi_filter, scope,
|
||||
phase == 3 ? attrs : objattrs,
|
||||
phase == 3 ? attrsonly : 1, &err )) != NULL )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if ( err == -1 || err == LDAP_USER_CANCELLED ) {
|
||||
if ( dns != NULL ) {
|
||||
ldap_value_free( dns );
|
||||
dns = NULL;
|
||||
}
|
||||
return( err );
|
||||
}
|
||||
}
|
||||
|
||||
if ( candidates == NULL ) {
|
||||
if ( tries < 2 && phase != 3 ) {
|
||||
scope = LDAP_SCOPE_SUBTREE;
|
||||
goto tryagain;
|
||||
} else {
|
||||
if ( dns != NULL ) {
|
||||
ldap_value_free( dns );
|
||||
dns = NULL;
|
||||
}
|
||||
return( err );
|
||||
}
|
||||
}
|
||||
|
||||
/* go on to the next component */
|
||||
if ( phase == 1 )
|
||||
phase++;
|
||||
if ( dns != NULL ) {
|
||||
ldap_value_free( dns );
|
||||
dns = NULL;
|
||||
}
|
||||
}
|
||||
*res = candidates;
|
||||
|
||||
return( err );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_ufn_search_ct( LDAP *ld, char *ufn, char **attrs, int attrsonly,
|
||||
LDAPMessage **res, LDAP_CANCELPROC_CALLBACK *cancelproc, void *cancelparm,
|
||||
char *tag1, char *tag2, char *tag3 )
|
||||
{
|
||||
char **ufncomp, **prefixcomp;
|
||||
char *pbuf;
|
||||
int ncomp, pcomp, i, err = 0;
|
||||
|
||||
/* getfilter stuff must be inited before we are called */
|
||||
if ( ld->ld_filtd == NULL ) {
|
||||
err = LDAP_PARAM_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, err, NULL, NULL );
|
||||
return( err );
|
||||
}
|
||||
|
||||
/* call ldap_explode_dn() to break the ufn into its components */
|
||||
if ( (ufncomp = ldap_explode_dn( ufn, 0 )) == NULL ) {
|
||||
err = LDAP_LOCAL_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, err, NULL, NULL );
|
||||
return( err );
|
||||
}
|
||||
for ( ncomp = 0; ufncomp[ncomp] != NULL; ncomp++ )
|
||||
; /* NULL */
|
||||
|
||||
/* more than two components => try it fully qualified first */
|
||||
if ( ncomp > 2 || ld->ld_ufnprefix == NULL ) {
|
||||
err = ldap_ufn_search_ctx( ld, ufncomp, ncomp, NULL, attrs,
|
||||
attrsonly, res, cancelproc, cancelparm, tag1, tag2, tag3 );
|
||||
|
||||
if ( ldap_count_entries( ld, *res ) > 0 ) {
|
||||
ldap_value_free( ufncomp );
|
||||
return( err );
|
||||
} else {
|
||||
ldap_msgfree( *res );
|
||||
*res = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ld->ld_ufnprefix == NULL ) {
|
||||
ldap_value_free( ufncomp );
|
||||
return( err );
|
||||
}
|
||||
|
||||
/* if that failed, or < 2 components, use the prefix */
|
||||
if ( (prefixcomp = ldap_explode_dn( ld->ld_ufnprefix, 0 )) == NULL ) {
|
||||
ldap_value_free( ufncomp );
|
||||
err = LDAP_LOCAL_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, err, NULL, NULL );
|
||||
return( err );
|
||||
}
|
||||
for ( pcomp = 0; prefixcomp[pcomp] != NULL; pcomp++ )
|
||||
; /* NULL */
|
||||
if ( (pbuf = (char *)NSLDAPI_MALLOC( strlen( ld->ld_ufnprefix ) + 1 ))
|
||||
== NULL ) {
|
||||
ldap_value_free( ufncomp );
|
||||
ldap_value_free( prefixcomp );
|
||||
err = LDAP_NO_MEMORY;
|
||||
LDAP_SET_LDERRNO( ld, err, NULL, NULL );
|
||||
return( err );
|
||||
}
|
||||
|
||||
for ( i = 0; i < pcomp; i++ ) {
|
||||
int j;
|
||||
|
||||
*pbuf = '\0';
|
||||
for ( j = i; j < pcomp; j++ ) {
|
||||
strcat( pbuf, prefixcomp[j] );
|
||||
if ( j + 1 < pcomp )
|
||||
strcat( pbuf, "," );
|
||||
}
|
||||
err = ldap_ufn_search_ctx( ld, ufncomp, ncomp, pbuf, attrs,
|
||||
attrsonly, res, cancelproc, cancelparm, tag1, tag2, tag3 );
|
||||
|
||||
if ( ldap_count_entries( ld, *res ) > 0 ) {
|
||||
break;
|
||||
} else {
|
||||
ldap_msgfree( *res );
|
||||
*res = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
ldap_value_free( ufncomp );
|
||||
ldap_value_free( prefixcomp );
|
||||
NSLDAPI_FREE( pbuf );
|
||||
|
||||
return( err );
|
||||
}
|
||||
|
||||
/*
|
||||
* same as ldap_ufn_search_ct, except without the ability to specify
|
||||
* ldapfilter.conf tags.
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_ufn_search_c( LDAP *ld, char *ufn, char **attrs, int attrsonly,
|
||||
LDAPMessage **res, LDAP_CANCELPROC_CALLBACK *cancelproc, void *cancelparm )
|
||||
{
|
||||
return( ldap_ufn_search_ct( ld, ufn, attrs, attrsonly, res, cancelproc,
|
||||
cancelparm, "ufn first", "ufn intermediate", "ufn last" ) );
|
||||
}
|
||||
|
||||
/*
|
||||
* same as ldap_ufn_search_c without the cancel function
|
||||
*/
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_ufn_search_s( LDAP *ld, char *ufn, char **attrs, int attrsonly,
|
||||
LDAPMessage **res )
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = ld->ld_timelimit;
|
||||
|
||||
return( ldap_ufn_search_ct( ld, ufn, attrs, attrsonly, res,
|
||||
ld->ld_timelimit ? ldap_ufn_timeout : NULL,
|
||||
ld->ld_timelimit ? (void *) &tv : NULL,
|
||||
"ufn first", "ufn intermediate", "ufn last" ) );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ldap_msg_merge - merge two ldap search result chains. the more
|
||||
* serious of the two error result codes is kept.
|
||||
*/
|
||||
|
||||
static LDAPMessage *
|
||||
ldap_msg_merge( LDAP *ld, LDAPMessage *a, LDAPMessage *b )
|
||||
{
|
||||
LDAPMessage *end, *aprev, *aend, *bprev, *bend;
|
||||
|
||||
if ( a == NULL )
|
||||
return( b );
|
||||
|
||||
if ( b == NULL )
|
||||
return( a );
|
||||
|
||||
/* find the ends of the a and b chains */
|
||||
aprev = NULL;
|
||||
for ( aend = a; aend->lm_chain != NULL; aend = aend->lm_chain )
|
||||
aprev = aend;
|
||||
bprev = NULL;
|
||||
for ( bend = b; bend->lm_chain != NULL; bend = bend->lm_chain )
|
||||
bprev = bend;
|
||||
|
||||
/* keep result a */
|
||||
if ( ldap_result2error( ld, aend, 0 ) != LDAP_SUCCESS ) {
|
||||
/* remove result b */
|
||||
ldap_msgfree( bend );
|
||||
if ( bprev != NULL )
|
||||
bprev->lm_chain = NULL;
|
||||
else
|
||||
b = NULL;
|
||||
end = aend;
|
||||
if ( aprev != NULL )
|
||||
aprev->lm_chain = NULL;
|
||||
else
|
||||
a = NULL;
|
||||
/* keep result b */
|
||||
} else {
|
||||
/* remove result a */
|
||||
ldap_msgfree( aend );
|
||||
if ( aprev != NULL )
|
||||
aprev->lm_chain = NULL;
|
||||
else
|
||||
a = NULL;
|
||||
end = bend;
|
||||
if ( bprev != NULL )
|
||||
bprev->lm_chain = NULL;
|
||||
else
|
||||
b = NULL;
|
||||
}
|
||||
|
||||
if ( (a == NULL && b == NULL) || (a == NULL && bprev == NULL) ||
|
||||
(b == NULL && aprev == NULL) )
|
||||
return( end );
|
||||
|
||||
if ( a == NULL ) {
|
||||
bprev->lm_chain = end;
|
||||
return( b );
|
||||
} else if ( b == NULL ) {
|
||||
aprev->lm_chain = end;
|
||||
return( a );
|
||||
} else {
|
||||
bprev->lm_chain = end;
|
||||
aprev->lm_chain = b;
|
||||
return( a );
|
||||
}
|
||||
}
|
||||
|
||||
static LDAPMessage *
|
||||
ldap_ufn_expand( LDAP *ld, LDAP_CANCELPROC_CALLBACK *cancelproc,
|
||||
void *cancelparm, char **dns, char *filter, int scope,
|
||||
char **attrs, int aonly, int *err )
|
||||
{
|
||||
LDAPMessage *tmpcand, *tmpres;
|
||||
char *dn;
|
||||
int i, msgid;
|
||||
struct timeval tv;
|
||||
|
||||
/* search for this component below the current candidates */
|
||||
tmpcand = NULL;
|
||||
i = 0;
|
||||
do {
|
||||
if ( dns != NULL )
|
||||
dn = dns[i];
|
||||
else
|
||||
dn = "";
|
||||
|
||||
if (( msgid = ldap_search( ld, dn, scope, filter, attrs,
|
||||
aonly )) == -1 ) {
|
||||
ldap_msgfree( tmpcand );
|
||||
*err = LDAP_GET_LDERRNO( ld, NULL, NULL );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 100000; /* 1/10 of a second */
|
||||
|
||||
do {
|
||||
*err = ldap_result( ld, msgid, 1, &tv, &tmpres );
|
||||
if ( *err == 0 && cancelproc != NULL &&
|
||||
(*cancelproc)( cancelparm ) != 0 ) {
|
||||
ldap_abandon( ld, msgid );
|
||||
*err = LDAP_USER_CANCELLED;
|
||||
LDAP_SET_LDERRNO( ld, *err, NULL, NULL );
|
||||
}
|
||||
} while ( *err == 0 );
|
||||
|
||||
if ( *err == LDAP_USER_CANCELLED || *err < 0 ||
|
||||
( *err = ldap_result2error( ld, tmpres, 0 )) == -1 ) {
|
||||
ldap_msgfree( tmpcand );
|
||||
return( NULL );
|
||||
}
|
||||
|
||||
tmpcand = ldap_msg_merge( ld, tmpcand, tmpres );
|
||||
|
||||
i++;
|
||||
} while ( dns != NULL && dns[i] != NULL );
|
||||
|
||||
if ( ldap_count_entries( ld, tmpcand ) > 0 ) {
|
||||
return( tmpcand );
|
||||
} else {
|
||||
ldap_msgfree( tmpcand );
|
||||
return( NULL );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* ldap_ufn_setfilter - set the filter config file used in ufn searching
|
||||
*/
|
||||
|
||||
LDAPFiltDesc *
|
||||
LDAP_CALL
|
||||
ldap_ufn_setfilter( LDAP *ld, char *fname )
|
||||
{
|
||||
if ( ld->ld_filtd != NULL )
|
||||
ldap_getfilter_free( ld->ld_filtd );
|
||||
|
||||
return( ld->ld_filtd = ldap_init_getfilter( fname ) );
|
||||
}
|
||||
|
||||
void
|
||||
LDAP_CALL
|
||||
ldap_ufn_setprefix( LDAP *ld, char *prefix )
|
||||
{
|
||||
if ( ld->ld_ufnprefix != NULL )
|
||||
NSLDAPI_FREE( ld->ld_ufnprefix );
|
||||
|
||||
ld->ld_ufnprefix = nsldapi_strdup( prefix );
|
||||
}
|
||||
|
||||
int
|
||||
LDAP_C
|
||||
ldap_ufn_timeout( void *tvparam )
|
||||
{
|
||||
struct timeval *tv;
|
||||
|
||||
tv = (struct timeval *)tvparam;
|
||||
|
||||
if ( tv->tv_sec != 0 ) {
|
||||
tv->tv_usec = tv->tv_sec * 1000000; /* sec => micro sec */
|
||||
tv->tv_sec = 0;
|
||||
}
|
||||
tv->tv_usec -= 100000; /* 1/10 of a second */
|
||||
|
||||
return( tv->tv_usec <= 0 ? 1 : 0 );
|
||||
}
|
||||
209
mozilla/directory/c-sdk/ldap/libraries/libldap/unbind.c
Normal file
209
mozilla/directory/c-sdk/ldap/libraries/libldap/unbind.c
Normal file
@@ -0,0 +1,209 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* The contents of this file are subject to the Netscape Public
|
||||
* License Version 1.1 (the "License"); you may not use this file
|
||||
* except in compliance with the License. You may obtain a copy of
|
||||
* the License at http://www.mozilla.org/NPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS
|
||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
||||
* implied. See the License for the specific language governing
|
||||
* rights and limitations under the License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is Netscape
|
||||
* Communications Corporation. Portions created by Netscape are
|
||||
* Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
* Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of Michigan.
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* unbind.c
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#ifndef lint
|
||||
static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "ldap-int.h"
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_unbind( LDAP *ld )
|
||||
{
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "ldap_unbind\n", 0, 0, 0 );
|
||||
|
||||
return( ldap_ld_free( ld, NULL, NULL, 1 ) );
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_unbind_s( LDAP *ld )
|
||||
{
|
||||
return( ldap_ld_free( ld, NULL, NULL, 1 ));
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
LDAP_CALL
|
||||
ldap_unbind_ext( LDAP *ld, LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls )
|
||||
{
|
||||
return( ldap_ld_free( ld, serverctrls, clientctrls, 1 ));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Dispose of the LDAP session ld, including all associated connections
|
||||
* and resources. If close is non-zero, an unbind() request is sent as well.
|
||||
*/
|
||||
int
|
||||
ldap_ld_free( LDAP *ld, LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls, int close )
|
||||
{
|
||||
int i;
|
||||
LDAPMessage *lm, *next;
|
||||
int err = LDAP_SUCCESS;
|
||||
LDAPRequest *lr, *nextlr;
|
||||
|
||||
if ( !NSLDAPI_VALID_LDAP_POINTER( ld )) {
|
||||
return( LDAP_PARAM_ERROR );
|
||||
}
|
||||
|
||||
if ( ld->ld_sbp->sb_naddr == 0 ) {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_REQ_LOCK );
|
||||
/* free LDAP structure and outstanding requests/responses */
|
||||
for ( lr = ld->ld_requests; lr != NULL; lr = nextlr ) {
|
||||
nextlr = lr->lr_next;
|
||||
nsldapi_free_request( ld, lr, 0 );
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_REQ_LOCK );
|
||||
|
||||
/* free and unbind from all open connections */
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CONN_LOCK );
|
||||
while ( ld->ld_conns != NULL ) {
|
||||
nsldapi_free_connection( ld, ld->ld_conns, serverctrls,
|
||||
clientctrls, 1, close );
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CONN_LOCK );
|
||||
|
||||
} else {
|
||||
int i;
|
||||
|
||||
for ( i = 0; i < ld->ld_sbp->sb_naddr; ++i ) {
|
||||
NSLDAPI_FREE( ld->ld_sbp->sb_addrs[ i ] );
|
||||
}
|
||||
NSLDAPI_FREE( ld->ld_sbp->sb_addrs );
|
||||
NSLDAPI_FREE( ld->ld_sbp->sb_fromaddr );
|
||||
}
|
||||
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_RESP_LOCK );
|
||||
for ( lm = ld->ld_responses; lm != NULL; lm = next ) {
|
||||
next = lm->lm_next;
|
||||
ldap_msgfree( lm );
|
||||
}
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_RESP_LOCK );
|
||||
|
||||
/* call cache unbind function to allow it to clean up after itself */
|
||||
if ( ld->ld_cache_unbind != NULL ) {
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_CACHE_LOCK );
|
||||
(void)ld->ld_cache_unbind( ld, 0, 0 );
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_CACHE_LOCK );
|
||||
}
|
||||
|
||||
if ( ld->ld_error != NULL )
|
||||
NSLDAPI_FREE( ld->ld_error );
|
||||
if ( ld->ld_matched != NULL )
|
||||
NSLDAPI_FREE( ld->ld_matched );
|
||||
if ( ld->ld_host != NULL )
|
||||
NSLDAPI_FREE( ld->ld_host );
|
||||
if ( ld->ld_ufnprefix != NULL )
|
||||
NSLDAPI_FREE( ld->ld_ufnprefix );
|
||||
if ( ld->ld_filtd != NULL )
|
||||
ldap_getfilter_free( ld->ld_filtd );
|
||||
if ( ld->ld_abandoned != NULL )
|
||||
NSLDAPI_FREE( ld->ld_abandoned );
|
||||
if ( ld->ld_sbp != NULL )
|
||||
ber_sockbuf_free( ld->ld_sbp );
|
||||
if ( ld->ld_selectinfo != NULL )
|
||||
nsldapi_free_select_info( ld->ld_selectinfo );
|
||||
if ( ld->ld_defhost != NULL )
|
||||
NSLDAPI_FREE( ld->ld_defhost );
|
||||
if ( ld->ld_servercontrols != NULL )
|
||||
ldap_controls_free( ld->ld_servercontrols );
|
||||
if ( ld->ld_clientcontrols != NULL )
|
||||
ldap_controls_free( ld->ld_clientcontrols );
|
||||
if ( ld->ld_preferred_language != NULL )
|
||||
NSLDAPI_FREE( ld->ld_preferred_language );
|
||||
|
||||
/*
|
||||
* XXXmcs: should use cache function pointers to hook in memcache
|
||||
*/
|
||||
if ( ld->ld_memcache != NULL ) {
|
||||
ldap_memcache_set( ld, NULL );
|
||||
}
|
||||
|
||||
for( i=0; i<LDAP_MAX_LOCK; i++ )
|
||||
LDAP_MUTEX_FREE( ld, ld->ld_mutex[i] );
|
||||
|
||||
NSLDAPI_FREE( ld->ld_mutex );
|
||||
NSLDAPI_FREE( (char *) ld );
|
||||
|
||||
return( err );
|
||||
}
|
||||
|
||||
|
||||
|
||||
int
|
||||
nsldapi_send_unbind( LDAP *ld, Sockbuf *sb, LDAPControl **serverctrls,
|
||||
LDAPControl **clientctrls )
|
||||
{
|
||||
BerElement *ber;
|
||||
int err, msgid;
|
||||
|
||||
LDAPDebug( LDAP_DEBUG_TRACE, "nsldapi_send_unbind\n", 0, 0, 0 );
|
||||
|
||||
/* create a message to send */
|
||||
if (( err = nsldapi_alloc_ber_with_options( ld, &ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
return( err );
|
||||
}
|
||||
|
||||
/* fill it in */
|
||||
LDAP_MUTEX_LOCK( ld, LDAP_MSGID_LOCK );
|
||||
msgid = ++ld->ld_msgid;
|
||||
LDAP_MUTEX_UNLOCK( ld, LDAP_MSGID_LOCK );
|
||||
|
||||
if ( ber_printf( ber, "{itn", msgid, LDAP_REQ_UNBIND ) == -1 ) {
|
||||
ber_free( ber, 1 );
|
||||
err = LDAP_ENCODING_ERROR;
|
||||
LDAP_SET_LDERRNO( ld, err, NULL, NULL );
|
||||
return( err );
|
||||
}
|
||||
|
||||
if (( err = nsldapi_put_controls( ld, serverctrls, 1, ber ))
|
||||
!= LDAP_SUCCESS ) {
|
||||
ber_free( ber, 1 );
|
||||
return( err );
|
||||
}
|
||||
|
||||
/* send the message */
|
||||
if ( nsldapi_ber_flush( ld, sb, ber, 1, 0 ) != 0 ) {
|
||||
ber_free( ber, 1 );
|
||||
err = LDAP_SERVER_DOWN;
|
||||
LDAP_SET_LDERRNO( ld, err, NULL, NULL );
|
||||
return( err );
|
||||
}
|
||||
|
||||
return( LDAP_SUCCESS );
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user