EN JA
CHMOD(2)
CHMOD(2) FreeBSD System Calls Manual CHMOD(2)

名称

chmod, fchmod, lchmod, fchmodatファイルのモードを変更する

ライブラリ

Standard C Library (libc, -lc)

書式

#include < sys/stat.h>

int
chmod( const char *path, mode_t mode);

int
fchmod( int fd, mode_t mode);

int
lchmod( const char *path, mode_t mode);

int
fchmodat( int fd, const char *path, mode_t mode, int flag);

解説

path で指定されるか、またはファイル記述子 fd で参照されるファイルのファイル許可ビットを mode に変更します。 chmod() システムコールは、プロセス所有者 (ユーザ) が path (または fd) で指定されたファイルを所有するか、またはスーパユーザであるかのどちらかであることを確認します。 chmod() システムコールは、シンボリックリンクをたどり、リンク自体ではなくリンクのターゲットに作用します。

lchmod() システムコールは、 chmod() に類似していますが、シンボリックリンクをたどりません。

fchmodat() は、 path が相対パスを指定する場合を除いて、 flag により chmod() または lchmod() と同等です。この場合、変更されるファイルは、カレントワーキングディレクトリの代わりにファイル記述子 fd に関連しているディレクトリに相対的に決定されます。 flag のための値は、 < fcntl.h> で定義され、次のリストからフラブのビット単位の包括的論理和 (OR) によって構成されます:

AT_SYMLINK_NOFOLLOW
path 名がシンボリックリンクであるなら、シンボリックリンクのモードが変更されます。

fchmodat() が、 fd パラメータの特別な値 AT_FDCWD を渡されるなら、カレントワーキングディレクトリが、使用されます。また、 flag が 0 であるなら、振る舞いは、 chmod() への呼び出しと同じです。

モードは、 < sys/stat.h> で定義された許可ビットマスクの論理和 ( or) から作成されます:

#define S_IRWXU 0000700    /* 所有者用の RWX マスク */ 
#define S_IRUSR 0000400    /* 所有者用の R */ 
#define S_IWUSR 0000200    /* 所有者用の W */ 
#define S_IXUSR 0000100    /* 所有者用の X */ 
 
#define S_IRWXG 0000070    /* グループ用の RWX マスク */ 
#define S_IRGRP 0000040    /* グループ用の R */ 
#define S_IWGRP 0000020    /* グループ用の W */ 
#define S_IXGRP 0000010    /* グループ用の X */ 
 
#define S_IRWXO 0000007    /* その他用の RWX マスク */ 
#define S_IROTH 0000004    /* その他用の R */ 
#define S_IWOTH 0000002    /* その他用の W */ 
#define S_IXOTH 0000001    /* その他用の X */ 
 
#define S_ISUID 0004000    /* 実行時にユーザ ID を設定 */ 
#define S_ISGID 0002000    /* 実行時にグループ ID を設定 */ 
#define S_ISVTX 0001000    /* スティッキビット */ 
#ifndef __BSD_VISIBLE 
#define S_ISTXT 0001000    /* スティッキビット */ 
#endif

FreeBSD VM システムは、実行可能モジュールについてスティッキビット ( ISTXT) を完全に無視します。 UFS をベースとしたファイルシステム (FFS, LFS) では、スティッキビットは、ディレクトリにだけ設定できます。

ISTXT (`スティッキビット') が設定されているディレクトリでは、特権のないユーザは、そのディレクトリ内にある他ユーザのファイルの削除、名前の変更ができません。どのユーザでも、そのユーザが所有するか適切な許可のあるディレクトリについてスティッキビットを設定できます。スティッキビットの性質の詳細については、 sticky(7) を参照してください。

あるディレクトリに ISUID (ユーザ ID 設定ビット) が設定されており、かつファイルシステムをマウントする際に MNT_SUIDDIR オプションが指定されていた場合、このディレクトリ内に作成される新しいファイルとサブディレクトリの所有者は、ディレクトリの所有者に設定されます。この機能が有効であるとき、新しいディレクトリは、親から ISUID ビットを継承します。実行ビットは、ファイルから取り除かれ、ファイルは、root の所有とはなりません。この機能は、ファイルへの書み込みがユーザに許可される条件を変更しません。ファイルが作成された後の最終的な所有者の決定に影響するのみです。グループは、継承されません。

この機能は、ftp、SAMBA または netatalk 経由の PC ユーザへのファイルサービスで使用されるよう設計されています。これは、シェルユーザにセキュリティホールを提供するので、特に、ホームディレクトリでは、使用してはなりません。このオプションが機能するためには、カーネル内に SUIDDIR オプションが必要です。 UFS ファイルシステムだけがこのオプションをサポートします。 suiddir マウントオプションの詳細については、 mount(8) を参照してください。

スーパユーザ以外のユーザによる、ファイルの書み込みまたはファイルの所有者の変更によってユーザ ID 設定ビットとグループ ID 設定ビットは、オフに切り替えられます。互換性は、犠牲になりますが、ユーザ ID 設定 (グループ ID 設定) ビットを残したままファイルが変更されるのを防ぐことで、システムは、いくらか安全になります。

戻り値

Upon successful completion, the value 0 is returned; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

chmod() システムコールは、次の場合に処理に失敗しファイルモードは、変更されません:
[ ENOTDIR]
パスの構成要素中にディレクトリ以外のものが含まれています。
[ ENAMETOOLONG]
パス名の構成要素が 255 文字を越えているか、またはパス名全体が 1023 文字を越えています。
[ ENOENT]
指定されたファイルが存在しません。
[ EACCES]
指定されたパスには、検索が許可されていないディレクトリが含まれています。
[ ELOOP]
パス名を変換するときに検出されたシンボリックリンクが多すぎます。
[ EPERM]
実効ユーザ ID がファイルの所有者と一致せず、実効ユーザ ID がスーパユーザではありません。
[ EPERM]
実効ユーザ ID がスーパユーザでない、実効ユーザ ID がファイルの所有者とマッチするが、ファイルのグループ ID が実効グループ ID も補足グループ ID の 1 つにもマッチしません。
[ EPERM]
指定されたファイルには、不変または追加専用フラグが設定されています、詳細については、 chflags(2) マニュアルページを参照してください。
[ EROFS]
指定されたファイルは、読み込み専用ファイルシステム上にあります。
[ EFAULT]
path 引数が、プロセスに割り当てられたアドレス空間の範囲外を指しています。
[ EIO]
ファイルシステムに読み書きしている間に入出力エラーが発生しました。
[ EFTYPE]
実効ユーザ ID は、スーパユーザではなく、モードは、スティッキビット ( S_ISVTX) を含んでいます、そして、パスは、ディレクトリを参照していません。

fchmod() システムコールは、次の場合に処理を失敗します:

[ EBADF]
記述子が有効ではありません。
[ EINVAL]
fd 引数がファイルではなくソケットを参照しています。
[ EROFS]
ファイルが読み込み専用のファイルシステム上に置かれています。
[ EIO]
ファイルシステムに読み書きしている間に入出力エラーが発生しました。

chmod() のエラーに加えて fchmodat() は、次の場合に失敗します:

[ EBADF]
path 引数が、絶対パスを指定していません、そして fd 引数は、 AT_FDCWD でもなく検索のためにオープンされた有効なファイル記述子でもありません。
[ EINVAL]
flag 引数の値は、有効ではありません。
[ ENOTDIR]
path 引数が、絶対パスではありません、そして fd が、 AT_FDCWD でもなくディレクトリに関連しているファイル記述子でもありません。

規格

chmod() システムコールは、 EFTYPE が返されることと S_ISTXT の使用法を除けば IEEE Std 1003.1-1990 (“POSIX.1”) に適合しています。 fchmodat() システムコールは、The Open Group Extended API Set 2 仕様に適合しています。

歴史

chmod() システムコールは、 Version 7 AT&T UNIX で登場しました。 fchmod() システムコールは、 4.2BSD で登場しました。 lchmod() システムコールは、 FreeBSD 3.0 で登場しました。 fchmodat() システムコールは、 FreeBSD 8.0 で登場しました。
April 10, 2008 FreeBSD