VOP_ATTRIB(9)

NAME
VOP_GETATTR, VOP_SETATTR - get and set attributes on a file or directory

SYNOPSIS
#include <sys/param.h>
#include <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);

DESCRIPTION
These entry points manipulate various attributes of a file or directory, including file permissions, owner, group, size, access time and modification time.

The arguments are:

vp  the vnode of the file

vap the attributes of the file

cred
    the user credentials of the calling process

p   the process

Attributes which are not being modified by VOP_SETATTR(9) should be set to the value VNOVAL.

LOCKS
VOP_GETATTR(9) expects the vnode to be locked on entry and will leave the vnode locked on return.

VOP_SETATTR(9) expects the vnode to be locked on entry and will leave the vnode locked on return.

RETURN VALUES
VOP_GETATTR(9) returns information about the file in *vap. VOP_SETATTR(9) returns zero if the attributes were changed successfully, otherwise an appropriate error is returned.

PSEUDOCODE

    int
    vop_getattr(struct vnode *vp, struct vattr *vap,
    	    struct ucred *cred, struct proc *p)
    {
        /*
         * Fill in the contents of *vap with information from
         * the filesystem.
         */
        ...;
        return 0;
    }
    int
    vop_setattr(struct vnode *vp, struct vattr *vap,
    	    struct ucred *cred, struct proc *p)
    {
        /*
         * Check for unsettable attributes.
         */
        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) {
    	/*
    	 * Set the immutable and append flags of the file.
    	 */
        }
        if (vap->va_uid != (uid_t)VNOVAL || vap->va_gid != (gid_t)VNOVAL) {
    	/*
    	 * Change owner and/or group of the file.
    	 */
        }
        if (vap->va_size != VNOVAL) {
    	/*
    	 * Truncate the file to the specified size.
    	 */
        }
        if (vap->va_atime.tv_sec != VNOVAL || vap->va_mtime.tv_sec != VNOVAL) {
    	/*
    	 * Change access and/or modification time of file.
    	 */
        }
        if (vap->va_mode != (mode_t)VNOVAL) {
    	/*
    	 * Change permissions of file.
    	 */
        }
        return 0;
    }

ERRORS

[EPERM]
    The file is immutable

[EACCES]
    Permission denied

[EROFS]
    The filesystem is readonly

SEE ALSO
vnode(9), VOP_ACCESS(9)

AUTHORS
This man page was written by Doug Rabson.