Interstage Application Server Smart Repository運用ガイド
|
目次
索引
|
5.3.3.3 同期型のエントリ変更
同期型でエントリを変更する場合のサンプルプログラムを以下に示します。
このサンプルプログラムでは、日本語を含むDNのエントリに、日本語の属性値を設定しています。
[jp_modattrs.c]
/*
* Copyright (c) 2004. Fujitsu Limited. All rights reserved.
*
* エントリの変更を行う(日本語データ含む)。
*
*/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#if defined(_WIN32)
#include <winsock.h>
#endif
#include "examples.h"
#include "def.h"
char *host = SAMPLE_HOST;
int port = SAMPLE_PORT;
char *binddn = SAMPLE_BINDDN;
char *passwd = SAMPLE_PASSWORD;
#if defined(unix)
char *mod_dn = "cn=ユーザ001," SAMPLE_BASEDN;
#elif defined(_WIN32)
char *mod_dn = "cn=ユーザ001," SAMPLE_BASEDN;
#endif
/*-------------------------------------------------------------*/
/*
* メイン・プログラム
*/
int main( int argc, char **argv )
{
LDAP *ld;
LDAPMod mod0;
LDAPMod mod1;
LDAPMod *mods[ 3 ];
char *vals0[ 2 ];
char *vals1[ 2 ];
struct berval **utf_vals1;
time_t now;
char buf[ 128 ];
#if defined(unix)
char *tm;
char tbuf[32];
#endif
int optdata;
int rtn;
char *utf_mod_dn;
extern char *host;
extern int port;
extern char *binddn;
extern char *passwd;
extern char *mod_dn;
/*----------------------------------------------------------*/
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] );
return( 1 );
}
/* オプションの設定(使用するLDAPプロトコル) */
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] );
return( 1 );
}
/* 簡易認証 */
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] );
return( 1 );
}
/* LDAPMod構造体の作成 */
vals0[0] = "user001@interstage.fujitsu.com";
vals0[1] = NULL;
mod0.mod_op = LDAP_MOD_REPLACE;
mod0.mod_type = "mail";
mod0.mod_values = vals0;
time( &now );
#if defined(unix)
#if defined(linux)
tm = ctime_r( &now, tbuf );
#else
tm = ctime_r( &now, tbuf, sizeof(tbuf) );
#endif
sprintf( buf, "このエントリは、jp_modattrsプログラムによって変更されました。%s ", tm );
#elif defined(_WIN32)
sprintf( buf, "このエントリは、jp_modattrsプログラムによって変更されました。%s", ctime( &now ));
#endif
/* ctime()またはctime_r()で取得した、時間の文字列に付加されている‘\n’の除去 */
if ( buf[ strlen( buf ) - 1 ] == '\n' ) {
buf[ strlen( buf ) - 1 ] = '\0';
}
vals1[ 0 ] = buf;
vals1[ 1 ] = NULL;
#if defined(unix)
rtn = do_conv_values( vals1, &utf_vals1, LDAP_CHARS_OPT_EUCJP,
LDAP_CHARS_OPT_UTF8 );
#elif defined(_WIN32)
rtn = do_conv_values( vals1, &utf_vals1, LDAP_CHARS_OPT_SJIS,
LDAP_CHARS_OPT_UTF8 );
#endif
if ( rtn == -1 ) {
do_unbind( ld, argv );
printf( "%s is abnormal end\n", argv[0] );
return( 1 );
} else {
mod1.mod_op = (LDAP_MOD_BVALUES | LDAP_MOD_ADD);
mod1.mod_type = "description";
mod1.mod_bvalues = utf_vals1;
}
mods[ 0 ] = &mod0;
mods[ 1 ] = &mod1;
mods[ 2 ] = NULL;
/* 変更値の作成 */
#if defined(unix)
rtn = ldap_conv_utf( mod_dn, &utf_mod_dn,
LDAP_CHARS_OPT_EUCJP, LDAP_CHARS_OPT_UTF8 );
#elif defined(_WIN32)
rtn = ldap_conv_utf( mod_dn, &utf_mod_dn,
LDAP_CHARS_OPT_SJIS, LDAP_CHARS_OPT_UTF8 );
#endif
if ( rtn == 0 ) {
perror( "ldap_conv_utf" );
do_unbind( ld, argv );
ldap_value_free_len( utf_vals1 );
printf( "%s is abnormal end\n", argv[0] );
return( 1 );
}
/* エントリの変更 */
printf( "%s: ldap_modify_s( \"%s\", ****** )\n", argv[0], mod_dn );
rtn = ldap_modify_s( ld, utf_mod_dn, mods );
if ( rtn != LDAP_SUCCESS ) {
/* エラー発生時 */
do_error_msg( "ldap_modify_s", rtn, NULL, NULL );
do_unbind( ld, argv );
ldap_value_free_len( utf_vals1 );
ldap_memfree( utf_mod_dn );
printf( "%s is abnormal end\n", argv[0] );
return( 1 );
}
/* 終了処理 */
do_unbind( ld, argv );
ldap_value_free_len( utf_vals1 );
ldap_memfree( utf_mod_dn );
printf( "%s is normal end\n", argv[0] );
return( 0 );
}
All Rights Reserved, Copyright(C) 富士通株式会社 2005