Oracle® Fusion Middleware Oracle Directory Server Enterprise Edition開発者ガイド 11g リリース1 (11.1.1.7.0) B72440-01 |
|
前 |
次 |
この章では、プラグイン関数で使用するデータ型と構造体について説明します。表14-1には、使用可能なデータ構造体のリストがまとめられています。表14-2には、コールバックのリストがまとめられています。
表14-1 データ構造体に対するクイック・リファレンス
データ構造体またはコールバック | 簡単な説明 |
---|---|
|
基本エンコーディング・ルールを使用してエンコードされるバイナリ・データ |
|
算出属性を処理するときに使用する情報 |
|
LDAP操作に関連付けられたLDAP v3コントロール |
|
ディレクトリ・エントリ属性に対する変更セット |
|
ディレクトリ・エントリ属性 |
|
サーバー・バックエンド |
|
サーバーに割り当てられた識別子(内部操作に使用される) |
|
スレッド同期の条件変数 |
|
クライアント接続 |
|
識別名 |
|
ディレクトリ・エントリ |
|
検索フィルタ |
|
プラグインによって処理される一致ルール |
|
個々の属性に対する変更 |
|
ディレクトリ・エントリに対する変更セット |
|
スレッド同期のMutex |
|
保留中のLDAP操作 |
|
LDAP操作データを含むパラメータ・ブロック |
|
提供するプラグインの説明 |
|
相対識別名 |
|
個々の属性値 |
|
属性値セット |
|
仮想の可能性がある属性 |
表14-2 コールバックに対するクイック・リファレンス
データ構造体またはコールバック | 簡単な説明 |
---|---|
|
拡張可能な一致フィルタを処理する。 |
|
内部検索で検出される参照を処理する。 |
|
内部検索後に送信される結果を処理する。 |
|
内部検索で検出されるエントリを処理する。 |
|
ロールの範囲を決定する。 |
|
参照をクライアントに送信する前に変更する。 |
|
結果をクライアントに送信する前に変更する。 |
|
エントリをクライアントに送信する前に変更する。 |
|
算出属性を処理する。 |
|
算出属性を計算する。 |
|
オブジェクト拡張の作成を処理する。 |
|
オブジェクト拡張の破棄を処理する。 |
|
再帰的なプラグイン登録を処理する。 |
berval
簡素化された基本エンコーディング・ルール(BER)を使用してエンコードされたバイナリ・データを表します。
JPEGまたはオーディオ・ファイルなどのバイナリ属性値を使用するときにberval
構造体を使用します。
/* Defined in ldap.h, which is included by slapi-plugin.h */ #include "slapi-plugin.h" struct berval { unsigned long bv_len; char * bv_val; };
computed_attr_context
計算される属性の属性タイプ、現在のBERエンコーディングされたリクエストおよびパラメータ・ブロック・コンテキストなどの情報を表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct _computed_attr_context computed_attr_context;
サーバーは、クライアント・アプリケーションにエントリを送信する前に、計算される属性があるかどうかを決定します。該当する場合、サーバーはこれらの属性を生成し、エントリに含めます。
このプロセスの一部として、サーバーは、computed_attr_context
構造体を作成し、属性値を生成する関数に関連情報を渡します。
LDAPControl
LDAP v3で指定されているように、LDAP操作に関連付けられたクライアントまたはサーバー・コントロールを表します。
クライアントおよびサーバー・コントロールは、LDAP操作の機能を拡張するために使用されることがあります。
/* Defined in ldap.h, which is included by slapi-plugin.h */ #include "slapi-plugin.h" typedef struct ldapcontrol { char * ldctl_oid; struct berval ldctl_value; char ldctl_iscritical; } LDAPControl, * PLDAPControl;
この構造体には、次のフィールドがあります。
表14-4 LDAPControl
のフィールド
フィールド | 説明 |
---|---|
|
コントロールのオブジェクト識別子(OID)。 |
|
操作のコントロールによって使用される値を含む |
|
|
LDAPMod
ディレクトリ・エントリの属性に対する変更を表します。
/* Defined in ldap.h, which is included by slapi-plugin.h */ #include "slapi-plugin.h" typedef struct ldapmod { int mod_op; char * mod_type; union { char ** modv_strvals; struct berval ** modv_bvals; } mod_vals; } LDAPMod; #define mod_values mod_vals.modv_strvals #define mod_bvalues mod_vals.modv_bvals
この構造体には、次のフィールドがあります。
表14-5 LDAPMod
のフィールド
フィールド | 説明 |
---|---|
|
実行する操作と属性値のデータ型。
|
|
変更する属性タイプ。 |
|
属性の文字列値の |
|
属性の |
例14-1では、メール・アドレスを変更するようにLDAPMod
を設定しています。
例14-1 エントリに対する変更の準備
#include "slapi-plugin.h" /* Declare the appropriate structures. */ LDAPMod mod_attr; /* Attribute to modify */ LDAPMod * mods[2]; /* Array of modifications */ char * mail_vals[] = /* New mail address */ {"quentin@example.com", NULL}; /* Set up the LDAPMod structure used to modify the entry. */ mod_attr.mod_type = "mail"; mod_attr.mod_op = LDAP_MOD_REPLACE; mod_attr.mod_values = mail_vals; /* "quentin@example.com" */ mods[0] = &mod_attr; mods[1] = NULL; /* Modify the entry using slapi_modify_internal_set_pb()... */
例14-2では、パラメータ・ブロックの内容に任意でさらに変更を追加しています。たとえば、このコードは、事前操作変更プラグイン関数の一部になることがあります。
例14-2 さらなる変更の追加
#include "slapi-plugin.h" /* * Set up an LDAPMod array, modify_mods, of additional modifications. */ if (modify_mods != NULL) { LDAPMod ** mods; Slapi_Mods smods; int i; slapi_pblock_get(pb, SLAPI_MODIFY_MODS, &mods); slapi_mods_init_passin(&smods, mods); for (i = 0; modify_mods[i] != NULL; i++) { /* Do not copy mods. */ slapi_mods_add_ldapmod(&smods, modify_mods[i]); } mods = slapi_mods_get_ldapmods_passout(&smods); slapi_pblock_set(pb, SLAPI_MODIFY_MODS, mods); slapi_mods_done(&smods); /* Release container only. Content is still pointed to by mods. */ slapi_ch_free((void **)&modify_mods); }
mrFilterMatchFn
フィルタ一致のコールバック関数を指定します。サーバーは、検索操作を処理するときに、拡張可能な一致検索フィルタと一致する候補ごとに1回この関数をコールします。
#include "slapi-plugin.h" typedef int (*mrFilterMatchFn) (void* filter, Slapi_Entry* entry, Slapi_Attr* vals);
コールバックは、次のパラメータを取ります。
表14-6 mrFilterMatchFn
のパラメータ
パラメータ | 説明 |
---|---|
|
フィルタ・ファクトリ関数によって作成されたフィルタ。 |
|
サーバーによってチェックされる候補エントリを表す |
|
エントリ内の最初の属性を表す 残りの属性に対して処理を繰り返すには、 |
サーバーは、一致ルール・プラグインを使用して拡張可能な一致フィルタを処理するときに、このフィルタ一致関数をコールします。拡張可能な一致フィルタは、一致するエントリが検出される仕組みを示した一致ルールのOIDか属性タイプのいずれか、またはその両方を指定します。たとえば、よく似た一致ルールを実装して、指定された値に類似するすべてのエントリを検出することができます。
一致ルールに対して拡張可能な一致フィルタを処理するには、このコールバックと、フィルタ構造体filter
を作成するフィルタ・ファクタの両方を実装します。コールバックは、この構造体から属性タイプや値などのフィルタに関する情報を取得し、この情報を候補entry
内の属性タイプや値と比較します。
コールバックは、フィルタが一致する場合は0
、フィルタが一致しない場合は-1
を戻す必要があります。エラー発生時は、RFC 4511『Lightweight Directory Access Protocol (v3)』の「Result Message」の項に示されているように、LDAPエラー・コードを戻すことがあります。
plugin_referral_entry_callback
参照のコールバック関数を指定します。サーバーは、このコールバックをトリガーするために実装された内部検索がLDAP v3参照を検出すると、この関数をコールします。
#include "slapi-plugin.h" typedef int (*plugin_referral_entry_callback)(char * referral, void *callback_data);
コールバックは、次のパラメータを取ります。
これをslapi_search_internal_callback_pb()
のprec
パラメータとして渡します。内部検索は、参照エントリを検出するたびに、この関数をコールします。
サーバーは、コールバックの戻り値を使用しません。
plugin_result_callback
検索結果のコールバック関数を指定します。サーバーは、このコールバックをトリガーするために実装された内部検索がLDAP結果を戻すと、この関数をコールします。
#include "slapi-plugin.h" typedef void (*plugin_result_callback)(int rc, void *callback_data);
コールバックは、次のパラメータを取ります。
これをslapi_search_internal_callback_pb()
のprc
パラメータとして渡します。サーバーは、検索が中止されなければ、検索操作ごとに1回この関数をコールします(中止された場合、関数はコールされません)。
plugin_search_entry_callback
エントリのコールバック関数を指定します。サーバーは、このコールバックをトリガーするために実装された内部検索がLDAPエントリを検出すると、この関数をコールします。
#include "slapi-plugin.h" typedef int (*plugin_search_entry_callback)(Slapi_Entry *e, void *callback_data);
コールバックは、次のパラメータを取ります。
これをslapi_search_internal_callback_pb()
のpsec
パラメータとして渡します。内部検索は、参照エントリを検出するたびに、この関数をコールします。
コールバックは、検索を続けるには0
を、検索を中断するには-1
を戻す必要があります。
roles_get_scope_fn_type
ある範囲のロールを決定するためのコールバック関数を指定します。プラグインは、slapi_role_get_scope()
を使用してこのコールバックをトリガーします。
#include "slapi-plugin.h" typedef int (*roles_get_scope_fn_type)(Slapi_Entry *role_entry, Slapi_DN ***scope, int *nb_scope);
コールバックは、次のパラメータを取ります。
このコールバックは、role_entryによって識別される範囲のロールを決定します。slapi_register_role_get_scope()
を使用して、サーバーにコールバックを登録します。
成功した場合は0
、それ以外の場合は-1
を戻します。
send_ldap_referral_fn_ptr_t
サーバーが結果をクライアントに送信する前にトリガーされるコールバックを指定します。
#include "slapi-plugin.h" typedef int (*send_ldap_referral_fn_ptr_t)( Slapi_PBlock *pb, Slapi_Entry *e, struct berval **refs, struct berval ***urls );
コールバックは、次のパラメータを取ります。
このコールバックによって、クライアントに戻される参照を変更できます。slapi_search_internal_callback_pb()
を使用して、サーバーにコールバックを登録します。
成功した場合は0
、そうでない場合は-1
を戻します。
send_ldap_result_fn_ptr_t
サーバーが結果をクライアントに送信する前にトリガーされるコールバックを指定します。
#include "slapi-plugin.h" typedef void (*send_ldap_result_fn_ptr_t)( Slapi_PBlock *pb, int err, char *matched, char *text, int nentries, struct berval **urls );
コールバックは、次のパラメータを取ります。
表14-12 send_ldap_result_fn_ptr_t
のパラメータ
パラメータ | 説明 |
---|---|
|
操作の現在のパラメータ・ブロック |
|
結果コード。 |
|
|
|
クライアントに返信するエラー・メッセージ。(エラー・メッセージを返信しない場合は |
|
LDAP検索操作の結果コードを返信するときに、この引数を使用して、検出された一致エントリの数を指定する。 |
|
|
このコールバックによって、クライアントに戻される結果を変更できます。slapi_search_internal_callback_pb()
を使用して、サーバーにコールバックを登録します。
成功した場合は0
、そうでない場合は-1
を戻します。
send_ldap_search_entry_fn_ptr_t
検索によって戻されるエントリをサーバーがクライアントに送信する前にトリガーされるコールバックを指定します。
#include "slapi-plugin.h" typedef int (*send_ldap_search_entry_fn_ptr_t)( Slapi_PBlock *pb, Slapi_Entry *e, LDAPControl **ectrls, char **attrs, int attrsonly );
コールバックは、次のパラメータを取ります。
このコールバックによって、クライアントに戻される内容を変更できます。slapi_search_internal_callback_pb()
を使用して、サーバーにコールバックを登録します。
成功した場合は0
、そうでない場合は-1
を戻します。
Slapi_Attr
ディレクトリ・エントリ属性を表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_attr Slapi_Attr;
Slapi_Backend
サーバー・バックエンドを表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct backend Slapi_Backend;
Slapi_ComponentId
内部操作を処理するときに、プラグインを識別するためにサーバーによって使用されるコンポーネント識別子を表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_componentid Slapi_ComponentId;
例
次のコードでは、内部検索中に使用されるプラグイン・コンポーネント識別子を設定しています。
例14-3 内部操作で使用するプラグイン識別子の設定
#include "slapi-plugin.h" /* Declare the identifier as global to the plug-in. */ static Slapi_ComponentId * postop_id; /* Assign a value as part of plug-in initialization. */ int testpostop_init(Slapi_PBlock * pb) { int rc = 0; /* Register description, other functions, and so forth. */ rc |= slapi_pblock_set( pb, SLAPI_PLUGIN_START_FN, (void *) testpostop_set_log ); /* Assign a value to the identifier. */ rc |= slapi_pblock_get(pb, SLAPI_PLUGIN_IDENTITY, &postop_id); return (rc); } /* The server uses the identifier when processing * internal operations, such as an internal search. */ int testpostop_set_log(Slapi_PBlock * pb) { Slapi_DN * confdn = NULL; /* DN for configuration entry */ Slapi_Entry * config = NULL; /* Configuration entry */ int rc = 0; confdn = slapi_sdn_new_dn_byval("cn=config"); rc |= slapi_search_internal_get_entry(confdn, NULL, &config, postop_id); /* Use the results of the search. */ return(rc); }
slapi_compute_callback_t
算出属性に値を指定するためにコールされる関数を決定するための関数を指定します。
typedef int (*slapi_compute_callback_t)(computed_attr_context *c, char* type,Slapi_Entry *e,slapi_compute_output_t outputfn);
コールバックは、次のパラメータを取ります。
このコールバックは、指定のコンテキストc
、エントリe
のタイプtype
の属性の値を計算する関数を選択します。サーバーは、この関数をコールして、操作を要求したクライアントにエントリe
を戻す前に属性値を計算するための関数を取得します。
この関数は、プラグイン初期化関数でslapi_compute_add_evaluator()
を使用して、サーバーに登録されます。
この関数は、成功すると0
を戻します。type
で渡された属性タイプを処理しない場合は、-1
を戻します。それ以外の場合は、LDAPエラー・コードを戻します。
slapi_compute_output_t
算出属性の値を決定するためのコールバック関数を指定します。
typedef int (*slapi_compute_output_t)(computed_attr_context *c, Slapi_Attr *a , Slapi_Entry *e);
コールバックは、次のパラメータを取ります。
このコールバックは、指定のコンテキストc
、エントリe
の属性a
の値を計算します。slapi_compute_add_evaluator()
を使用して登録するslapi_compute_callback_t
関数は、この関数をコールして、サーバーにエントリe
を戻す前にa
の値を計算します。
この関数は、成功すると0
を戻します。a
で渡された属性タイプを処理しない場合は、-1
を戻します。それ以外の場合は、LDAPエラー・コードを戻します。
Slapi_CondVar
スレッド同期を処理するためにプラグインによって使用される条件変数を表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_condvar Slapi_CondVar;
Slapi_Connection
サーバーへの接続を表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct conn Slapi_Connection;
Slapi_DN
識別名(DN)を表す不透明な構造体です。構造体は、元のDNを保持し、slapi_sdn_get_ndn()
がコールされた後に正規化されたバージョンも保持できます。
#include "slapi-plugin.h" typedef struct slapi_dn Slapi_DN;
Slapi_Entry
ディレクトリ・エントリを表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_entry Slapi_Entry;
slapi_extension_constructor_fnptr
オブジェクト拡張のコールバック関数を指定します。
#include "slapi-plugin.h" typedef void *(*slapi_extension_constructor_fnptr) (void *object, void *parent);
コールバックは、次のパラメータを取ります。
このコールバックは、slapi_get_object_extension()
を使用して取得できるオブジェクト拡張を登録します。
オブジェクト拡張が存在しない場合、このコールバックがオブジェクト拡張のみを作成することを確認します。
コールバックは、実際のプラグイン初期化関数の一部としてslapi_register_object_extension()
を使用してサーバーに登録されます。
このコールバックは、拡張へのポインタを戻します。それ以外の場合は、NULL
を戻します。
slapi_extension_destructor_fnptr
オブジェクト拡張に割り当てられたメモリーを解放するためのコールバック関数を指定します。
#include "slapi-plugin.h" typedef void (*slapi_extension_destructor_fnptr)(void *extension, void *object, void *parent);
コールバックは、次のパラメータを取ります。
このコールバックは、オブジェクト拡張に割り当てられたメモリーを解放します。関数は、プラグイン初期化関数でslapi_register_object_extension()
を使用して、サーバーに登録されます。
Slapi_Filter
検索フィルタを表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_filter Slapi_Filter;
Slapi_MatchingRuleEntry
プラグインによって処理されるLDAP v3一致ルールを表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_matchingRuleEntry Slapi_MatchingRuleEntry;
Slapi_Mod
ディレクトリ・エントリ属性の変更を表す不透明な構造体です。
パラメータ・ブロックは、Slapi_Mod
構造体ではなくLDAPMod
構造体を使用します。後者のタイプは、幅広く変更を処理するプラグインに便利です。
#include "slapi-plugin.h" typedef struct slapi_mod Slapi_Mod;
Slapi_Mods
ディレクトリ・エントリに対する一連の変更を表す不透明な構造体です。
パラメータ・ブロックは、Slapi_Mods
構造体ではなくLDAPMod
構造体の配列を使用します。後者のタイプは、幅広く変更を処理するプラグインに便利です。
#include "slapi-plugin.h" typedef struct slapi_mods Slapi_Mods;
Slapi_Mutex
プラグインによって使用されるmutexロックを表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_mutex Slapi_Mutex;
Slapi_Operation
LDAPクライアントからの保留中の操作を表す不透明な構造体です。
構造体は、他のデータとの間で、要求された操作のタイプを記録します。
#include "slapi-plugin.h" typedef struct op Slapi_Operation;
Slapi_PBlock
パラメータ・ブロックと呼ばれ、サーバー操作のコンテキストで更新された名前/値ペアを含む不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_pblock Slapi_PBlock;
プラグイン関数のほとんどのタイプは、サーバーによって、処理される操作に関連するデータを含むパラメータ・ブロック(Slapi_PBlock
)で渡されます。slapi_pblock_get()
を使用してデータにアクセスします。
プラグイン初期化関数は、slapi_pblock_set()
を使用して、少なくともプラグインAPIバージョン、プラグインの説明およびその他のプラグイン関数を登録します。
Slapi_PBlock
構造体で使用可能な特定のパラメータは、プラグイン関数のタイプとLDAP操作のコンテキストに依存します。プラグイン関数の特定のタイプに使用可能な名前/値ペアの詳細は、335ページの「パラメータ・ブロック・リファレンス」を参照してください。
Slapi_PBlock
の使用例は、$INSTALL_DIR/examples/
の下のサンプル・プラグインを参照してください。
Slapi_PluginDesc
プラグインを識別するために指定するプラグインの説明を表します。
プラグイン初期化関数は、この情報をサーバーに登録する必要があります。
#include "slapi-plugin.h" typedef struct slapi_plugindesc { char * spd_id; char * spd_vendor; char * spd_version; char * spd_description; } Slapi_PluginDesc;
この構造体には、次のフィールドがあります。
Slapi_PluginDesc
の使用例は、$INSTALL_DIR/examples/
の下のサンプル・プラグインを参照してください。
slapi_plugin_init_fnptr
他のプラグインを登録するためのコールバック関数を指定します。
#include "slapi-plugin.h" typedef int (*slapi_plugin_init_fnptr)( Slapi_PBlock *pb );
コールバックは、次のパラメータを取ります。
このコールバックは、プラグイン初期化関数を模倣し、1つのプラグインが他のプラグインを登録することを許可します。関数は、実際のプラグイン初期化関数の一部としてslapi_register_plugin()
を使用してサーバーに登録されます。
このコールバックは、成功すると0
を戻します。そうでない場合は、-1
を戻します。
プラグイン初期化関数の例は、$INSTALL_DIR/examples/
の下のサンプル・プラグインを参照してください。
Slapi_RDN
同じ親を持つ他のエントリとそのエントリを差別化するDNの一部である相対識別名(RDN)を表す不透明な構造体です。
#include "slapi-plugin.h" typedef struct slapi_rdn Slapi_RDN;
Slapi_Value
個々の属性値を表す不透明な構造体です。
一度に属性のすべての値を処理するときは、かわりにSlapi_ValueSet
を使用します。
#include "slapi-plugin.h" typedef struct slapi_value Slapi_Value;
Slapi_ValueSet
属性の値セットを表す不透明な構造体です。
個々の属性値を処理するときは、かわりにSlapi_Value
を使用します。
#include "slapi-plugin.h" typedef struct slapi_value_set Slapi_ValueSet;