On Saturday, May 04, 2013 4:47:43 am Bruce Evans wrote:
> > Log:
> >  Fix FIONREAD on regular files.  The computed result was being ignored and
> >  it was being passed down to VOP_IOCTL() where it promptly resulted in
> >  ENOTTY due to a missing else for the past 8 years.  While here, use a
> >  shared vnode lock while fetching the current file's size.
> 
> In another thread I complained to kib about using the bad style of not
> returning as soon as possible, but instead sometimes returning and sometimes
> falling through a complicated if-else ladder to get to the return at the
> end.

What about this:

static int
vn_ioctl(fp, com, data, active_cred, td)
        struct file *fp;
        u_long com;
        void *data;
        struct ucred *active_cred;
        struct thread *td;
{
        struct vnode *vp = fp->f_vnode;
        struct vattr vattr;

        switch (vp->v_type) {
        case VREG:
        case VDIR:
                switch (com) {
                case FIONREAD:
                        vn_lock(vp, LK_SHARED | LK_RETRY);
                        error = VOP_GETATTR(vp, &vattr, active_cred);
                        VOP_UNLOCK(vp, 0);
                        if (!error)
                                *(int *)data = vattr.va_size - fp->f_offset;
                        return (error);
                case FIONBIO:
                case FIOASYNC:
                        return (0);     /* XXX */
                default:
                        return (VOP_IOCTL(vp, com, data, fp->f_flag,
                            active_cred, td));
                }
        default:
                return (ENOTTY);
        }
}

(The 'XXX' comment could perhaps be expanded to something along the lines of 
'Allow fcntl() to toggle FNONBLOCK and FASYNC.')

-- 
John Baldwin
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to