]> git.sur5r.net Git - openldap/commitdiff
Ldaptcl package version 1.2:
authorRandy Kunkee <kunkee@openldap.org>
Tue, 3 Aug 1999 07:23:03 +0000 (07:23 +0000)
committerRandy Kunkee <kunkee@openldap.org>
Tue, 3 Aug 1999 07:23:03 +0000 (07:23 +0000)
- 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.

contrib/ldaptcl/CHANGES [new file with mode: 0644]
contrib/ldaptcl/Makefile.in
contrib/ldaptcl/configure
contrib/ldaptcl/configure.in
contrib/ldaptcl/ldaperr.tcl [new file with mode: 0644]
contrib/ldaptcl/neoXldap.c

diff --git a/contrib/ldaptcl/CHANGES b/contrib/ldaptcl/CHANGES
new file mode 100644 (file)
index 0000000..2a7b8ce
--- /dev/null
@@ -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.)
index a7db9517eb23fadd39b6f1b1aa2e8294b339db60..c195b1b392f536d3b2967f27dbd89666e4999901 100644 (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
 
index 2acc11f62e3ee26f1aece303e73ecb822e71af1e..4472c774e4babaa7610cf4bc186a3460eaa92a85 100755 (executable)
@@ -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
index 7efa1aa14a4d51e52a99f9014563a62d337c5f58..bed2a399ce11928532c4cf6260f3103c0816ddb3 100644 (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}
diff --git a/contrib/ldaptcl/ldaperr.tcl b/contrib/ldaptcl/ldaperr.tcl
new file mode 100644 (file)
index 0000000..31872f6
--- /dev/null
@@ -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]
+}
index 88f55de5559aa86a5aa21d9541841d8e8a6101c7..a2c6d90878af54f6c343511f0007cf3befc61179 100644 (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
        */
 #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
 #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;
 }