CHROOT(2)

名称
chroot - ルートディレクトリを変更する

ライブラリ
libc

書式
<unistd.h> int chroot(const char *dirname)

解説
dirname は、ASCII のヌル文字で終了するディレクトリのパス名のアドレスです。 chroot() は、 dirname をルートディレクトリ、すなわち、 ‘/’ で開始するパス名のパス検索の 開始点にします。

ディレクトリがルートディレクトリになるためには、 プロセスにそのディレクトリへの実行 (検索) 許可がなければなりません。

chroot() はプロセスの現在のディレクトリに影響しないことに注意する必要があります。

この関数を呼び出せるのはスーパユーザのみです。

ディレクトリを参照するオープンファイル記述子が存在する場合、 chroot() 呼び出しは sysctl 変数 ‘kern.chroot_allow_open_directories’ の設定に従い、次のように失敗します:

‘kern.chroot_allow_open_directories’ が 0 に設定されている場合、ディレクトリがオープンされていれば chroot() は常に EPERM で失敗します。

‘kern.chroot_allow_open_directories’ が 1 にセットされている場合 (デフォルト)、 ディレクトリがオープンされていて、そのプロセスが chroot() 呼び出しの影響を受ける場合、 EPERM で失敗します。

‘kern.chroot_allow_open_directories’ が他の値の場合、オープンディレクトリのチェックはされません。

正常に完了すると、値 0 が返されます。そうでない場合は、値 -1 が返され、 エラーを示すために errno が設定されます。

エラー
chroot() は、次の場合、処理に失敗し、ルートディレクトリは変更されません。

[ENOTDIR]
    パスの構成要素中にディレクトリ以外のものが含まれています。

[EPERM]
    実効ユーザ ID がスーパユーザではありません。またはディレクトリが 1 つ以上のファイル記述子によってオープンされています。

[ENAMETOOLONG]
    パス名の構成要素が 255 文字を越えているか、 またはパス名全体が 1023 文字を越えています。

[ENOENT]
    指定のディレクトリが存在しません。

[EACCES]
    指定されたパスには、検索が許可されていないディレクトリが含まれています。

[ELOOP]
    パス名を変換するときに検出されたシンボリックリンクが多すぎます。

[EFAULT]
    path は、プロセスに割り当てられたアドレス空間の範囲外を指しています。

[EIO]
    ファイルシステムに読み書きしている間に入出力エラーが発生しました。

関連項目
chdir(2), jail(2)

歴史
chroot() 関数は 4.2BSD で登場しました。