VOP_ATTRIB(9)

명칭
VOP_GETATTR, VOP_SETATTR - 파일 또는 디렉토리의 속성의 취득 또는 설정

서식
<sys/param.h> <sys/vnode.h> int VOP_GETATTR(struct vnode *vp, struct vattr *vap, struct ucred *cred, struct thread *td) int VOP_SETATTR(struct vnode *vp, struct vattr *vap, struct ucred *cred, struct thread *td)

해설
이러한 엔트리 포인트는, 파일 또는 디렉토리의 여러가지 속성을 조작합니다. 조작 대상에는, 파일 퍼미션, 소유자, 그룹, 크기, 액세스 시각, 갱신 시각을 포함합니다.

인수는 이하와 같습니다.

vp  파일의 vnode.

vap 파일의 속성.

cred
    호출한 프로세스의 유저 증명.

td  thread.

VOP_SETATTR(9) 에 의해 갱신 되려고 하고 있지 않은 속성은 VNOVAL 하지만 설정되어 있어야 합니다. VATTR_NULL() (은)는 모든 값을 클리어 하기 위해서 사용할 수가 있어 일반적으로는 *vap 의 값의 명시 전에 그 내용을 리셋트 하기 위해서 사용되어야 합니다.

락
VOP_GETATTR(9) (은)는, 들어갈 때에 vnode 가 락 되고 있어, 귀가시까지 vnode 가 락 된채로 있는 것을 기대합니다. 그 락의 형태는 공유 또는 배타가 가능합니다.

VOP_SETATTR(9) (은)는, 들어갈 때에 vnode 가 락 되고 있어, 귀가시까지 vnode 가 락 된채로 있는 것을 기대합니다. 그 락의 형태는 배타가 아니면 안됩니다.

반환값
VOP_GETATTR(9) 하 *vap (을)를 개입시켜 속성 데이타를 뽑기 시작할 수가 있었을 경우에는 0 을 돌려주어, 그렇지 않은 경우에는 적절한 에러가 돌려주어집니다. VOP_SETATTR(9) (은)는 속성이 잘 변경되었을 경우에는 0 을 돌려주어, 그렇지 않은 경우에는 적절한 에러가 돌려주어집니다.

유사 코드

    int
    vop_getattr(struct vnode *vp, struct vattr *vap,
    	    struct ucred *cred, struct thread *td)
    {
        /*
         * *vap 를 파일 시스템으로부터의 정보로 묻습니다.
         */
        ...;
        return 0;
    }
    int
    vop_setattr(struct vnode *vp, struct vattr *vap,
    	    struct ucred *cred, struct thread *td)
    {
        /*
         * 설정할 수 없는 속성을 체크합니다.
         */
        if ((vap->va_type ! = VNON) || (vap->va_nlink ! = VNOVAL) ||
    	(vap->va_fsid ! = VNOVAL) || (vap->va_fileid ! = VNOVAL) ||
    	(vap->va_blocksize ! = VNOVAL) || (vap->va_rdev ! = VNOVAL) ||
    	((int) vap->va_bytes ! = VNOVAL) || (vap->va_gen ! = VNOVAL)) {
    	return (EINVAL);
        }
        if (vap->va_flags ! = VNOVAL) {
    	/*
    	 * 파일의 변경 불능과 추가 플래그를 설정합니다.
    	 */
        }
        if (vap->va_uid ! = (uid_t) VNOVAL || vap->va_gid ! = (gid_t) VNOVAL) {
    	/*
    	 * 파일의 소유자 및/또는 그룹을 변경합니다.
    	 */
        }
        if (vap->va_size ! = VNOVAL) {
    	/*
    	 * 파일을 지정된 크기에 절약합니다.
    	 */
        }
        if (vap->va_atime.tv_sec ! = VNOVAL || vap->va_mtime.tv_sec ! = VNOVAL) {
    	/*
    	 * 파일의 액세스 및/또는 갱신 시각을 변경합니다.
    	 */
        }
        if (vap->va_mode ! = (mode_t) VNOVAL) {
    	/*
    	 * 파일의 퍼미션을 변경합니다.
    	 */
        }
        return 0;
    }

에러

[EPERM]
    파일은 변경 불가능합니다.

[EACCES]
    호출측이 그 파일 또는 디렉토리의 속성을 수정하는 퍼미션을 가지고 있지 않습니다.

[EROFS]
    파일 시스템이 읽어들여 전용입니다.

관련 항목
VFS(9), vnode(9), VOP_ACCESS(9)

저자
이 메뉴얼 페이지는 Doug Rabson 하지만 썼습니다.