#ifdef USE_LDAP
-#include <sys/time.h>
#include <glib.h>
+#include <sys/time.h>
+#include <string.h>
#include <ldap.h>
#include <lber.h>
#include <pthread.h>
#include "addritem.h"
#include "addrcache.h"
#include "syldap.h"
+#include "utils.h"
/*
* Create new LDAP server interface object.
*/
SyldapServer *syldap_create() {
SyldapServer *ldapServer;
+
+ debug_print("Creating LDAP server interface object\n");
+
ldapServer = g_new0( SyldapServer, 1 );
ldapServer->name = NULL;
ldapServer->hostName = NULL;
ldapServer->retVal = MGU_SUCCESS;
ldapServer->callBack = NULL;
ldapServer->accessFlag = FALSE;
+ ldapServer->idleId = 0;
return ldapServer;
}
}
gint syldap_get_status( SyldapServer *ldapServer ) {
- g_return_if_fail( ldapServer != NULL );
+ g_return_val_if_fail( ldapServer != NULL, -1 );
return ldapServer->retVal;
}
+
ItemFolder *syldap_get_root_folder( SyldapServer *ldapServer ) {
- g_return_if_fail( ldapServer != NULL );
+ g_return_val_if_fail( ldapServer != NULL, NULL );
return addrcache_get_root_folder( ldapServer->addressCache );
}
+
gchar *syldap_get_name( SyldapServer *ldapServer ) {
- g_return_if_fail( ldapServer != NULL );
+ g_return_val_if_fail( ldapServer != NULL, NULL );
return ldapServer->name;
}
+
gboolean syldap_get_accessed( SyldapServer *ldapServer ) {
- g_return_if_fail( ldapServer != NULL );
+ g_return_val_if_fail( ldapServer != NULL, FALSE );
return ldapServer->accessFlag;
}
void syldap_free( SyldapServer *ldapServer ) {
g_return_if_fail( ldapServer != NULL );
+ debug_print("Freeing LDAP server interface object\n");
+
ldapServer->callBack = NULL;
- // Free internal stuff
+ /* Free internal stuff */
g_free( ldapServer->name );
g_free( ldapServer->hostName );
g_free( ldapServer->baseDN );
ldapServer->maxEntries = 0;
ldapServer->newSearch = FALSE;
- // Clear cache
+ /* Clear cache */
addrcache_clear( ldapServer->addressCache );
addrcache_free( ldapServer->addressCache );
- // Clear pointers
+ /* Clear pointers */
ldapServer->name = NULL;
ldapServer->hostName = NULL;
ldapServer->baseDN = NULL;
ldapServer->searchCriteria = NULL;
ldapServer->searchValue = NULL;
ldapServer->addressCache = NULL;
+ g_free(ldapServer->thread);
ldapServer->thread = NULL;
ldapServer->busyFlag = FALSE;
ldapServer->retVal = MGU_SUCCESS;
ldapServer->accessFlag = FALSE;
- // Now release LDAP object
+ /* Now release LDAP object */
g_free( ldapServer );
}
* Display object to specified stream.
*/
void syldap_print_data( SyldapServer *ldapServer, FILE *stream ) {
- GSList *node;
g_return_if_fail( ldapServer != NULL );
+
fprintf( stream, "SyldapServer:\n" );
fprintf( stream, " name: '%s'\n", ldapServer->name );
fprintf( stream, "host name: '%s'\n", ldapServer->hostName );
* Display object to specified stream.
*/
void syldap_print_short( SyldapServer *ldapServer, FILE *stream ) {
- GSList *node;
g_return_if_fail( ldapServer != NULL );
+
fprintf( stream, "SyldapServer:\n" );
fprintf( stream, " name: '%s'\n", ldapServer->name );
fprintf( stream, "host name: '%s'\n", ldapServer->hostName );
ItemPerson *person;
ItemEMail *email;
GSList *nodeName = listName;
+
while( nodeName ) {
GSList *nodeAddress = listAddr;
person = addritem_create_item_person();
ItemPerson *person;
ItemEMail *email;
- // Find longest first name in list
+ /* Find longest first name in list */
while( nodeFirst ) {
if( firstName == NULL ) {
firstName = nodeFirst->data;
nodeFirst = g_slist_next( nodeFirst );
}
- // Format name
+ /* Format name */
if( listLast ) {
lastName = listLast->data;
}
addrcache_add_person( ldapServer->addressCache, person );
}
- // Add address item
+ /* Add address item */
while( nodeAddress ) {
email = addritem_create_item_email();
addritem_email_set_address( email, nodeAddress->data );
static GSList *syldap_add_list_values( LDAP *ld, LDAPMessage *entry, char *attr ) {
GSList *list = NULL;
gint i;
- char **vals;
+ gchar **vals;
+
if( ( vals = ldap_get_values( ld, entry, attr ) ) != NULL ) {
for( i = 0; vals[i] != NULL; i++ ) {
- // printf( "lv\t%s: %s\n", attr, vals[i] );
+ /* printf( "lv\t%s: %s\n", attr, vals[i] ); */
list = g_slist_append( list, g_strdup( vals[i] ) );
}
}
*/
static GSList *syldap_add_single_value( LDAP *ld, LDAPMessage *entry, char *attr ) {
GSList *list = NULL;
- char **vals;
+ gchar **vals;
+
if( ( vals = ldap_get_values( ld, entry, attr ) ) != NULL ) {
if( vals[0] != NULL ) {
- // printf( "sv\t%s: %s\n", attr, vals[0] );
+ /* printf( "sv\t%s: %s\n", attr, vals[0] ); */
list = g_slist_append( list, g_strdup( vals[0] ) );
}
}
* Return: TRUE if search criteria appear OK.
*/
gboolean syldap_check_search( SyldapServer *ldapServer ) {
- g_return_if_fail( ldapServer != NULL );
+ g_return_val_if_fail( ldapServer != NULL, FALSE );
+
ldapServer->retVal = MGU_LDAP_CRITERIA;
- // Test search criteria
+ /* Test search criteria */
if( ldapServer->searchCriteria == NULL ) {
return FALSE;
}
char *attribute;
gchar *criteria;
BerElement *ber;
- int rc, cnt;
+ gint rc;
GSList *listName = NULL, *listAddress = NULL, *listID = NULL;
GSList *listFirst = NULL, *listLast = NULL, *listDN = NULL;
struct timeval timeout;
gboolean entriesFound = FALSE;
- g_return_if_fail( ldapServer != NULL );
+ g_return_val_if_fail( ldapServer != NULL, -1 );
ldapServer->retVal = MGU_SUCCESS;
if( ! syldap_check_search( ldapServer ) ) {
return ldapServer->retVal;
}
- // Set timeout
+ /* Set timeout */
timeout.tv_sec = ldapServer->timeOut;
timeout.tv_usec = 0L;
return ldapServer->retVal;
}
- // printf( "connected to LDAP host %s on port %d\n", ldapServer->hostName, ldapServer->port );
+ /* printf( "connected to LDAP host %s on port %d\n", ldapServer->hostName, ldapServer->port ); */
- // Bind to the server, if required
+ /* Bind to the server, if required */
if( ldapServer->bindDN ) {
if( * ldapServer->bindDN != '\0' ) {
- // printf( "binding...\n" );
+ /* printf( "binding...\n" ); */
rc = ldap_simple_bind_s( ld, ldapServer->bindDN, ldapServer->bindPass );
- // printf( "rc=%d\n", rc );
+ /* printf( "rc=%d\n", rc ); */
if( rc != LDAP_SUCCESS ) {
- // printf( "LDAP Error: ldap_simple_bind_s: %s\n", ldap_err2string( rc ) );
+ /* printf( "LDAP Error: ldap_simple_bind_s: %s\n", ldap_err2string( rc ) ); */
ldap_unbind( ld );
ldapServer->retVal = MGU_LDAP_BIND;
return ldapServer->retVal;
}
}
- // Define all attributes we are interested in.
+ /* Define all attributes we are interested in. */
attribs[0] = SYLDAP_ATTR_DN;
attribs[1] = SYLDAP_ATTR_COMMONNAME;
attribs[2] = SYLDAP_ATTR_GIVENNAME;
attribs[5] = SYLDAP_ATTR_UID;
attribs[6] = NULL;
- // Create LDAP search string and apply search criteria
+ /* Create LDAP search string and apply search criteria */
criteria = g_strdup_printf( ldapServer->searchCriteria, ldapServer->searchValue );
rc = ldap_search_ext_s( ld, ldapServer->baseDN, LDAP_SCOPE_SUBTREE, criteria, attribs, 0, NULL, NULL,
&timeout, 0, &result );
return ldapServer->retVal;
}
if( rc != LDAP_SUCCESS ) {
- // printf( "LDAP Error: ldap_search_st: %s\n", ldap_err2string( rc ) );
+ /* printf( "LDAP Error: ldap_search_st: %s\n", ldap_err2string( rc ) ); */
ldap_unbind( ld );
ldapServer->retVal = MGU_LDAP_SEARCH;
return ldapServer->retVal;
}
- // printf( "Total results are: %d\n", ldap_count_entries( ld, result ) );
+ /* printf( "Total results are: %d\n", ldap_count_entries( ld, result ) ); */
- // Clear the cache if we have new entries, otherwise leave untouched.
+ /* Clear the cache if we have new entries, otherwise leave untouched. */
if( ldap_count_entries( ld, result ) > 0 ) {
addrcache_clear( ldapServer->addressCache );
}
- // Process results
+ /* Process results */
ldapServer->entriesRead = 0;
for( e = ldap_first_entry( ld, result ); e != NULL; e = ldap_next_entry( ld, e ) ) {
entriesFound = TRUE;
if( ldapServer->entriesRead >= ldapServer->maxEntries ) break;
- // printf( "DN: %s\n", ldap_get_dn( ld, e ) );
+ /* printf( "DN: %s\n", ldap_get_dn( ld, e ) ); */
- // Process all attributes
+ /* Process all attributes */
for( attribute = ldap_first_attribute( ld, e, &ber ); attribute != NULL;
attribute = ldap_next_attribute( ld, e, ber ) ) {
if( strcasecmp( attribute, SYLDAP_ATTR_COMMONNAME ) == 0 ) {
}
}
- // Free memory used to store attribute
+ /* Free memory used to store attribute */
ldap_memfree( attribute );
- // Format and add items to cache
+ /* Format and add items to cache */
syldap_build_items_fl( ldapServer, listAddress, listFirst, listLast );
- // Free up
+ /* Free up */
syldap_free_lists( listName, listAddress, listID, listDN, listFirst, listLast );
listName = listAddress = listID = listFirst = listLast = listDN = NULL;
syldap_free_lists( listName, listAddress, listID, listDN, listFirst, listLast );
listName = listAddress = listID = listFirst = listLast = listDN = NULL;
- // Free up and disconnect
+ /* Free up and disconnect */
ldap_msgfree( result );
ldap_unbind( ld );
ldapServer->newSearch = FALSE;
return ldapServer->retVal;
}
-// ============================================================================================
+/* syldap_display_search_results() - updates the ui. this function is called from the
+ * main thread (the thread running the GTK event loop). */
+static gint syldap_display_search_results(SyldapServer *ldapServer)
+{
+ /* NOTE: when this function is called the accompanying thread should
+ * already be terminated. */
+ gtk_idle_remove(ldapServer->idleId);
+ ldapServer->callBack(ldapServer);
+ /* FIXME: match should know whether to free this SyldapServer stuff. */
+ g_free(ldapServer->thread);
+ ldapServer->thread = NULL;
+ return TRUE;
+}
+
+/* ============================================================================================ */
/*
* Read data into list. Main entry point
* Return: TRUE if file read successfully.
*/
-// ============================================================================================
+/* ============================================================================================ */
gint syldap_read_data( SyldapServer *ldapServer ) {
- g_return_if_fail( ldapServer != NULL );
+ g_return_val_if_fail( ldapServer != NULL, -1 );
ldapServer->accessFlag = FALSE;
pthread_detach( pthread_self() );
if( ldapServer->newSearch ) {
- // Read data into the list
+ /* Read data into the list */
syldap_search( ldapServer );
- // Mark cache
+ /* Mark cache */
ldapServer->addressCache->modified = FALSE;
ldapServer->addressCache->dataRead = TRUE;
ldapServer->accessFlag = FALSE;
}
- // Callback
+ /* Callback */
ldapServer->busyFlag = FALSE;
if( ldapServer->callBack ) {
- sched_yield();
- ( ldapServer->callBack )( ldapServer );
+ /* make the ui thread update the search results */
+ /* TODO: really necessary to call gdk_threads_XXX()??? gtk_idle_add()
+ * should do this - could someone check the GTK sources please? */
+ gdk_threads_enter();
+ ldapServer->idleId = gtk_idle_add(syldap_display_search_results, ldapServer);
+ gdk_threads_leave();
+
}
- ldapServer->thread = NULL;
- pthread_exit( NULL );
+
return ldapServer->retVal;
}
-// ============================================================================================
+/* ============================================================================================ */
/*
* Cancel read with thread.
*/
-// ============================================================================================
+/* ============================================================================================ */
void syldap_cancel_read( SyldapServer *ldapServer ) {
g_return_if_fail( ldapServer != NULL );
+
+ /* DELETEME: this is called from inside UI thread so it's OK, Christoph! */
if( ldapServer->thread ) {
- // printf( "thread cancelled\n" );
+ /* printf( "thread cancelled\n" ); */
pthread_cancel( *ldapServer->thread );
}
+ g_free(ldapServer->thread);
ldapServer->thread = NULL;
ldapServer->busyFlag = FALSE;
}
-// ============================================================================================
+/* ============================================================================================ */
/*
* Read data into list using a background thread.
* Return: TRUE if file read successfully. Callback function will be
* notified when search is complete.
*/
-// ============================================================================================
+/* ============================================================================================ */
gint syldap_read_data_th( SyldapServer *ldapServer ) {
- pthread_t thread;
- g_return_if_fail( ldapServer != NULL );
+ g_return_val_if_fail( ldapServer != NULL, -1 );
ldapServer->busyFlag = FALSE;
syldap_check_search( ldapServer );
if( ldapServer->retVal == MGU_SUCCESS ) {
+// debug_print("Staring LDAP read thread\n");
+
ldapServer->busyFlag = TRUE;
- ldapServer->thread = &thread;
- pthread_create( ldapServer->thread, NULL, (void *) &syldap_read_data, (void *) ldapServer );
+ ldapServer->thread = g_new0(pthread_t, 1);
+ pthread_create( ldapServer->thread, NULL, (void *) syldap_read_data, (void *) ldapServer );
}
return ldapServer->retVal;
}
* Return link list of persons.
*/
GList *syldap_get_list_person( SyldapServer *ldapServer ) {
- g_return_if_fail( ldapServer != NULL );
+ g_return_val_if_fail( ldapServer != NULL, NULL );
return addrcache_get_list_person( ldapServer->addressCache );
}
* Return: NULL.
*/
GList *syldap_get_list_folder( SyldapServer *ldapServer ) {
- g_return_if_fail( ldapServer != NULL );
+ g_return_val_if_fail( ldapServer != NULL, NULL );
return NULL;
}
GList *syldap_read_basedn_s( const gchar *host, const gint port, const gchar *bindDN, const gchar *bindPW, const gint tov ) {
GList *baseDN = NULL;
LDAP *ld;
- int rc, i;
+ gint rc, i;
LDAPMessage *result, *e;
- char *attribs[10];
+ gchar *attribs[10];
BerElement *ber;
- char *attribute;
- char **vals;
+ gchar *attribute;
+ gchar **vals;
struct timeval timeout;
if( host == NULL ) return baseDN;
if( port < 1 ) return baseDN;
- // Set timeout
+ /* Set timeout */
timeout.tv_usec = 0L;
if( tov > 0 ) {
timeout.tv_sec = tov;
timeout.tv_sec = 30L;
}
- // Connect to server.
+ /* Connect to server. */
if( ( ld = ldap_init( host, port ) ) == NULL ) {
return baseDN;
}
- // Bind to the server, if required
+ /* Bind to the server, if required */
if( bindDN ) {
if( *bindDN != '\0' ) {
rc = ldap_simple_bind_s( ld, bindDN, bindPW );
if( rc != LDAP_SUCCESS ) {
- // printf( "LDAP Error: ldap_simple_bind_s: %s\n", ldap_err2string( rc ) );
+ /* printf( "LDAP Error: ldap_simple_bind_s: %s\n", ldap_err2string( rc ) ); */
ldap_unbind( ld );
return baseDN;
}
}
}
- // Test for LDAP version 3
+ /* Test for LDAP version 3 */
attribs[0] = SYLDAP_V3_TEST_ATTR;
attribs[1] = NULL;
rc = ldap_search_ext_s( ld, SYLDAP_SEARCHBASE_V3, LDAP_SCOPE_BASE, SYLDAP_TEST_FILTER, attribs,
0, NULL, NULL, &timeout, 0, &result );
if( rc == LDAP_SUCCESS ) {
- // Process entries
+ /* Process entries */
for( e = ldap_first_entry( ld, result ); e != NULL; e = ldap_next_entry( ld, e ) ) {
- // printf( "DN: %s\n", ldap_get_dn( ld, e ) );
+ /* printf( "DN: %s\n", ldap_get_dn( ld, e ) ); */
- // Process attributes
+ /* Process attributes */
for( attribute = ldap_first_attribute( ld, e, &ber ); attribute != NULL;
attribute = ldap_next_attribute( ld, e, ber ) ) {
if( strcasecmp( attribute, SYLDAP_V3_TEST_ATTR ) == 0 ) {
if( ( vals = ldap_get_values( ld, e, attribute ) ) != NULL ) {
for( i = 0; vals[i] != NULL; i++ ) {
- // printf( "\t%s: %s\n", attribute, vals[i] );
+ /* printf( "\t%s: %s\n", attribute, vals[i] ); */
baseDN = g_list_append( baseDN, g_strdup( vals[i] ) );
}
}
}
if( baseDN == NULL ) {
- // Test for LDAP version 2
+ /* Test for LDAP version 2 */
attribs[0] = NULL;
rc = ldap_search_ext_s( ld, SYLDAP_SEARCHBASE_V2, LDAP_SCOPE_BASE, SYLDAP_TEST_FILTER, attribs,
0, NULL, NULL, &timeout, 0, &result );
if( rc == LDAP_SUCCESS ) {
- // Process entries
+ /* Process entries */
for( e = ldap_first_entry( ld, result ); e != NULL; e = ldap_next_entry( ld, e ) ) {
- // if( baseDN ) break;
- // printf( "DN: %s\n", ldap_get_dn( ld, e ) );
+ /* if( baseDN ) break; */
+ /* printf( "DN: %s\n", ldap_get_dn( ld, e ) ); */
- // Process attributes
+ /* Process attributes */
for( attribute = ldap_first_attribute( ld, e, &ber ); attribute != NULL;
attribute = ldap_next_attribute( ld, e, ber ) ) {
- // if( baseDN ) break;
+ /* if( baseDN ) break; */
if( strcasecmp( attribute, SYLDAP_V2_TEST_ATTR ) == 0 ) {
if( ( vals = ldap_get_values( ld, e, attribute ) ) != NULL ) {
for( i = 0; vals[i] != NULL; i++ ) {
char *ch;
- // Strip the 'ldb:' from the front of the value
+ /* Strip the 'ldb:' from the front of the value */
ch = ( char * ) strchr( vals[i], ':' );
if( ch ) {
gchar *bn = g_strdup( ++ch );
GList *syldap_read_basedn( SyldapServer *ldapServer ) {
GList *baseDN = NULL;
LDAP *ld;
- int rc, i;
+ gint rc, i;
LDAPMessage *result, *e;
- char *attribs[10];
+ gchar *attribs[10];
BerElement *ber;
- char *attribute;
- char **vals;
+ gchar *attribute;
+ gchar **vals;
struct timeval timeout;
ldapServer->retVal = MGU_BAD_ARGS;
if( ldapServer->hostName == NULL ) return baseDN;
if( ldapServer->port < 1 ) return baseDN;
- // Set timeout
+ /* Set timeout */
timeout.tv_usec = 0L;
if( ldapServer->timeOut > 0 ) {
timeout.tv_sec = ldapServer->timeOut;
timeout.tv_sec = 30L;
}
- // Connect to server.
+ /* Connect to server. */
if( ( ld = ldap_init( ldapServer->hostName, ldapServer->port ) ) == NULL ) {
ldapServer->retVal = MGU_LDAP_INIT;
return baseDN;
}
- // Bind to the server, if required
+ /* Bind to the server, if required */
if( ldapServer->bindDN ) {
if( *ldapServer->bindDN != '\0' ) {
rc = ldap_simple_bind_s( ld, ldapServer->bindDN, ldapServer->bindPass );
if( rc != LDAP_SUCCESS ) {
- //printf( "LDAP Error: ldap_simple_bind_s: %s\n", ldap_err2string( rc ) );
+ /* printf( "LDAP Error: ldap_simple_bind_s: %s\n", ldap_err2string( rc ) ); */
ldap_unbind( ld );
ldapServer->retVal = MGU_LDAP_BIND;
return baseDN;
ldapServer->retVal = MGU_LDAP_SEARCH;
- // Test for LDAP version 3
+ /* Test for LDAP version 3 */
attribs[0] = SYLDAP_V3_TEST_ATTR;
attribs[1] = NULL;
rc = ldap_search_ext_s( ld, SYLDAP_SEARCHBASE_V3, LDAP_SCOPE_BASE, SYLDAP_TEST_FILTER, attribs,
0, NULL, NULL, &timeout, 0, &result );
if( rc == LDAP_SUCCESS ) {
- // Process entries
+ /* Process entries */
for( e = ldap_first_entry( ld, result ); e != NULL; e = ldap_next_entry( ld, e ) ) {
- // printf( "DN: %s\n", ldap_get_dn( ld, e ) );
+ /* printf( "DN: %s\n", ldap_get_dn( ld, e ) ); */
- // Process attributes
+ /* Process attributes */
for( attribute = ldap_first_attribute( ld, e, &ber ); attribute != NULL;
attribute = ldap_next_attribute( ld, e, ber ) ) {
if( strcasecmp( attribute, SYLDAP_V3_TEST_ATTR ) == 0 ) {
if( ( vals = ldap_get_values( ld, e, attribute ) ) != NULL ) {
for( i = 0; vals[i] != NULL; i++ ) {
- // printf( "\t%s: %s\n", attribute, vals[i] );
+ /* printf( "\t%s: %s\n", attribute, vals[i] ); */
baseDN = g_list_append( baseDN, g_strdup( vals[i] ) );
}
}
}
if( baseDN == NULL ) {
- // Test for LDAP version 2
+ /* Test for LDAP version 2 */
attribs[0] = NULL;
rc = ldap_search_ext_s( ld, SYLDAP_SEARCHBASE_V2, LDAP_SCOPE_BASE, SYLDAP_TEST_FILTER, attribs,
0, NULL, NULL, &timeout, 0, &result );
if( rc == LDAP_SUCCESS ) {
- // Process entries
+ /* Process entries */
for( e = ldap_first_entry( ld, result ); e != NULL; e = ldap_next_entry( ld, e ) ) {
- // if( baseDN ) break;
- // printf( "DN: %s\n", ldap_get_dn( ld, e ) );
+ /* if( baseDN ) break; */
+ /* printf( "DN: %s\n", ldap_get_dn( ld, e ) ); */
- // Process attributes
+ /* Process attributes */
for( attribute = ldap_first_attribute( ld, e, &ber ); attribute != NULL;
attribute = ldap_next_attribute( ld, e, ber ) ) {
- // if( baseDN ) break;
+ /* if( baseDN ) break; */
if( strcasecmp( attribute, SYLDAP_V2_TEST_ATTR ) == 0 ) {
if( ( vals = ldap_get_values( ld, e, attribute ) ) != NULL ) {
for( i = 0; vals[i] != NULL; i++ ) {
char *ch;
- // Strip the 'ldb:' from the front of the value
+ /* Strip the 'ldb:' from the front of the value */
ch = ( char * ) strchr( vals[i], ':' );
if( ch ) {
gchar *bn = g_strdup( ++ch );
gboolean syldap_test_connect_s( const gchar *host, const gint port ) {
gboolean retVal = FALSE;
LDAP *ld;
+
if( host == NULL ) return retVal;
if( port < 1 ) return retVal;
if( ( ld = ldap_open( host, port ) ) != NULL ) {
gboolean syldap_test_connect( SyldapServer *ldapServer ) {
gboolean retVal = FALSE;
LDAP *ld;
+
ldapServer->retVal = MGU_BAD_ARGS;
if( ldapServer == NULL ) return retVal;
if( ldapServer->hostName == NULL ) return retVal;
gboolean syldap_test_ldap_lib() {
void *handle, *fun;
- // Get library
+ /* Get library */
handle = dlopen( LDAP_LINK_LIB_NAME_1, RTLD_LAZY );
if( ! handle ) {
return FALSE;
}
- // Test for symbols we need
+ /* Test for symbols we need */
fun = dlsym( handle, "ldap_init" );
if( ! fun ) {
dlclose( handle );