/system/contract
/system/contract ファイルシステムは、契約サブシステムへの第一インタフェースとして機能します。/system/contract のサブディレクトリは、利用可能な契約タイプごとに 1 つずつ存在しています。
/system/contract は、標準の /system/contract マウントポイントに加え、任意のマウントポイントにもマウントできます。また、いくつかの場所に同時にマウントすることもできます。そのような追加マウントが許可されているのは、chroot(1M) を使ってファイルシステムのサブツリーにプロセスを制限しやすくしつつも、そうしたプロセスが引き続き、contract コマンドやインタフェースを使用できるようにするためです。
/system/contract のファイルにアクセスするには、標準のシステムコール (open(2)、close(2)、poll(2) など) と libcontract(3LIB) への呼び出しを組み合わせて使用します。
契約ファイルシステムのコンシューマは、大規模ファイルに対応している必要があります。largefile(5) および lfcompile64(5) を参照してください。
/system/contract ディレクトリの最上位レベルには、利用可能な契約タイプごとに用意されたタイプ固有の名前を持ついくつかのサブディレクトリと、1 つの特殊ディレクトリ all が含まれています。これらのディレクトリはそれぞれ、誰でも読み取りや検索を行えます。
各 /system/contract/type ディレクトリには、ある固定数のファイルが含まれます。また、個数の固定されていないサブディレクトリも含まれます。それらのサブディレクトリは、タイプ type の既存の契約に対応したものであり、それらの契約の ID の 10 進表現に基づいた名前を持っています。
/system/contract/type ディレクトリ内に存在するファイルは、次のとおりです。
このファイルをオープンすると、新しい type 契約テンプレートに対するファイル記述子が返されます。
テンプレートファイル記述子では、次の libcontract(3LIB) 呼び出しを使用できます。
ct_tmpl_activate(3contract) ct_tmpl_clear(3contract) ct_tmpl_create(3contract)
その他のテンプレート関数については、「条項」を参照してください。
このファイルをオープンすると、オープン元の LWP が最後に書き込んだ type 契約の状態ファイルに対するファイル記述子が返されます。「/system/contract/type/id の構造」を参照してください。オープン元の LWP が type 契約をまだ 1 つも作成していなかった場合、最新契約オープン処理は ESRCH で失敗します。
このファイルをオープンすると、システム上のすべての type 契約からのイベントを受信するイベントエンドポイントに対するファイル記述子が返されます。タイプバンドルイベントエンドポイントは、特権がなくてもオープンできます。読み取り元の実効ユーザー ID 以外のユーザーが所有し、書き込みを行った契約から送信されてきたイベントは、不可視になります。つまり、それらのイベントは自動的にスキップされます。ただし、その読み取り元の実効セットに {PRIV_CONTRACT_OBSERVER} が含まれている場合はその限りではありません。「イベント」を参照してください。
このファイルをオープンすると、オープン元のプロセスが保持するすべての type 契約からのイベントを受信するイベントエンドポイントに対するファイル記述子が返されます。「イベント」を参照してください。
/system/contract/all ディレクトリには、数値に基づく名前が付けられたファイルが、システム内の契約ごとに 1 つずつ含まれています。各ファイルは、対応する契約のタイプ固有ディレクトリへのシンボリックリンクになっています。つまり、/system/contract/all/id は、/system/contract/type/id をポイントしています。
各 /system/contract/type/id ディレクトリに含まれるファイルは、次のとおりです。
このファイルをオープンすると、契約 id の制御ファイルに対するファイル記述子が返されます。オープン元のプロセスが契約 id を保持しておらず、しかもそのオープン元のプロセスが所属するプロセス契約からその契約が継承されていない場合には、このオープンは失敗します。process(4) を参照してください。
呼び出し元が所有する契約の ctl ファイル記述子では、次の libcontract(3LIB) 呼び出しを行えます。
ct_ctl_abandon(3contract) ct_ctl_newct(3contract) ct_ctl_ack(3contract) ct_ctl_qack(3contract)
所有者を持たない契約の ctl ファイル記述子では、次の libcontract(3LIB) 呼び出しを行えます。
ct_ctl_adopt(3contract)
このファイルをオープンすると、契約 id の状態ファイルに対するファイル記述子が返されます。状態ファイル記述子で、次の libcontract(3LIB) 呼び出しを行えます。
ct_status_read(3contract)
「ステータス」を参照してください。
このファイルをオープンすると、契約 id からのイベントを受信するイベントエンドポイントに対するファイル記述子が返されます。「イベント」を参照してください。
契約のイベントエンドポイントをオープンできるのは、その契約を所有するプロセスと同一の実効ユーザー ID を持つプロセス、その契約の作成者と同一の実効ユーザー ID を持つプロセス、および実効セットに {PRIV_CONTRACT_OBSERVER} が含まれているプロセスだけです。
契約作成者が契約の識別子として使用可能な 64 ビット量を指定します。この条項を設定するには、ct_tmpl_set_cookie(3CONTRACT) を使用します。
通知イベントとして配信されるイベントを選択します。この条項を設定するには、ct_tmpl_set_informative(3CONTRACT) を使用します。
クリティカルイベントとして配信されるイベントを選択します。この条項を設定するには、ct_tmpl_set_critical(3CONTRACT) を使用します。
ct_status_read(3CONTRACT) から返されるステータスオブジェクトには、次の各情報が含まれます。
契約の数値 ID。この情報を取得するには、ct_status_get_id(3CONTRACT) を使用します。
契約のタイプ。文字列として表されます。ct_status_get_type(3CONTRACT) を使って取得します。契約タイプは、/system/contract 配下の対応するサブディレクトリの名前と同じになります。
契約を作成したプロセスのゾーン ID。ct_status_get_zoneid(3CONTRACT) を使って取得します。
契約の状態。CTS_OWNED、CTS_INHERITED、CTS_ORPHAN、CTS_DEAD のいずれかで表されます。この情報を取得するには、ct_status_get_state(3CONTRACT) を使用します。
契約の状態が CTS_OWNED である場合、契約を所有するプロセスの ID。契約の状態が CTS_INHERITED である場合、リージェントとして機能している契約の ID。契約の状態が CTS_ORPHAN、CTS_DEAD のいずれかである場合、これは未定義となります。この情報を取得するには、ct_status_get_holder(3CONTRACT) を使用します。
契約のイベントキュー上で保留状態になっている未確認クリティカルイベントの数。この情報を取得するには、ct_status_get_nevents(3CONTRACT) を使用します。
現在の同期ネゴシエーションがタイムアウトするまでの残時間。この情報を取得するには、ct_status_get_ntime(3CONTRACT) を使用します。
現在のネゴシエーションクォンタムが尽きるまでの残時間。この情報を取得するには、ct_status_get_qtime(3CONTRACT) を使用します。
ネゴシエーションタイムアウトを起動したイベントの ID。この情報を取得するには、ct_status_get_nevid(3CONTRACT) を使用します。
契約の Cookie 条項。この情報を取得するには、ct_status_get_cookie(3CONTRACT) を使用します。
契約の通知イベントセット。この情報を取得するには、ct_status_get_informative(3CONTRACT) を使用します。
契約のクリティカルイベントセット。この情報を取得するには、ct_status_get_critical(3CONTRACT) を使用します。
3 つのイベントエンドポイント /system/contract/type/bundle、/system/contract/type/pbundle、および /system/contract/type/id/events には、どれも同じ方法でアクセスできます。
イベントエンドポイントファイル記述子では、次の libcontract(3LIB) インタフェースが使用されます。
ct_event_read(3contract) ct_event_read_critical(3contract) ct_event_reset(3contract) ct_event_next(3contract)
プロセスが複数のイベントエンドポイントを監視しやすくする目的で、イベントエンドポイントに対して poll(2) が呼び出せるようになっています。あるエンドポイントファイル記述子上で受信が可能となっている場合、その記述子に対して POLLIN が設定されます。
ct_event_read(3CONTRACT) から返されたイベントオブジェクトには、次の情報が含まれます。
イベントを生成した契約の ID。この情報を取得するには、ct_event_get_ctid(3CONTRACT) を使用します。
契約イベントの ID。ct_event_get_evid(3CONTRACT) を使用します。
ビットベクトル。通常は CT_ACK と CTE_INFO が含まれます。この情報を取得するには、ct_event_get_flags(3CONTRACT) を使用します。
イベントのタイプ。契約タイプのマニュアルページ内に指定された定数のいずれか、または CT_EV_NEGEND に等しくなります。この情報を取得するには、ct_event_get_type(3CONTRACT) を使用します。
次のイベントタイプが定義されています。
終了ネゴシエーションの起動後、少し経ってから CT_EV_NEGEND イベントが送信されます。これはネゴシエーションが終了したことを示します。この原因は、処理が取り消されたからか、または処理が成功した可能性があります。成功した場合で、かつ所有者が新しい契約が書き込まれることを要求した場合、これにはその契約の ID が含まれます。
CT_EV_NEGEND は、契約の通知イベントセットやクリティカルイベントセットに含めることができません。これは常に配信され、常にクリティカルとなります。CT_EV_NEGEND が処理の成功を示している場合、イベントはそれ以上送信されません。契約の所有者は、ct_ctl_abandon(3CONTRACT) を使ってその契約を破棄してください。
CT_EV_NEGEND イベントには次の情報が含まれます。
終了したネゴシエーションの ID。この情報を取得するには、ct_event_get_nevid(3CONTRACT) を使用します。
新しく作成された契約の ID。この値は、契約が作成されなかった場合は 0 になります。また、処理が完了しなかった場合は既存の契約の ID になります。この情報を取得するには、ct_event_get_newct(3CONTRACT) を使用します。
すべての契約タイプの一覧
すべての契約 ID のディレクトリ
契約 id のタイプ固有ディレクトリへのシンボリックリンク
固有タイプのディレクトリ
この契約タイプのテンプレート
そのタイプのすべての契約に対する待機ポイント
オープン元プロセスのそのタイプのすべての契約に対する待機ポイント
オープン元の LWP によって作成された最新の type 契約の状態
契約 ID のディレクトリ
契約 ID のイベントに対する待機ポイント
契約 ID の制御ファイル
契約 ID の状態情報
ctrun(1), ctstat(1), ctwatch(1), chroot(1M), close(2), ioctl(2), open(2), poll(2), ct_ctl_abandon(3CONTRACT), ct_event_get_ctid(3CONTRACT), ct_event_get_evid(3CONTRACT), ct_event_get_flags(3CONTRACT), ct_event_get_nevid(3CONTRACT), ct_event_get_newct(3CONTRACT), ct_event_get_type(3CONTRACT), ct_status_read(3CONTRACT)ct_status_get_cookie(3CONTRACT), ct_status_get_critical(3CONTRACT), ct_status_get_holder(3CONTRACT), ct_status_get_id(3CONTRACT), ct_status_get_informative(3CONTRACT), ct_status_get_nevid(3CONTRACT), ct_status_get_nevents(3CONTRACT), ct_status_get_ntime(3CONTRACT), ct_status_get_qtime(3CONTRACT), ct_status_get_state(3CONTRACT), ct_status_get_type(3CONTRACT), ct_tmpl_set_cookie(3CONTRACT), ct_tmpl_set_critical(3CONTRACT), ct_tmpl_set_informative(3CONTRACT), libcontract(3LIB), process(4), largefile(5), lfcompile(5), privileges(5)