]> git.sur5r.net Git - openldap/commitdiff
Added support for ldap.conf file. See ldap.conf(5) for details.
authorKurt Zeilenga <kurt@openldap.org>
Tue, 10 Nov 1998 23:37:30 +0000 (23:37 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Tue, 10 Nov 1998 23:37:30 +0000 (23:37 +0000)
Modified clients to reduce use of ldapconfig.h.edit.
ldap_{get,set}_option support is relatively complete.  Needs
to be extended to support other "features" of OpenLDAP.

32 files changed:
clients/fax500/main.c
clients/fax500/rp500.c
clients/finger/main.c
clients/gopher/go500.c
clients/gopher/go500gw.c
clients/mail500/main.c
clients/rcpt500/main.c
clients/tools/ldapdelete.c
clients/tools/ldapmodify.c
clients/tools/ldapmodrdn.c
clients/tools/ldapsearch.c
clients/ud/auth.c
clients/ud/main.c
clients/ud/util.c
doc/man/man1/ldapdelete.1
doc/man/man1/ldapmodify.1
doc/man/man1/ldapmodrdn.1
doc/man/man1/ldapsearch.1
doc/man/man1/ud.1
doc/man/man3/ldap.3
doc/man/man5/ud.conf.5
include/ldapconfig.h.edit
include/portable.h.bot
include/portable.h.in
libraries/libldap/Makefile.in
libraries/libldap/cldap.c
libraries/libldap/init.c
libraries/libldap/ldap-int.h
libraries/libldap/open.c
libraries/libldap/options.c
libraries/libldap/unbind.c
servers/slapd/tools/centipede.c

index da4d63b9d940761e06887e01ca5278bd7160e8b9..61ff681f073b76c2dc4992af5676667c959ced92 100644 (file)
@@ -308,7 +308,7 @@ connect_to_x500()
        int sizelimit = FAX_MAXAMBIGUOUS;
        int deref = LDAP_DEREF_ALWAYS;
 
-       if ( (ld = ldap_open( LDAPHOST, LDAP_PORT )) == NULL ) {
+       if ( (ld = ldap_open( NULL, 0 )) == NULL ) {
                syslog( LOG_ALERT, "ldap_open failed" );
                return( -1 );
        }
@@ -316,7 +316,7 @@ connect_to_x500()
        ldap_set_option(ld, LDAP_OPT_SIZELIMIT, &sizelimit);
        ldap_set_option(ld, LDAP_OPT_DEREF, &deref);
 
-       if ( ldap_simple_bind_s( ld, FAX_BINDDN, FAX_BIND_CRED ) != LDAP_SUCCESS ) {
+       if ( ldap_simple_bind_s( ld, NULL, NULL ) != LDAP_SUCCESS ) {
                syslog( LOG_ALERT, "ldap_simple_bind_s failed" );
                return( -1 );
        }
index b4fd84462fdaab762a0d46202e396c1112041628..bea1f4b495b49d127b47830162c1f3f3675cd1e3 100644 (file)
@@ -32,8 +32,8 @@
 #define DEFAULT_SIZELIMIT      50
 
 int            debug;
-char   *ldaphost = LDAPHOST;
-char   *base = RP_BASE;
+char   *ldaphost = NULL;
+char   *base = NULL;
 int            deref = LDAP_DEREF_ALWAYS;
 int            sizelimit = DEFAULT_SIZELIMIT;
 LDAPFiltDesc   *filtd;
@@ -116,7 +116,7 @@ main (argc, argv)
        ldap_set_option(ld, LDAP_OPT_SIZELIMIT, &sizelimit);
        ldap_set_option(ld, LDAP_OPT_DEREF, &deref);
 
-       if ( ldap_simple_bind_s( ld, RP_BINDDN, RP_BIND_CRED ) != LDAP_SUCCESS ) {
+       if ( ldap_simple_bind_s( ld, NULL, NULL ) != LDAP_SUCCESS ) {
                fprintf( stderr, "X.500 is temporarily unavailable.\n" );
                ldap_perror( ld, "ldap_simple_bind_s" );
                exit( -1 );
index 739f56abe9c5bbf286809021023e684ecb95d76f..e2c3fbe25d6c95a7716e83845c915812a4a855d5 100644 (file)
@@ -34,9 +34,9 @@
 
 
 int    dosyslog = 1;
-char   *ldaphost = LDAPHOST;
-int    ldapport = LDAP_PORT;
-char   *base = FINGER_BASE;
+char   *ldaphost = NULL;
+int    ldapport = 0;
+char   *base = NULL;
 int    deref;
 char   *filterfile = FILTERFILE;
 char   *templatefile = TEMPLATEFILE;
@@ -167,7 +167,7 @@ static do_query()
        }
        ldap_set_option(ld, LDAP_OPT_DEREF, &deref);
 
-       if ( ldap_simple_bind_s( ld, FINGER_BINDDN, FINGER_BIND_CRED )
+       if ( ldap_simple_bind_s( ld, NULL, NULL )
                != LDAP_SUCCESS )
        {
                fprintf( stderr, FINGER_UNAVAILABLE );
index 0f706498a7d926072a7b32c58e6604caacc2b6fc..e93b5504e820da147a59ccef9b1553731e3b98ad 100644 (file)
@@ -44,8 +44,8 @@ int   dosyslog;
 int    inetd;
 int    dtblsize;
 
-char   *ldaphost = LDAPHOST;
-char   *base = GO500_BASE;
+char   *ldaphost = NULL;
+char   *base = NULL;
 int    rdncount = GO500_RDNCOUNT;
 char   *filterfile = FILTERFILE;
 char   *templatefile = TEMPLATEFILE;
@@ -391,7 +391,7 @@ int s;
                int deref = GO500_DEREF;
                ldap_set_option(ld, LDAP_OPT_DEREF, &deref);
 
-               rc = ldap_simple_bind_s( ld, GO500_BINDDN, GO500_BIND_CRED );
+               rc = ldap_simple_bind_s( ld, NULL, NULL );
                if ( rc != LDAP_SUCCESS ) {
                        fprintf(fp,
                            "0An error occurred (explanation)\t@%d\t%s\t%d\r\n",
index bf25933d3fda1d61f6a4e5a060a593510e240411..464361ff8027255f7111bd667ba0af0e05dd9a87 100644 (file)
@@ -45,8 +45,8 @@ int   dosyslog;
 int    inetd;
 int    dtblsize;
 
-char           *ldaphost = LDAPHOST;
-int            ldapport = LDAP_PORT;
+char           *ldaphost = NULL;
+int            ldapport = 0;
 int            searchaliases = 1;
 char           *helpfile = GO500GW_HELPFILE;
 char           *filterfile = FILTERFILE;
@@ -440,7 +440,7 @@ int s;
 
        ldap_set_option(ld, LDAP_OPT_DEREF, &deref);
 
-       if ( (rc = ldap_simple_bind_s( ld, GO500GW_BINDDN, NULL ))
+       if ( (rc = ldap_simple_bind_s( ld, NULL, NULL ))
            != LDAP_SUCCESS ) {
                if ( debug ) ldap_perror( ld, "ldap_simple_bind_s" );
                fprintf(fp, "0An error occurred (explanation)\tE%d\t%s\t%d\r\n",
index 31406ac229b6153b229672b381763bbadff524bc..0a117ce43207d87d0820e5855b44a546546bae66 100644 (file)
@@ -56,7 +56,7 @@ char  *vacationhost = NULL;
 char   *errorsfrom = NULL;
 char   *mailfrom = NULL;
 char   *host = NULL;
-char   *ldaphost = LDAPHOST;
+char   *ldaphost = NULL;
 int    hostlen = 0;
 int    debug;
 
@@ -356,7 +356,7 @@ connect_to_x500()
        opt = LDAP_DEREF_ALWAYS;
        ldap_set_option(ld, LDAP_OPT_DEREF, &opt);
 
-       if ( ldap_simple_bind_s( ld, MAIL500_BINDDN, NULL ) != LDAP_SUCCESS ) {
+       if ( ldap_simple_bind_s( ld, NULL, NULL ) != LDAP_SUCCESS ) {
                syslog( LOG_ALERT, "ldap_simple_bind_s failed" );
                return( -1 );
        }
index b6bf01636e91c6553b9a452e91e291808af8595c..4a73a2f53d40de3bf8ff29fb2ae86f693de6633a 100644 (file)
@@ -27,9 +27,9 @@ int derefaliases = 1;
 int sizelimit = RCPT500_SIZELIMIT;
 int rdncount = RCPT500_RDNCOUNT;
 int ldapport = 0;
-char *ldaphost = LDAPHOST;
-char *searchbase = RCPT500_BASE;
-char *dapuser = RCPT500_BINDDN;
+char *ldaphost = NULL;
+char *searchbase = NULL;
+char *dapuser = NULL;
 char *filterfile = FILTERFILE;
 char *templatefile = TEMPLATEFILE;
 char reply[ MAXSIZE * RCPT500_LISTLIMIT ];
index 5349065d042f6f1557c71addd2246b0473be6382..5ff04f187afc86fb7728227fe5bdfeedeb205163 100644 (file)
 #include <lber.h>
 #include <ldap.h>
 
-#include "ldapconfig.h"
-
-static char    *binddn = LDAPDELETE_BINDDN;
-static char    *passwd = LDAPDELETE_BIND_CRED;
-static char    *base = LDAPDELETE_BASE;
-static char    *ldaphost = LDAPHOST;
-static int     ldapport = LDAP_PORT;
+static char    *binddn = NULL;
+static char    *passwd = NULL;
+static char    *base = NULL;
+static char    *ldaphost = NULL;
+static int     ldapport = 0;
 static int     not, verbose, contoper;
 static LDAP    *ld;
 
index 92766e8d69f57c0d13e1bbfc8231726f531fe25d..33b364caaef1073cbd36584977f6033c374d8e2e 100644 (file)
 #include <ldap.h>
 #include <ldif.h>
 
-#include "ldapconfig.h"
-
 static char    *prog;
-static char    *binddn = LDAPMODIFY_BINDDN;
-static char    *passwd = LDAPMODIFY_BIND_CRED;
-static char    *ldaphost = LDAPHOST;
-static int     ldapport = LDAP_PORT;
+static char    *binddn = NULL;
+static char    *passwd = NULL;
+static char    *ldaphost = NULL;
+static int     ldapport = 0;
 static int     new, replace, not, verbose, contoper, force, valsfromfiles;
 static LDAP    *ld;
 
index 058c4754620a4e31080833b3aa71872562abb6da..87260045463bf8182de9afd4f3cfed9b084fb78c 100644 (file)
 #include <lber.h>
 #include <ldap.h>
 
-#include "ldapconfig.h"
-
-static char    *binddn = LDAPMODRDN_BINDDN;
-static char    *passwd = LDAPMODRDN_BIND_CRED;
-static char    *base = LDAPMODRDN_BASE;
-static char    *ldaphost = LDAPHOST;
-static int     ldapport = LDAP_PORT;
+static char    *binddn = NULL;
+static char    *passwd = NULL;
+static char    *base = NULL;
+static char    *ldaphost = NULL;
+static int     ldapport = 0;
 static int     not, verbose, contoper;
 static LDAP    *ld;
 
index 399088a0d2dc75e509840e33d03845df618b65ca..9fe3bdb218745aaa43a14f7faca7cbcf22e3851f 100644 (file)
@@ -11,8 +11,6 @@
 #include <ldap.h>
 #include <ldif.h>
 
-#include "ldapconfig.h"
-
 #define DEFSEP         "="
 
 #ifdef LDAP_DEBUG
@@ -76,11 +74,11 @@ static int dosearch LDAP_P((
     char       *filtpatt,
     char       *value));
 
-static char    *binddn = LDAPSEARCH_BINDDN;
-static char    *passwd = LDAPSEARCH_BIND_CRED;
-static char    *base = LDAPSEARCH_BASE;
-static char    *ldaphost = LDAPHOST;
-static int     ldapport = LDAP_PORT;
+static char    *binddn = NULL;
+static char    *passwd = NULL;
+static char    *base = NULL;
+static char    *ldaphost = NULL;
+static int     ldapport = 0;
 static char    *sep = DEFSEP;
 static char    *sortattr = NULL;
 static int     skipsortattr = 0;
index 079d904458c88619d08e52d5943f81967ab5de09..5440037e9d9db6eb08b3f02a42007e7d04816d9b 100644 (file)
@@ -257,7 +257,7 @@ int implicit;
                else
                        ldap_perror(ld, "ldap_bind_s" );
                (void) ldap_bind_s(ld, default_bind_object,
-                        (char *) UD_BIND_CRED, LDAP_AUTH_SIMPLE);
+                        (char *) NULL, LDAP_AUTH_SIMPLE);
                if (default_bind_object == NULL)
                        set_bound_dn(NULL);
                else
index b1c780d06b52249a3dd4a9168819a92f12dc114e..e700875670a4f4a7cf1ac93dfd7ca4bbdfa4e1b0 100644 (file)
@@ -58,7 +58,7 @@ static char *filter_file = FILTERFILE;
 static int ldap_port = LDAP_PORT;
 static int dereference = TRUE;
 
-char *default_bind_object = UD_BINDDN;
+char *default_bind_object = NULL;
 
 char *bound_dn;                        /* bound user's Distinguished Name */
 char *group_base;              /* place in LDAP tree where groups are */
@@ -510,7 +510,7 @@ char **base, *s;
        /* set the search base back to the original default value */
        else if (!strcasecmp(s, "default")) {
                if (type == BASE_SEARCH)
-                       StrFreeDup(base, UD_BASE);
+                       StrFreeDup(base, NULL);
                else if (type == BASE_GROUPS)
                        StrFreeDup(base, UD_WHERE_GROUPS_ARE_CREATED);
                printbase(output_string, *base);
@@ -603,6 +603,16 @@ void initialize_client()
                                if ((*cp == '\0') || (*cp == '\n'))
                                        continue;
                                server = strdup(cp);
+                       } 
+                       else if (!strncasecmp(buffer, "host", 4)) {
+                               if (server != NULL)
+                                       continue;
+                               cp = buffer + 4;
+                               while (isspace(*cp))
+                                       cp++;
+                               if ((*cp == '\0') || (*cp == '\n'))
+                                       continue;
+                               server = strdup(cp);
                        }
                        else if (!strncasecmp(buffer, "base", 4)) {
                                cp = buffer + 4;
@@ -626,10 +636,6 @@ void initialize_client()
        }
        if (group_base == NULL)
                group_base = strdup(UD_WHERE_GROUPS_ARE_CREATED);
-       if (search_base == NULL)
-               search_base = strdup(UD_BASE);
-       if (server == NULL)
-               server = strdup(LDAPHOST);
 
        /*
         *  Set up our LDAP connection.  The values of retry and timeout
@@ -641,7 +647,7 @@ void initialize_client()
                exit(0);
                /* NOTREACHED */
        }
-       if (ldap_bind_s(ld, (char *) default_bind_object, (char *) UD_BIND_CRED,
+       if (ldap_bind_s(ld, (char *) default_bind_object, NULL,
            LDAP_AUTH_SIMPLE) != LDAP_SUCCESS) {
                int ld_errno = 0;
                ldap_get_option(ld, LDAP_OPT_ERROR_NUMBER, &ld_errno);
index ea0bbd1256daff430c0e399086fc14163b755792..d3a55b99bf14d2ca0b7b728e251c7c81721d7aee 100644 (file)
@@ -526,7 +526,7 @@ char *s;
        register char **cpp;
        static char short_DN[BUFSIZ];
 
-       if (strstr(s, UD_BASE) == NULL)
+       if (strstr(s, NULL) == NULL)
                return(ldap_dn2ufn(s));
        cpp = ldap_explode_dn(s, TRUE);
        sprintf(short_DN, "%s, %s", *cpp, *(cpp + 1));
index 43ae6033ee4b0f64a2e9839f6c2333de2ad3cf7e..efc15b3ca79d81cce409e8d6135c47d75f712090 100644 (file)
@@ -1,4 +1,4 @@
-.TH LDAPDELETE 1 "22 September 1998" "OpenLDAP LDVERSION"
+.TH LDAPDELETE 1 "10 November 1998" "OpenLDAP LDVERSION"
 .SH NAME
 ldapdelete \- ldap delete entry tool
 .SH SYNOPSIS
@@ -67,7 +67,7 @@ is treated as a pattern where the first occurrence of \fB%s\fP is
 replaced with a line from \fIfile\fP.
 .TP
 .B \-D binddn
-Use \fIbinddn\fP to bind to the X.500 directory. \fIbinddn\fP should be
+Use \fIbinddn\fP to bind to the LDAP directory. \fIbinddn\fP should be
 a string-represented DN as defined in RFC 1779.
 .TP
 .B \-w passwd
@@ -93,6 +93,7 @@ course it would probably be necessary to supply a \fIbinddn\fP and
 Exit status is 0 if no errors occur.  Errors result in a non-zero exit
 status and a diagnostic message being written to standard error.
 .SH "SEE ALSO"
+.BR ldap.conf (5),
 .BR ldapadd (1),
 .BR ldapmodify (1),
 .BR ldapmodrdn (1),
index 679f672a2701290b6ac775cc8e083c506e1574ce..b304b01e5a92e4bf245bcd1f55b17347436bc18c 100644 (file)
@@ -1,4 +1,4 @@
-.TH LDAPMODIFY 1 "22 September 1998" "OpenLDAP LDVERSION"
+.TH LDAPMODIFY 1 "10 November 1998" "OpenLDAP LDVERSION"
 .SH NAME
 ldapmodify, ldapadd \- ldap modify entry and ldap add entry tools
 .SH SYNOPSIS
@@ -104,7 +104,7 @@ Read the entry modification information from \fIfile\fP instead of from
 standard input.
 .TP
 .B \-D binddn
-Use \fIbinddn\fP to bind to the X.500 directory. \fIbinddn\fP should be
+Use \fIbinddn\fP to bind to the LDAP directory. \fIbinddn\fP should be
 a string-represented DN as defined in RFC 1779.
 .TP
 .B \-w passwd
@@ -285,6 +285,7 @@ status and a diagnostic message being written to standard error.
 .BR ldapdelete (1),
 .BR ldapmodrdn (1),
 .BR ldapsearch (1),
+.BR ldap.conf (5),
 .BR ldap (3),
 .BR ldap_add (3),
 .BR ldap_delete (3),
index 86d76655bd3b8bd5abb5ef598efb7bfaecae9e13..f2a17099e0974ee04e22f4fedee7d1f84072457c 100644 (file)
@@ -1,4 +1,4 @@
-.TH LDAPMODRDN 1 "22 September 1998" "OpenLDAP LDVERSION"
+.TH LDAPMODRDN 1 "10 November 1998" "OpenLDAP LDVERSION"
 .SH NAME
 ldapmodrdn \- ldap modify entry RDN tool
 .SH SYNOPSIS
@@ -67,7 +67,7 @@ Read the entry modification information from \fIfile\fP instead of from
 standard input or the command-line.
 .TP
 .B \-D binddn
-Use \fIbinddn\fP to bind to the X.500 directory. \fIbinddn\fP should be
+Use \fIbinddn\fP to bind to the LDAP directory. \fIbinddn\fP should be
 a string-represented DN as defined in RFC 1779.
 .TP
 .B \-w passwd
@@ -120,6 +120,7 @@ status and a diagnostic message being written to standard error.
 .BR ldapdelete (1),
 .BR ldapmodify (1),
 .BR ldapsearch (1),
+.BR ldap.conf (5),
 .BR ldap (3),
 .BR ldap_modrdn2 (3)
 .LP
index f1b5d43a55e32473cca95cbdb86ced02f861bdfe..1453f073d56203f7394397b5ca8e0b9b09bdbb8c 100644 (file)
@@ -1,4 +1,4 @@
-.TH LDAPSEARCH 1 "22 September 1998" "OpenLDAP LDVERSION"
+.TH LDAPSEARCH 1 "10 November 1998" "OpenLDAP LDVERSION"
 .SH NAME
 ldapsearch \- ldap search tool
 .SH SYNOPSIS
@@ -123,7 +123,7 @@ replaced with a line from \fIfile\fP.  If \fIfile\fP is a single \fI-\fP
 character, then the lines are read from standard input.
 .TP
 .B \-D binddn
-Use \fIbinddn\fP to bind to the X.500 directory. \fIbinddn\fP should be
+Use \fIbinddn\fP to bind to the LDAP directory. \fIbinddn\fP should be
 a string-represented DN as defined in RFC 1779.
 .TP
 .B \-w bindpasswd
@@ -275,6 +275,7 @@ status and a diagnostic message being written to standard error.
 .BR ldapdelete (1),
 .BR ldapmodify (1),
 .BR ldapmodrdn (1),
+.BR ldap.conf (5),
 .BR ldap (3),
 .BR ldap_search (3)
 .LP
index 1c74bf8f35096ea75aafc55bff548d2cafebcd2d..aeb572c612a69a51d2cd9fd7502e955762823c16 100644 (file)
@@ -1,7 +1,7 @@
-.TH UD 1 "22 September 1998" "OpenLDAP LDVERSION"
+.TH UD 1 "10 November 1998" "OpenLDAP LDVERSION"
 .UC 6
 .SH NAME
-ud \- interactive X.500 Directory Server query program
+ud \- interactive LDAP Directory Server query program
 .SH SYNOPSIS
 .B ud
 [-Dv] [-s 
@@ -59,6 +59,7 @@ Prints out a list of valid ud debug masks.
 ETCDIR/ud.conf         The ud configuration file.
 .SH "SEE ALSO"
 .BR ud.conf (5),
+.BR ldap.conf (5),
 .BR ldap (3)
 .SH DIAGNOSTICS
 .B ud
index 7403bddd539d3aa13e76aa5d6c61432d67eeec43..130f78516c6ff436b039e2c54aa082e02f5e1871 100644 (file)
@@ -1,4 +1,4 @@
-.TH LDAP 3 "22 September 1998" "OpenLDAP LDVERSION"
+.TH LDAP 3 "10 November 1998" "OpenLDAP LDVERSION"
 .SH NAME
 ldap - Lightweight Directory Access Protocol package
 .SH SYNOPSIS
@@ -12,7 +12,7 @@ ldap - Lightweight Directory Access Protocol package
 .LP
 The Lightweight Directory Access Protocol provides TCP/IP access to
 the X.500 Directory or to a stand-alone LDAP server.
-The University of Michigan LDAP package includes a stand-alone server in
+The OpenLDAP LDAP package includes a stand-alone server in
 .BR slapd (8),
 an LDAP to X.500 gateway in
 .BR ldapd (8),
index 88f450581dda2b29b0f5ef4aaa7a02c8ba6b143e..0ab9fdf283ae4b9d24391836680094ab13383fa4 100644 (file)
@@ -3,7 +3,7 @@
 .SH NAME
 ud.conf \- ud configuration file
 .SH SYNOPSIS
-/etc/ud.conf
+ETCDIR/ud.conf
 .SH DESCRIPTION
 The
 .I ud
@@ -17,13 +17,13 @@ configuration file.
 .SH OPTIONS
 The different configuration options are:
 .TP 1i
-\fBserver <name>\fP
+\fBHOST <name>\fP
 Used to specify the name of an LDAP server to which 
 .I ud 
 should connect.  There may be only one entry per config file.
 The server's name can be specified as a domain-style name or an IP address.
 .TP 1i
-\fBbase <base>\fP
+\fBBASE <base>\fP
 Used to specify the search base to use when performing search operations.
 The base may be changed by those using
 .I ud
@@ -33,7 +33,7 @@ command.
 There may be only one entry per config file.
 The base must be specified as a Distinguished Name in LDAP format.
 .TP 1i
-\fBgroupbase <base>\fP
+\fBGROUPBASE <base>\fP
 Used to specify the base used when creating groups.
 The base may be changed by those using
 .I ud
@@ -43,7 +43,7 @@ command.
 There may be only one entry per config file.
 The base must be specified as a Distinguished Name in LDAP format.
 .TP 1i
-\fBsearch <algorithm>\fP
+\fBSEARCH <algorithm>\fP
 Used to specify a search algorithm to use when performing searches.  More than
 one algorithm may be specified, and each is tried in turn until a suitable
 response is found.
@@ -88,7 +88,7 @@ For example,
 causes this algorithm to be applied when the number of fields is exactly equal
 to one.  If there is exactly one field, the token is looked up as a UID.
 .SH FILES
-.I  /etc/ud.conf
+.I  ETCDIR/ud.conf
 .SH "SEE ALSO"
 ud(1),
 ldap(3)
index 8a053cad5b9388996bc12faf12355030f9fb1a4c..8df80f4dd6126b330d35efce1ad82669e1352f1d 100644 (file)
 #define DEFAULT_SYSCONFDIR     "%SYSCONFDIR%"
 #define DEFAULT_LIBEXECDIR     "%LIBEXECDIR%"
 
-/* default ldap host */
-#define LDAPHOST       "localhost"
+#define DEFAULT_LDAP_CONF_FILE "%SYSCONFDIR%/ldap.conf"
+#define DEFAULT_LDAP_USERRC_FILE "ldaprc"
+#define DEFAULT_LDAP_ENV_PREFIX "LDAP"
 
-#define DEFAULT_LDAPHOST_FILE "%SYSCONFDIR%/ldaphost"
-/* default place to start searching */
-#define DEFAULT_BASE   "o=Your Organization Name, c=US"
-#define DEFAULT_BASE_FILE "%SYSCONFDIR%/ldapbase"
-
-/*
- * default binddn and creditials
- *  use files, make sure they are not generally readable
- */
-#define DEFAULT_BINDDN         NULL
-#define DEFAULT_BINDDN_FILE "%SYSCONFDIR%/ldapbinddn"
-
-#define DEFAULT_BIND_CRED      NULL
-#define DEFAULT_BIND_CRED_FILE "%SYSCONFDIR%/ldapbindcred"
 
 /*********************************************************************
  *                                                                   *
 /*
  * FINGER DEFINITIONS
  */
-       /* who to bind as */
-#define FINGER_BINDDN                  NULL
-#define FINGER_BIND_CRED               NULL
-       /* where to search */
-#define FINGER_BASE                            DEFAULT_BASE
        /* banner to print */
-#define FINGER_BANNER          "X.500 Finger Service...\r\n"
+#define FINGER_BANNER          "OpenLDAP Finger Service...\r\n"
        /* who to report errors to */
 #define FINGER_ERRORS          "System Administrator"
        /* what to say if no matches are found */
@@ -106,11 +88,6 @@ Please try again later.\r\n"
 /*
  * GO500 GOPHER GATEWAY DEFINITIONS
  */
-       /* who to bind as */
-#define GO500_BINDDN   NULL
-#define GO500_BIND_CRED        NULL
-       /* where to search */
-#define GO500_BASE     DEFAULT_BASE
        /* port on which to listen */
 #define GO500_PORT     5555
        /* how to handle aliases */
@@ -132,9 +109,6 @@ Please try again later.\r\n"
 /*
  * GO500GW GOPHER GATEWAY DEFINITIONS
  */
-       /* who to bind as */
-#define GO500GW_BINDDN                 NULL
-#define GO500GW_BIND_CRED              NULL
        /* where the helpfile lives */
 #define GO500GW_HELPFILE       "%SYSCONFDIR%/go500gw.help"
        /* port on which to listen */
@@ -156,9 +130,6 @@ Please try again later.\r\n"
 /*
  * RCPT500 MAIL RESPONDER GATEWAY DEFINITIONS
  */
-       /* who to bind as */
-#define RCPT500_BINDDN         NULL
-#define RCPT500_BIND_CRED      NULL
        /* where the helpfile lives */
 #define RCPT500_HELPFILE       "%SYSCONFDIR%/rcpt500.help"
        /* maximum number of matches returned */
@@ -168,8 +139,6 @@ Please try again later.\r\n"
        /* command that will accept an RFC822 message text on standard
           input, and send it.  sendmail -t does this nicely. */
 #define RCPT500_PIPEMAILCMD    "%SENDMAIL% -t"
-        /* where to search */
-#define RCPT500_BASE             DEFAULT_BASE
        /* attribute to use when sorting results */
 #define RCPT500_SORT_ATTR      SORT_ATTR
        /* max number of hits displayed in full before a list is presented */
@@ -179,48 +148,9 @@ Please try again later.\r\n"
        /* number of DN components to show in entry displays */
 #define RCPT500_RDNCOUNT       DEFAULT_RDNCOUNT        
 
-/*
- * LDAPSEARCH TOOL
- */
-       /* who to bind as */
-#define LDAPSEARCH_BINDDN              NULL
-#define LDAPSEARCH_BIND_CRED   NULL
-       /* search base */
-#define LDAPSEARCH_BASE                DEFAULT_BASE
-
-/*
- * LDAPMODIFY TOOL
- */
-       /* who to bind as */
-#define LDAPMODIFY_BINDDN              NULL
-#define LDAPMODIFY_BIND_CRED   NULL
-       /* search base */
-#define LDAPMODIFY_BASE                DEFAULT_BASE
-
-/*
- * LDAPDELETE TOOL
- */
-       /* who to bind as */
-#define LDAPDELETE_BINDDN              NULL
-#define LDAPDELETE_BIND_CRED   NULL
-       /* search base */
-#define LDAPDELETE_BASE                DEFAULT_BASE
-
-/*
- * LDAPMODRDN TOOL
- */
-       /* who to bind as */
-#define LDAPMODRDN_BINDDN              NULL
-#define LDAPMODRDN_BIND_CRED   NULL
-       /* search base */
-#define LDAPMODRDN_BASE                DEFAULT_BASE
-
 /*
  * MAIL500 MAILER DEFINITIONS
  */
-       /* who to bind as */
-#define MAIL500_BINDDN                 NULL
-#define MAIL500_BIND_CRED                      NULL
        /* max number of ambiguous matches reported */
 #define MAIL500_MAXAMBIGUOUS   10
        /* max subscribers allowed (size limit when searching for them ) */
@@ -239,12 +169,6 @@ Please try again later.\r\n"
 #define UD_DEFAULT_EDITOR      "%EDITOR%"
        /* default bbasename of user config file */
 #define UD_USER_CONFIG_FILE    ".udrc"
-       /* default user to bind as */
-#define UD_BINDDN              NULL
-       /* default password to bind with */
-#define UD_BIND_CRED   NULL
-       /* default search base */
-#define UD_BASE                DEFAULT_BASE
        /* default base where groups are created */
 #define UD_WHERE_GROUPS_ARE_CREATED    ""
        /* default base below which all groups live */
@@ -253,11 +177,6 @@ Please try again later.\r\n"
 /*
  * FAX500 DEFINITIONS
  */
-       /* what to bind as */
-#define FAX_BINDDN             NULL
-#define FAX_BIND_CRED  NULL
-       /* default search base */
-#define FAX_BASE               DEFAULT_BASE
        /* how long to wait for searches */
 #define FAX_TIMEOUT            180
        /* maximum number of ambiguous matches reported */
@@ -270,12 +189,6 @@ Please try again later.\r\n"
 /*
  * RP500 DEFINITIONS
  */
-       /* what to bind as */
-#define RP_BINDDN              NULL
-#define RP_BIND_CRED   NULL
-       /* default search base */
-#define RP_BASE                        DEFAULT_BASE
-
        /* prefix to add to non-fully-qualified numbers */
 #define RP_PHONEPREFIX ""
 
index 5994b212992b6dac8dcdf02754e06020d25ca6e4..6690a91d0abc1109a75c40879d15e760dfca8ae6 100644 (file)
@@ -5,6 +5,7 @@
 #endif
 
 #include "ldap_cdefs.h"
+#include "ldap_features.h"
 
 #endif /* _LDAP_PORTABLE_H */
 
index 6ccc15f8bb9299ef6350f45ba1a435875dd6e999..e93316ad2fc8ecb92e0edee0994b43790dceb78a 100644 (file)
@@ -541,6 +541,7 @@ is provided ``as is'' without express or implied warranty.
 #endif
 
 #include "ldap_cdefs.h"
+#include "ldap_features.h"
 
 #endif /* _LDAP_PORTABLE_H */
 
index 9b7524c7693e69811a6620f3a92680ea0ddda681..9580ac1db76e42b53a534eec8f6c9d4d95da5e92 100644 (file)
@@ -33,7 +33,7 @@ ltest:        $(LIBRARY) test.o $(LIBLBER)
 ttest: $(LIBRARY) tmpltest.o $(LIBLBER)
        $(CC) $(LDFLAGS) -o $@ tmpltest.o $(LIBS)
 
-CFFILES= ldapfilter.conf ldapfriendly ldaptemplates.conf ldapsearchprefs.conf
+CFFILES= ldap.conf ldapfilter.conf ldapfriendly ldaptemplates.conf ldapsearchprefs.conf
 
 install-local: $(LIBRARY) $(CFFILES) FORCE
        -$(MKDIR) -p $(libdir)
index 5ce38dee7d7a88656ed3ed0ad0f7670947a90a1a..c12859b858ddf9dffe5f906441df2b2ba1eb20dc 100644 (file)
@@ -65,10 +65,6 @@ cldap_open( char *host, int port )
 
     Debug( LDAP_DEBUG_TRACE, "ldap_open\n", 0, 0, 0 );
 
-    if ( port == 0 ) {
-           port = LDAP_PORT;
-    }
-
     if ( (s = socket( AF_INET, SOCK_DGRAM, 0 )) < 0 ) {
        return( NULL );
     }
@@ -87,8 +83,8 @@ cldap_open( char *host, int port )
     }
     if ( (ld->ld_sb.sb_fromaddr = (void *) calloc( 1,
            sizeof( struct sockaddr ))) == NULL ) {
-       free( ld );
-       close( s );
+
+       ldap_ld_free(ld, 1);
        return( NULL );
     }  
     ld->ld_sb.sb_sd = s;
@@ -120,8 +116,7 @@ cldap_open( char *host, int port )
                            (char *)hp->h_addr_list[ i ],
                            sizeof(sock.sin_addr.s_addr));
                    if ( add_addr( ld, (struct sockaddr *)&sock ) < 0 ) {
-                       close( s );
-                       free( ld );
+                       ldap_ld_free( ld, 1 );
                        return( NULL );
                    }
                }
@@ -129,8 +124,7 @@ cldap_open( char *host, int port )
            } else {
                sock.sin_addr.s_addr = address;
                if ( add_addr( ld, (struct sockaddr *)&sock ) < 0 ) {
-                   close( s );
-                   free( ld );
+                   ldap_ld_free( ld, 1 );
                    return( NULL );
                }
            }
@@ -144,8 +138,7 @@ cldap_open( char *host, int port )
        address = INADDR_LOOPBACK;
        sock.sin_addr.s_addr = htonl( address );
        if ( add_addr( ld, (struct sockaddr *)&sock ) < 0 ) {
-           close( s );
-           free( ld );
+           ldap_ld_free( ld, 1 );
            return( NULL );
        }
     }
@@ -155,7 +148,7 @@ cldap_open( char *host, int port )
            || ( ld->ld_defconn = ldap_new_connection( ld, NULL, 1,0,0 )) == NULL
 #endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS */
            ) {
-       free( ld );
+       ldap_ld_free( ld, 0 );
        return( NULL );
     }
 
index 3c8771f6f357a521467575efc4892006370922f8..da6ed406cee2e5a061b997f4ee0563f2b7d98870 100644 (file)
@@ -8,6 +8,7 @@
 #include <ac/time.h>
 
 #include "ldap-int.h"
+#include "ldapconfig.h"
 
 struct ldapoptions openldap_ldap_global_options; 
 
@@ -16,6 +17,242 @@ struct ldapoptions openldap_ldap_global_options;
 
 int    openldap_ldap_initialized = 0;
 
+#define ATTR_NONE      0
+#define ATTR_BOOL      1
+#define ATTR_INT       2
+#define ATTR_KV                3
+#define ATTR_STRING    4
+
+struct ol_keyvalue {
+       char*           key;
+       int                     value;
+};
+
+struct ol_keyvalue deref_kv[] = {
+       {"never", LDAP_DEREF_NEVER},
+       {"searching", LDAP_DEREF_SEARCHING},
+       {"finding", LDAP_DEREF_FINDING},
+       {"always", LDAP_DEREF_ALWAYS},
+       {NULL, 0}
+};
+
+struct ol_attribute {
+       int                     type;
+       char*           name;
+       void*           data;
+       size_t          offset;
+} attrs[] = {
+       {ATTR_KV,               "DEREF",                &deref_kv,
+               offsetof(struct ldapoptions, ldo_deref)},
+       {ATTR_INT,              "SIZELIMIT",    NULL,
+               offsetof(struct ldapoptions, ldo_sizelimit)},
+       {ATTR_INT,              "TIMELIMIT",    NULL,
+               offsetof(struct ldapoptions, ldo_timelimit)},
+       {ATTR_STRING,   "BASE",                 NULL,
+               offsetof(struct ldapoptions, ldo_defbase)},
+       {ATTR_STRING,   "HOST",                 NULL,
+               offsetof(struct ldapoptions, ldo_defhost)},
+       {ATTR_INT,              "PORT",                 NULL,
+               offsetof(struct ldapoptions, ldo_defport)},
+       {ATTR_BOOL,             "REFERRALS",    (void *) LDAP_BOOL_REFERRALS, 0},
+       {ATTR_BOOL,             "RESTART",              (void *) LDAP_BOOL_RESTART, 0},
+       {ATTR_BOOL,             "DNS",                  (void *) LDAP_BOOL_DNS, 0},
+       {ATTR_NONE,     NULL, 0}
+};
+
+#define MAX_LDAP_ATTR_LEN  sizeof("SIZELIMIT")
+#define MAX_LDAP_ENV_PREFIX_LEN 8
+
+static void openldap_ldap_init_w_conf(const char *file)
+{
+       char buf[MAX_LDAP_ATTR_LEN];
+       char linebuf[128];
+       FILE *fp;
+       int i;
+       char *cmd, *opt;
+       char *start, *end;
+
+       fp = fopen(file, "r");
+       if(fp == NULL) {
+               /* could not open file */
+               return;
+       }
+
+       while((start = fgets(linebuf, sizeof(linebuf), fp)) != NULL) {
+               /* skip lines starting with '#' */
+               if(*start == '#') continue;
+
+               /* trim leading white space */
+               while((*start != '\0') && isspace(*start)) start++;
+
+               /* anything left? */
+               if(*start == '\0') continue;
+
+               /* trim trailing white space */
+               end = &start[strlen(start)-1];
+               while(isspace(*end)) end--;
+               end[1] = '\0';
+
+               /* anything left? */
+               if(*start == '\0') continue;
+               
+
+               /* parse the command */
+               cmd=start;
+               while((*start != '\0') && !isspace(*start)) {
+                       start++;
+               }
+               if(*start == '\0') {
+                       /* command has no argument */
+                       continue;
+               } 
+
+               *start++ = '\0';
+
+               /* we must have some non-whitespace to skip */
+               while(isspace(*start)) start++;
+               opt = start;
+
+               for(i=0; attrs[i].type != ATTR_NONE; i++) {
+                       void *p;
+
+                       if(strcasecmp(cmd, attrs[i].name) != 0) {
+                               continue;
+                       }
+
+                       p = &((char *) &gopts)[attrs[i].offset];
+
+                       switch(attrs[i].type) {
+                       case ATTR_BOOL:
+                               if((strcasecmp(opt, "on") == 0) 
+                                       || (strcasecmp(opt, "yes") == 0)
+                                       || (strcasecmp(opt, "true") == 0))
+                               {
+                                       LDAP_BOOL_SET(&gopts, (int) attrs[i].data);
+
+                               } else {
+                                       LDAP_BOOL_CLR(&gopts, (int) attrs[i].data);
+                               }
+
+                               break;
+
+                       case ATTR_INT:
+                               * (int*) p = atoi(opt);
+                               break;
+
+                       case ATTR_KV: {
+                                       struct ol_keyvalue *kv;
+
+                                       for(kv = (struct ol_keyvalue *) attrs[i].data;
+                                               kv->key != NULL;
+                                               kv++) {
+
+                                               if(strcasecmp(opt, kv->key) == 0) {
+                                                       * (int*) p = kv->value;
+                                                       break;
+                                               }
+                                       }
+                               } break;
+
+                       case ATTR_STRING:
+                               if (* (char**) p != NULL) free(* (char**) p);
+                               * (char**) p = strdup(opt);
+                               break;
+                       }
+               }
+       }
+}
+
+static void openldap_ldap_init_w_userconf(const char *file)
+{
+       char *home = getenv("HOME");
+       char *path = malloc(strlen(home) + strlen(file) + 3);
+
+       /* try ~/file */
+       sprintf(path, "%s/%s", home, file);
+       openldap_ldap_init_w_conf(path);
+
+       /* try ~/.file */
+       sprintf(path, "%s/.%s", home, file);
+       openldap_ldap_init_w_conf(path);
+
+       /* try file */
+       openldap_ldap_init_w_conf(file);
+
+       /* try .file */
+       sprintf(path, "%s/.%s", home, file);
+       openldap_ldap_init_w_conf(path);
+}
+
+static void openldap_ldap_init_w_env(const char *prefix)
+{
+       char buf[MAX_LDAP_ATTR_LEN+MAX_LDAP_ENV_PREFIX_LEN];
+       int len;
+       int i;
+       void *p;
+       char *value;
+
+       if (prefix == NULL) {
+               prefix = DEFAULT_LDAP_ENV_PREFIX;
+       }
+
+       strncpy(buf, prefix, MAX_LDAP_ENV_PREFIX_LEN);
+       buf[MAX_LDAP_ENV_PREFIX_LEN] = '\0';
+       len = strlen(buf);
+
+       for(i=0; attrs[i].type != ATTR_NONE; i++) {
+               strcpy(&buf[len], attrs[i].name);
+               value = getenv(buf);
+
+               if(value == NULL) {
+                       continue;
+               }
+
+               p = &((char *) &gopts)[attrs[i].offset];
+
+               switch(attrs[i].type) {
+               case ATTR_BOOL:
+                       if((strcasecmp(value, "on") == 0) 
+                               || (strcasecmp(value, "yes") == 0)
+                               || (strcasecmp(value, "true") == 0))
+                       {
+                               LDAP_BOOL_SET(&gopts, (int) attrs[i].data);
+
+                       } else {
+                               LDAP_BOOL_CLR(&gopts, (int) attrs[i].data);
+                       }
+                       break;
+
+               case ATTR_INT:
+                       * (int*) p = atoi(value);
+                       break;
+
+               case ATTR_KV: {
+                               struct ol_keyvalue *kv;
+
+                               for(kv = (struct ol_keyvalue *) attrs[i].data;
+                                       kv->key != NULL;
+                                       kv++) {
+
+                                       if(strcasecmp(value, kv->key) == 0) {
+                                               * (int*) p = kv->value;
+                                               break;
+                                       }
+                               }
+                       } break;
+
+               case ATTR_STRING:
+                       if (* (char**) p != NULL) free(* (char**) p);
+                       if (*value == '\0') {
+                               * (char**) p = NULL;
+                       } else {
+                               * (char**) p = strdup(value);
+                       }
+                       break;
+               }
+       }
+}
+
 void openldap_ldap_initialize( void )
 {
        if ( openldap_ldap_initialized ) {
@@ -30,6 +267,8 @@ void openldap_ldap_initialize( void )
        gopts.ldo_defhost = strdup("localhost");
        gopts.ldo_defport = LDAP_PORT;
 
+       gopts.ldo_refhoplimit = LDAP_DEFAULT_REFHOPLIMIT;
+
        LDAP_BOOL_ZERO(&gopts);
 
 #if defined( LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS ) || \
@@ -37,5 +276,9 @@ void openldap_ldap_initialize( void )
        LDAP_BOOL_SET(&gopts, LDAP_BOOL_REFERRALS);
 #endif
 
+       openldap_ldap_init_w_conf(DEFAULT_LDAP_CONF_FILE);
+       openldap_ldap_init_w_userconf(DEFAULT_LDAP_USERRC_FILE);
+       openldap_ldap_init_w_env(NULL);
+
        openldap_ldap_initialized = 1;
 }
index 97e62695924b78a820267d2620cb15d9627c6d0c..a047cc54e83a628044c21f2b44eced9c33d346d6 100644 (file)
@@ -67,6 +67,7 @@ struct ldapoptions {
        int             ldo_timelimit;
        int             ldo_sizelimit;
 
+       char*   ldo_defbase;
        char*   ldo_defhost;
        int             ldo_defport;
 
@@ -90,6 +91,10 @@ struct ldap {
 #define ld_timelimit   ld_options.ldo_timelimit
 #define ld_sizelimit   ld_options.ldo_sizelimit
 
+#define ld_defbase             ld_options.ldo_defbase
+#define ld_defhost             ld_options.ldo_defhost
+#define ld_defport             ld_options.ldo_defport
+
 #define ld_cldaptries  ld_options.ldo_cldaptries
 #define ld_cldaptimeout        ld_options.ldo_cldaptimeout
 #define ld_refhoplimit ld_options.ldo_refhoplimit
@@ -121,8 +126,6 @@ struct ldap {
        char            *ld_cldapdn;    /* DN used in connectionless search */
 
        /* 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;
 
index fa383284b4159caed78ee2110212af88361ceed9..ff88c634638995dade20d91634f61a77315dcaaf 100644 (file)
@@ -53,6 +53,9 @@ ldap_open( char *host, int port )
                return( NULL );
        }
 
+       /* we'll assume we're talking version 2 for now */
+       ld->ld_version = LDAP_VERSION2;
+
 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS
        if (( srv = (LDAPServer *)calloc( 1, sizeof( LDAPServer ))) ==
            NULL || ( ld->ld_defhost != NULL && ( srv->lsrv_host =
@@ -88,11 +91,11 @@ ldap_open( char *host, int port )
 /*
  * 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
+ * "host" may be a space-separated list of hosts or IP addresses
  *
  * Example:
  *     LDAP    *ld;
- *     ld = ldap_open( default_hostname, default_port );
+ *     ld = ldap_open( host, port );
  */
 LDAP *
 ldap_init( char *defhost, int defport )
@@ -146,38 +149,42 @@ ldap_init( char *defhost, int defport )
                return( NULL );
        }
 
-#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS
-       if (( ld->ld_selectinfo = ldap_new_select_info()) == NULL ) {
+       /* copy the global options */
+       memcpy(&ld->ld_options, &openldap_ldap_global_options,
+               sizeof(ld->ld_options));
+
+       /* but not pointers to malloc'ed strings */
+       ld->ld_options.ldo_defbase = NULL;
+       ld->ld_options.ldo_defhost = NULL;
+
+       if ( defhost != NULL ) {
+               ld->ld_options.ldo_defhost = strdup( defhost );
+       } else {
+               ld->ld_options.ldo_defhost = strdup(
+                       openldap_ldap_global_options.ldo_defhost);
+       }
+
+       if ( ld->ld_options.ldo_defhost == NULL ) {
                free( (char*)ld );
            WSACleanup( );
                return( NULL );
        }
 
-       LDAP_BOOL_ZERO(&ld->ld_options);
-       LDAP_BOOL_SET(&ld->ld_options, LDAP_BOOL_REFERRALS);
-#else
-       LDAP_BOOL_ZERO(&ld->ld_options);
-#endif
-
-       if ( defhost != NULL &&
-           ( ld->ld_defhost = strdup( defhost )) == NULL ) {
 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS
-               ldap_free_select_info( ld->ld_selectinfo );
-#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS */
-               free( (char*)ld );
+       if (( ld->ld_selectinfo = ldap_new_select_info()) == NULL ) {
+               free( (char*) ld->ld_options.ldo_defhost );
+               free( (char*) ld->ld_options.ldo_defbase );
+               free( (char*) ld );
            WSACleanup( );
                return( NULL );
        }
+#endif
 
+       if(defport != 0) {
+               ld->ld_defport = defport;
+       }
 
-       ld->ld_defport = ( defport == 0 ) ? LDAP_PORT : defport;
-       ld->ld_version = LDAP_VERSION;
        ld->ld_lberoptions = LBER_USE_DER;
-       ld->ld_options.ldo_refhoplimit = LDAP_DEFAULT_REFHOPLIMIT;
-
-#ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS
-       LDAP_BOOL_SET(&ld->ld_options, LDAP_BOOL_REFERRALS);
-#endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS */
 
 #if defined( STR_TRANSLATION ) && defined( LDAP_DEFAULT_CHARSET )
        ld->ld_lberoptions |= LBER_TRANSLATE_STRINGS;
index 18b8fa6a2cf73255e109d2dd10fe61f8e1371ed8..182e7df67d0a45a9e45eeb42525e58a584557147 100644 (file)
@@ -112,12 +112,11 @@ ldap_get_option(
                return 0;
 
        case LDAP_OPT_PROTOCOL_VERSION:
-               if(ld == NULL) {
-                       /* bad param */
-                       break;
-               } 
-
-               * (int *) outvalue = ld->ld_version;
+               if ((ld != NULL) && ld->ld_version) {
+                       * (int *) outvalue = ld->ld_version;
+               } else { 
+                       * (int *) outvalue = lo->ldo_version;
+               }
                return 0;
 
        case LDAP_OPT_SERVER_CONTROLS:
@@ -126,11 +125,13 @@ ldap_get_option(
                break;
 
        case LDAP_OPT_HOST_NAME:
-               if(ld == NULL) {
-                       /* bad param */
-                       break;
-               } 
-               * (char **) outvalue = ld->ld_host;
+               /*
+                * draft-ietf-ldapext-ldap-c-api-01 doesn't state
+                * whether client to have to free host names or no,
+                * we do
+                */
+
+               * (char **) outvalue = strdup(lo->ldo_defhost);
                return 0;
 
        case LDAP_OPT_ERROR_NUMBER:
@@ -147,6 +148,17 @@ ldap_get_option(
                        /* bad param */
                        break;
                } 
+
+               /*
+                * draft-ietf-ldapext-ldap-c-api-01 doesn't require
+                *      the client to have to free error strings, we do
+                */
+
+               if( ld->ld_error == NULL ) {
+                       * (char **) outvalue = NULL;
+               } else {
+                       * (char **) outvalue = strdup(ld->ld_error);
+               }
                break;
 
        default:
@@ -225,11 +237,73 @@ ldap_set_option(
 
        case LDAP_OPT_SERVER_CONTROLS:
        case LDAP_OPT_CLIENT_CONTROLS:
-       case LDAP_OPT_HOST_NAME:
-       case LDAP_OPT_ERROR_NUMBER:
-       case LDAP_OPT_ERROR_STRING:
                /* not yet supported */
                break;
+
+       case LDAP_OPT_HOST_NAME: {
+                       char* host = * (char **) invalue;
+
+                       if(lo->ldo_defhost != NULL) {
+                               free(lo->ldo_defhost);
+                               lo->ldo_defhost = NULL;
+                       }
+
+                       if(host != NULL) {
+                               lo->ldo_defhost = strdup(host);
+                               return 0;
+                       }
+
+                       if(ld == NULL) {
+                               /*
+                                * must want global default returned
+                                * to initial condition.
+                                */
+                               lo->ldo_defhost = strdup("localhost");
+
+                       } else {
+                               /*
+                                * must want the session default
+                                *   updated to the current global default
+                                */
+                               lo->ldo_defhost = strdup(
+                                       openldap_ldap_global_options.ldo_defhost);
+                       }
+               } return 0;
+
+       case LDAP_OPT_ERROR_NUMBER: {
+                       int err = * (int *) invalue;
+
+                       if (err != 0 ) {
+                               /* not supported */
+                               /* we only allow ld_errno to be cleared. */
+                               break;
+                       }
+
+                       if(ld == NULL) {
+                               /* need a struct ldap */
+                               break;
+                       }
+
+                       ld->ld_errno = err;
+               } return 0;
+
+       case LDAP_OPT_ERROR_STRING: {
+                       char* err = * (char **) invalue;
+
+                       if (err != NULL ) {
+                               /* not supported */
+                               /* we only allow ld_error to be cleared. */
+                               break;
+                       }
+
+                       if(ld == NULL) {
+                               /* need a struct ldap */
+                               break;
+                       }
+
+                       ld->ld_error = err;
+               } return 0;
+
        default:
                /* bad param */
                break;
index f46c45adc829ceb1ba959c8f9bf74338fc099899..d641ec3f9c7a5c4be0cabfa9a28e00a66b696e68 100644 (file)
@@ -98,8 +98,11 @@ ldap_ld_free( LDAP *ld, int close )
                ldap_free_select_info( ld->ld_selectinfo );
 #endif /* LDAP_API_FEATURE_X_OPENLDAP_V2_REFERRALS */
 
-       if ( ld->ld_defhost != NULL )
-               free( ld->ld_defhost );
+       if ( ld->ld_options.ldo_defbase != NULL )
+               free( ld->ld_options.ldo_defbase );
+
+       if ( ld->ld_options.ldo_defhost != NULL )
+               free( ld->ld_options.ldo_defhost );
 
        free( (char *) ld );
 
index 8e964ed05e90f3619ba48e891d90f4e1472048cd..266b26bad9e67ab3491b976f0d81d8d7bcba5be0 100644 (file)
@@ -11,7 +11,6 @@
 #include <lber.h>
 #include <ldap.h>
 
-#include <ldapconfig.h>
 #include <ldbm.h>
 
 #define DEFAULT_LDAPFILTER     "(objectclass=*)"
@@ -89,8 +88,8 @@ main( int argc, char **argv )
 
        ldapsrcurl = NULL;
        ldapdesturl = NULL;
-       ldaphost = LDAPHOST;
-       ldapbase = DEFAULT_BASE;
+       ldaphost = NULL;
+       ldapbase = NULL;
        srcldapauthmethod = LDAP_AUTH_SIMPLE;
        destldapauthmethod = LDAP_AUTH_SIMPLE;
        srcldapbinddn = NULL;