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; } } |
目次
索引
![]() ![]() |