スポンサーリンク

VOP_ACCESS(9) FreeBSD カーネル開発者マニュアル VOP_ACCESS(9)

名称

VOP_ACCESS − ファイルまたは UNIX ドメインソケットのアクセス許可の調査

書式

#include <sys/param.h>
#include <sys/vnode.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;

}

}

/* 不変ビットが設定されていれば、誰も書き込めません。 */
if ((mode & VWRITE) && vp has immutable bit set)

return EPERM;

/* そうでなければ、uid が 0 ならば常に許可。 */
if (cred->cr_uid == 0)

return 0;

mask = 0;

/* そうでなければ、所有者を調べます。 */
if (cred->cr_uid == owner of vp) {

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);

}

/* そうでなければ、グループを調べます。 */
for (i = 0, gp = cred->cr_groups; i < cred->cr_ngroups; i++, gp++)

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);

}

/* そうでなければ、その他を調べます。 */
if (mode & VEXEC)

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]
パーミッションビットのファイルモードまたは ACL が要求 されたアクセスを許可しませんでした。

関連項目

vaccess(9), vaccess_acl_posix1e(9), vnode(9)

作者

このマニュアルページは Doug Rabson が書きました。

FreeBSD 10.0 July 24, 1996 FreeBSD 10.0

スポンサーリンク