次の例は、blevel_t 型の 2 つの変数間の最大値と最小値を見つけます。このインタフェースでは、2 つのレベルが比較されます。2 つのレベルにより定められた範囲内で、blminimum(3) ルーチンにより、もっとも高い下限のレベルを、また、blmaximum(3) ルーチンによりもっとも低い上限のレベルを見つけることができます。レベルは、biltolev(3) ルーチンを使用してレベルに変換された、機密ラベル、認可上限、または情報ラベルのいずれかです。
次のコード例は、TS A B のプロセス認可上限と ADMIN_LOW の機密ラベルが作成する範囲から、もっとも高い下限ともっとも低い上限を見つけます。プロセスは、Confidential で動作しています。
この例の前半は、2 つのレベルのうち、より優位な格付けとすべてのコンパートメントでもっとも優位なコンパートメントを見つけ、その値を最初のパラメータに入れます。この処理は、ルーチンに渡される元のパラメータ値の両方よりも優位なレベルのうちでもっとも低いものを見つけるため、「もっとも低い上限の検索」と言います。
プロセスの機密ラベルがプロセス認可上限よりも優位でないため、プロセスは変換に sys_trans_label 特権を必要とします。第 3 章「特権」で説明している特権のブラケット化が必要な位置は、コード内のコメントで示してあります。
#include <tsol/label.h> main() { int retval, length = 0; char *string = (char *)0, *string1 = (char *)0; bclear_t clear; bslabel_t senslabel; bsllow(&senslabel); reval = getclearance(&clear); blmaximum(&senslabel, &clear); /* 有効セット内で sys_trans_label 特権をオン (有効) にする */ retval = bsltos(&senslabel, &string, length, LONG_WORDS); /* sys_trans_label をオフ (無効) にする */ printf("Maximum = %s¥n", string);
printf(1) 文によって、次のように出力されます。TS ABLE BAKER は、TS A B と ADMIN_LOW より優位なもっとも低いレベルです。
Maximum = TS A B
例の後半は、格付けおよび、コンパートメントのうち、両方のパラメータに含まれているものの中でもっとも低い値を見つけ、その値を最初のパラメータに入れます。この処理は、渡される両方の元のパラメータ値より劣位であるもっとも高いレベルを見つけるため、「もっとも高い下限の検索」と言います。
bsllow(&senslabel); blminimum(&senslabel, &clear); retval = bsltos(&senslabel, &string, length, LONG_WORDS); printf("Minimum = %s¥n", string); }
printf(1) 文によって、次のように出力されます。ADMIN_LOW は、TS A B と ADMIN_LOW より劣位であり、もっとも高いレベルです。
Minimum = ADMIN_LOW