VOP_ACCESS(9) FreeBSD カーネル開発者マニュアル VOP_ACCESS(9)
名称
VOP_ACCESS − ファイルまたは UNIX ドメインソケットのアクセス許可の調査 |
書式
#include <sys/param.h> int |
VOP_ACCESS(struct vnode *vp, int mode, struct ucred *cred, struct thread *td); |
解説 |
このエントリポイントは、与えられた証明に対する、ファイルのアクセス許可を 調査します。 引数は以下の通りです。 |
vp
調査対象ファイルの vnode。 mode cred td mode は VREAD, VWRITE または VEXEC を含むマスクです。 ロック |
vnode は、入る時にロックされ、戻る時にもロックされ続けます。 |
戻り値
ファイルが指定された方法でアクセス可能な場合には、0 が返されます。そうで ない場合には、適切なエラーコードが返されます。 |
疑似コード
int vop_access(struct vnode *vp, int mode, struct ucred *cred, struct thread *td) { int error; /* * ファイルがソケット、FIFO、またはファイルシステムに存在する * ブロック型または文字型デバイスでない場合には、読み込み専用 * ファイルシステムへの書き込みは認められません。 */ if (mode & VWRITE) { |
switch (vp->v_type) { |
|||
case VDIR: |
|||
case VLNK: |
|||
case VREG: |
|||
if (vp->v_mount->mnt_flag & MNT_RDONLY) |
|||
return EROFS; |
|||
break; |
|||
} |
} /* 不変ビットが設定されていれば、誰も書き込めません。
*/ |
return EPERM; |
/* そうでなければ、uid が 0 ならば常に許可。 */ |
return 0; |
mask = 0; /* そうでなければ、所有者を調べます。 */ |
if (mode & VEXEC) |
|
mask |= S_IXUSR; |
|
if (mode & VREAD) |
|
mask |= S_IRUSR; |
|
if (mode & VWRITE) |
|
mask |= S_IWUSR; |
|
return (((mode of vp) & mask) == mask ? 0 : EACCES); |
} /* そうでなければ、グループを調べます。 */ |
if (group of vp == *gp) { |
||||
if (mode & VEXEC) |
||||
mask |= S_IXGRP; |
||||
if (mode & VREAD) |
||||
mask |= S_IRGRP; |
||||
if (mode & VWRITE) |
||||
mask |= S_IWGRP; |
||||
return (((mode of vp) & mask) == mask ? 0 : EACCES); |
||||
} |
/* そうでなければ、その他を調べます。 */ |
mask |= S_IXOTH; |
if (mode & VREAD) |
mask |= S_IROTH; |
if (mode & VWRITE) |
mask |= S_IWOTH; |
return (((mode of vp) & mask) == mask ? 0 :
EACCES); |
エラー
[EPERM]
不変ファイルを変更しようとしました。 [EACCES] 関連項目 |
vaccess(9), vaccess_acl_posix1e(9), vnode(9) |
作者
このマニュアルページは Doug Rabson が書きました。 FreeBSD 10.0 July 24, 1996 FreeBSD 10.0 |