VOP_ATTRIB(9) BSD Kernel Developer's Manual 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 modifica‐
tion 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.
LOCKSVOP_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 VALUESVOP_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 ALSOvnode(9), VOP_ACCESS(9)AUTHORS
This man page was written by Doug Rabson.
BSD July 24, 1996 BSD