この節に記載される API 関数は、dhcptab コンテナとともに使用されます。
dhcptab コンテナの名前をリストします。
int list_dt(const char *location, char ***listppp, uint_t *count);
location で見つかった dhcptab コンテナオブジェクトの動的に割り当てたリストを生成し (listppp) 、リストの項目数を count 内に格納します。dhcptab コンテナオブジェクトが全く存在しない場合は、DSVC_SUCCESS が返され、listppp は NULL に設定され、count は 0 に設定されます。
DSVC_SUCCESS, DSVC_ACCESS, DSVC_NO_LOCATION
dhcptab コンテナをオープンするか、または新たに作成します。
int open_dt(void **handpp, const char *location, uint_t flags);
既存の dhcptab コンテナをオープンするか、または新しいコンテナを location に作成し、そのインスタンスハンドルを指すように handpp を初期設定します。データ格納にとって必要な初期設定があれば、それを行います。新しい dhcptab を作成する場合には、所有者/アクセス権に呼び出し元の ID が使用されます。有効なフラグには、DSVC_CREATE、DSVC_READ、DSVC_WRITE、DSVC_NONBLOCK があります。dhcptab コンテナの読み取り専用 (DSVC_CREATE | DSVC_READ) としての作成は無効であることに注意してください。
DSVC_SUCCESS, DSVC_EXISTS, DSVC_ACCESS, DSVC_NOENT, DSVC_NO_LOCATION, DSVC_BUSY, DSVC_INTERNAL
dhcptab コンテナ内のレコードに対するクエリー検索を行います。
int lookup_dt(void *handp, boolean_t partial, uint_t query, int count, const dt_rec_t *targetp, dt_rec_list_t **resultp, uint_t *records);
query と targetp の組み合わせで指定されたクエリーにマッチするインスタンスを dhcptab コンテナから検索します。partial 引数が B_TRUE の場合は、呼び出し元にとって部分的なクエリー結果も適用可能であることを意味します。したがって、partial が B_TRUE の場合は、マッチするレコードが 1 つでもあれば、クエリーは有効と見なされます。partial が B_FALSE の場合は、クエリーがコンテナ全体に適用された場合だけ DSVC_SUCCESS が返されます。
クエリー引数は、長さがそれぞれ 16 ビットの 2 つのフィールドからなります。下位 16 ビットでは、targetp のどのフィールド {key, type} をクエリーの対象とするかを選択します。上位 16 ビットでは、下位 16 ビットで選択された特定のフィールド値がマッチするものを検索するのか (ビットセット)、マッチしないものを検索するのか (ビットクリア) を指定します。両方の 16 ビットフィールドとも、ビット 2 から 15 は現在のところ使用されておらず、0 に設定されていなければなりません。クエリーを構築するために有用なマクロを例 3–1 に示します。
count フィールドは、マッチするレコードを最大でいくつ返すかを指定します。count 値に -1 を指定すると、マッチするレコードがいくつあっても、すべて返すことを要求します。count 値に 0 を指定すると、lookup_dt はデータ無しでただちに返されます。
resultp は、返されるレコードのリストを指すよう設定されます。resultp に NULL が指定される場合、呼び出し元は単にクエリーにマッチするレコードがいくつあるかに関心があるということになります。これらのレコードは動的に割り当てられるため、呼び出し元でこれを解放する必要があることに注意してください。lookup_dt() は、records 引数内にマッチするレコードの数を返します。records の値 0 は、クエリーにマッチするレコードは全く無いことを示します。
次の例には、DHCP ネットワークおよび dhcptab のコンテナに対するクエリー検索の構築や操作に有用なマクロが含まれています。
/* * Query macros - used for initializing query fields (lookup_d?) */ /* dhcp network container */ #define DN_QCID 0x0001 #define DN_QCIP 0x0002 #define DN_QSIP 0x0004 #define DN_QLEASE 0x0008 #define DN_QMACRO 0x0010 #define DN_QFDYNAMIC 0x0020 #define DN_QFAUTOMATIC 0x0040 #define DN_QFMANUAL 0x0080 #define DN_QFUNUSABLE 0x0100 #define DN_QFBOOTP_ONLY 0x0200 #define DN_QALL (DN_QCID | DN_QCIP | DN_QSIP | DN_QLEASE | \ DN_QMACRO | DN_QFDYNAMIC DN_QFAUTOMATIC |\ DN_QFMANUAL | DN_QFUNUSABLE | \ DN_QFBOOTP_ONLY) /* dhcptab */ #define DT_DHCPTAB "dhcptab" /* default name of container */ #define DT_QKEY 0x01 #define DT_QTYPE 0x02 #define DT_QALL (DT_QKEY | DT_QTYPE) /* general query macros */ #define DSVC_QINIT(q) ((q) = 0) #define DSVC_QEQ(q, v) ((q) = ((q) | (v) | ((v) << 16))) #define DSVC_QNEQ(q, v) ((q) = ((~(v << 16)) & (q)) | (v))) #define DSVC_QISEQ(q, v) (((q) & (v)) && ((q) & ((v) << 16))) #define DSVC_QISNEQ(q, v) (((q) & (v)) && (!((q) & ((v) << 16)))) /* Examples */ uint_t query; /* search for dhcptab record with key value, but not flags value */ DSVC_QINIT(query); DSVC_QEQ(query, DT_QKEY); DSVC_QNEQ(query, DT_QTYPE); /* search for dhcp network record that matches cid, client ip, server ip. */ DSVC_QINIT(query); DSVC_QEQ(query, (DN_QCID | DN_QCIP | DN_QSIP));
DSVC_SUCCESS, DSVC_ACCESS, DSVC_BUSY, DSVC_INTERNAL.
dhcptab コンテナにレコードを追加します。
int add_dt(void *handp, dt_rec_t *newp);
handp で参照される dhcptab コンテナにレコード newp を追加します。newp に対応するシグニチャは、基盤となるパブリックモジュールによって更新されます。更新における衝突が発生する場合は、データ格納は更新されません。動的に割り当てられた引数は、呼び出し元で解放する必要があります。
DSVC_SUCCESS, DSVC_ACCESS, DSVC_BUSY, DSVC_INTERNAL, DSVC_EXISTS .
dhcptab コンテナ内のレコードを変更します。
int modify_dt(void *handp, const dt_rec_t *origp, dt_rec_t *newp);
handp で参照される dhcptab コンテナ内のレコード origp をレコード newp に変更します。newp に対応するシグニチャは、基盤となるパブリックモジュールによって更新されます。更新における衝突が発生する場合は、データ格納は更新されません。動的に割り当てられた引数は、呼び出し元で解放する必要があります。
DSVC_SUCCESS, DSVC_ACCESS, DSVC_BUSY, DSVC_COLLISION, DSVC_INTERNAL, DSVC_NOENT.
dhcptab コンテナからレコードを削除します。
int delete_dt(void *handp, const dt_rec_t *dtp);
ハンドル handp で参照される dhcptab コンテナから、dtp の key、type、dt_sig フィールドで指定されるレコードを削除します。更新における衝突が発生する場合には、マッチするレコードはデータ格納から削除されず、DSVC_COLLISION が返されます。動的に割り当てられた引数は、呼び出し元で解放する必要があります。
dtp シグニチャ (dt_sig) に 0 を指定すると、更新における衝突があるかどうかの検知は行なわれず、マッチするレコードが単純に削除されます。
DSVC_SUCCESS, DSVC_ACCESS, DSVC_NOENT, DSVC_BUSY, DSVC_INTERNAL, DSVC_COLLISION.
dhcptab コンテナをクローズします。
int close_dt(void **handpp);
インスタンスハンドルを解放し、インスタンスごとの状態を消去します。
DSVC_SUCCESS, DSVC_ACCESS, DSVC_INTERNAL.
データ格納のロケーションから dhcptab コンテナを削除します。
int remove_dt(const char *location);
データ格納から location 内の dhcptab コンテナを削除します。
DSVC_SUCCESS, DSVC_ACCESS, DSVC_NOENT, DSVC_NO_LOCATION, DSVC_BUSY, DSVC_INTERNAL.