Use fo_stat() rather than duplicating knowledge of file type internals
in here for stat(2) and friends. Update the badops entries accordingly.
This commit is contained in:
parent
c3eff14a6d
commit
b6fb1d8bbe
@ -95,7 +95,9 @@ static int badfo_ioctl __P((struct file *fp, u_long com, caddr_t data,
|
|||||||
struct proc *p));
|
struct proc *p));
|
||||||
static int badfo_poll __P((struct file *fp, int events,
|
static int badfo_poll __P((struct file *fp, int events,
|
||||||
struct ucred *cred, struct proc *p));
|
struct ucred *cred, struct proc *p));
|
||||||
|
static int badfo_stat __P((struct file *fp, struct stat *sb, struct proc *p));
|
||||||
static int badfo_close __P((struct file *fp, struct proc *p));
|
static int badfo_close __P((struct file *fp, struct proc *p));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Descriptor management.
|
* Descriptor management.
|
||||||
*/
|
*/
|
||||||
@ -538,25 +540,7 @@ ofstat(p, uap)
|
|||||||
if ((unsigned)uap->fd >= fdp->fd_nfiles ||
|
if ((unsigned)uap->fd >= fdp->fd_nfiles ||
|
||||||
(fp = fdp->fd_ofiles[uap->fd]) == NULL)
|
(fp = fdp->fd_ofiles[uap->fd]) == NULL)
|
||||||
return (EBADF);
|
return (EBADF);
|
||||||
switch (fp->f_type) {
|
error = fo_stat(fp, &ub, p);
|
||||||
|
|
||||||
case DTYPE_FIFO:
|
|
||||||
case DTYPE_VNODE:
|
|
||||||
error = vn_stat((struct vnode *)fp->f_data, &ub, p);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DTYPE_SOCKET:
|
|
||||||
error = soo_stat((struct socket *)fp->f_data, &ub);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DTYPE_PIPE:
|
|
||||||
error = pipe_stat((struct pipe *)fp->f_data, &ub);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
panic("ofstat");
|
|
||||||
/*NOTREACHED*/
|
|
||||||
}
|
|
||||||
cvtstat(&ub, &oub);
|
cvtstat(&ub, &oub);
|
||||||
if (error == 0)
|
if (error == 0)
|
||||||
error = copyout((caddr_t)&oub, (caddr_t)uap->sb, sizeof (oub));
|
error = copyout((caddr_t)&oub, (caddr_t)uap->sb, sizeof (oub));
|
||||||
@ -587,25 +571,7 @@ fstat(p, uap)
|
|||||||
if ((unsigned)uap->fd >= fdp->fd_nfiles ||
|
if ((unsigned)uap->fd >= fdp->fd_nfiles ||
|
||||||
(fp = fdp->fd_ofiles[uap->fd]) == NULL)
|
(fp = fdp->fd_ofiles[uap->fd]) == NULL)
|
||||||
return (EBADF);
|
return (EBADF);
|
||||||
switch (fp->f_type) {
|
error = fo_stat(fp, &ub, p);
|
||||||
|
|
||||||
case DTYPE_FIFO:
|
|
||||||
case DTYPE_VNODE:
|
|
||||||
error = vn_stat((struct vnode *)fp->f_data, &ub, p);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DTYPE_SOCKET:
|
|
||||||
error = soo_stat((struct socket *)fp->f_data, &ub);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DTYPE_PIPE:
|
|
||||||
error = pipe_stat((struct pipe *)fp->f_data, &ub);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
panic("fstat");
|
|
||||||
/*NOTREACHED*/
|
|
||||||
}
|
|
||||||
if (error == 0)
|
if (error == 0)
|
||||||
error = copyout((caddr_t)&ub, (caddr_t)uap->sb, sizeof (ub));
|
error = copyout((caddr_t)&ub, (caddr_t)uap->sb, sizeof (ub));
|
||||||
return (error);
|
return (error);
|
||||||
@ -635,25 +601,7 @@ nfstat(p, uap)
|
|||||||
if ((unsigned)uap->fd >= fdp->fd_nfiles ||
|
if ((unsigned)uap->fd >= fdp->fd_nfiles ||
|
||||||
(fp = fdp->fd_ofiles[uap->fd]) == NULL)
|
(fp = fdp->fd_ofiles[uap->fd]) == NULL)
|
||||||
return (EBADF);
|
return (EBADF);
|
||||||
switch (fp->f_type) {
|
error = fo_stat(fp, &ub, p);
|
||||||
|
|
||||||
case DTYPE_FIFO:
|
|
||||||
case DTYPE_VNODE:
|
|
||||||
error = vn_stat((struct vnode *)fp->f_data, &ub, p);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DTYPE_SOCKET:
|
|
||||||
error = soo_stat((struct socket *)fp->f_data, &ub);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DTYPE_PIPE:
|
|
||||||
error = pipe_stat((struct pipe *)fp->f_data, &ub);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
panic("fstat");
|
|
||||||
/*NOTREACHED*/
|
|
||||||
}
|
|
||||||
if (error == 0) {
|
if (error == 0) {
|
||||||
cvtnstat(&ub, &nub);
|
cvtnstat(&ub, &nub);
|
||||||
error = copyout((caddr_t)&nub, (caddr_t)uap->sb, sizeof (nub));
|
error = copyout((caddr_t)&nub, (caddr_t)uap->sb, sizeof (nub));
|
||||||
@ -1314,6 +1262,7 @@ struct fileops badfileops = {
|
|||||||
badfo_readwrite,
|
badfo_readwrite,
|
||||||
badfo_ioctl,
|
badfo_ioctl,
|
||||||
badfo_poll,
|
badfo_poll,
|
||||||
|
badfo_stat,
|
||||||
badfo_close
|
badfo_close
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1351,6 +1300,16 @@ badfo_poll(fp, events, cred, p)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
badfo_stat(fp, sb, p)
|
||||||
|
struct file *fp;
|
||||||
|
struct stat *sb;
|
||||||
|
struct proc *p;
|
||||||
|
{
|
||||||
|
|
||||||
|
return (EBADF);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
badfo_close(fp, p)
|
badfo_close(fp, p)
|
||||||
struct file *fp;
|
struct file *fp;
|
||||||
@ -1362,5 +1321,3 @@ badfo_close(fp, p)
|
|||||||
|
|
||||||
SYSINIT(fildescdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,
|
SYSINIT(fildescdev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,
|
||||||
fildesc_drvinit,NULL)
|
fildesc_drvinit,NULL)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user