ACCESS(2) | FreeBSD System Calls Manual | ACCESS(2) |
名称
access, eaccess, faccessat — ファイルのアクセス可能性をチェックするライブラリ
Standard C Library (libc, -lc)書式
#include < unistd.h> int
access( const char *path, int mode);
int
eaccess( const char *path, int mode);
int
faccessat( int fd, const char *path, int mode, int flag);
解説
access() システムコールと eaccess() システムコールは、 mode 引数によって示されたアクセス許可について path 引数で指定されるファイルのアクセス可能性をチェックします。 mode の値は、チェックされるアクセス許可 (読み込み許可については、 R_OK、書み込み許可については、 W_OK、実行/検索許可については、 X_OK) のビット単位の OR、または存在試験 ( F_OK) のどちらかです。さらなる情報は、 intro(2) の 「ファイルアクセスパーミッション」 セクションを参照してください。
eaccess() システムコールは、実効ユーザ ID とグループアクセスリストを用いて要求を許可します。一方 access() システムコールは、実効ユーザ ID の代わりに実ユーザ ID を、実効グループ ID の代わりに実グループと残りのグループアクセスリストを用います。
faccessat() システムコールは、 path が相対パスを指定する場合を除いて、 access() と同等です。この場合、判断されるアクセス可能性のあるファイルは、カレントワーキングディレクトリの代わりにファイル記述子 fd に関連しているディレクトリに相対的に位置付けられます。 faccessat() が、 fd パラメータの特別な値 AT_FDCWD を渡されるなら、カレントワーキングディレクトリが、使用され、振る舞いは、 access() への呼び出しと同じです。 flag のための値は、 < fcntl.h> で定義され、次のリストからフラブのビット単位の包括的論理和 (OR) によって構成されます:
- AT_EACCESS
- アクセス可能性のためのチェックは、 access() への呼び出しで要求されるような実ユーザ ID と実グループ ID の代わりに、実効ユーザ ID と実効グループ ID を使用して実行されます。
プロセスの実ユーザもしくは実効ユーザに適切な特権があり、 X_OK について成功を示していても、実際にはファイルの実行許可ビットが設定されていないことがあります。同じことが、 R_OK および W_OK にも該当します。
戻り値
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.エラー
ファイルへのアクセスは、次の場合に拒絶されます:- [ ENOTDIR]
- パスの構成要素中にディレクトリ以外のものが含まれています。
- [ ENAMETOOLONG]
- パス名の構成要素が 255 文字を越えているか、またはパス名全体が 1023 文字を越えています。
- [ ENOENT]
- 指定されたファイルが存在しません。
- [ ELOOP]
- パス名を変換するときに検出されたシンボリックリンクが多すぎます。
- [ EROFS]
- 読み込み専用ファイルシステム上のファイルについて書き込みアクセスが要求されました。
- [ ETXTBSY]
- 現時点で実行中の純粋な手続き (共有テキスト) ファイルについて書み込みアクセスが要求されています。
- [ EACCES]
- ファイルモードの許可ビットが要求されたアクセスを許容しないか、またはパスの構成要素について検索許可が拒絶されています。
- [ EFAULT]
- path 引数が、プロセスに割り当てられたアドレス空間の範囲外を指しています。
- [ EIO]
- ファイルシステムに読み書きしている間に入出力エラーが発生しました。
また、 faccessat() システムコールは、次の場合に失敗します:
- [ EBADF]
- path 引数が、絶対パスを指定していません、そして fd 引数は、 AT_FDCWD でもなく検索のためにオープンされた有効なファイル記述子でもありません。
- [ EINVAL]
- flag 引数の値が、有効ではありません。
- [ ENOTDIR]
- path 引数が、絶対パスではありません、そして fd が、 AT_FDCWD でもなくディレクトリに関連しているファイル記述子でもありません。
規格
access() システムコールは、 IEEE Std 1003.1-1990 (“POSIX.1”) に適合するはずです。 faccessat() システムコールは、The Open Group Extended API Set 2 仕様に適合しています。歴史
access() 関数は、 Version 7 AT&T UNIX で登場しました。 faccessat() システムコールは、 FreeBSD 8.0 で登場しました。セキュリティに関する考察
access() システムコールは、競合状態によって潜在的なセキュリティホールとなるので、使うべきではありません。ユーザ ID 設定とグループ ID 設定されたアプリケーションは、実効ユーザ ID もしくは実効グループ ID を復元するようにしてください。そして実ユーザ ID もしくは実グループ ID でのアクセスを、 access() を使用して模擬的にチェックするのではなく、直接実行するべきです。不適切に使用された場合、 eaccess() 呼び出しも同様にして競合の対象となることがあります。access() は、操作が特定のファイルシステムオブジェクトを理解できるかどうかに関してユーザに手がかりを与えるために役に立つように残っています (例えば、書き込み可能なフォルダで協調されるだけであるメニュー項目を '削除' します ... 例えば、AFS の場合に、アプリケーションが理解しないかもしれない st_mode ビットの解釈を避けます)。それはまた、 stat(2) より安いファイル存在テストができます。
April 10, 2008 | FreeBSD |