/* 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); }
/* * 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); }
/* 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); }
/* * 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; } }