Interstage Application Server ディレクトリサービス運用ガイド
目次 索引 前ページ次ページ

第9章 アプリケーションの作成(C API)> 9.3 ソースプログラムの作成> 9.3.12 非同期操作

9.3.12.2 非同期操作の結果受取り

 非同期型関数を使ったLDAP操作の結果(result情報)はldap_result()で受け取ります。

 ldap_result()を呼び出すと、Interstage ディレクトリサービスからのresult情報を取得します。result情報が通知されない場合は、指定したタイマー時間まで待ち合わせたあと、呼び出し元に復帰します。ldap_result()では、パラメタとして以下のものを指定します。

 ldap_result()は、関数の復帰値として、受信したresult情報の種類を返します。これを利用して、どの非同期処理に対するresult情報かを判定することができます。ldap_result()については、“リファレンスマニュアル(API編)”の“処理結果の受取り/解析インタフェース”を参照してください。

 以下の処理結果を例にとって、処理結果の解析方法を説明します。

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

 

result情報の読み込みとメッセージタイプの取

 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情報です。

 

result情報の解

 非同期操作により受信した結果は、ldap_msgtype()で取得したメッセージタイプにより解析方法が異なります。

 エントリの検索結果を取得する例です。

  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;
      }
  }

目次 索引 前ページ次ページ

Copyright 2008 FUJITSU LIMITED