この例は、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) を確認してください。