Provided by: freebsd-manpages_6.2-1_all bug

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 thread *td);

     int
     VOP_SETATTR(struct vnode *vp, struct vattr *vap, struct ucred *cred,
             struct thread *td);

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.

     td    The thread.

     Attributes which are not being modified by VOP_SETATTR() should be set to
     the value VNOVAL; VATTR_NULL() may be used to clear all the values, and
     should generally be used to reset the contents of *vap prior to setting
     specific values.

LOCKS

     VOP_GETATTR() expects the vnode to be locked on entry and will leave the
     vnode locked on return.  The lock type can be either shared or exclusive.

     VOP_SETATTR() expects the vnode to be locked on entry and will leave the
     vnode locked on return.  The lock type must be exclusive.

RETURN VALUES

     VOP_GETATTR() returns 0 if it was able to retrieve the attribute data via
     *vap, otherwise an appropriate error is returned.  VOP_SETATTR() 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 thread *td)
     {
         /*
          * Fill in the contents of *vap with information from
          * the file system.
          */
         ...;

         return 0;
     }

     int
     vop_setattr(struct vnode *vp, struct vattr *vap,
                 struct ucred *cred, struct thread *td)
     {
         /*
          * 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]           The caller does not have permission to modify the file
                        or directory attributes.

     [EROFS]            The file system is read-only.

SEE ALSO

     VFS(9), vnode(9), VOP_ACCESS(9)

AUTHORS

     This manual page was written by Doug Rabson.