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 |