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 proc *p) int VOP_SETATTR(struct vnode *vp, struct vattr *vap, struct ucred *cred, struct proc *p)

解説
これらのエントリポイントは、 ファイルまたはディレクトリの様々な属性を操作します。 操作対象には、ファイルパーミッション、所有者、グループ、 大きさ、アクセス時刻、更新時刻を含みます。

引数は以下の通りです。

vp  ファイルの vnode。

vap ファイルの属性。

cred
    呼び出したプロセスのユーザ証明。

p   プロセス。

VOP_SETATTR(9) によって更新されようとしていない属性は VNOVAL が設定されているべきです。

ロック
VOP_GETATTR(9) は、入る時に vnode がロックされていて、戻り時まで vnode がロックされたままで あることを期待します。

VOP_SETATTR(9) は、入る時に vnode がロックされていて、戻り時まで vnode がロックされたままで あることを期待します。

戻り値
VOP_GETATTR(9) は *vap にファイルの情報を返します。 VOP_SETATTR(9) は属性がうまく変更された場合には 0 を返し、 そうでない場合には適切なエラーコードが返されます。

疑似コード

    int
    vop_getattr(struct vnode *vp, struct vattr *vap,
    	    struct ucred *cred, struct proc *p)
    {
        /*
         * *vap をファイルシステムからの情報で埋めます。
         */
        ...;
        return 0;
    }
    int
    vop_setattr(struct vnode *vp, struct vattr *vap,
    	    struct ucred *cred, struct proc *p)
    {
        /*
         * 設定できない属性をチェックします。
         */
        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]
    ファイルシステムが読み込み専用です。

関連項目
vnode(9), VOP_ACCESS(9)

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