この例は、Confidential でセマフォセットの識別子を作成し、同じセマフォセットで CMW ラベルを取得します。続いてプログラムは、ロックを要求する時点で、セマフォセットの情報ラベルを変更します。このプログラムは、Top Secret で動作しています。
#include <sys/tsol/ipc.h> #include <sys/types.h> #include <tsol/label.h> #include <sys/sem.h> main() { int id, retval, error; bclabel_t cmwlabel; bslabel_t senslabel; bilabel_t inflabel; char *string = (char *)0, *string2 = (char *)0; struct sembuf sops = {2, 1, IPC_NOWAIT}; retval = stobsl("CONFIDENTIAL", &senslabel, NEW_LABEL, &error); retval = stobil("CONFIDENTIAL", &inflabel, NEW_LABEL, &error); /* Confidential のセマフォセットを作成する */ /* 有効セット内で ipc_mac_write をオン (有効) にする */ id = semgetl(IPC_PRIVATE, 5, IPC_CREAT, &senslabel); /* ipc_mac_write をオフ (無効) にする */ /* セマフォセットの CMW ラベルを得る */ /* 有効セット内で ipc_mac_read をオン (有効) にする */ retval = getsemcmwlabel(id, &cmwlabel); /* ipc_mac_read をオフ (無効) にする */ /* CMW ラベルを出力する */ bcltos(&cmwlabel, &string, 0, LONG_WORDS); printf("CMW label = %s¥n", string);
printf 文によって、次のように出力されます。
CMW label = UNCLASSIFIED[C]
プログラムは、セマフォロックを要求するとき、セマフォセットの情報ラベルを Unclassified から Confidential に変更します。
/* ロックを要求し、情報ラベルを Confidential に変更する */ /* 有効セット内で ipc_upgrade_il をオン (有効) にする */ retval = semopl(id, &sops, 1, &inflabel); /* ipc_upgrade_il をオフ (無効) にする */ /* セマフォセットの CMW ラベルを得る */ /* 有効セット内で ipc_mac_read をオン (有効) にする */ retval = getsemcmwlabel(id, &cmwlabel); /* ipc_mac_read をオフ (無効) にする */ getcil(&inflabel, &cmwlabel); /* 情報ラベルを出力する */ biltos(&inflabel, &string2, 0, LONG_WORDS); printf("Information label = %s¥n", string2); }
printf 文によって、次のように出力されます。
Information label = CONFIDENTIAL
情報ラベルに対する変更を確認する場合、/etc/system ファイルで System V IPC セマフォの情報ラベルの浮上がオンに設定されていること (tsol_float_sem_il = 1) を確認してください。