VOP_ATTRIB(9) MidnightBSD 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 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.
MidnightBSD 0.3 July 24, 1996 MidnightBSD 0.3