2017-05-29 8 views
0

Cでコード化された小さなOpenLDAPクライアントの変換中に苦労しています。このプログラムの元のバージョンは廃止予定のAPIでうまく機能します。CでLDAPクライアントを開く - 廃止予定の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); 
} 

このコードは動作しますが、それは与える:

属性:ModuleNameの
値:LIC_058
属性:BEGINDATE
値:19970404
属性:終了日
値: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); 
} 

最初のステップを(バインドを初期化)動作するようですが、私は、検索を実行すると、それは、フェーズ2でクラッシュ:

LDAPサーバ:LDAP:// myldapserver:389
LDAP初期の成功
メモリ障害(コアダンプ)

これは、GCC 4.8でのSolaris 11上だが、私はそれがシステム関連ではないと思います。検索APIに問題がありますか?私はそれをたくさん見つけましたが、私はそれが失敗する正当な理由は見つけられません。

ありがとうございます。

答えて

0

お手数ですが、バインディングが動作しないようです。私は、パスワードを受け取るためにcred.bv_valを割り当てるのを忘れていました。これがコアダンプの理由です。

関連する問題