-/*
- * Apply an advisory lock on a file descriptor.
- */
-flock()
-{
- register struct a {
- int fd;
- int how;
- } *uap = (struct a *)u.u_ap;
- register struct file *fp;
- register int cmd, flags;
-
- fp = getinode(uap->fd);
- if (fp == NULL)
- return;
- cmd = uap->how;
- flags = u.u_pofile[uap->fd] & (UF_SHLOCK|UF_EXLOCK);
- if (cmd&LOCK_UN) {
- if (flags == 0) {
- u.u_error = EINVAL;
- return;
- }
- funlocki((struct inode *)fp->f_data, flags);
- u.u_pofile[uap->fd] &= ~(UF_SHLOCK|UF_EXLOCK);
- return;
- }
- /*
- * No reason to write lock a file we've already
- * write locked, similarly with a read lock.
- */
- if ((flags&UF_EXLOCK) && (cmd&LOCK_EX) ||
- (flags&UF_SHLOCK) && (cmd&LOCK_SH))
- return;
- u.u_pofile[uap->fd] =
- flocki((struct inode *)fp->f_data, u.u_pofile[uap->fd], cmd);
-}
-