| Interstage Application Server ディレクトリサービス運用ガイド |
目次
索引
![]()
|
| 第9章 アプリケーションの作成(C API) | > 9.3 ソースプログラムの作成 | > 9.3.12 非同期操作 |
非同期型関数を使ったLDAP操作の結果(result情報)はldap_result()で受け取ります。
ldap_result()を呼び出すと、Interstage ディレクトリサービスからのresult情報を取得します。result情報が通知されない場合は、指定したタイマー時間まで待ち合わせたあと、呼び出し元に復帰します。ldap_result()では、パラメタとして以下のものを指定します。
非同期型関数を発行する際に通知される値を指定します。
特定の非同期型関数のresult情報を待つ場合には、その関数のメッセージIDを指定します。待ち合わせる非同期型関数を特定しない場合には、LDAP_RES_ANYを指定します。
処理結果を受信する際の、処理の種類を指定します。
一括受信の場合、要求に対する最後のメッセージを受信してから、呼び出し元に復帰します。順次受信の場合には、1件のメッセージを受信するとすぐに呼び出し元に復帰します。
ここで指定された時間以内にメッセージを受信しなかった場合、呼び出し元にタイムアウトを示す0が通知されます。NULLを指定すると結果を受信するまで待ち合わせます。
ldap_result()は、関数の復帰値として、受信したresult情報の種類を返します。これを利用して、どの非同期処理に対するresult情報かを判定することができます。ldap_result()については、“リファレンスマニュアル(API編)”の“処理結果の受取り/解析インタフェース”を参照してください。
以下の処理結果を例にとって、処理結果の解析方法を説明します。

非同期操作の結果は以下のような構造で返却されます。

result情報はメッセージリストで返却されます。メッセージリストを解析するには以下の関数を使用します。

受信したresult情報のメッセージ種別やメッセージIDを判定する場合、以下の関数を使用します。

メッセージタイプとして以下の値が通知されます。
|
メッセージタイプ |
説明 |
|---|---|
|
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()で取得したメッセージタイプにより解析方法が異なります。
エントリの検索結果が格納されています。“検索結果の解析”を参考にエントリ情報を取得します。
非同期操作の応答が格納されています。以下の関数を使用してresult情報に通知された値を取得します。
result情報に含まれている情報を読み込んで、パラメタで指定された変数に格納します。
取得できる主な情報には、以下のものがあります。
エントリの検索結果を取得する例です。
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;
}
} |
目次
索引
![]()
|