Messages in this thread | | | Date | Fri, 25 Jun 1999 04:47:26 +0200 (MEST) | From | Bernhard Kaindl <> | Subject | Re: RFC: BSD system call revoke? |
| |
Hi Ted,
thank you for pointing out why revoke is not allowed to close the fd, maybe you are right that only root/priviliged process should be allowed to revoke.
> Finally, to whoever implements revoke: Note that it would be nice if the > tty hangup code and the vhangup system call can be implemented in terms > of the new revoke code. This would simplify the kernel a bit, since > there's no reason why the tty hangup code needs to do and the revoke() > system call needs to do shouldn't sure code paths.
Thank you for the pointer, i looked at the 'destroy-f_ops' loop in hangup, so acually i think we can share some revoked-stubs with hangup so we don't need to reinvent the wheel and we have a working revoke without mmap support already there;
Leaving the mmap issue out for one moment, revoke should be this simple:
static ssize_t ret_null(struct file* filp, char* buf, size_t len, loff_t* off) { return 0; }
static ssize_t ret_ioerr(struct file* f, const char* buf, size_t s, loff_t* o) { return -EIO; }
static struct file_operations revoked_fops = { NULL, /* default_llseek gives a good illusion... */ ret_null, /* read returns null bytes read */ ret_ioerr, /* write gives an IO Error */ NULL, /* readdir is not supported... */ revoked_poll, /* we will use hangup's poll stub */ revoked_ioctl, /* we will use hangup's ioctl stub */ NULL, /* no mmap anymore... */ NULL, /* open is NULL in hung_up_tty_fops */ NULL, /* flush is NULL in hung_up_tty_fops */ NULL, /* the fd will be closed later and NULL is ok */ NULL, /* fsync is also NULL in hung_up_tty_fops */ NULL, /* fasync is also NULL in hung_up_tty_fops */ NULL, /* check_media_change is not in hung_up_tty_fops */ NULL, /* revalidate is not in hung_up_tty_fops */ NULL /* lock is not in hung_up_tty_fops */ };
asmlinkage int sys_revoke(char * path) { int error; struct dentry * dentry; struct inode * inode; struct file * filp;
lock_kernel(); dentry = namei(path);
error = PTR_ERR(dentry); if (IS_ERR(dentry)) goto out;
if (!capable(CAP_DAC_OVERRIDE)) { error = -EPERM; goto dput_out; }
inode = dentry->d_inode;
if (!(inode->i_mode & (S_IFBLK | S_IFCHR))) { error = -EINVAL; goto dput_out; }
for (filp = inuse_filps; filp; filp = filp->f_next) if (filp->f_dentry == dentry) { down(&inode->i_sem); if (filp->f_op && filp->f_op->release) filp->f_op->release(inode, filp); filp->f_op = &revoked_fops; up(&inode->i_sem); } dput_out: dput(dentry); out: unlock_kernel(); return error; }
Should this be correct?
--
- Bernd
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |