Ldaptcl package version 1.2:

- Filter no longer a required controlArray member, defaults to objectclass=*.
- Sets errorCode with LDAP macro string value (better to test than the more
  human readable values).
- Shorten minimum required characters for search scope definitions: now allows
  "base", "one", and "sub".  For the latter two, additional characters are
  ignored.
- Now compiles successfully with -devel branch (though less tested).
- Client cache management code enabled for OpenLDAP versions <= 1.2.4.  (This
  code is relatively untested and feedback is welcome.)
- More installation cleanups to work easily as a dynamically loadable Tcl
  package.
This commit is contained in:
Randy Kunkee 1999-08-03 07:23:03 +00:00
parent f7fe39e5f2
commit 11eafc253c
6 changed files with 130 additions and 34 deletions

11
contrib/ldaptcl/CHANGES Normal file
View file

@ -0,0 +1,11 @@
Package version 1.2:
- Filter no longer a required controlArray member, defaults to objectclass=*.
- Sets errorCode with LDAP macro string value (better to test than the more
human readable values).
- Shorten minimum required characters for search scope definitions: now allows
"base", "one", and "sub". For the latter two, additional characters are
ignored.
- Now compiles successfully with -devel branch.
- Client cache management code enabled for OpenLDAP versions <= 1.2.4. (This
code is relatively untested and feedback is welcome.)

View file

@ -85,6 +85,7 @@ SHLIB_LD = @SHLIB_LD@
LDAP_LIBFLAGS = @ldaplibflags@
LDAP_CFLAGS = @ldapinclude@
LDAP_INCDIR = @ldapincdir@
LDAP_BUILD = @ldapbuild@
LDAP_DIR = @ldapdir@
@ -120,13 +121,11 @@ LIBS= @LIBS@ @TCLX_LIB_SPEC@ @TCL_LIB_SPEC@ @TCL_LIBS@ $(LDAP_LIBFLAGS) -lc
TK_LIBS=@TKX_LIB_SPEC@ @TK_LIB_SPEC@ @TK_LIBS@
TK_VERSION=@TK_VERSION@
LDAPINCDIR=/usr/local/include
CC = @CC@
CC_SWITCHES = ${CFLAGS} @NEO_SHLIB_CFLAGS@ -I. \
-I@prefix@/include ${AC_FLAGS} ${PROTO_FLAGS} \
${SECURITY_FLAGS} ${MEM_DEBUG_FLAGS} ${KEYSYM_FLAGS} \
-DNEO_LIBRARY=\"${NEO_LIBRARY}\"
-DNEO_LIBRARY=\"${NEO_LIBRARY}\" -DVERSION=\"${VERSION}\"
TK_SWITCHES = ${CC_SWITCHES} @TK_XINCLUDES@
@ -140,15 +139,20 @@ all: @NEO_LIB_FILE@ ldaptclsh @LDAPWISH@
@MAKE_LIB@
$(RANLIB) @NEO_LIB_FILE@
neoXldap.o: neoXldap.c
neoXldap.o: neoXldap.c ldaptclerr.h
$(CC) -c $(LDAP_CFLAGS) $(CC_SWITCHES) $<
ldaptclerr.h: ldaperr.tcl
tcl ldaperr.tcl $(LDAP_INCDIR)/ldap.h > ldaptclerr.h
clean:
-rm -f ldaptclsh ldapwish
-rm -f *.o *.a *.so*
distclean: clean
rm -f Makefile pkgIndex.tcl config.cache config.log config.status
rm -f Makefile pkgIndex.tcl config.cache config.log config.status \
ldaptclerr.h
install: install-binaries install-man

View file

@ -539,11 +539,11 @@ else
fi
# $Id: configure.in,v 1.1 1999/02/10 22:56:49 kunkee Exp $
# $Id: configure.in,v 1.2 1999/07/27 05:29:27 kunkee Exp $
NEO_VERSION=1.1
NEO_VERSION=1.2
NEO_MAJOR_VERSION=1
NEO_MINOR_VERSION=1
NEO_MINOR_VERSION=2
VERSION=${NEO_VERSION}
if test "${prefix}" = "NONE"; then
@ -1387,6 +1387,7 @@ ldapbuild=yes
VERSION=${NEO_VERSION}
# Note: in the following variable, it's important to use the absolute
# path name of the Tcl directory rather than "..": this is because
@ -1596,6 +1597,7 @@ s%@ldaplibflags@%$ldaplibflags%g
s%@ldapinclude@%$ldapinclude%g
s%@ldapbuild@%$ldapbuild%g
s%@ldapdir@%$ldapdir%g
s%@ldapincdir@%$ldapincdir%g
s%@DL_LIBS@%$DL_LIBS%g
s%@LD_FLAGS@%$LD_FLAGS%g
s%@MATH_LIBS@%$MATH_LIBS%g

View file

@ -2,11 +2,11 @@ dnl This file is an input file used by the GNU "autoconf" program to
dnl generate the file "configure", which is run during Tk installation
dnl to configure the system for the local environment.
AC_INIT(neoXldap.c)
# $Id: configure.in,v 1.1 1999/02/10 22:56:49 kunkee Exp $
# $Id: configure.in,v 1.2 1999/07/27 05:29:27 kunkee Exp $
NEO_VERSION=1.1
NEO_VERSION=1.2
NEO_MAJOR_VERSION=1
NEO_MINOR_VERSION=1
NEO_MINOR_VERSION=2
VERSION=${NEO_VERSION}
if test "${prefix}" = "NONE"; then
@ -169,6 +169,7 @@ AC_SUBST(ldaplibflags)
AC_SUBST(ldapinclude)
AC_SUBST(ldapbuild)
AC_SUBST(ldapdir)
AC_SUBST(ldapincdir)
VERSION=${NEO_VERSION}

View file

@ -0,0 +1,33 @@
#
# ldaperr.tcl: scan ldap.h for error return codes for initializing
# errorCode table.
#
proc genstrings {path} {
set fp [open $path]
while {[gets $fp line] != -1 &&
![string match "#define LDAP_SUCCESS*" $line]} { }
puts "/* This file automatically generated, hand edit at your own risk! */"
puts -nonewline "char *ldaptclerrorcode\[\] = {
NULL"
set lasterr 0
while {[gets $fp line] != -1} {
if {[clength $line] == 0 || [ctype space $line]} continue
if {![string match #define* $line]} break
if {![string match "#define LDAP_*" $line]} continue
lassign $line define macro value
incr lasterr
while {$lasterr < $value} {
puts -nonewline ",\n\tNULL"
incr lasterr
}
puts -nonewline ",\n\t\"$macro\""
}
puts "\n};"
puts "#define LDAPTCL_MAXERR\t$value"
}
#cmdtrace on
if !$tcl_interactive {
genstrings [lindex $argv 0]
}

View file

@ -23,7 +23,7 @@
* Requests for permission may be sent to NeoSoft Inc, 1770 St. James Place,
* Suite 500, Houston, TX, 77056.
*
* $Id$
* $Id: neoXldap.c,v 1.4 1999/07/27 05:29:27 kunkee Exp $
*
*/
@ -34,7 +34,7 @@
* Umich-3.3 client code. The UMICH_LDAP define is used to include
* code that will work with the Umich-3.3 LDAP, but not with Netscape's
* SDK. OpenLDAP may support some of these, but they have not been tested.
* Current support is by Randy Kunkee.
* Currently supported by Randy Kunkee (kunkee@OpenLDAP.org).
*/
/*
@ -57,6 +57,8 @@
#define STREQU(str1, str2) \
(((str1) [0] == (str2) [0]) && (strcmp (str1, str2) == 0))
#define STRNEQU(str1, str2, n) \
(((str1) [0] == (str2) [0]) && (strncmp (str1, str2, n) == 0))
/*
* The following section defines some common macros used by the rest
@ -76,8 +78,13 @@
*/
#define ldap_attributefree(p) ldap_memfree(p)
#define ldap_memfree(p) free(p)
#ifdef LDAP_OPT_ERROR_NUMBER
#define ldap_get_lderrno(ld) (ldap_get_option(ld, LDAP_OPT_ERROR_NUMBER, &lderrno), lderrno)
#else
#define ldap_get_lderrno(ld) (ld->ld_errno)
#endif
#define LDAP_ERR_STRING(ld) \
ldap_err2string(ldap->ld_errno)
ldap_err2string(ldap_get_lderrno(ld))
#elif defined( LDAP_OPT_SIZELIMIT )
/*
** Netscape SDK w/ ldap_set_option, ldap_get_option
@ -93,11 +100,38 @@
#define ldap_ber_free(p, n) ber_free(p, n)
#define ldap_value_free_len(bvals) ber_bvecfree(bvals)
#define ldap_attributefree(p)
#define ldap_get_lderrno(ld) (ld->ld_errno)
#define LDAP_ERR_STRING(ld) \
ldap_err2string(ld->ld_errno)
#endif
typedef struct ldaptclobj {
LDAP *ldap;
int flags
} LDAPTCL;
#define LDAPTCL_INTERRCODES 0x001
#include "ldaptclerr.h"
static
LDAP_SetErrorCode(LDAPTCL *ldaptcl, int code, Tcl_Interp *interp)
{
char shortbuf[6];
char *errp;
int lderrno;
if (code == -1)
code = ldap_get_lderrno(ldaptcl->ldap);
if ((ldaptcl->flags & LDAPTCL_INTERRCODES) || code > LDAPTCL_MAXERR ||
ldaptclerrorcode[code] == NULL) {
sprintf(shortbuf, "0x%03x", code);
errp = shortbuf;
} else
errp = ldaptclerrorcode[code];
Tcl_SetErrorCode(interp, errp, NULL);
}
/*-----------------------------------------------------------------------------
* LDAP_ProcessOneSearchResult --
@ -130,6 +164,7 @@ LDAP_ProcessOneSearchResult (interp, ldap, entry, destArrayNameObj, evalCodeObj)
BerElement *ber;
struct berval **bvals;
char *dn;
int lderrno;
Tcl_UnsetVar (interp, Tcl_GetStringFromObj (destArrayNameObj, NULL), 0);
@ -210,9 +245,9 @@ LDAP_ProcessOneSearchResult (interp, ldap, entry, destArrayNameObj, evalCodeObj)
*-----------------------------------------------------------------------------
*/
static int
LDAP_PerformSearch (interp, ldap, base, scope, attrs, filtpatt, value, destArrayNameObj, evalCodeObj, timeout_p)
LDAP_PerformSearch (interp, ldaptcl, base, scope, attrs, filtpatt, value, destArrayNameObj, evalCodeObj, timeout_p)
Tcl_Interp *interp;
LDAP *ldap;
LDAPTCL *ldaptcl;
char *base;
int scope;
char **attrs;
@ -222,6 +257,7 @@ LDAP_PerformSearch (interp, ldap, base, scope, attrs, filtpatt, value, destArray
Tcl_Obj *evalCodeObj;
struct timeval *timeout_p;
{
LDAP *ldap = ldaptcl->ldap;
char filter[BUFSIZ];
int resultCode;
int errorCode;
@ -232,7 +268,7 @@ LDAP_PerformSearch (interp, ldap, base, scope, attrs, filtpatt, value, destArray
LDAPMessage *entryMessage;
Tcl_Obj *resultObj;
int lderr;
int lderrno;
resultObj = Tcl_GetObjResult (interp);
@ -243,6 +279,7 @@ LDAP_PerformSearch (interp, ldap, base, scope, attrs, filtpatt, value, destArray
"LDAP start search error: ",
LDAP_ERR_STRING(ldap),
(char *)NULL);
LDAP_SetErrorCode(ldaptcl, -1, interp);
return TCL_ERROR;
}
@ -297,6 +334,7 @@ LDAP_PerformSearch (interp, ldap, base, scope, attrs, filtpatt, value, destArray
ldap_err2string(errorCode),
(char *)NULL);
ldap_msgfree(resultMessage);
LDAP_SetErrorCode(ldaptcl, errorCode, interp);
return TCL_ERROR;
}
}
@ -307,6 +345,7 @@ LDAP_PerformSearch (interp, ldap, base, scope, attrs, filtpatt, value, destArray
"LDAP result search error: ",
LDAP_ERR_STRING(ldap),
(char *)NULL);
LDAP_SetErrorCode(ldaptcl, -1, interp);
return TCL_ERROR;
} else
ldap_msgfree(resultMessage);
@ -336,7 +375,8 @@ NeoX_LdapTargetObjCmd (clientData, interp, objc, objv)
{
char *command;
char *subCommand;
LDAP *ldap = (LDAP *)clientData;
LDAPTCL *ldaptcl = (LDAPTCL *)clientData;
LDAP *ldap = ldaptcl->ldap;
char *dn;
int is_add = 0;
int is_add_or_modify = 0;
@ -422,6 +462,7 @@ NeoX_LdapTargetObjCmd (clientData, interp, objc, objv)
"LDAP bind error: ",
ldap_err2string(errcode),
(char *)NULL);
LDAP_SetErrorCode(ldaptcl, errcode, interp);
return TCL_ERROR;
}
return TCL_OK;
@ -445,6 +486,7 @@ NeoX_LdapTargetObjCmd (clientData, interp, objc, objv)
"LDAP delete error: ",
ldap_err2string(errcode),
(char *)NULL);
LDAP_SetErrorCode(ldaptcl, errcode, interp);
return TCL_ERROR;
}
return TCL_OK;
@ -473,6 +515,7 @@ NeoX_LdapTargetObjCmd (clientData, interp, objc, objv)
" error: ",
ldap_err2string(errcode),
(char *)NULL);
LDAP_SetErrorCode(ldaptcl, errcode, interp);
return TCL_ERROR;
}
return TCL_OK;
@ -594,6 +637,7 @@ NeoX_LdapTargetObjCmd (clientData, interp, objc, objv)
" error: ",
ldap_err2string(result),
(char *)NULL);
LDAP_SetErrorCode(ldaptcl, result, interp);
return TCL_ERROR;
}
return TCL_OK;
@ -657,14 +701,7 @@ NeoX_LdapTargetObjCmd (clientData, interp, objc, objv)
"filter",
0);
if (filterPatternString == (char *)NULL) {
Tcl_AppendStringsToObj (resultObj,
"required element \"filter\" ",
"is missing from ldap control array \"",
controlArrayName,
"\"",
(char *)NULL);
return TCL_ERROR;
filterPatternString = "objectclass=*";
}
/* Fetch scope setting from control array.
@ -676,16 +713,16 @@ NeoX_LdapTargetObjCmd (clientData, interp, objc, objv)
} else {
if (STREQU(scopeString, "base"))
scope = LDAP_SCOPE_BASE;
else if (STREQU(scopeString, "onelevel"))
else if (STRNEQU(scopeString, "one", 3))
scope = LDAP_SCOPE_ONELEVEL;
else if (STREQU(scopeString, "subtree"))
else if (STRNEQU(scopeString, "sub", 3))
scope = LDAP_SCOPE_SUBTREE;
else {
Tcl_AppendStringsToObj (resultObj,
"\"scope\" element of \"",
controlArrayName,
"\" array is not one of ",
"\"base\", \"one_level\", ",
"\"base\", \"onelevel\", ",
"or \"subtree\"",
(char *) NULL);
return TCL_ERROR;
@ -766,7 +803,7 @@ NeoX_LdapTargetObjCmd (clientData, interp, objc, objv)
#endif
return LDAP_PerformSearch (interp,
ldap,
ldaptcl,
baseString,
scope,
attributesArray,
@ -777,7 +814,7 @@ NeoX_LdapTargetObjCmd (clientData, interp, objc, objv)
timeout_p);
}
#if UMICH_LDAP
#if defined(UMICH_LDAP) || (defined(OPEN_LDAP) && !defined(LDAP_API_VERSION))
if (STREQU (subCommand, "cache")) {
char *cacheCommand;
@ -822,6 +859,7 @@ NeoX_LdapTargetObjCmd (clientData, interp, objc, objv)
"LDAP cache enable error: ",
LDAP_ERR_STRING(ldap),
(char *)NULL);
LDAP_SetErrorCode(ldaptcl, -1, interp);
return TCL_ERROR;
}
return TCL_OK;
@ -907,9 +945,11 @@ static void
NeoX_LdapObjDeleteCmd(clientData)
ClientData clientData;
{
LDAP *ldap = (LDAP *)clientData;
LDAPTCL *ldaptcl = (LDAPTCL *)clientData;
LDAP *ldap = ldaptcl->ldap;
ldap_unbind(ldap);
ckfree((char*) ldaptcl);
}
/*-----------------------------------------------------------------------------
@ -939,6 +979,7 @@ NeoX_LdapObjCmd (clientData, interp, objc, objv)
char *ldapHost;
int ldapPort = 389;
LDAP *ldap;
LDAPTCL *ldaptcl;
Tcl_Obj *resultObj = Tcl_GetObjResult (interp);
@ -1040,10 +1081,14 @@ NeoX_LdapObjCmd (clientData, interp, objc, objv)
ldap->ld_deref = LDAP_DEREF_NEVER; /* Turn off alias dereferencing */
#endif
ldaptcl = (LDAPTCL *) ckalloc(sizeof(LDAPTCL));
ldaptcl->ldap = ldap;
ldaptcl->flags = 0;
Tcl_CreateObjCommand (interp,
newCommand,
NeoX_LdapTargetObjCmd,
(ClientData) ldap,
(ClientData) ldaptcl,
NeoX_LdapObjDeleteCmd);
return TCL_OK;
}
@ -1062,6 +1107,6 @@ Tcl_Interp *interp;
NeoX_LdapObjCmd,
(ClientData) NULL,
(Tcl_CmdDeleteProc*) NULL);
Tcl_PkgProvide(interp, "Ldaptcl", "1.1");
Tcl_PkgProvide(interp, "Ldaptcl", VERSION);
return TCL_OK;
}