Compare commits
64 Commits
LDAPCSDK_4
...
MODULAR_NE
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c515100b8e | ||
|
|
fe0f4d855f | ||
|
|
3d4019f9c4 | ||
|
|
9d96048a4b | ||
|
|
ae5d3bac86 | ||
|
|
dd5a8c0dfa | ||
|
|
a5f43d2a13 | ||
|
|
897d60bb73 | ||
|
|
fd1359cac8 | ||
|
|
aa88ba7591 | ||
|
|
0c9f6e6d80 | ||
|
|
f635646933 | ||
|
|
74a41b1364 | ||
|
|
dddf36e52d | ||
|
|
42f1218f94 | ||
|
|
9369584965 | ||
|
|
644d7cd9c7 | ||
|
|
cac7b720c3 | ||
|
|
371d44de72 | ||
|
|
d5840939c7 | ||
|
|
2a50f93567 | ||
|
|
d2a75afae6 | ||
|
|
8f2a603835 | ||
|
|
d9babead55 | ||
|
|
daa26a48be | ||
|
|
be77d90b49 | ||
|
|
e2793376a7 | ||
|
|
6d54e5f6e3 | ||
|
|
b0db9a4acd | ||
|
|
a7a9a03946 | ||
|
|
5340ef2b1b | ||
|
|
1043bb4cc9 | ||
|
|
9cb908ce37 | ||
|
|
93cf7025ed | ||
|
|
42b35681a2 | ||
|
|
bd2471c41c | ||
|
|
3231691800 | ||
|
|
2bdd74e814 | ||
|
|
97b4b7a6d1 | ||
|
|
55369bada1 | ||
|
|
82ed1f72bb | ||
|
|
52d02fe072 | ||
|
|
11e91b2751 | ||
|
|
9c6ac35617 | ||
|
|
50054acba1 | ||
|
|
79a4c9490b | ||
|
|
c181b6d7f9 | ||
|
|
a5e5b98ad8 | ||
|
|
f453d81444 | ||
|
|
05cb725cfb | ||
|
|
46d5611628 | ||
|
|
d9a5e647f5 | ||
|
|
6c07a2ca66 | ||
|
|
3c5574eb6e | ||
|
|
fee6fe5171 | ||
|
|
46e818474a | ||
|
|
ac3fe4623e | ||
|
|
e5430a78e1 | ||
|
|
e8ecd3ec68 | ||
|
|
86e542aa90 | ||
|
|
35f45baaed | ||
|
|
e72757dc16 | ||
|
|
f7ac2222ef | ||
|
|
4099eb2ef3 |
3875
mozilla/cmd/winfe/fegui.cpp
Executable file
3875
mozilla/cmd/winfe/fegui.cpp
Executable file
File diff suppressed because it is too large
Load Diff
2031
mozilla/cmd/winfe/nsapp.cpp
Normal file
2031
mozilla/cmd/winfe/nsapp.cpp
Normal file
File diff suppressed because it is too large
Load Diff
123
mozilla/cmd/winfe/stdafx.h
Normal file
123
mozilla/cmd/winfe/stdafx.h
Normal file
@@ -0,0 +1,123 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||||
*
|
||||
* 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) 1998 Netscape Communications Corporation. All Rights
|
||||
* Reserved.
|
||||
*/
|
||||
|
||||
#ifndef STDAFX_PCH
|
||||
#define STDAFX_PCH
|
||||
|
||||
#define OEMRESOURCE
|
||||
|
||||
#if defined(DEBUG_blythe)
|
||||
// Set up a flag specific to WFE developers in the client
|
||||
#define DEBUG_WFE
|
||||
#endif
|
||||
|
||||
/* Very windows specific includes.
|
||||
*/
|
||||
/* MFC, KFC, RUN DMC, whatever */
|
||||
#include <afxwin.h>
|
||||
#include <afxext.h>
|
||||
#include <afxpriv.h>
|
||||
#include <afxole.h>
|
||||
#include <afxdisp.h>
|
||||
#include <afxodlgs.h>
|
||||
#ifdef _WIN32
|
||||
#include <afxcmn.h>
|
||||
#endif
|
||||
|
||||
/* More XP than anything */
|
||||
#include "xp.h"
|
||||
#include "fe_proto.h"
|
||||
#include "fe_rgn.h"
|
||||
#include "libi18n.h"
|
||||
#include "xlate.h"
|
||||
#include "ntypes.h"
|
||||
#ifdef EDITOR
|
||||
#include "edttypes.h"
|
||||
#endif
|
||||
#include "xpassert.h"
|
||||
#include "lo_ele.h"
|
||||
#include "layers.h"
|
||||
|
||||
/* Standard C includes */
|
||||
#ifndef _WIN32
|
||||
#include <dos.h>
|
||||
#endif
|
||||
#include <malloc.h>
|
||||
#include <direct.h>
|
||||
#include <stdarg.h>
|
||||
#include <time.h>
|
||||
#include <io.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#ifdef DEBUG
|
||||
#include <assert.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/* Very windows specific includes.
|
||||
*/
|
||||
/* WFE needs a layout file */
|
||||
extern "C" {
|
||||
#include "layout.h"
|
||||
}
|
||||
|
||||
/* Some common defines. */
|
||||
#ifndef _AFXDLL
|
||||
#define new DEBUG_NEW
|
||||
#endif
|
||||
|
||||
/* All front end forward declarations needed to compile. */
|
||||
#include "forward.h"
|
||||
|
||||
/* Front end Casting macros. */
|
||||
#include "cast.h"
|
||||
|
||||
/* General purpose utilities. */
|
||||
#include "feutil.h"
|
||||
|
||||
/* afxData/sysInfo */
|
||||
#include "sysinfo.h"
|
||||
|
||||
/* Some defines we like everywhere. */
|
||||
#include "resource.h"
|
||||
#include "defaults.h"
|
||||
|
||||
/* The application include and
|
||||
* Commonly used, rarely changed headers */
|
||||
#include "ncapiurl.h"
|
||||
#include "genedit.h"
|
||||
#include "genframe.h"
|
||||
#include "genview.h"
|
||||
#include "gendoc.h"
|
||||
#include "intlwin.h"
|
||||
#include "mozilla.h"
|
||||
#include "cxwin.h"
|
||||
#include "winproto.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#ifdef assert
|
||||
#undef assert
|
||||
#endif
|
||||
#define assert(x) ASSERT(x)
|
||||
#endif
|
||||
|
||||
#endif /* STDAFX_PCH */
|
||||
@@ -1,80 +0,0 @@
|
||||
#! 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:
|
||||
@@ -1,154 +0,0 @@
|
||||
======================================================================
|
||||
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)
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
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:
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
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:
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
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>
|
||||
@@ -1,28 +0,0 @@
|
||||
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)
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
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))
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
#
|
||||
# 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
|
||||
@@ -1,217 +0,0 @@
|
||||
/*--------------------------------------------------------------------------
|
||||
/ 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);
|
||||
}
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
#
|
||||
# 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
786
mozilla/directory/c-sdk/ldap/configure
vendored
@@ -1,786 +0,0 @@
|
||||
#! /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
|
||||
@@ -1,43 +0,0 @@
|
||||
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
|
||||
@@ -1,4 +0,0 @@
|
||||
disptmpl.h
|
||||
lber.h
|
||||
ldap.h
|
||||
srchpref.h
|
||||
@@ -1,52 +0,0 @@
|
||||
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:
|
||||
@@ -1,46 +0,0 @@
|
||||
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:
|
||||
@@ -1,364 +0,0 @@
|
||||
/* -*- 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 */
|
||||
@@ -1,272 +0,0 @@
|
||||
/* -*- 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 */
|
||||
@@ -1,57 +0,0 @@
|
||||
/* 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 */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,68 +0,0 @@
|
||||
#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 */
|
||||
@@ -1,158 +0,0 @@
|
||||
#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 */
|
||||
@@ -1,57 +0,0 @@
|
||||
/*
|
||||
* 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 */
|
||||
@@ -1,404 +0,0 @@
|
||||
/*
|
||||
* 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 */
|
||||
@@ -1,58 +0,0 @@
|
||||
#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 */
|
||||
@@ -1,135 +0,0 @@
|
||||
/* -*- 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 */
|
||||
@@ -1,32 +0,0 @@
|
||||
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:
|
||||
@@ -1,19 +0,0 @@
|
||||
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
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
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
|
||||
@@ -1,104 +0,0 @@
|
||||
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
|
||||
@@ -1,87 +0,0 @@
|
||||
/* -*- 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
|
||||
}
|
||||
@@ -1,658 +0,0 @@
|
||||
/* -*- 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 */
|
||||
@@ -1,98 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,668 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,172 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,241 +0,0 @@
|
||||
/* -*- 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 */
|
||||
@@ -1,164 +0,0 @@
|
||||
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)
|
||||
|
||||
@@ -1,232 +0,0 @@
|
||||
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)
|
||||
@@ -1,268 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,210 +0,0 @@
|
||||
/* -*- 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 ) );
|
||||
}
|
||||
@@ -1,155 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,130 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,230 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,569 +0,0 @@
|
||||
/* -*- 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 */
|
||||
@@ -1,179 +0,0 @@
|
||||
/* -*- 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 ) );
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
/* -*- 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 */
|
||||
@@ -1,493 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
/* -*- 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 ) );
|
||||
}
|
||||
@@ -1,158 +0,0 @@
|
||||
/* -*- 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 ) );
|
||||
}
|
||||
@@ -1,757 +0,0 @@
|
||||
/* -*- 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" );
|
||||
}
|
||||
@@ -1,163 +0,0 @@
|
||||
/* -*- 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
|
||||
@@ -1,212 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
}
|
||||
@@ -1,446 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,250 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,138 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,136 +0,0 @@
|
||||
/* -*- 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;
|
||||
}
|
||||
@@ -1,135 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,347 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,250 +0,0 @@
|
||||
/* -*- 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 */
|
||||
@@ -1,126 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,535 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,353 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,465 +0,0 @@
|
||||
/* -*- 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 ) );
|
||||
}
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
/* -*- 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
|
||||
@@ -1,759 +0,0 @@
|
||||
/* -*- 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 */
|
||||
@@ -1,105 +0,0 @@
|
||||
# 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"
|
||||
@@ -1,242 +0,0 @@
|
||||
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
|
||||
@@ -1,153 +0,0 @@
|
||||
# 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
|
||||
@@ -1,677 +0,0 @@
|
||||
##########################################################################
|
||||
# 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
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,90 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,211 +0,0 @@
|
||||
/* -*- 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 ) );
|
||||
}
|
||||
@@ -1,694 +0,0 @@
|
||||
/* -*- 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;
|
||||
}
|
||||
@@ -1,606 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,417 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,757 +0,0 @@
|
||||
/* -*- 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 */
|
||||
|
||||
@@ -1,88 +0,0 @@
|
||||
/* -*- 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 );
|
||||
|
||||
}
|
||||
@@ -1,174 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,162 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,900 +0,0 @@
|
||||
/* -*- 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 */
|
||||
@@ -1,250 +0,0 @@
|
||||
/* -*- 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 ) );
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,63 +0,0 @@
|
||||
/* -*- 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;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,276 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
}
|
||||
@@ -1,256 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,997 +0,0 @@
|
||||
/* -*- 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 ) );
|
||||
}
|
||||
@@ -1,314 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,318 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
@@ -1,437 +0,0 @@
|
||||
/* -*- 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);
|
||||
}
|
||||
@@ -1,421 +0,0 @@
|
||||
/* -*- 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 );
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user