Interstage ディレクトリサービスに対してエントリの検索を要求すると、検索条件に合致したエントリの情報が通知されます。エントリを検索するには、以下の関数を使用します。
ldap_search( LDAP *ld, const char *base, int scope, const char *filter, char **attrs, int attrsonly )
非同期型の検索をします。
ldap_search_s( LDAP *ld, const char *base, int scope, const char *filter, char **attrs, int attrsonly, LDAPMessage **res )
同期型の検索をします。
基本的な検索方法
基本的な検索は、サーチベース(検索開始位置)、検索する範囲、および検索フィルタを指定します。これらのパラメタの組み合わせることにより検索範囲を絞り込むことができます。
サーチベース
サーチベースとなるエントリのDNを指定します。省略できません。
検索する範囲
検索する範囲として、以下のどれか1つを指定します。
LDAP_SCOPE_BASE : サーチベースに指定された階層だけを検索します。
LDAP_SCOPE_ONELEVEL : サーチベースに指定された階層の1つ下の階層を検索します。
LDAP_SCOPE_SUBTREE : サーチベースに指定された階層配下すべてを検索します。
検索フィルタ
検索条件の式を"cn=User001"のように指定します。NULLを指定すると、検索対象のエントリの中で、利用できるエントリが、すべて通知されます。
同期型検索の例を示します。
/* エントリの検索 */ rtn = ldap_search_s( ld, "ou=interstage,o=fujitsu,dc=com", LDAP_SCOPE_SUBTREE, "cn=User001", NULL, 0, &result ); if ( rtn != LDAP_SUCCESS ) { /* エラー発生時の処理をする */ return -1; }
高度な検索方法
基本的な検索方法による検索範囲の絞り込みに加え、検索結果で通知する対象を限定したり、通知される最大件数に制限を設けたり、検索タイムアウトを設定したりできます。
以下に検索例を説明します。
取得する属性を制限する
検索結果として取得する属性を指定できます。
char *attrs[] = { "cn", "telephonenumber","mail", NULL }; ...... rtn = ldap_search_s( ld, "ou=interstage,o=fujitsu,dc=com", LDAP_SCOPE_SUBTREE, "cn=User001", attrs, 0, &result );
NULLを指定すると、検索条件に合致したエントリの、利用できる属性が、すべて通知されます。
DNだけを検索する
検索結果としてDNだけを検索することができます。
char *attrs[] = { LDAP_NO_ATTRS, NULL }; ...... rtn = ldap_search_s( ld, "ou=interstage,o=fujitsu,dc=com", LDAP_SCOPE_SUBTREE, "cn=User001", attrs, 0, &result );
検索結果の最大エントリ数を制限する
検索結果の最大エントリ数を、セションハンドルオプション「LDAP_OPT_SIZELIMIT」を使って設定します。
int sizelimit = 3; rtn = ldap_set_option( ld, LDAP_OPT_SIZELIMIT, (void *)(&sizelimit) );
また、セションハンドルを使用しないで、以下の関数を使っても最大エントリ数を制限できます。
ldap_search_ext( LDAP *ld, const char *base, int scope, const char *filter, char **attrs, int attrsonly, LDAPControl **serverctrls, LDAPControls clientctrls, struct timeval *timeout, int sizelimit, int *msgidp )
非同期型の検索をします。
ldap_search_ext_s( LDAP *ld, const char *base, int scope, const char *filter, char **attrs, int attrsonly, LDAPControl **serverctrls, LDAPControls clientctrls, struct timeval *timeout, int sizelimit, LDAPMessage **res )
同期型の検索をします。
int sizelimit = 3; rtn = ldap_search_ext_s( ld, "ou=interstage,o=fujitsu,dc=com", LDAP_SCOPE_SUBTREE, "cn=User001", NULL, 0, NULL, NULL, NULL, sizelimit, &result );
検索結果の最大待ち時間を制限する
セションハンドルオプション「LDAP_OPT_TIMELIMIT」を使って、検索結果の最大待ち時間を秒単位で設定します。
int timelimit = 5; rtn = ldap_set_option( ld, LDAP_OPT_TIMELIMIT, (void *)(&timelimit) );
以下の関数を使うこともできます。
ldap_search_st( LDAP *ld, const char *base, int scope, const char *filter, char **attrs, int attrsonly, struct timeval *timeout, LDAPMessage **res )
時間制限付きの同期型検索をします。
timeout.tv_sec = 5L; /* 秒単位 */ timeout.tv_usec = 0L; /* マイクロ秒単位 */ rtn = ldap_search_st( ld, "ou=interstage,o=fujitsu,dc=com", LDAP_SCOPE_SUBTREE, "cn=User001", NULL, 0, &timeout, &result );
また、ldap_search_ext()、ldap_search_ext_s()でも同様に最大待ち時間を指定することができます。