X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Finit.c;h=c6b68759823304508494be73f768def571f82827;hb=b0b8546f054f31b1a080defede171f833d20b124;hp=e123e06118d36bd84c65e87c1a166204d44ffcb2;hpb=dfba82c4416985ef4d3110c62fc3f898ada14276;p=openldap diff --git a/libraries/libldap/init.c b/libraries/libldap/init.c index e123e06118..c6b6875982 100644 --- a/libraries/libldap/init.c +++ b/libraries/libldap/init.c @@ -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,12 +261,22 @@ 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) { @@ -364,6 +384,17 @@ 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) { @@ -373,6 +404,9 @@ ldap_int_destroy_global_options(void) ldap_free_urllist( gopts->ldo_defludp ); gopts->ldo_defludp = NULL; } +#if defined(HAVE_WINSOCK) || defined(HAVE_WINSOCK2) + WSACleanup( ); +#endif } /* @@ -393,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 wll be freed by the atexit() handler + /* 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; @@ -445,11 +484,44 @@ void ldap_int_initialize( struct ldapoptions *gopts, int *dbglvl ) 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 ) @@ -482,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);