ACCESS(2)

名前
access - ユーザーのファイルに対する権利をチェックをする

書式
#include <unistd.h>

int access(const char *pathname, int mode);

説明
access は pathname という名前を持つファイル(または他のファイル・システム上のオブジェクト) に対してプロセスから読み込み、書き込みが許されているか、 ファイルが存在しているかなどのチェックを行なう。 pathname がシンボリック・リンクならばこのシンボリック・リンクの参照するファイルに 対する権利が検査される。 mode は R_OK, W_OK, X_OK, F_OK の一つ以上から構成されるマスクである。 R_OK, W_OK, X_OK はそれぞれファイルが存在し、読み込み許可、書き込み許可、実行許可を があるかをチェックするように要求する。 F_OK はファイルが存在するかどうかのみをチェックするよう要求する。 検査は pathname で与えられたファイルへのパスに現れるディレクトリの許可に依存している。 またシンボリック・リンクによって参照されるファイルへのディレクトリに も依存している。 チェックは実際の操作で使用するプロセスの実効(effective)ID でなく 実(real) ユーザーID や 実(real) グループID で行なわれる。 これは set-UID プログラムで起動したユーザーの権限を決定することを 容易にする。 アクセス・ビットのみがチェックされ、ファイルの種類や内容はチェックされない。 それで、ディレクトリが「書き込み可能」となった場合は、たぶんディレクトリに ファイルを作成することが可能なことを意味し、ディレクトリをファイルとして 書き込むことが可能なわけではない。同様に DOS のファイルは「実行可能」と 判断されるが、 execve(2) コールは失敗するだろう。

返り値
成功した場合(全ての要求された許可が得られたら)、ゼロが返される。 エラーの場合(少なくとも一つの mode で要求された許可がなかった場合や、他のエラーが起きた場合)、 -1 が返され、 errno が適切に設定される。

エラー

EACCES
    要求されたアクセスは そのファイル自身に否認されたか pathname へのディレクトリのどれかに検索許可(search permission)が得られなかった。

EROFS
    読み込み専用(read-only)のファイル・システムに対して書き込み許可を 要求した。

EFAULT
    pathname がアクセス可能なアドレス空間の外を指している。

EINVAL
    mode に不正な値が指定された。

ENAMETOOLONG
    pathname が長過ぎる。

ENOENT
    pathname のディレクトリ部分がアクセス可能だが、存在しないか壊れた(dangling) シンボリック・リンクである。

ENOTDIR
    pathname のディレクトリ部分が、実際には、ディレクトリでない。

ENOMEM
    カーネルに十分なメモリがない。

ELOOP
    pathname を解決する際に遭遇するシンボリック・リンクが多過ぎる。

EIO I/O エラーが発生した。

制限
access は要求されたアクセスのどれかに失敗した場合には、たとえ他のどれかに成功 したとしてもエラーを返す。

access はユーザーID マッピングを使用した NFS ファイル・システムでは正常に機能 しないかもしれない。なぜならばユーザーID のマッピングはサーバーで行な われ権利のチェックをするクライアントには見えないからである。

Using access to check if a user is authorized to e.g. open a file before actually doing so using open(2) creates a security hole, because the user might exploit the short time interval between checking and opening the file to manipulate it. 実際に open(2) を使用する前にファイルをオープンする権利を確認するために access を使用することはセキュリティ・ホールになる。なぜならチェックをしてから 実際にファイルのオープン操作をする間に短い間隔を利用できるから。

準拠
SVID, AT&T, POSIX, X/OPEN, BSD 4.3

関連項目
stat(2), open(2), chmod(2), chown(2), setuid(2), setgid(2).