ONC+ 開発ガイド

SAC とポートモニターのインタフェース

SAC は、起動するポートモニターごとに次の 2 つの環境変数を作成します。

SAC は FIFO 経由でポートモニターと通信します。 ポートモニターはカレントディレクトリ内で SAC からのメッセージを受け取るための _pmpipe と、応答メッセージを SAC に送るための ../_sacpipe をオープンします。

メッセージ形式

この節では、SAC からポートモニターに送るメッセージ (SAC メッセージ) と、ポートモニターから SAC に送るメッセージ (ポートモニターメッセージ) について説明します。メッセージは、FIFO を通して C の構造体形式で送信されます。例 F–2 を参照してください。

SAC のメッセージ

SAC から送られるメッセージの形式は、構造体 sacmsg で定義されています。

struct sacmsg {
 	int sc_size; /* オプションデータ部分のサイズ */
 	char sc_type; /* メッセージのタイプ */
};

SAC からポートモニターに送られるメッセージには 4 つのタイプがあります。メッセージがどのタイプなのかは、sacmsg 構造体の sc_type フィールドに次のどれかの値を設定して示します。

ポートモニターは、sac からのメッセージには必ず応答しなければなりません。

ポートモニターメッセージ

ポートモニターから sac に送られるメッセージの形式は、次の構造体 pmmsg で定義されています。

struct pmmsg {
 	char pm_type;                /* メッセージのタイプ */
 	unchar pm_state;             /* ポートモニターの現在の状態 */
 	char pm_maxclass;            /* このポートモニターが解釈できる
                                   最大メッセージクラス */
 	char pm_tag[PMTAGSIZE + 1];  /* ポートモニターのタグ */
 	int pm_size;                 /* オプションデータ部分のサイズ */
};

ポートモニターから SAC に送られるメッセージには 2 つのタイプがあります。 メッセージがどのタイプなのかは、pmmsg 構造体の pm_type フィールドに次のどちらかの値を設定して示します。

どちらのタイプのメッセージの場合も、pm_tag フィールドにはポートモニターのタグが、pm_state フィールドにはポートモニターの現在の状態が設定されます。pm_state フィールドに設定できる状態は次の 4 つです。

現在の状態は、sac からの最後のメッセージによる状態変更を反映しています。

通常の応答メッセージは状態メッセージです。否定応答メッセージを返すのは、sac から受信したメッセージが理解できなかったときだけです。

pm_size はメッセージのオプションデータ部分のサイズを示します。pm_maxclass はメッセージクラスを指定するのに使用します。この 2 つのフィールドについては、メッセージクラス の説明を参照してください。Solaris 環境では、常に pm_maxclass 1 へ、sc_size0 へ設定してください。

ポートモニターから先にメッセージを送ることはありません。ポートモニターは、受信したメッセージに応答するだけです。

メッセージクラス

メッセージクラスの概念は、SAF の拡張性に含まれています。前述のメッセージはすべて class 1 メッセージです。 どのメッセージにも可変長データは含まれていません。必要な情報はすべてメッセージヘッダーに入っています。

新たなメッセージをプロトコルに加えると、それによって新たなメッセージクラス、たとえば、クラス 2 が定義されます。SAC からポートモニターに送られる最初のメッセージは常にクラス 1 のメッセージです。どのポートモニターもクラス 1 のメッセージは理解できますから、SAC が送る最初のメッセージは必ず理解されます。ポートモニターは、それに対する sac への応答の中で、ポートモニターが理解できる最大メッセージクラス番号を pm_maxclass フィールドに設定します。sac は、ポートモニターに対して、pm_maxclass の値より大きいクラスのメッセージは送りません。ポートモニターが理解できるクラスより上のクラスのメッセージを必要とする要求は、失敗に終わります。Solaris 環境では、常に pm_maxclass 1 へ設定してください。

どのポートモニターも、pm_maxclass の値と等しいクラスかそれより小さいクラスのメッセージを受信できます。したがって、pm_maxclass フィールドが 3 の場合、このポートモニターはクラス 123 のメッセージを理解できます。ポートモニターはメッセージを生成することはありません。受信したメッセージに応答するだけです。ポートモニターからの応答は、元のメッセージと同じクラスでなければなりません。

sac の側からだけメッセージが生成されるので、sac が生成できるクラスより上のクラスのメッセージをポートモニターが処理できる場合も、このプロトコルは正しく機能します。

pm_size pmmsg 構造体の要素です。sc_sizesacmsg 構造体の要素です。 これらの要素はメッセージのオプションデータ部分のサイズを示します。オプションデータ部分の形式は未定義です。オプションデータ部分の形式定義は、メッセージのタイプによって決まっています。Solaris 環境では、常に sc_sizepm_size0 へ設定してください。