]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/init.c
Patch: More format bugs (ITS#1702)
[openldap] / libraries / libldap / init.c
index 8c453154ae5acd7e21bb4b4e3c7a209dccb90ce5..c6b68759823304508494be73f768def571f82827 100644 (file)
@@ -1,6 +1,6 @@
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 #include "portable.h"
@@ -115,7 +115,12 @@ static void openldap_ldap_init_w_conf(
                return;
        }
 
+#ifdef NEW_LOGGING
+       LDAP_LOG (( "init", LDAP_LEVEL_DETAIL1, 
+               "openldap_init_w_conf: trying %s\n", file ));
+#else
        Debug(LDAP_DEBUG_TRACE, "ldap_init: trying %s\n", file, 0, 0);
+#endif
 
        fp = fopen(file, "r");
        if(fp == NULL) {
@@ -123,7 +128,12 @@ static void openldap_ldap_init_w_conf(
                return;
        }
 
+#ifdef NEW_LOGGING
+       LDAP_LOG (( "init", LDAP_LEVEL_DETAIL1, 
+               "openldap_init_w_conf: using %s\n", file ));
+#else
        Debug(LDAP_DEBUG_TRACE, "ldap_init: using %s\n", file, 0, 0);
+#endif
 
        while((start = fgets(linebuf, sizeof(linebuf), fp)) != NULL) {
                /* skip lines starting with '#' */
@@ -251,23 +261,33 @@ static void openldap_ldap_init_w_userconf(const char *file)
        home = getenv("HOME");
 
        if (home != NULL) {
+#ifdef NEW_LOGGING
+       LDAP_LOG (( "init", LDAP_LEVEL_ARGS, 
+               "openldap_init_w_userconf: HOME env is %s\n", home ));
+#else
                Debug(LDAP_DEBUG_TRACE, "ldap_init: HOME env is %s\n",
                      home, 0, 0);
+#endif
                path = LDAP_MALLOC(strlen(home) + strlen(file) + 3);
        } else {
+#ifdef NEW_LOGGING
+       LDAP_LOG (( "init", LDAP_LEVEL_ARGS, 
+               "openldap_init_w_userconf: HOME env is NULL\n" ));
+#else
                Debug(LDAP_DEBUG_TRACE, "ldap_init: HOME env is NULL\n",
                      0, 0, 0);
+#endif
        }
 
        if(home != NULL && path != NULL) {
                /* we assume UNIX path syntax is used... */
 
                /* try ~/file */
-               sprintf(path, "%s/%s", home, file);
+               sprintf(path, "%s%s%s", home, LDAP_DIRSEP, file);
                openldap_ldap_init_w_conf(path, 1);
 
                /* try ~/.file */
-               sprintf(path, "%s/.%s", home, file);
+               sprintf(path, "%s%s.%s", home, LDAP_DIRSEP, file);
                openldap_ldap_init_w_conf(path, 1);
        }
 
@@ -364,6 +384,31 @@ static void openldap_ldap_init_w_env(
        }
 }
 
+#if defined(__GNUC__)
+/* Declare this function as a destructor so that it will automatically be
+ * invoked either at program exit (if libldap is a static library) or
+ * at unload time (if libldap is a dynamic library).
+ *
+ * Sorry, don't know how to handle this for non-GCC environments.
+ */
+static void ldap_int_destroy_global_options(void)
+       __attribute__ ((destructor));
+#endif
+
+static void
+ldap_int_destroy_global_options(void)
+{
+       struct ldapoptions *gopts = LDAP_INT_GLOBAL_OPT();
+
+       if ( gopts->ldo_defludp ) {
+               ldap_free_urllist( gopts->ldo_defludp );
+               gopts->ldo_defludp = NULL;
+       }
+#if defined(HAVE_WINSOCK) || defined(HAVE_WINSOCK2)
+       WSACleanup( );
+#endif
+}
+
 /* 
  * Initialize the global options structure with default values.
  */
@@ -382,11 +427,16 @@ void ldap_int_initialize_global_options( struct ldapoptions *gopts, int *dbglvl
        gopts->ldo_tm_api = (struct timeval *)NULL;
        gopts->ldo_tm_net = (struct timeval *)NULL;
 
-       /* ldo_defludp is leaked, we should have an at_exit() handler
-        * to free this and whatever else needs to cleaned up. 
+       /* ldo_defludp will be freed by the termination handler
         */
        ldap_url_parselist(&gopts->ldo_defludp, "ldap://localhost/");
        gopts->ldo_defport = LDAP_PORT;
+#if !defined(__GNUC__) && !defined(PIC)
+       /* Do this only for a static library, and only if we can't
+        * arrange for it to be executed as a library destructor
+        */
+       atexit(ldap_int_destroy_global_options);
+#endif
 
        gopts->ldo_refhoplimit = LDAP_DEFAULT_REFHOPLIMIT;
        gopts->ldo_rebind_proc = NULL;
@@ -432,11 +482,46 @@ void ldap_int_initialize( struct ldapoptions *gopts, int *dbglvl )
                return;
        }
 
+       ldap_int_error_init();
+
+#ifdef HAVE_WINSOCK2
+{      WORD wVersionRequested;
+       WSADATA wsaData;
+       wVersionRequested = MAKEWORD( 2, 0 );
+       if ( WSAStartup( wVersionRequested, &wsaData ) != 0 ) {
+               /* Tell the user that we couldn't find a usable */
+               /* WinSock DLL.                                  */
+               return;
+       }
+       /* Confirm that the WinSock DLL supports 2.0.*/
+       /* Note that if the DLL supports versions greater    */
+       /* than 2.0 in addition to 2.0, it will still return */
+       /* 2.0 in wVersion since that is the version we      */
+       /* requested.                                        */
+       if ( LOBYTE( wsaData.wVersion ) != 2 ||
+               HIBYTE( wsaData.wVersion ) != 0 )
+       {
+           /* Tell the user that we couldn't find a usable */
+           /* WinSock DLL.                                  */
+           WSACleanup( );
+           return; 
+       }
+}      /* The WinSock DLL is acceptable. Proceed. */
+#elif HAVE_WINSOCK
+{      WSADATA wsaData;
+       if ( WSAStartup( 0x0101, &wsaData ) != 0 ) {
+           return;
+       }
+}
+#endif
+
 #if defined(LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND) \
        || defined(HAVE_TLS) || defined(HAVE_CYRUS_SASL)
        ldap_int_hostname = ldap_pvt_get_fqdn( ldap_int_hostname );
 #endif
-
        ldap_int_utils_init();
 
        if ( ldap_int_tblsize == 0 )
@@ -457,8 +542,7 @@ void ldap_int_initialize( struct ldapoptions *gopts, int *dbglvl )
                if( user == NULL ) user = getenv("LOGNAME");
 
                if( user != NULL ) {
-                       /* this value is leaked, need at_exit() handler */
-                       gopts->ldo_def_sasl_authcid = LDAP_STRDUP( user );
+                       gopts->ldo_def_sasl_authcid = user;
                }
     }
 #endif
@@ -470,26 +554,50 @@ void ldap_int_initialize( struct ldapoptions *gopts, int *dbglvl )
                char *altfile = getenv(LDAP_ENV_PREFIX "CONF");
 
                if( altfile != NULL ) {
+#ifdef NEW_LOGGING
+                       LDAP_LOG (( "init", LDAP_LEVEL_DETAIL1, 
+                               "openldap_init_w_userconf: %sCONF env is %s\n",
+                               LDAP_ENV_PREFIX, altfile ));
+#else
                        Debug(LDAP_DEBUG_TRACE, "ldap_init: %s env is %s\n",
                              LDAP_ENV_PREFIX "CONF", altfile, 0);
+#endif
                        openldap_ldap_init_w_sysconf( altfile );
                }
                else
+#ifdef NEW_LOGGING
+                       LDAP_LOG (( "init", LDAP_LEVEL_DETAIL1, 
+                               "openldap_init_w_userconf: %sCONF env is NULL\n",
+                               LDAP_ENV_PREFIX ));
+#else
                        Debug(LDAP_DEBUG_TRACE, "ldap_init: %s env is NULL\n",
                              LDAP_ENV_PREFIX "CONF", 0, 0);
+#endif
        }
 
        {
                char *altfile = getenv(LDAP_ENV_PREFIX "RC");
 
                if( altfile != NULL ) {
+#ifdef NEW_LOGGING
+                       LDAP_LOG (( "init", LDAP_LEVEL_DETAIL1, 
+                               "openldap_init_w_userconf: %sRC env is %s\n",
+                               LDAP_ENV_PREFIX, altfile ));
+#else
                        Debug(LDAP_DEBUG_TRACE, "ldap_init: %s env is %s\n",
                              LDAP_ENV_PREFIX "RC", altfile, 0);
+#endif
                        openldap_ldap_init_w_userconf( altfile );
                }
                else
+#ifdef NEW_LOGGING
+                       LDAP_LOG (( "init", LDAP_LEVEL_DETAIL1, 
+                               "openldap_init_w_userconf: %sRC env is NULL\n",
+                               LDAP_ENV_PREFIX ));
+#else
                        Debug(LDAP_DEBUG_TRACE, "ldap_init: %s env is NULL\n",
                              LDAP_ENV_PREFIX "RC", 0, 0);
+#endif
        }
 
        openldap_ldap_init_w_env(gopts, NULL);