非同期操作を使用すると、アプリケーションからInterstage ディレクトリサービスに非同期要求を送信した後、任意のタイミングで処理結果を受信することができます。
非同期操作の関数の代表的なものには以下の関数があります。
ldap_simple_bind( LDAP *ld, const char *dn, const char *passwd )
ldap_search( LDAP *ld, const char *base, int scope, const char *filter, char **attrs, int attrsonly )
非同期型の検索をします。
ldap_modify( LDAP *ld, const char *dn, LDAPMod **mods )
非同期型のエントリ変更をします。
ldap_add( LDAP *ld, const char *dn, LDAPMod **attrs )
非同期型のエントリ追加をします。
ldap_delete( LDAP *ld, const char *dn )
非同期型のエントリ削除をします。
ldap_rename( LDAP *ld, const char *dn, const char *newrdn, const char *newparent, int deleteoldrdn, LDAPControl **serverctrls, LDAPControl **clientctrls, int *msgidp )
非同期型のエントリ名変更をします。
ldap_compare( LDAP *ld, const char *dn, const char *attr, const char *value )
非同期型の属性値比較をします。
非同期型関数を使ったLDAP操作の結果(result情報)はldap_result()で受け取ります。
ldap_result( LDAP *ld, int msgid, int all, struct timeval *timeout, LDAPMessage **resp )
非同期関数の処理結果や検索結果のエントリを受け取ります。
ldap_result()を呼び出すと、Interstage ディレクトリサービスからのresult情報を取得します。result情報が通知されない場合は、指定したタイマー時間まで待ち合わせたあと、呼び出し元に復帰します。ldap_result()では、パラメタとして以下のものを指定します。
メッセージID
非同期型関数を発行する際に通知される値を指定します。
特定の非同期型関数のresult情報を待つ場合には、その関数のメッセージIDを指定します。待ち合わせる非同期型関数を特定しない場合には、LDAP_RES_ANYを指定します。
受信処理タイプ
処理結果を受信する際の、処理の種類を指定します。
一括受信(LDAP_MSG_ALL:最後まで受信してから復帰)
順次受信(LDAP_MSG_ONE:1個受信したら復帰)
受信済メッセージ通知(LDAP_MSG_RECEIVED:受信済みメッセージの読込み)
一括受信の場合、要求に対する最後のメッセージを受信してから、呼び出し元に復帰します。順次受信の場合には、1件のメッセージを受信するとすぐに呼び出し元に復帰します。
受信待ちタイマー
ここで指定された時間以内にメッセージを受信しなかった場合、呼び出し元にタイムアウトを示す0が通知されます。NULLを指定すると結果を受信するまで待ち合わせます。
ldap_result()は、関数の復帰値として、受信したresult情報の種類を返します。これを利用して、どの非同期処理に対するresult情報かを判定することができます。ldap_result()については、“リファレンスマニュアル(API編)”の“処理結果の受取り/解析インタフェース”を参照してください。
以下の処理結果を例にとって、処理結果の解析方法を説明します。
非同期操作の結果は以下のような構造で返却されます。
result情報はメッセージリストで返却されます。メッセージリストを解析するには以下の関数を使用します。
ldap_first_message( LDAP *ld, LDAPMessage *res )
先頭のメッセージアドレスを通知します。
ldap_next_message( LDAP *ld, LDAPMessage *res )
次のメッセージアドレスを通知します。
ldap_count_messages( LDAP *ld, LDAPMessage *res )
メッセージリストの個数を通知します。
受信したresult情報のメッセージ種別やメッセージIDを判定する場合、以下の関数を使用します。
ldap_msgid( LDAPMessage *lm )
指定されたメッセージのメッセージIDを通知します。
ldap_msgtype( LDAPMessage *lm )
指定されたメッセージタイプを通知します。
メッセージタイプとして以下の値が通知されます。
メッセージタイプ | 説明 |
---|---|
LDAP_RES_BIND | ユーザ認証に対するresult情報です。 |
LDAP_RES_SEARCH_ENTRY | 検索条件に合致したエントリを表しています。 |
LDAP_RES_SEARCH_RESULT | エントリの検索結果の通知を示します。 |
LDAP_RES_MODIFY | エントリの変更に対するresult情報です。 |
LDAP_RES_ADD | エントリの追加に対するresult情報です。 |
LDAP_RES_DELETE | エントリの削除に対するresult情報です。 |
LDAP_RES_MODDN | エントリ名の変更に対するresult情報です。 |
LDAP_RES_COMPARE | 属性値の比較に対するresult情報です。 |
非同期操作により受信した結果は、ldap_msgtype()で取得したメッセージタイプにより解析方法が異なります。
LDAP_RES_SEARCH_ENTRY
エントリの検索結果が格納されています。“9.3.5 検索結果の解析”を参考にエントリ情報を取得します。
LDAP_RES_SEARCH_ENTRY以外
非同期操作の応答が格納されています。以下の関数を使用してresult情報に通知された値を取得します。
ldap_parse_result( LDAP *ld, LDAPMessage *res, int *errcodep, char **matcheddnp, char **errmsgp, char **referralsp, LDAPControl **serverctrisp, int freeit )
result情報に含まれている情報を読み込んで、パラメタで指定された変数に格納します。
取得できる主な情報には、以下のものがあります。
LDAPエラーコード
詳細エラーメッセージの文字列
適合したDNの範囲
エントリの検索結果を取得する例です。
msgid = ldap_search( ld, basedn, LDAP_SCOPE_SUBTREE, filter, NULL, 0 ); if ( msgid == -1 ) { /* エラー発生時の処理をする */ return -1; } timeout.tv_sec = 10L; /* 10sec */ timeout.tv_usec = 0L; finished = 0; while ( finished == 0 ) { doOtherWork(); rtn = ldap_result( ld, msgid, LDAP_MSG_ALL, &timeout, &result ); switch( rtn ) { case 0: /* Timeout */ sleep(1); break; case -1: /* エラー発生時の処理をする */ return -1; default: /* success */ finished = 1; break; } /* switch */ } /* while */ message = ldap_first_message( ld, result ); printf( "ldap_count_messages()=%d\n", ldap_count_messages( ld, message ) ); for ( ; message != NULL; message = ldap_next_message( ld, message ) ) { msgtype = ldap_msgtype( message ); if ( msgtype == LDAP_RES_SEARCH_ENTRY ) { printf( "dn: %s\n", ldap_get_dn( ld, message ) ); } else { int errcode = 0; char *matched = NULL; char *errmsg = NULL; ldap_parse_result( ld, message, &errcode, &matched, &errmsg, 0, 0, 0 ); printf( "ldap_parse_result errcode=%s(%d)\n", ldap_err2string(errcode), errcode ); ldap_msgfree( result ); ldap_memfree( matched ); ldap_memfree( errmsg ); return -1; } }
非同期型の関数を使用してInterstage ディレクトリサービスに要求を送信した場合、以下の関数を使用することにより、要求を取り消すことができます。
ldap_abandon( LDAP *ld, int msgid )
非同期型のLDAP操作を中止します。
非同期要求を取り消すには、取り消したい非同期要求のメッセージIDを指定します。メッセージIDは、非同期要求を発行する際に通知されます。
ldap_abandon()を発行した時点で、取り消したい非同期要求のresult情報をすでに受信していた場合は、そのresult情報は破棄されます。
msgid = ldap_search( ld, basedn, LDAP_SCOPE_SUBTREE, filter, NULL, 0 ); rtn = ldap_abandon( ld, msgid ); if( rtn == -1 ) { /* エラー発生時の処理をする */ return -1; }