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  조사하고 있는 thread.

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 하지만 썼습니다.