gpt4 book ai didi

c - 在 C 中处理 ldap_initalize 时出错

转载 作者:行者123 更新时间:2023-11-30 17:34:20 26 4
gpt4 key购买 nike

背景
我在处理 C 中的 ldap_initialize 函数时遇到错误。

在阅读了大量文档(大多数只是手册页的简单副本)后,我发现了多种方法(可能是误导或错误的)来错误处理此函数。

这是我遇到问题的代码:

//--------------------------------------
// declarations
//--------------------------------------
int status = 0;
int optionHandlingStatus = 0;
char * ldapErrorString = NULL;
char serverAddress[PLS_STRING_ARRAY_SIZE];

//--------------------------------------
// prepare the server's address
//--------------------------------------
sprintf(
serverAddress,
"ldap://%s:%s",
settings->serverAddress,
settings->serverPort
);
//writeDebugLog("LDAP server address set to [%s].", serverAddress);

//--------------------------------------
// connect to the server
//--------------------------------------
status = ldap_initialize(&ldapServerConnection, serverAddress);
optionHandlingStatus = ldap_get_option(ldapServerConnection, LDAP_OPT_RESULT_CODE, &status);
if (status != LDAP_SUCCESS || errno != LDAP_SUCCESS) { //the specs are strange
if (status && errno) {
writeDebugLog("CONNECTION Fail!.");
writeSyslog("CONNECTION Fail!.");
}
ldapErrorString = ldap_err2string(status);
writeDebugLog("Connection to server failed with [%s].", ldapErrorString);
writeSyslog(
"LDAP server initalization error. Check [%s] server's status.",
serverAddress
);
return(NULL);
}

问题
文件说 ldap_initialize 应该:
1. 在连接错误的情况下返回 NULL 指针(如果我使用ldap_init)
2.返回错误状态,可以使用ldap_get_option

获取

但是,这两种方法都不可靠。我已经对我创建的用于启动与 LDAP 服务器的连接的函数进行了彻底的测试。有时 ldap_init 返回一个指向 LDAP 对象的有效指针,ldap_initialize 返回错误代码 LDAP success(当使用 ldap_get_option 时), ldap_get_option 解析错误码时成功返回。

我发现,如果我检查 C 的 errno 变量,我可以相当准确地获取 ldap_initialize 函数的连接状态,因为它似乎在失败时设置了 errno (errno == 2) =>“没有这样的文件或目录”。

当我在程序中指定随机未使用的端口时,这通常是准确的。但是,我使用名为 pamtester 的程序更彻底地测试了我的程序,但它无法对我指定的用户进行身份验证。在我调用 ldap_initialize 后立即设置的错误是“没有这样的文件或目录”。

我在 ldap_initialize 之后强制设置了 C (errno = 0),并且能够成功根据我的 LDAP 数据库对用户进行身份验证。

问题
1.ldap_initialize函数错误处理的正确方法是什么?
2. 我应该使用不同的函数来初始化 LDAP 连接吗?
3. 如果错误状态实际上是由 C 的 errno 标志处理的,而不是由 ldap_get_options 处理的,为什么所有手册页和示例都另有说明?

最佳答案

仅当 ldap_initilize 返回与 LDAP_SUCCESS 不同的内容时才检查 errno。在ldap_initilize返回后也立即执行此操作,否则errno可能已被破坏。

代码应如下所示:

int status = ldap_initialize(&ldapServerConnection, serverAddress);
if (status != LDAP_SUCCESS)
{
/* int errno_save = errno; */
perror("ldap_initialize() failed"); /* This call shows the error message related to errno. */
/* If on a GNU system also the following will do: */
/* fprintf(stderr, ""ldap_initialize() failed with #%d: '%s'\n", errno_save, strerror(errno_save)); */

writeDebugLog("CONNECTION Fail!.");
writeSyslog("CONNECTION Fail!.");

ldapErrorString = ldap_err2string(status);
writeDebugLog("Connection to server failed with [%s].", ldapErrorString);
writeSyslog(
"LDAP server initalization error. Check [%s] server's status.",
serverAddress
);
return(NULL);
}
<小时/>

更新:

使用ldap_init*()函数不会尝试建立连接,因此不会检测到任何无效的地址数据。要实际测试连接,请使用 ldap_open(),但使用 ldsp_init()

来自man ldap_open :

ldap_init() acts just like ldap_open(), but does not open a connection to the LDAP server. The actual connection open will occur when the first operation is attempted.

关于c - 在 C 中处理 ldap_initalize 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23380874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com