Exemplo n.º 1
0
/* ARGSUSED */
static int
fifo_ioctl(void *v)
{
    struct vop_ioctl_args /* {
		struct vnode	*a_vp;
		u_long		a_command;
		void		*a_data;
		int		a_fflag;
		kauth_cred_t	a_cred;
		struct lwp	*a_l;
	} */ *ap = v;
    struct file	filetmp;
    int		error;

    if (ap->a_command == FIONBIO)
        return (0);
    if (ap->a_fflag & FREAD) {
        filetmp.f_data = ap->a_vp->v_fifoinfo->fi_readsock;
        error = soo_ioctl(&filetmp, ap->a_command, ap->a_data);
        if (error)
            return (error);
    }
    if (ap->a_fflag & FWRITE) {
        filetmp.f_data = ap->a_vp->v_fifoinfo->fi_writesock;
        error = soo_ioctl(&filetmp, ap->a_command, ap->a_data);
        if (error)
            return (error);
    }
    return (0);
}
Exemplo n.º 2
0
/*
 * Device ioctl operation.
 */
int
fifo_ioctl(struct vnop_ioctl_args *ap)
{
	struct fileproc filetmp;
	struct fileglob filefg;
	int error;

	if (ap->a_command == FIONBIO)
		return (0);
	bzero(&filetmp, sizeof(struct fileproc));
	filetmp.f_fglob = &filefg;
	if (ap->a_fflag & FREAD) {
		filetmp.f_fglob->fg_data = (caddr_t)ap->a_vp->v_fifoinfo->fi_readsock;
		error = soo_ioctl(&filetmp, ap->a_command, ap->a_data, ap->a_context);
		if (error)
			return (error);
	}
	if (ap->a_fflag & FWRITE) {
		filetmp.f_fglob->fg_data = (caddr_t)ap->a_vp->v_fifoinfo->fi_writesock;
		error = soo_ioctl(&filetmp, ap->a_command, ap->a_data, ap->a_context);
		if (error)
			return (error);
	}
	return (0);
}
Exemplo n.º 3
0
/* ARGSUSED */
int
fifo_ioctl(void *v)
{
	struct vop_ioctl_args *ap = v;
	struct file filetmp;
	int error;

	if (ap->a_command == FIONBIO)
		return (0);
	if (ap->a_fflag & FREAD) {
		filetmp.f_data = ap->a_vp->v_fifoinfo->fi_readsock;
		error = soo_ioctl(&filetmp, ap->a_command, ap->a_data, ap->a_p);
		if (error)
			return (error);
	}
	if (ap->a_fflag & FWRITE) {
		filetmp.f_data = ap->a_vp->v_fifoinfo->fi_writesock;
		error = soo_ioctl(&filetmp, ap->a_command, ap->a_data, ap->a_p);
		if (error)
			return (error);
	}
	return (0);
}
Exemplo n.º 4
0
/*
 * Ioctl system call
 */
int anp_ioctl(int fd,int ucom,caddr_t udata)
{
     struct socket *sock;
     register int com, error;
     register u_int size;
     caddr_t data, memp;
     int tmp;
#define STK_PARAMS	128
     char stkbuf[STK_PARAMS];

     MU_LOCK(kern_lock_p);
     sock=anp_fdfind(fd);

     com=ucom;
/* AC: since we don't support exec() in sim. environment, we don't support
 * these ioctl's either...
 */
#ifdef NOPE
     switch (com = ucom) {
     case FIONCLEX:
	  fdp->fd_ofileflags[uap->fd] &= ~UF_EXCLOSE;
	  MU_UNLOCK(kern_lock_p);
	  return (0);
     case FIOCLEX:
	  fdp->fd_ofileflags[uap->fd] |= UF_EXCLOSE;
	  MU_UNLOCK(kern_lock_p);
	  return (0);
     }
#endif

     /*
      * Interpret high order word to find amount of data to be
      * copied to/from the user's address space.
      */
     size = IOCPARM_LEN(com);
     if (size > IOCPARM_MAX) {
	  anp_errno=ENOTTY;
	  MU_UNLOCK(kern_lock_p);
	  return -1;
     }
     memp = NULL;
     if (size > sizeof (stkbuf)) {
	  memp = (caddr_t)anp_sys_malloc((u_long)size, M_IOCTLOPS, M_WAITOK);
	  data = memp;
     } else
	  data = stkbuf;
     if (com&IOC_IN) {
	  if (size) {
	       error = copyin(udata, data, (u_int)size);
	       if (error) {
		    if (memp)
			 anp_sys_free(memp, M_IOCTLOPS);
		    anp_errno=error;
		    MU_UNLOCK(kern_lock_p);
		    return -1;
	       }
	  } else
	       *(caddr_t *)data = udata;
     } else if ((com&IOC_OUT) && size)
	  /*
	   * Zero the buffer so the user always
	   * gets back something deterministic.
	   */
	  bzero(data, size);
     else if (com&IOC_VOID)
	  *(caddr_t *)data = udata;

     switch (com) {

     case FIONBIO:
     case FIOASYNC:
	  tmp = *((int *) data);
	  error = (soo_ioctl)(sock, com, (caddr_t)&tmp);
	  break;
#ifdef NOPE
     case FIOSETOWN:
	  tmp = *((int *)data);
	  if (fp->f_type == DTYPE_SOCKET) {
	       ((struct socket *)fp->f_data)->so_pgid = tmp;
	       error = 0;
	       break;
	  }
	  if (tmp <= 0) {
	       tmp = -tmp;
	  } else {
	       struct proc *p1 = pfind(tmp);
	       if (p1 == 0) {
		    error = ESRCH;
		    break;
	       }
	       tmp = p1->p_pgrp->pg_id;
	  }
	  error = (*fp->f_ops->fo_ioctl)
	       (fp, (int)TIOCSPGRP, (caddr_t)&tmp, p);
	  break;

     case FIOGETOWN:
	  if (fp->f_type == DTYPE_SOCKET) {
	       error = 0;
	       *(int *)data = ((struct socket *)fp->f_data)->so_pgid;
	       break;
	  }
	  error = (*fp->f_ops->fo_ioctl)(fp, (int)TIOCGPGRP, data, p);
	  *(int *)data = -*(int *)data;
	  break;

#endif
     default:
	  error = soo_ioctl(sock, com, data);
	  /*
	   * Copy any data to user, size was
	   * already set and checked above.
	   */
	  if (error == 0 && (com&IOC_OUT) && size)
	       error = copyout(data, udata, (u_int)size);
	  break;
     }
     if (memp)
	  anp_sys_free(memp, M_IOCTLOPS);
     anp_errno=error;
     MU_UNLOCK(kern_lock_p);
     if (anp_errno!=0) {
	  return -1;
     } else {
	  return 0;
     }
}