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  スレッド。

VOP_SETATTR() によって更新されようとしていない属性は VNOVAL が設定されているべきです。 VATTR_NULL() は全ての値をクリアするために使用することができ、一般的には *vap の値の明示の前にその内容をリセットするために使用されるべきです。

ロック
VOP_GETATTR() は、入る時に vnode がロックされていて、戻り時まで vnode がロックされたままで あることを期待します。 そのロックの型は共有または排他が可能です。

VOP_SETATTR() は、入る時に vnode がロックされていて、戻り時まで vnode がロックされたままで あることを期待します。 そのロックの型は排他でなければなりません。

戻り値
VOP_GETATTR() は *vap を介して属性データを取り出すことができた場合には 0 を返し、 そうでない場合には適切なエラーが返されます。 VOP_SETATTR() は属性がうまく変更された場合には 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 が書きました。