VOP_ACCESS(9)

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

書式
<sys/param.h> <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 が書きました。