InfoDirectory使用手引書
|
目次
索引

|
5.5.3.8 V3拡張機能を使用したエントリ検索
V3拡張機能(サーバソートおよびページング)のエントリ検索におけるサンプルプログラムを以下に示します。
このサンプルプログラムでは、サーバソートとページング機能を同時に指定した検索を行っています。
[search_ext.c]
/*
* 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 );
}
All Rights Reserved, Copyright(C) 富士通株式会社 2005