次のコードは、getmldadorn(2) システムコールを使用して MLD 装飾を照会し、getsldname(2) システムコールを使用して Top Secret SLD の SLD 名を照会します。この例では、Top Secret の SLD はまだ存在しないため、getsldname(2) に対する呼び出しがこれを作成します。
プロセスは、認可上限 Top Secret を使用して Confidential で動作しています。このプロセスは、Top Secret ラベルの変換に sys_trans_label 特権、Top Secret SLD の作成に file_upgrade_sl 特権、そして Top Secret SLD 情報のアクセスに file_mac_search 特権と file_mac_read 特権を必要とします。
#include <tsol/label.h>
main()
{
int retval, error, length;
bslabel_t label;
char *buffer[1025], *buf[1025], *string = "TOP SECRET";
char *file = "/export/home/zelda";
retval = getmldadorn(file, buffer);
printf("MLD adornment = %s¥n", buffer);
/* 有効セット内で sys_trans_label をオン (有効) にする */
retval = stobsl(string, &label, NEW_LABEL, &error);
/* sys_trans_label をオフ (無効) にする */
length = sizeof(buf);
/* file_upgrade_sl、file_mac_search、file_mac_read */
/*をオン (有効) にする */
retval = getsldname(file, &label, buf, length);
/* file_upgrade_sl、file_mac_search、file_mac_read */
/*をオフ (無効) にする*/
printf("SLD name = %s¥n", buf);
}
printf(1) 文によって、次のように出力されます
MLD adornment = .MLD.
SLD name = .SLD.3
次の例は、mldgetcwd(3) ルーチンを使用して現在の作業ディレクトリ (MLD と現在の SLD) を照会し、adornfc(1) ルーチンを使用してこの MLD の装飾名を取得します。続いて、mldrealpath(1) ルーチンを使用して resolvefile (解決済みファイル) に格納されたパス名内の余分なスラッシュを削除し、実際のパスを見つけます。このプロセスは、Confidential で動作しています。
#include <tsol/label.h>
#include <sys/types.h>
main()
{
int retval;
char *buffer[1025];
char *file = "/export/home/zelda";
char *string2, *name[1025], *string3, *resolved[1025];
size_t size;
/* 文字列のエラーを解決する */
char *resolvefile = "./";
size = sizeof(buffer);
string2 = (char *)mldgetcwd(buffer, size);
printf("Current working directory = %s¥n", buffer);
retval = adornfc(file, name);
printf("Adorned name = %s¥n", name);
string3 = (char *)mldrealpath(resolvefile, resolved);
printf("Real path = %s¥n", resolved);
}
printf 文によって、次のように出力されます。
adornfc(1) ルーチンに対するファイルパラメータに SLD 名が含められる場合、装飾名は /export/home/zelda/.MLD..SLD.1 のように SLD が追加された形式で返されます。
Current working directory = /export/home/.MLD.zelda/.SLD.2
Adorned name = /export/home/.MLD.zelda
Real path = /export/home/.MLD.zelda/.SLD.2
次の例は、/export/home/zelda MLD の属性情報を取得します。stat(2) システムコールマクロは、printf(1) 文で MLD がディレクトリであるか通常のファイルであるかを確認します。そして、ctime(3C) ルーチンによって、返された秒単位の時間がユーザーが読める形式に変換されます (詳細は、ctime(3C) のマニュアルページを参照)。
#include <tsol/label.h>
#include <sys/stat.h>
main()
{
int retval;
struct stat statbuf;
char *file = "/export/home/zelda";
retval = mldstat(file, &statbuf);
printf("Is file system object a directory? = %d¥n", S_ISDIR(statbuf.st_mode));
printf("Is file system object a regular file? = %d¥n", S_ISREG(statbuf.st_mode));
printf("Number of links = %d¥n", statbuf.st_nlink);
printf("Owner's user ID = %d¥n", statbuf.st_uid);
printf("Owner's group Id = %d¥n", statbuf.st_gid);
printf("Last access time = %s¥n", ctime(&statbuf.st_atime));
printf("Last modify time = %s¥n", ctime(&statbuf.st_mtime));
printf("Last status change = %s¥n", ctime(&statbuf.st_ctime));
}
printf 文によって、次のように出力されます。
Is file system object a directory? = 1
Is file system object a regular file? = 0
Number of links = 6
Owner's user ID = 29378
Owner's group Id = 10
Last access time = Wed May 28 10:58:25 1997
Last modify time = Wed May 28 09:39:18 1997
Last status change = Wed May 28 09:39:18 1997