AF_INET ファミリでは、プロセスは、特権または非特権のポート番号に対して単一ラベル接続またはマルチラベル接続を確立できます。特権ポート番号に接続するには、net_priv_addr 特権が必要です。マルチレベルポート接続にするには、net_bindmlp 特権も必要です。
サーバープロセスには、マルチレベルポート接続のために、その実効セットに net_bindmlp 特権が必要です。それに対して単一レベルポート接続を行う場合、サーバープロセスにはソケットに対する必須同等読み取りアクセスが必要であり、クライアントプロセスには必須同等書き込みアクセスが必要です。両方のプロセスには、ファイルに対する必須と任意のアクセスが必要です。ファイルへのアクセスが拒否される場合、アクセスが拒否されるプロセスには、アクセスを得るために、適切なファイル特権がその実効セットに必要です。
次のコーディング例は、接続されたクライアントのラベルをマルチレベルサーバーがどのように取得するかを示します。標準 C ライブラリ関数 getpeerucred() が、接続されたソケットまたは STREAM ピアの資格を取得します。Trusted Extensions において、マルチレベルポートサーバーの待機ソケットが接続要求を受け入れると、通常、最初の引数がクライアントソケットファイル記述子になります。Trusted Extensions アプリケーションは、標準のアプリケーションプログラムとまったく同じに getpeerucred() 関数を使用します。Trusted Extensions には ucred_getlabel() が追加され、ラベルを返します。詳細は、ucred_get(3C) のマニュアルページを参照してください。
/* * この例は、接続されたクライアントのラベルをマルチレベルサーバーが * どのように取得するかを示す。 */ void remote_client_label(int svr_fd) { ucred_t *uc = NULL; m_label_t *sl; struct sockaddr_in6 remote_addr; bzero((void *)&remote_addr, sizeof (struct sockaddr_in6)); while (1) { int clnt_fd; clnt_fd = accept(svr_fd, (struct sockaddr *)&remote_addr, &sizeof (struct sockaddr_in6)); /* * ソケットからクライアント属性を取得する */ if (getpeerucred(clnt_fd, &uc) == -1) { return; } /* * ucred 構造体から各フィールドを抽出する */ sl = ucred_getlabel(uc); /* * セキュリティーラベルの使用法 * ..... */ ucred_free(uc); close(clnt_fd); } }