InfoDirectory使用手引書 |
目次 索引 |
第3部 SDK編 | > 第5章 アプリケーション開発環境(LDAP C API) | > 5.5 サンプルプログラム | > 5.5.3 サンプルプログラムの紹介 |
V3拡張機能(サーバソートおよびページング)のエントリ検索におけるサンプルプログラムを以下に示します。
このサンプルプログラムでは、サーバソートとページング機能を同時に指定した検索を行っています。
/* * Copyright (c) 2001. Fujitsu Limited. All rights reserved. * * Search the directory for all entry with server sort and paging. * */ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #if defined(unix) #include <time.h> #elif defined(_WIN32) #include <winsock.h> #endif #if defined(unix) #include <unistd.h> #endif #include "examples.h" unsigned long global_counter = 0; char *host = "localhost"; int port = LDAP_PORT; char *binddn = "cn=admin,o=Fujitsu,c=JP"; char *passwd = "admin123"; char *s_base = "o=Fujitsu,c=JP"; int scope = LDAP_SCOPE_SUBTREE; char *filter = "(objectclass=*)"; char sortkey1[] = "cn"; char sortkey2[] = "sn"; char *sortarray[3] = {sortkey1, sortkey2, NULL}; int dopaging = TRUE; int pagesize = 10; /*-------------------------------------------------------------*/ /* * Perform other work while polling for results. This doesn't do anything * useful, but it could. */ static void do_other_work() { extern unsigned long global_counter; global_counter++; } /*-------------------------------------------------------------*/ /* * main program */ int main( int argc, char *argv[] ) { LDAP *ld=NULL; LDAPMessage *result = NULL; int rtn=0; int optdata = 0; int errcode = 0; char *errmsg = NULL; int num_entries = 0; LDAPControl **resctrlp = NULL; LDAPControl **reqctrlp = NULL; int allpagesdone = FALSE; extern char *host; extern int port; extern char *binddn; extern char *passwd; extern char *s_base; extern int scope; extern char *filter; /*----------------------------------------------------------*/ printf( "%s is start\n", argv[0] ); printf( "%s: ldap_init( \"%s\", %d )\n", argv[0], host, port ); ld = ldap_init( host, port ); if ( ld == NULL ) { perror( "ldap_init" ); printf( "%s is abnormal end\n", argv[0] ); exit( 1 ); } /* set option ( LDAP_VERSION3 ) */ optdata = LDAP_VERSION3; printf( "%s: ldap_set_option( LDAP_OPT_PROTOCOL_VERSION, %d )\n", argv[0], optdata ); rtn = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, (void *)(&optdata)); if ( rtn != 0 ) { do_error_msg( "ldap_set_option", rtn, NULL, NULL ); do_unbind( ld, argv ); printf( "%s is abnormal end\n", argv[0] ); exit( 1 ); } /* set option ( LDAP_OPT_OFF ) */ optdata = LDAP_OPT_OFF; printf( "%s: ldap_set_option( LDAP_OPT_REFERRALS, %d )\n", argv[0], optdata ); rtn = ldap_set_option(ld, LDAP_OPT_REFERRALS, (void *)(&optdata)); if ( rtn != 0 ) { do_error_msg( "ldap_set_option", rtn, NULL, NULL ); do_unbind( ld, argv ); printf( "%s is abnormal end\n", argv[0] ); exit( 1 ); } /* simple authenticate */ printf( "%s: ldap_simple_bind_s( \"%s\", \"******\" )\n", argv[0], binddn ); rtn = ldap_simple_bind_s( ld, binddn, passwd ); if ( rtn != LDAP_SUCCESS ) { do_error_msg( "ldap_simple_bind_s", rtn, NULL, NULL ); do_unbind( ld, argv ); printf( "%s is abnormal end\n", argv[0] ); exit( 1 ); } /* make sort ldap control */ printf( "%s: ldap_create_sort_control( \"sort key is %s, %s\" )\n", argv[0], sortarray[0], sortarray[1] ); rtn = ldap_create_sort_control(ld,sortarray, 0x0, 0x0,&reqctrlp); if(rtn != LDAP_SUCCESS) { do_error_msg( "ldap_create_sort_control", rtn, NULL, NULL ); do_unbind( ld, argv ); printf( "%s is abnormal end\n", argv[0] ); exit( 1 ); } /* make paging control */ rtn = ldap_create_paging_control(ld,pagesize,0x0,&reqctrlp); if(rtn != LDAP_SUCCESS) { do_error_msg( "ldap_create_paging_control", rtn, NULL, NULL ) do_unbind( ld, argv ); printf( "%s is abnormal end\n", argv[0] ); ldap_controls_free ( reqctrlp ); exit( 1 ); } while (!allpagesdone) { /* Actually perform the search */ if ( (rtn = ldap_search_ext_s( ld, s_base, scope, filter, NULL, 0, reqctrlp, NULL, NULL, 0, &result )) != LDAP_SUCCESS ) { do_error_msg( "ldap_search_ext_s", rtn, NULL, NULL ); do_unbind( ld, argv ); printf( "%s is abnormal end\n", argv[0] ); ldap_controls_free ( reqctrlp ); exit( 1 ); } num_entries += print_entry( ld, result, 0 ); printf( "%d matches\n", num_entries ); /* get the response controls to see if more pages remain */ rtn = ldap_parse_result( ld, result, &errcode, NULL, &errmsg, NULL, &resctrlp, 0); if ( rtn != LDAP_SUCCESS ) { do_error_msg( "ldap_parse_result", rtn, NULL, NULL ); do_unbind( ld, argv ); printf( "%s is abnormal end\n", argv[0] ); ldap_controls_free ( reqctrlp ); ldap_msgfree( result ); exit( 1 ); } else { if ( errcode ) { do_error_msg( "ldap_parse_result", errcode, NULL, errmsg ); } if ( errmsg ) { ldap_memfree(errmsg); } if ( dopaging && resctrlp ) { rtn = ldap_create_more_paging_control(ld,pagesize,0x0,resctrlp,&reqctrlp); if(rtn == LDAP_NO_RESULTS_RETURNED) allpagesdone = TRUE; else if(rtn == LDAP_MORE_RESULTS_TO_RETURN) allpagesdone = FALSE; else { do_error_msg( "ldap_create_more_paging_control", rtn, NULL, NULL ); do_unbind( ld, argv ); printf( "%s is abnormal end\n", argv[0] ); ldap_controls_free ( reqctrlp ); ldap_controls_free ( resctrlp ); exit( 1 ); } } else { allpagesdone = TRUE; ldap_controls_free ( reqctrlp ); } } if (result) { ldap_msgfree ( result ); result = NULL; } if (resctrlp) { ldap_controls_free ( resctrlp ); resctrlp = NULL; } } ldap_controls_free ( reqctrlp ); printf( "%s: %d entries retrieved. I counted to %ld while I was waiting.\n", argv[0], num_entries, global_counter ) do_unbind( ld, argv ); printf( "%s is normal end\n", argv[0] ); exit( 0 ); }
目次 索引 |