Solaris Trusted Extensions 開発ガイド

第 6 章 トラステッド X ウィンドウシステム

この章では、Trusted Extensions X ウィンドウシステム API について説明します。また、トラステッド X ウィンドウシステムのセキュリティーポリシーおよび Solaris Trusted Extensions インタフェースを説明するために使用する簡単な Motif アプリケーションも含まれています。

Trusted Extensions API を Solaris OS で使用する方法の例は、Solaris ソースコードを参照してください。OpenSolaris の Web サイト の左のナビゲーションバーにある「Source Browser」をクリックします。Source Browser を使用して Solaris のソースコードを検索します。

この章の内容は次のとおりです。

トラステッド X ウィンドウシステムの環境

Solaris Trusted Extensions が構成されているシステム は、共通デスクトップ環境 (Common Desktop Environment、CDE) の拡張バージョンである Solaris Trusted Extensions CDE を使用します。Solaris Trusted Extensions CDE は、Trusted Extensions X ウィンドウシステムを使用します。Trusted Extensions X ウィンドウシステムには、必須アクセス制御 (MAC)、任意アクセス制御 (DAC)、および特権の使用をサポートするためのプロトコル拡張が含まれます。

データ転送セッションは「多インスタンス化」されます。すなわち、異なる機密ラベルおよびユーザー ID でセッションがインスタンス化されます。多インスタンス化は、1 つの機密ラベルまたはユーザー ID の非特権クライアントのデータが、別の機密ラベルまたはユーザー ID の別のクライアントに転送されないようにします。このような転送は、トラステッド X ウィンドウシステムの DAC ポリシー、および 等位書き込みと下位読み取りの MAC ポリシーに違反する可能性があります。

Trusted Extensions X ウィンドウシステム API によって、セキュリティー関連属性情報を取得したり設定したりできます。さらに、この API によって、テキスト文字列出力にスタイルを適用するフォントリストおよびピクセル幅を使用してラベルを文字列に変換できます。たとえば、14 ポイント、ボールドの Helvetica フォントなどです。このようなインタフェースは、通常、Motif ウィジェット、Xt イントリンシクス、Xlib、および CDE インタフェースとともに作成される管理アプリケーションによって呼び出されます。

これらのルーチンの宣言については、「Trusted Extensions X ウィンドウシステム API」を参照してください。

トラステッド X ウィンドウシステムのセキュリティー属性

トラステッド X ウィンドウシステムのインタフェースは、さまざまな X ウィンドウシステムオブジェクトのセキュリティー関連属性の情報を管理します。Motif のみによって GUI アプリケーションを作成することができます。Motif アプリケーションは、Xlib オブジェクトのセキュリティー属性の情報を処理する Motif ウィジェットを基礎にして、Xlib オブジェクト ID を取得するために XToolkit ルーチンを使用します。

トラステッド X ウィンドウシステムインタフェースによってセキュリティー属性の情報が取得される X ウィンドウシステムのオブジェクトは、ウィンドウ、プロパティー、X ウィンドウサーバー、およびクライアントと X ウィンドウサーバー間の接続です。Xlib には、ウィンドウ、プロパティー、表示、およびクライアント接続 ID を取得する呼び出しがあります。

ウィンドウは、ユーザーに対して出力を表示し、クライアントからの入力を受け入れます。

プロパティーは、プロパティー名によってアクセスされるデータの任意の集まりです。プロパティー名およびプロパティータイプは「アトム」によって参照できます。これは一意の 32 ビットの識別子であり、文字の名前文字列です。

ウィンドウ、プロパティー、およびクライアント接続のセキュリティー属性は、所有者 ID および機密ラベル情報から構成されます。これらの属性を収集するための構造体については、「X11 のデータ型」を参照してください。セキュリティー属性情報を取得および設定するインタフェースについては、「Trusted Extensions X ウィンドウシステム API」を参照してください。

トラステッド X ウィンドウシステムのセキュリティーポリシー

ウィンドウ、プロパティー、およびピックスマップオブジェクトには、ユーザー ID、クライアント ID、および機密ラベルがあります。グラフィックコンテキスト、フォント、およびカーソルには、クライアント ID のみがあります。クライアントと X ウィンドウサーバーとの接続には、ユーザー ID、X ウィンドウサーバー ID、および機密ラベルがあります。

ユーザー ID」は、オブジェクトを作成したクライアントの ID です。「クライアント ID」は、オブジェクトを作成するクライアントが接続される接続番号に関連します。

DAC ポリシーでは、オブジェクトを所有するクライアントはそのオブジェクトで操作を実行しなければなりません。クライアントのユーザー ID がオブジェクトの ID と等しい場合、クライアントはオブジェクトを所有します。接続要求の場合、クライアントのユーザー ID が X ウィンドウサーバーワークステーションの所有者のアクセス制御リスト (ACL) にある必要があります。あるいは、クライアントがトラステッドパス属性を表明する必要があります。

MAC ポリシーは、ウィンドウおよびピックスマップに関しては等位書き込み、ネーミングウィンドウに関しては等位読み取りです。MAC ポリシーは、プロパティーに関しては下位読み取りです。機密ラベルは、作成元クライアントの機密ラベルに設定されます。次は、それぞれのアクションの MAC ポリシーです。

ウィンドウは、クライアント間で共有される情報を含むプロパティーを持つことができます。ウィンドウプロパティーは、アプリケーションが実行されている機密ラベルで作成されるので、プロパティーデータへのアクセスはそれの機密ラベルによって分離されます。クライアントは、プロパティーを作成したり、ウィンドウ上のプロパティーにデータを格納したり、MAC および DAC の制限に従ってプロパティーからデータを取得したりできます。多インスタンス化されないプロパティーを指定するには、TrustedExtensionsPolicy ファイルを更新します。

TrustedExtensionsPolicy ファイルは、Xsun サーバーおよび Xorg サーバー用にサポートされます。

次の節でそれぞれのセキュリティーポリシーについて説明します。

ルートウィンドウ

ルートウィンドウは、ウィンドウ階層の最上位です。ルートウィンドウは、いずれのクライアントにも属さない公共オブジェクトですが、保護する必要があるデータを持ちます。ルートウィンドウの属性は ADMIN_LOW で保護されます。

クライアントウィンドウ

クライアントには、通常、ルートウィンドウから派生する少なくとも 1 つの最上位クライアントウィンドウと、その最上位ウィンドウ内で入れ子にされた追加ウィンドウがあります。クライアントの最上位ウィンドウから派生するすべてのウィンドウの機密ラベルは同じです。

優先指定/リダイレクトウィンドウ

メニューや特定のダイアログボックスなどの優先指定/リダイレクトウィンドウは、別のクライアントから離れた入力フォーカスを受け取ることはできません。そのため、入力フォーカスは誤った機密ラベルでファイルに入力を受け入れません。優先指定/リダイレクトウィンドウは、作成元クライアントによって所有され、ほかのクライアントによって別の機密ラベルでデータにアクセスするために使用できません。

キーボード、ポインタ、サーバー制御

クライアントは、キーボード、ポインタ、およびサーバーを制御するために MAC および DAC を必要とします。フォーカスをリセットするには、クライアントはフォーカスを所有するか、実効セットに win_devices 特権を必要とします。

ポインタを移動するには、クライアントはポインタ制御、および宛先ウィンドウに対する MAC と DAC が必要です。明示的なユーザーアクションを含むイベントに関して、X および Y 座標情報が取得されます。

選択マネージャー

選択マネージャーアプリケーションは、信頼できないウィンドウ間をデータが転送されるカット&ペースト、ドラッグ&ドロップなど、ユーザーレベルのウィンドウ間データ移動を仲介します。転送が試みられると、選択マネージャーは転送をキャプチャーし、制御ユーザーの承認を確認し、ユーザーに確認とラベル付け情報を要求します。ユーザーがデータ移動を試みると常に、選択マネージャーが自動的に表示されます。選択マネージャーが表示されるようにアプリケーションコードを更新する必要はありません。

管理者は、一部の転送タイプに対して自動確認を設定できます。その場合、選択マネージャーは表示されません。転送が MAC および DAC ポリシーに一致する場合、データ転送は完了します。ファイルマネージャーおよびウィンドウマネージャーは、それぞれの専用ドロップ領域の選択エージェントとしても動作します。多インスタンス化される選択ターゲットを指定するには、/usr/openwin/server/etc/TrustedExtensionsPolicy ファイルを参照してください。自動的に確認される選択ターゲットを決定するには、/usr/dt/config/sel_config ファイルを参照してください。

デフォルトのウィンドウリソース

クライアントによって作成されていないリソースは、ADMIN_LOW で保護されるデフォルトのリソースです。ADMIN_LOW で実行されるか、適切な特権を持って実行されるクライアントのみがデフォルトのリソースを変更できます。

ウィンドウリソースは次のとおりです。

ウィンドウ間のデータの移動

クライアントは、選択マネージャーと関係なくウィンドウ間でデータを移動するには、実効セットに win_selection 特権が必要です。「選択マネージャー」を参照してください。

特権操作とトラステッド X ウィンドウシステム

ユーザーが介在せずにウィンドウ、プロパティー、またはアトム名にアクセスするライブラリルーチンは、MAC および DAC を必要とします。フレームバッファーグラフィックコンテキスト、フォント、およびカーソルにアクセスするライブラリルーチンは任意アクセスを必要とし、さらに、特別なタスクに対する追加特権を必要とする場合があります。

オブジェクトへのアクセスを拒否された場合、クライアントは実効セットに win_dac_readwin_dac_writewin_mac_readwin_mac_write の特権のうち 1 つ以上を必要とする場合があります。これらの特権を有効または無効にするには、TrustedExtensionsPolicy ファイルを参照してください。

次に、それぞれのタスクを実行するのに必要な特権を示します。

Trusted Extensions X ウィンドウシステム API

Trusted X11 API を使用するには、次のヘッダーファイルが必要です。


#include <X11/extensions/Xtsol.h>

Trusted X11 の例は、-lXtsol および -ltsol ライブラリオプションによってコンパイルされます。

X11 ラベルクリッピング API を使用するには、次のヘッダーファイルが必要です。


#include <Dt/label_clipping.h>

ラベルクリッピングの例は、-lDtTsol および -ltsol ライブラリオプションによってコンパイルされます。

次の節で、Trusted X11 インタフェースおよび X11 ラベルクリッピングインタフェースのデータ型および宣言を示します。

X11 のデータ型

次のデータ型が X11/extensions/Xtsol.h で定義されていて、Trusted Extensions X ウィンドウシステム API に使用されます。

属性へのアクセス

リソース、プロパティー、およびクライアント属性にアクセスするために、次のルーチンが使用されます。

Status XTSOLgetResAttributes(Display *display, XID object, ResourceType type, XTSOLResAttributes *winattrp);

このルーチンは、winattrp のウィンドウ ID のリソース属性を返します。XTSOLgetResAttributes(3XTSOL) のマニュアルページを参照してください。

Status XTSOLgetPropAttributes(Display *display, Window window, Atom property, XTSOLPropAttributes *propattrp);

このルーチンは、propattrp のウィンドウ ID によって決まるプロパティーのプロパティー属性を返します。XTSOLgetPropAttributes(3XTSOL) のマニュアルページを参照してください。

Status XTSOLgetClientAttributes(Display *display, XID windowid, XTsolClientAttributes *clientattrp);

このルーチンは clientattrp のクライアント属性を返します。XTSOLgetClientAttributes(3XTSOL) のマニュアルページを参照してください。

ウィンドウラベルへのアクセスと設定

ウィンドウの機密ラベルを取得および設定するために、XTSOLgetResLabel() および XTSOLsetResLabel() ルーチンが使用されます。

Status XTSOLgetResLabel(Display *display, XID object, ResourceType type, m_label_t *sl);

このルーチンはウィンドウの機密ラベルを取得します。XTSOLgetResLabel(3XTSOL) のマニュアルページを参照してください。

Status XTSOLsetResLabel(Display *display, XID object, ResourceType type, m_label_t *sl);

このルーチンはウィンドウの機密ラベルを設定します。XTSOLsetResLabel(3XTSOL) のマニュアルページを参照してください。

ウィンドウユーザー ID へのアクセスと設定

ウィンドウのユーザー ID を取得および設定するために、XTSOLgetResUID() および XTSOLsetResUID() ルーチンが使用されます。

Status XTSOLgetResUID(Display *display, XID object, ResourceType type, uid_t *uidp);

このルーチンはウィンドウのユーザー ID を取得します。XTSOLgetResUID(3XTSOL) のマニュアルページを参照してください。

Status XTSOLsetResUID(Display *display, XID object, ResourceType type, uid_t *uidp);

このルーチンはウィンドウのユーザー ID を設定します。XTSOLsetResUID(3XTSOL) のマニュアルページを参照してください。

ウィンドウプロパティーラベルへのアクセスと設定

ウィンドウ ID によって決まるプロパティーの機密ラベルを取得および設定するために、XTSOLgetPropLabel() および XTSOLsetPropLabel() ルーチンが使用されます。

Status XTSOLgetPropLabel(Display *display, Window window, Atom property, m_label_t *sl);

このルーチンは、ウィンドウ ID によって決まるプロパティーの機密ラベルを取得します。XTSOLgetPropLabel(3XTSOL) のマニュアルページを参照してください。

Status XTSOLsetPropLabel(Display *display, Window window, Atom property, m_label_t *sl);

このルーチンは、ウィンドウ ID によって決まるプロパティーの機密ラベルを設定します。XTSOLsetPropLabel(3XTSOL) のマニュアルページを参照してください。

ウィンドウプロパティーユーザー ID へのアクセスと設定

ウィンドウ ID によって決まるプロパティーのユーザー ID を取得および設定するために、XTSOLgetPropUID() および XTSOLsetPropUID() ルーチンが使用されます。

Status XTSOLgetPropUID(Display *display, Window window, Atom property, uid_t *uidp);

このルーチンは、ウィンドウ ID によって決まるプロパティーのユーザー ID を取得します。XTSOLgetPropUID(3XTSOL) のマニュアルページを参照してください。

Status XTSOLsetPropUID(Display *display, Window window, Atom property, uid_t *uidp);

このルーチンは、ウィンドウ ID によって決まるプロパティーのユーザー ID を設定します。XTSOLsetPropUID(3XTSOL) のマニュアルページを参照してください。

ワークステーション所有者 ID へのアクセスと設定

ワークステーションサーバーの所有者のユーザー ID を取得および設定するために、XTSOLgetWorkstationOwner() および XTSOLsetWorkstationOwner() ルーチンが使用されます。


注 –

XTSOLsetWorkstationOwner() ルーチンはウィンドウマネージャーによってのみ使用されます。


Status XTSOLgetWorkstationOwner(Display *display, uid_t *uidp);

このルーチンは、ワークステーションサーバーの所有者のユーザー ID を取得します。XTSOLgetWorkstationOwner(3XTSOL) のマニュアルページを参照してください。

Status XTSOLsetWorkstationOwner(Display *display, uid_t *uidp);

このルーチンは、ワークステーションサーバーの所有者のユーザー ID を設定します。XTSOLsetWorkstationOwner(3XTSOL) のマニュアルページを参照してください。

X ウィンドウサーバーの認可上限と最下位ラベルの設定

X ウィンドウサーバーにセッション高位認可上限およびセッション最下位ラベルを設定するために、XTSOLsetSessionHI() および XTSOLsetSessionLO() ルーチンを使用します。セッション高位認可上限は、ラベルビルダー GUI から選択でき、ユーザーの範囲内である必要があります。セッション最下位ラベルは、マルチレベルセッションの場合のユーザーの最下位ラベルと同じです。


注 –

これらのインタフェースはウィンドウマネージャーによってのみ使用されます。


Status XTSOLsetSessionHI(Display *display, m_label_t *sl);

セッションの高位認可上限は、ログイン時のワークステーション所有者の認可上限から設定されます。セッションの高位認可上限は、所有者の認可上限およびマシンモニターのラベル範囲の上限のほうが優位です。これが変更されると、ウィンドウサーバーの認可上限より高位の機密ラベルで実行されるクライアントからの接続要求は、特権がなければ拒否されます。XTSOLsetSessionHI(3XTSOL) のマニュアルページを参照してください。

Status XTSOLsetSessionLO(Display *display, m_label_t *sl);

セッションの最下位ラベルは、ログイン時のワークステーション所有者の最下位ラベルから設定されます。セッションの最下位ラベルは、管理のために設定されるユーザーの最下位ラベルおよびマシンモニターのラベル範囲の下限より高位です。この設定を変更すると、ウィンドウサーバーの機密ラベルより下位の機密ラベルで実行されるクライアントからの接続要求は、特権がなければ拒否されます。XTSOLsetSessionLO(3XTSOL) のマニュアルページを参照してください。。

トラステッドパスウィンドウでの作業

指定したウィンドウをトラステッドパスウィンドウにするため、および、指定したウインドウがトラステッドパスウィンドウであるかどうかを検査するために、XTSOLMakeTPWindow() および XTSOLIsWindowTrusted() ルーチンが使用されます。

Status XTSOLMakeTPWindow(Display *display, Window *w);

このルーチンは、指定したウィンドウをトラステッドパスウィンドウにします。XTSOLMakeTPWindow(3XTSOL) のマニュアルページを参照してください。

Bool XTSOLIsWindowTrusted(Display *display, Window *window);

このルーチンは、指定したウィンドウがトラステッドパスウィンドウであるかどうかを検査します。XTSOLIsWindowTrusted(3XTSOL) のマニュアルページを参照してください。

スクリーンストライプの高さへのアクセスと設定

スクリーンストライプの高さを取得および設定するために、XTSOLgetSSHeight() および XTSOLsetSSHeight() ルーチンが使用されます。


注 –

これらのインタフェースはウィンドウマネージャーによってのみ使用されます。


Status XTSOLgetSSHeight(Display *display, int screen_num, int *newHeight);

このルーチンはスクリーンストライプの高さを取得します。XTSOLgetSSHeight(3XTSOL) のマニュアルページを参照してください。

Status XTSOLsetSSHeight(Display *display, int screen_num, int newHeight);

このルーチンはスクリーンストライプの高さを設定します。スクリーンストライプがなくなったり、非常に大きなスクリーンストライプになったりしないように注意してください。XTSOLsetSSHeight(3XTSOL) のマニュアルページを参照してください。

ウィンドウの多インスタンス化情報の設定

Status XTSOLsetPolyInstInfo(Display *display, m_label_t sl, uid_t *uidp, int enabled);

XTSOLsetPolyInstInfo() ルーチンは、クライアントとは異なる機密ラベルで、クライアントがプロパティーからプロパティー情報を取得できるようにします。最初の呼び出しで、必要な機密ラベルとユーザー ID を指定し、enabled プロパティーを True に設定します。次に、XTSOLgetPropAttributes()XTSOLgetPropLabel()、または XTSOLgetPropUID() を呼び出します。終了するには、enabled プロパティーを False に設定して XTSOLsetPolyInstInfo() ルーチンを再び呼び出します。XTSOLsetPolyInstInfo(3XTSOL) のマニュアルページを参照してください。

X11 ラベルクリッピングインタフェースでの作業

int label_to_str(const m_label_t *label, char **string, const m_label_str_t conversion_type, uint_t flags);

label_to_str() ルーチンは、機密ラベルまたは認可上限を文字列に変換します。label_to_str(3TSOL) のマニュアルページを参照してください。

トラステッド X ウィンドウシステムインタフェースの使用

このあとの各節では、Trusted Extensions インタフェース呼び出しを使用するコーディング例の抜粋を示します。これらの呼び出しはセキュリティー属性を処理して、ラベルを文字列に変換します。抜粋では、ウィンドウセキュリティー属性、アプリケーションプログラムでもっとも一般的に管理される属性の処理に焦点を当てます。多くの場合、クライアントは、別のアプリケーションによって作成されたオブジェクトに対して適切な特権を使用することによってセキュリティー属性を取得します。その次に、クライアントは属性をチェックして、オブジェクトに対する操作がシステムのセキュリティーポリシーによって許可されているか否かを判別します。このセキュリティーポリシーには、DAC ポリシー、および MAC の等位書き込みと下位読み取りのポリシーが含まれます。アクセスが拒否されると、アプリケーションは場合に応じてエラーを生成するか、特権を使用します。特権が必要とされる場合の説明は、「特権操作とトラステッド X ウィンドウシステム」を参照してください。

Trusted Extensions API に渡すためのオブジェクトの ID を取得する前に、オブジェクトを作成してください。

ウィンドウ属性の取得

XTSOLgetResAttributes() ルーチンは、ウィンドウのセキュリティー関連属性を返します。次を指定します。

クライアントは、そのクライアントが作成したウィンドウのセキュリティー属性を取得するので、特権は必要ありません。

このマニュアル内のプログラム例は、API の紹介を中心としていて、エラーチェックは行なっていません。実際に作成するアプリケーションでは、適切なエラーチェックを実行してください。

/* Xlib 呼び出しによって基本のウィンドウと表示 ID を取得する */
   window = XtWindow(topLevel);
   display = XtDisplay(topLevel);

/* ウィンドウセキュリティー属性を取得する */
   retval = XTSOLgetResAttributes(display, window, IsWindow, &winattrs);

/* ラベルを文字列に変換する */
   retval = label_to_str(&winattrs.sl, &plabel, M_LABEL, LONG_NAMES);

/* セキュリティー属性情報を出力する */
   printf(“Workstation Owner ID = %d\nUser ID = %d\nLabel = %s\n”,
   winattrs.ouid, winattrs.uid, string1);

printf 文によって次のように出力されます。


Workstation Owner ID = 29378
User ID = 29378
Label = CONFIDENTIAL

フォントリストによるウィンドウラベルの変換

この例は、プロセス機密ラベルを取得し、フォントリストおよびピクセル幅を使用してそれを文字列に変換する方法を示します。ラベルの文字列とともに、ラベルウィジェットが作成されます。プロセス機密ラベルはウィンドウ機密ラベルと同じです。したがって、特権は必要ありません。

最後の文字列がピクセル幅に収まらない場合、文字列は切り取られて切り取りインジケータが表示されます。X ウィンドウシステムのラベル変換インタフェースは指定したピクセル数で切り取り、ラベルクリッピングインタフェースは文字数で切り取ります。


注 –

英語以外の言語で label_encodings ファイルを使用する場合、ISO 標準のコード番号 128 以上のアクセント文字では変換されないことがあります。次の例は、アジア言語の文字セットでは機能しません。


	retval = getplabel(&senslabel);

/* フォントリストを作成し、それを使用してラベルを変換する */
	italic = XLoadQueryFont(XtDisplay(topLevel),
		“-adobe-times-medium-i-*-*-14-*-*-*-*-*-iso8859-1”);
	fontlist = XmFontListCreate(italic, “italic”);
	xmstr = Xbsltos(XtDisplay(topLevel), &senslabel, width, fontlist, 
		LONG_WORDS);
/* フォントリストとラベルテキストを使用してラベルウィジェットを作成する */
	i=0;
	XtSetArg(args[i], XmNfontList, fontlist); i++;
	XtSetArg(args[i], XmNlabelString, xmstr); i++;
	label = XtCreateManagedWidget(“label”, xmLabelWidgetClass, 
		form, args, i);

ウィンドウラベルの取得

この例は、ウィンドウの機密ラベルを取得する方法を示します。プロセス機密ラベルはウィンドウ機密ラベルと同じです。したがって、特権は必要ありません。

/* ウィンドウラベルを取得する */
	retval = XTSOLgetResLabel(display, window, IsWindow, &senslabel);

/* ラベルを文字列に変換し、出力する */
	retval = label_to_str(label, &string, M_LABEL, LONG_NAMES);
	printf(“Label = %s\n”, string);

printf 文によって、たとえば、次のように出力されます。


Label = PUBLIC

ウィンドウラベルの設定

この例は、ウィンドウに機密ラベルを設定する方法を示します。新しい機密ラベルは、ウィンドウおよびプロセスの機密ラベルより優位です。クライアントが優位ではないラベルを変換するには、クライアントの実効セットに sys_trans_label 特権が必要です。さらに、ウィンドウの機密ラベルを変更するには、クライアントに win_upgrade_sl 特権も必要です。

特権の使用についての詳細は、『Solaris セキュリティーサービス開発ガイド』を参照してください。

/* テキスト文字列を機密ラベルに変換する */
   retval = label_to_str(string4, &label, M_LABEL, L_NO_CORRECTION, &error);

/* 新しい値で機密ラベルを設定する */
   retval = XTSOLsetResLabel(display, window, IsWindow, label);

ウィンドウユーザー ID の取得

この例は、ウィンドウユーザー ID を取得する方法を示します。プロセスはウィンドウリソースを所有し、同じ機密ラベルで実行されています。したがって、特権は必要ありません。

/* ウィンドウのユーザー ID を取得する */
	retval = XTSOLgetResUID(display, window, IsWindow, &uid);

X ウィンドウサーバーワークステーション所有者 ID の取得

この例は、X ウィンドウサーバーにログインしているユーザーの ID を取得する方法を示します。プロセス機密ラベルはウィンドウ機密ラベルと同じです。したがって、特権は必要ありません。

/* ウィンドウのユーザー ID を取得する */
	retval = XTSOLgetWorkstationOwner(display, &uid);