名前
chown, fchown, lchown - ファイルの所有者を変更する
書式
#include <sys/types.h> #include <unistd.h>
int chown(const char *path, uid_t owner, gid_t group); int fchown(int fd, uid_t owner, gid_t group); int lchown(const char *path, uid_t owner, gid_t group);
説明
これらのシステムコールは、 path または fd で指定されたファイルの所有者 (owner) とグループを変更する。 特権を持つプロセス (Linux では CAP_CHOWN ケーパビリティ (capability) を持つプロセス) だけが ファイルの所有者を変更できる。 ファイルの所有者は、その所有者が属しているグループのいずれかに ファイルのグループを変更することができる。 特権 (Linux では CAP_CHOWN) を持つプロセスは、任意のグループに変更できる。
owner または group に -1 が指定された場合、それらの ID は変更されない。
スーパー・ユーザー以外によって実行ファイルの所有者またはグループが 変更された場合は S_ISUID と ISGID モードビットはクリアされる。 POSIX はこの動作やルートが chown() を行なった場合については特に指定されていない。 Linux における動作はカーネルのバージョンに依存する。 非グループ実行ファイル (S_IXGRP ビットが設定されていない) の場合には S_ISGID ビットは強制ロック (mandatory locking) を意味している。 そしてそれは chown() ではクリアできない。
返り値
成功すると、0 を返す。 失敗すると、-1 を返し、 errno に適切な値を設定する。
エラー
ファイルシステムによっては他のエラーが返される事がある。 chmod で一般的なエラーを以下に挙げる。
EACCES | path の構成要素に検索許可 (search permission) がない (path_resolution(7) も参照)。 |
EFAULT | path が割り当てられたアドレス空間外を指している。 |
ELOOP | path を解決する際に遭遇したシンボリック・リンクが多過ぎる。 |
ENAMETOOLONG | |
path が長過ぎる。 | |
ENOENT | ファイルが存在しない。 |
ENOMEM | カーネルに十分なメモリがない。 |
ENOTDIR | |
path の構成要素がディレクトリでない。 | |
EPERM | 呼び出したプロセスに所有者またはグループ (もしくはその両方) を変更するために 要求される許可 (上記を参照) がない。 |
EROFS | 指定したファイルが読み込み専用 (read-only) のファイル・システム上にある。 |
fchown() で一般的なエラーを以下に挙げる: | |
EBADF | ディスクリプターが有効でない。 |
EIO | i ノード (inode) を変更する際に低レベル I/O エラーが発生した。 |
ENOENT | 上記を参照。 |
EPERM | 上記を参照。 |
EROFS | 上記を参照。 |
準拠
4.4BSD, SVr4, POSIX.1-2001.
4.4BSD 版ではスーパー・ユーザーのみが使用できる (つまり、普通のユーザーはファイルを手放すことはできない)。
注意
chown() 方式は UID マッピングを使用した NFS ファイル・システムを侵害する。 さらにファイルの内容にアクセスする全てのシステム・コールを侵害する。 これは chown() が既にオープンされたファイルに対する アクセスをただちに取り消すことによる。 クライアント側のキャッシュにより所有権が変更されて ユーザーのアクセスが許した時点と、実際に他のクライアントでユーザーによって ファイルにアクセスできる時点との間に時間差があるかもしれない。
Linux の 2.1.81 より前のバージョン (特に 2.1.46 以前) では、 chown() はシンボリック・リンクを追跡しない。 Linux 2.1.81 以降では chown() はシンボリック・リンクを追跡し、新たなシステム・コール lchown() はシンボリック・リンクを追跡しない。 Linux 2.1.86 以降ではこの新しいコール (古い chown() と全く同じ動作を行なう) は同じシステムコール番号を持ち chown() は新しく導入された番号を持つ。
fchown() は _BSD_SOURCE が定義されている場合のみ利用できる。