日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
UNIX(4) FreeBSD カーネルインタフェースマニュアル UNIX(4)
名称
unix -- UNIX ドメインプロトコルファミリ
書式
#include <sys/types.h>
#include <sys/un.h>
解説
UNIX ドメインプロトコルファミリは、通常の socket(2) メカニズムを介して
ローカル (マシンの) プロセス間通信を提供するプロトコルの集まりです。UNIX
ドメインファミリは、SOCK_STREAM, SOCK_SEQPACKET と SOCK_DGRAM ソケットタ
イプをサポートし、アドレシングにファイルシステムのパス名を使用します。
アドレッシング
UNIX ドメインのアドレスは、多くても 104 の文字の可変長のファイルシステム
パス名です。インクルードファイル <sys/un.h> は、次のアドレスを定義してい
ます:
struct sockaddr_un {
u_char sun_len;
u_char sun_family;
char sun_path[104];
};
bind(2) で UNIX ドメインソケットに名前をバインドすることによって、ファイ
ルシステムにソケットファイルを作成されます。このファイルは、ソケットがク
ローズされても削除されません -- ファイルを削除するためには、unlink(2) を
使用しなければなりません。
bind(2) と connect(2) によって要求される UNIX ドメインアドレスの長さは、
<sys/un.h> で定義されたマクロ SUN_LEN() を使用して計算することができま
す。sun_path フィールドは、SUN_LEN() で使用されるためにヌル文字で終了して
いなければなりませんが、終端のヌルは、アドレスの一部ではありません。
UNIX ドメインプロトコルファミリは、着信メッセージでブロードキャストアドレ
シングも ``ワイルドカード'' に適合するどんな形式もサポートしていません。
すべてのアドレスは、他の UNIX ドメインソケットの絶対的パス名か相対的パス
名です。また、パス名を参照するとき、通常のファイルシステムアクセス制御メ
カニズムが適用されます。例えば、connect(2) または sendto(2) の宛先は、書
き込み可能でなければなりません。
制御メッセージ
UNIX ドメインソケットは、UNIX ファイル記述子の通信をサポートし、
sendmsg(2) と recvmsg(2) への msg 引数の msg_control フィールドの使用を通
して資格証明を処理します。渡される項目は、インクルードファイル
<sys/socket.h> で定義されている struct cmsghdr を使用して記述されていま
す。
ファイル記述子を送信するために、メッセージのタイプは、SCM_RIGHTS であり、
メッセージのデータ部分は、渡されるファイル記述子を表される整数の配列で
す。渡される記述子の数は、メッセージの長さのフィールドによって定義されま
す。長さのフィールドは、ヘッダのサイズとファイル記述子配列のサイズの合計
です。
受信された記述子は、MSG_CMSG_CLOEXEC が recvmsg(2) 呼び出しで渡されるかど
うかに依存する dup(fd) または fcntl(fd, F_DUPFD_CLOEXEC, 0) を通して作成
されたかのように、送信側の記述子の複写です。配信を待っているか、または故
意に受信されない記述子は、宛先ソケットがクローズされるとき、システムに
よって自動的にクローズされます。
次のような <sys/socket.h> で定義されるタイプ struct cmsgcred のデータ部分
があるタイプ SCM_CREDS の制御メッセージを明示的に使用して送信プロセスの資
格証明を送信することができます:
struct cmsgcred {
pid_t cmcred_pid; /* 送信プロセスの PID */
uid_t cmcred_uid; /* 送信プロセスの実 UID */
uid_t cmcred_euid; /* 送信プロセスの実効 UID */
gid_t cmcred_gid; /* 送信プロセスの実 GID */
short cmcred_ngroups; /* グループの数 */
gid_t cmcred_groups[CMGROUP_MAX]; /* グループ */
};
送信側は、システムによって満たされたゼロクリアされたバッファを渡すべきで
す。
グループリストは、多くても CMGROUP_MAX GID に切り詰められます。
プロセス ID cmcred_pid は、セキュリティの決定を行うために (KERN_PROC_PID
sysctl を経るかのように) 検索されるべきではありません。送信プロセスが、終
了しましたが、そのプロセス ID は、新しいプロセスのために、すでに再利用さ
れています。
ソケットオプション
UNIX ドメインソケットは、setsockopt(2) で設定し、getsockopt(2) でテストす
ることができる、オプションレベル SOL_LOCAL のための多くのソケットオプショ
ンをサポートします。
LOCAL_CREDS このオプションは、SOCK_DGRAM, SOCK_SEQPACKET また
は SOCK_STREAM ソケットで有効にされるかもしれませ
ん。このオプションは、recvmsg(2) 制御メッセージと
して write(2), send(2), sendto(2) または
sendmsg(2) を呼び出しているプロセスの資格証明を受
信する受信側のメカニズムを提供しています。cmsghdr
構造体を含むバッファを指す msghdr 構造体の
msg_control フィールドは、次の <sys/socket.h> で
定義された可変長の sockcred 構造体が後に続きます:
struct sockcred {
uid_t sc_uid; /* 実ユーザ ID */
uid_t sc_euid; /* 実効ユーザ ID */
gid_t sc_gid; /* 実グループ ID */
gid_t sc_egid; /* 実効グループ ID */
int sc_ngroups; /* 追加グループの数 */
gid_t sc_groups[1]; /* 可変長 */
};
現在の実装は、グループリストを多くても
CMGROUP_MAX グループに切り詰めます。
SOCKCREDSIZE() マクロは、指定された数のグループの
ための sockcred 構造体のサイズを計算します。
cmsghdr フィールドには、次の値があります:
cmsg_len = CMSG_LEN(SOCKCREDSIZE(ngroups))
cmsg_level = SOL_SOCKET
cmsg_type = SCM_CREDS
SOCK_STREAM と SOCK_SEQPACKET のソケット資格証明
は、最初にソケットから読み込まれたもののみ渡さ
れ、次に、システムは、ソケットのオプションをクリ
アします。
このオプションと上記の明示的 struct cmsgcred の両
方は、同じ値 SCM_CREDS を使用しますが、互換性がな
い制御メッセージです。このオプションが有効にさ
れ、送信側が struct cmsgcred で SCM_CREDS 制御
メッセージをアタッチしたなら、それは、破棄され、
struct sockcred が、含まれます。
多くの setuid プログラムは、エラーメッセージのよ
うな呼び出し側によって少なくとも部分的に制御され
たデータを write(2) (書き込みます)。したがって、
特定の sc_euid 値に付随しているメッセージは、その
ユーザからであるように信頼されるべきではありませ
ん。
LOCAL_CREDS_PERSISTENT このオプションは、最初に読み込まれたものの代り
に、ソケットの資格証明が SOCK_STREAM または
SOCK_SEQPACKET ソケットからの読み込みのたびに渡さ
れることを除いて、LOCAL_CREDS に似ています。さら
に、msghdr 構造体の msg_control フィールドは、可
変長の sockcred2 構造体が続く cmsghdr 構造体を含
むバッファを指し、次のように <sys/socket.h> で定
義されています:
struct sockcred2 {
int sc_version; /* この構造体のバージョン */
pid_t sc_pid; /* 送信プロセスの PID */
uid_t sc_uid; /* 実ユーザ id */
uid_t sc_euid; /* 実効ユーザ id */
gid_t sc_gid; /* 実グループ id */
gid_t sc_egid; /* 実効グループ id */
int sc_ngroups; /* 補足グループの数 */
gid_t sc_groups[1]; /* 可変長 */
};
現在のバージョンは、0 です。
cmsghdr フィールドは、次の値があります:
cmsg_len = CMSG_LEN(SOCKCRED2SIZE(ngroups))
cmsg_level = SOL_SOCKET
cmsg_type = SCM_CREDS2
LOCAL_CREDS と LOCAL_CREDS_PERSISTENT オプション
は、相互に排他的です。
LOCAL_CONNWAIT SOCK_STREAM ソケットを使用して、このオプションに
よって connect(2) は、accept(2) が listen (接続を
受け付け) しているソケットで呼び出されるまで、ブ
ロックします。
LOCAL_PEERCRED SOCK_STREAM または SOCK_SEQPACKET で
getsockopt(2) によって要求されたソケットは、リ
モート側の資格証明を返します。これらは、次のよう
に <sys/ucred.h> で定義された xucred 構造体に書き
込まれた形式で到達します:
struct xucred {
u_int cr_version; /* 構造体レイアウト
バージョン */
uid_t cr_uid; /* 実効ユーザ ID */
short cr_ngroups; /* グループの数 */
gid_t cr_groups[XU_NGROUPS]; /* グループ */
pid_t cr_pid; /* 送信しているプロセスのプロセス ID */
};
cr_version フィールドは、XUCRED_VERSION 定義と照
合されるべきです。
サーバ (listen(2) の呼び出し側) に提出された資格
証明は、connect(2) を呼び出したとき、クライアント
の資格証明です。クライアント connect(2) の呼び出
し側) に提出された資格証明は、listen(2) を呼び出
したとき、サーバの資格証明です。このメカニズム
は、信頼できます。異なる有効な資格証明の下で適切
なシステムコール (例えば、connect(2) または
listen(2)) を呼び出すことによる場合を除いて、その
ピア (相手側) に提出された資格証明に影響を及ぼ
す、いずれかの当事者 (party) のための方法はありま
せん。
SOCK_DGRAM で信頼されるピア (相手側) の資格証明を
得るためには、ソケットは、LOCAL_CREDS ソケットオ
プションを参照します。
関連項目
connect(2), dup(2), fcntl(2), getsockopt(2), listen(2), recvmsg(2),
sendto(2), setsockopt(2), socket(2), CMSG_DATA(3), intro(4)
"An Introductory 4.3 BSD Interprocess Communication Tutorial", PS1, 7.
"An Advanced 4.3 BSD Interprocess Communication Tutorial", PS1, 8.
FreeBSD 13.2 August 7, 2021 FreeBSD 13.2