次のコードは、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