在C中打开LDAP客户端-如何替换不推荐的API

在C中打开LDAP客户端-如何替换不推荐的API,c,gcc,ldap,solaris,openldap,C,Gcc,Ldap,Solaris,Openldap,我正在努力转换一个用C编写的小型OpenLDAP客户端。这个程序的原始版本可以很好地使用不推荐的API #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ldap.h> /*------------------- gcc -w -DLDAP_DEPRECATED -o exe/TstLDAPold sources/TstLDAPold.c -lope

我正在努力转换一个用C编写的小型OpenLDAP客户端。这个程序的原始版本可以很好地使用不推荐的API

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ldap.h>


/*-------------------

 gcc -w  -DLDAP_DEPRECATED -o exe/TstLDAPold  sources/TstLDAPold.c -lopenldap

--------------------*/

int main(int argc, char ** argv)
{

  char* pstrDatabaseName = "I36_XXX";
  char * pstrSchemaName = "DEV_XXX";
  char* pstrModuleName = "L8XX";
  char * pstrHostName = "mado";

  // New LDAP Structure

  int version, ldapPort, i, rc, entryCount, NodeFound;
  char *ldapHost, *searchBase;
  char *attribute, *dn, **values;
  const char *sortAttribute = "sn";
  struct timeval timeOut;
  BerElement *ber;
  LDAP *ld;
  LDAPMessage *searchResult, *entry;
  FILE *fp;

  const char * loginDN = "cn=ldap_yyyy,cn=yyyyy,cn=Ixxxxx";
  const char * password = "ldap_xxx";

  ldapHost = (char *) malloc(100);
  searchBase = (char *) malloc(500);                     // New LDAP Structure

  (void) strcpy( (char *) ldapHost, (const char *) "myldapserver");

  char * strLdapPort = (char *) malloc(10);
  if (getenv("LDAP_PORT") != NULL)
  {
    ldapPort = atoi(getenv("LDAP_PORT"));
    strcpy(strLdapPort, getenv("LDAP_PORT"));
  }
  else
  {
    ldapPort = 389;
    strcpy(strLdapPort, "389");
  }

  strcpy(searchBase, "HostName=");  // Change attrib ModuleName in ProgramName
  strcat(searchBase, pstrHostName);
  strcpy(searchBase, "ProgramName="); // Change attrib ModuleName in ProgramName
  strcat(searchBase, pstrModuleName);
  strcat(searchBase, ",SchemaName=");                    // New LDAP Structure
  strcat(searchBase, pstrSchemaName);                    // New LDAP Structure
  strcat(searchBase, ",DatabaseName=");                  // New LDAP Structure
  strcat(searchBase, pstrDatabaseName);                  // New LDAP Structure
  strcat(searchBase, ",cn=RLM,cn=Ixxx");

  /* Set LDAP version to 3 */
  version = LDAP_VERSION3;
  ldap_set_option(NULL, LDAP_OPT_PROTOCOL_VERSION, &version);

  /* Initialize the LDAP session */
  /* NEW ROUTINE OPEN LDAP 2.4 */

  char * ldapServer = (char *) malloc(200);
  strcpy(ldapServer, (const char *) ldapHost);
  strcat(ldapServer, (const char *) ":");
  strcat(ldapServer, (const char *) strLdapPort);
  printf("LDAP Server : %s\n", ldapServer);
  //LDAP ld1;


   if ((ld = ldap_open(ldapHost, ldapPort)) == NULL)
   {
   printf("\n    LDAP session initialization failed\n");
   return (1);
   } else {
    printf("Open success\n");
   }

  /* Bind to the server */

  rc = ldap_simple_bind_s(ld, loginDN, password);
  if (rc != LDAP_SUCCESS)
  {
    printf(
        "ldap_simple_bind_s: %s\nInformations : Login: %s Password: %s\n",
        ldap_err2string(rc), loginDN, password);

    printf( "Unbind\n" );
    ldap_unbind_s(ld);
    printf( "Unbinding ok\n" );
    return (1);
  }

  rc = ldap_search_s(ld, searchBase, LDAP_SCOPE_ONELEVEL, "(objectclass=*)",
      NULL, 0, &searchResult);




  if (rc != LDAP_SUCCESS)
  {
    printf("ldap_search_ext_s: %s \n", ldap_err2string(rc));
    ldap_unbind_s(ld);
    return (1);
  } else {
    printf("Search Success\n");
  }

/// DISPLAY RESULTS


  NodeFound = 0;
  /* Go through the search results by checking entries */
  for (entry = ldap_first_entry(ld, searchResult);
      entry != NULL & NodeFound == 0; entry = ldap_next_entry(ld, entry))
  {
    if ((dn = ldap_get_dn(ld, entry)) != NULL)
    {
      ldap_memfree(dn);
    }

    for (attribute = ldap_first_attribute(ld, entry, &ber);
        attribute != NULL;
        attribute = ldap_next_attribute(ld, entry, ber))
    {
      /* Get values and print.  Assumes all values are strings. */
      if ((values = ldap_get_values(ld, entry, attribute)) != NULL)
      {
        printf("attribute : %s \n",attribute );
        printf("value : %s\n", values[0] );

        if (strcasecmp(attribute, "HostName") == 0)
        {
          if (strncmp(values[0], pstrHostName, strlen(pstrHostName)) != 0)
          {
            NodeFound = 0;
          } else
          {
            //strcpy(mstrHostName, values[0]);
            NodeFound = 1;
          }
        }

        ldap_value_free(values);
      }
      ldap_memfree(attribute);
    }

  }
  ldap_msgfree(searchResult);
  ldap_unbind_s(ld);

  return (0);
}
#包括
#包括
#包括
#包括
/*-------------------
gcc-w-DLDAP_已弃用-o exe/TstLDAPold sources/TstLDAPold.c-lopenldap
--------------------*/
int main(int argc,字符**argv)
{
char*pstrDatabaseName=“I36_XXX”;
char*pstrSchemaName=“DEV_XXX”;
char*pstrModuleName=“L8XX”;
char*pstrHostName=“mado”;
//新的LDAP结构
int版本,ldapPort,i,rc,entryCount,NodeFound;
char*ldapHost,*searchBase;
字符*属性,*dn,**值;
常量字符*sortatAttribute=“sn”;
结构timeval超时;
贝雷伦*贝雷尔;
LDAP*ld;
LDAPMessage*搜索结果,*条目;
文件*fp;
const char*loginDN=“cn=ldap_yyyy,cn=yyyyy,cn=ixxx”;
const char*password=“ldap\u xxx”;
ldapHost=(char*)malloc(100);
searchBase=(char*)malloc(500);//新的LDAP结构
(void)strcpy((char*)ldapHost,(const char*)“myldapserver”);
char*strLdapPort=(char*)malloc(10);
if(getenv(“LDAP_端口”)!=NULL)
{
ldapPort=atoi(getenv(“LDAP_端口”);
strcpy(strLdapPort,getenv(“LDAP_PORT”);
}
其他的
{
ldapPort=389;
strcpy(strldaport,“389”);
}
strcpy(searchBase,“HostName=”);//更改ProgramName中的attrib ModuleName
strcat(searchBase,pstrHostName);
strcpy(searchBase,“ProgramName=”);//更改ProgramName中的attrib ModuleName
strcat(searchBase,pstrModuleName);
strcat(searchBase,”,SchemaName=“);//新的LDAP结构
strcat(searchBase,pstrSchemaName);//新的LDAP结构
strcat(searchBase,”,DatabaseName=“);//新的LDAP结构
strcat(searchBase,pstrDatabaseName);//新的LDAP结构
strcat(searchBase,“,cn=RLM,cn=Ixxx”);
/*将LDAP版本设置为3*/
版本=LDAP_版本3;
ldap_set_选项(NULL、ldap_OPT_协议版本和版本);
/*初始化LDAP会话*/
/*新例程OpenLDAP 2.4*/
char*ldapServer=(char*)malloc(200);
strcpy(ldapServer,(const char*)ldapHost);
strcat(ldapServer,(const char*)“:”;
strcat(ldapServer,(const char*)strLdapPort;
printf(“LDAP服务器:%s\n”,ldapServer);
//LDAP-ld1;
如果((ld=ldap_open(ldapHost,ldapPort))==NULL)
{
printf(“\n LDAP会话初始化失败\n”);
申报表(1);
}否则{
printf(“打开成功\n”);
}
/*绑定到服务器*/
rc=ldap\u simple\u bind\s(ld、loginDN、密码);
如果(rc!=LDAP_成功)
{
printf(
“ldap\u简单\u绑定\u s:%s\n信息:登录:%s密码:%s\n”,
ldap_err2string(rc)、登录名、密码);
printf(“解除绑定”);
ldap解除绑定(ld);
printf(“解除绑定正常\n”);
申报表(1);
}
rc=ldap\u search\s(ld,searchBase,ldap\u SCOPE\u ONELEVEL,”(objectclass=*)”,
NULL、0和searchResult);
如果(rc!=LDAP_成功)
{
printf(“ldap搜索外部:%s\n”,ldap错误字符串(rc));
ldap解除绑定(ld);
申报表(1);
}否则{
printf(“搜索成功\n”);
}
///显示结果
NodeFound=0;
/*通过检查条目查看搜索结果*/
for(entry=ldap\u first\u entry(ld,searchResult);
entry!=NULL&NodeFound==0;entry=ldap\u next\u entry(ld,entry))
{
if((dn=ldap\u get\u dn(ld,entry))!=NULL)
{
ldap_memfree(dn);
}
for(attribute=ldap\u first\u属性(ld、entry和ber);
属性!=NULL;
属性=ldap_下一个_属性(ld、条目、ber))
{
/*获取值并打印。假设所有值都是字符串*/
if((values=ldap\u get\u values(ld,entry,attribute))!=NULL)
{
printf(“属性:%s\n”,属性);
printf(“值:%s\n”,值[0]);
if(strcasecmp(属性,“主机名”)==0)
{
如果(strncmp(值[0],pstrHostName,strlen(pstrHostName))!=0)
{
NodeFound=0;
}否则
{
//strcpy(mstrHostName,值[0]);
NodeFound=1;
}
}
ldap_值_free(值);
}
ldap_memfree(属性);
}
}
ldap_msgfree(搜索结果);
ldap解除绑定(ld);
返回(0);
}
此代码有效,它提供:

属性:ModuleName
值:LIC_058
属性:BeginDate
值:19970404
属性:EndDate
值:20251231

然后,我将其更改为:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ldap.h>


/*-------------------

 gcc -o exe/TstLDAP  sources/TstLDAP.c -lopenldap

--------------------*/

int main(int argc, char ** argv)
{

  char* pstrDatabaseName = "I36_XXX";
  char * pstrSchemaName = "DEV_XXX";
  char* pstrModuleName = "LXXX";
  char * pstrHostName = "mado";

  // New LDAP Structure

  int version, ldapPort, i, rc, entryCount, NodeFound;
  char *ldapHost, *searchBase;
  char *attribute, *dn, **values;
  const char *sortAttribute = "sn";
  struct timeval timeOut;
  BerElement *ber;
  LDAP *ld;
  LDAPMessage *searchResult, *entry;
  FILE *fp;

  const char * loginDN = "cn=ldap_yyy,cn=yyyy,cn=Ixxxx";
  const char * password = "ldap_xxx";

  ldapHost = (char *) malloc(100);
  searchBase = (char *) malloc(500);                     // New LDAP Structure

  (void) strcpy( (char *) ldapHost, (const char *) "ldap://myldapserver");

  char * strLdapPort = (char *) malloc(10);
  if (getenv("LDAP_PORT") != NULL)
  {
    ldapPort = atoi(getenv("LDAP_PORT"));
    strcpy(strLdapPort, getenv("LDAP_PORT"));
  }
  else
  {
    ldapPort = 389;
    strcpy(strLdapPort, "389");
  }


  strcpy(searchBase, "HostName=");  // Change attrib ModuleName in ProgramName
  strcat(searchBase, pstrHostName);
  strcpy(searchBase, "ProgramName="); // Change attrib ModuleName in ProgramName
  strcat(searchBase, pstrModuleName);
  strcat(searchBase, ",SchemaName=");                    // New LDAP Structure
  strcat(searchBase, pstrSchemaName);                    // New LDAP Structure
  strcat(searchBase, ",DatabaseName=");                  // New LDAP Structure
  strcat(searchBase, pstrDatabaseName);                  // New LDAP Structure
  strcat(searchBase, ",cn=RLM,cn=Ixxx");

  /* Set LDAP version to 3 */
  version = LDAP_VERSION3;
  ldap_set_option(NULL, LDAP_OPT_PROTOCOL_VERSION, &version);

  /* Initialize the LDAP session */
  /* NEW ROUTINE OPEN LDAP 2.4 */

  char * ldapServer = (char *) malloc(200);
  strcpy(ldapServer, (const char *) ldapHost);
  strcat(ldapServer, (const char *) ":");
  strcat(ldapServer, (const char *) strLdapPort);
  printf("LDAP Server : %s\n", ldapServer);
  //LDAP ld1;

  if (ldap_initialize(&ld, ldapServer))
  {
    //logFile("/tmp/licences_manager.log", "LDAP init failed!", "");
    printf("LDAP Init failed");
  }
  else
  {
    //logFile("/tmp/licences_manager.log", "LDAP init Success!", "");
    printf("LDAP Init Success\n");
  }

  /*
   if ((ld = ldap_open(ldapHost, ldapPort)) == NULL)
   {
   printf("\n    LDAP session initialization failed\n");
   return (1);
   }*/

  /* Bind to the server */

  struct berval cred;
  strcpy(cred.bv_val, password);
  cred.bv_len = strlen(password);
  rc = ldap_sasl_bind_s(ld, loginDN, LDAP_SASL_SIMPLE, &cred, NULL, NULL,  NULL);
  if (rc != LDAP_SUCCESS)
  {
    printf("ldap_sasl_bind_s: %s\nInformations : Login: %s Password: %s\n",
        ldap_err2string(rc), loginDN, password);
    return (1);
  } else {
    printf( "Binding successful\n");
  }


  ////-------------Phase 2

  LDAPControl             **serverctrls;
  LDAPControl             **clientctrls; 
  struct timeval  *timeout;

  rc = ldap_search_ext_s( ld,
   searchBase, 
   LDAP_SCOPE_ONELEVEL, 
   "(objectclass=*)",
      NULL, 
      0,
      NULL, // LDAPControl             **serverctrls, // NEW
      NULL, // LDAPControl             **clientctrls, // NEW 
      NULL, // struct timeval  *timeout,               //NEW
      LDAP_NO_LIMIT,   // int                             sizelimit, // NEW
      &searchResult );

  if (rc != LDAP_SUCCESS)
  {
    printf("ldap_search_ext_s: %s \n", ldap_err2string(rc));
    //ldap_unbind_s(ld);
    return (1);
  } else {
    printf("Search Success\n");
  }

  return (0);
}
#包括
#包括
#包括
#包括
/*-------------------
gcc-o exe/TstLDAP sources/TstLDAP.c-lopenldap
--------------------*/
int main(int argc,字符**argv)
{
char*pstrDatabaseName=“I36_XXX”;
char*pstrSchemaName=“DEV_XXX”;
char*pstrModuleName=“LXXX”;
char*pstrHostName=“mado”;
//新的LDAP结构
int版本,ldapPort,i,rc,entryCount,NodeFound;
char*ldapHost,*searchBase;
字符*属性,*dn,**值;
常量字符*sortatAttribute=“sn”;
结构timeval超时;
贝雷伦*贝雷尔;
LDAP*ld;
LDAPMessage*搜索结果,*条目;
文件*fp;
const char*loginDN=“cn=ldap\u yyy,cn=yyy,cn=ixxx”;
const char*password=“ldap\u xxx”;
ldapHost=(char*)malloc(100);
searchBase=(char*)malloc(500);//新的LDAP结构
(void)strcpy((char*)ldapHost,(const char*)”ldap://myldapserver");
char*strLdapPort=(char*)malloc(10);
if(getenv(“LDAP_端口”)!=NULL)
{
ldapPort=atoi(getenv(“LDAP_端口”);
strcpy(strLdapPort,getenv(“LDAP_PORT”);
}
其他的
{
ldapPort=389;
strcpy(strldaport,“389”);
}
strcpy(searchBase,“HostName=”);//更改ProgramName中的attrib ModuleName
strcat(searchBase,pstrHostName);
strcpy(searchBase,“ProgramName=”);//更改ProgramName中的attrib ModuleName
strcat(searchBase,pstrModuleName);
strcat(searchBase,”,SchemaName=“);//新的LDAP结构