当用户找不到时,这里的ldap_result会卡住,设置tm.sec 为1也不行。需要继续定位。同样系统上官方的ldapsearch程序没有这个问题。
// gcc ldap_search.c -L /usr/local/lib/ -lldap -llber -I /usr/local/include -DLDAP_DEPRECATED=1
// ldapsearch -h 10.211.55.11 -p 389 -D "[email protected]" -w "Admin@123456" -b "dc=test,dc=com" "cn=u2"
#include <stdio.h>
#include <stdint.h>
#include <ldap.h>
#include <sys/time.h>
#define LDAP_SERVER_NUM 10
#define LDAP_SERVER_NAME_LEN 64
#define LDAP_USER_DN_LEN 256
#define LDAP_USER_PSWD_LEN 64
#define LDAP_SEARCH_DN_NUM 10
#define LDAP_SEARCH_DN_LEN 256
#define LDAP_SEARCH_FILTER_LEN 64
typedef struct ldap_server_t {
char server[LDAP_SERVER_NAME_LEN];
uint16_t port;
char user_dn[LDAP_USER_DN_LEN];
char user_pswd[LDAP_USER_PSWD_LEN];
} ldap_server_t;
typedef struct ldap_search_dn_t {
char dn[LDAP_SEARCH_DN_LEN];
int server_index;
} ldap_search_dn_t;
int ldap_server_num = 0;
ldap_server_t g_ldap_server[LDAP_SERVER_NUM] = {
0};
int ldap_search_dn_num = 0;
ldap_search_dn_t g_ldap_search_dn[LDAP_SEARCH_DN_NUM] = {
0};
int ldap_register_server(char *hostname, int16_t port, char *dn, char *pswd) {
if (ldap_server_num >= LDAP_SERVER_NUM) {
return -1;
}
for (int index = 0; index < LDAP_SERVER_NUM; index++) {
if (strlen(g_ldap_server[ldap_server_num].server) > 0) {
continue;
}
strcpy(g_ldap_server[index].server, hostname);
g_ldap_server[index].port = port;
strcpy(g_ldap_server[index].user_dn, dn);
strcpy(g_ldap_server[index].user_pswd, pswd);
ldap_server_num++;
return 0;
}
return -1;
}
void ldap_unregister_server(char *servername) {
for (int i = 0; i < LDAP_SERVER_NUM; i++) {
if (strcmp(g_ldap_server[i].server, servername) != 0) {
continue;
}
memset(g_ldap_server[i].server, 0, LDAP_USER_DN_LEN);
memset(g_ldap_server[i].user_dn, 0, LDAP_USER_DN_LEN);
memset