1*13045Ssam /* sys_socket.c 4.3 83/06/12 */ 212794Ssam 312794Ssam #include "../h/param.h" 412794Ssam #include "../h/systm.h" 512794Ssam #include "../h/dir.h" 612794Ssam #include "../h/user.h" 712794Ssam #include "../h/file.h" 812794Ssam #include "../h/mbuf.h" 912794Ssam #include "../h/protosw.h" 1012794Ssam #include "../h/socket.h" 1112794Ssam #include "../h/socketvar.h" 1212794Ssam #include "../h/ioctl.h" 1312794Ssam #include "../h/uio.h" 1412794Ssam #include "../h/stat.h" 1512794Ssam 1612794Ssam #include "../net/if.h" 1712794Ssam #include "../net/route.h" 1812794Ssam 19*13045Ssam int soo_rw(), soo_ioctl(), soo_select(), soo_close(); 2012794Ssam struct fileops socketops = 21*13045Ssam { soo_rw, soo_ioctl, soo_select, soo_close }; 2212794Ssam 2312794Ssam soo_rw(fp, rw, uio) 2412794Ssam struct file *fp; 2512794Ssam enum uio_rw rw; 2612794Ssam struct uio *uio; 2712794Ssam { 2812794Ssam int soreceive(), sosend(); 2912794Ssam 3012794Ssam return ( 3112794Ssam (*(rw==UIO_READ?soreceive:sosend)) 3212794Ssam ((struct socket *)fp->f_data, 0, uio, 0, 0)); 3312794Ssam } 3412794Ssam 3512794Ssam soo_ioctl(fp, cmd, data) 3612794Ssam struct file *fp; 3712794Ssam int cmd; 3812794Ssam register caddr_t data; 3912794Ssam { 4012794Ssam register struct socket *so = (struct socket *)fp->f_data; 4112794Ssam 4212794Ssam switch (cmd) { 4312794Ssam 4412794Ssam case FIONBIO: 4512794Ssam if (*(int *)data) 4612794Ssam so->so_state |= SS_NBIO; 4712794Ssam else 4812794Ssam so->so_state &= ~SS_NBIO; 4912794Ssam break; 5012794Ssam 5112794Ssam case FIOASYNC: 5212794Ssam if (*(int *)data) 5312794Ssam so->so_state |= SS_ASYNC; 5412794Ssam else 5512794Ssam so->so_state &= ~SS_ASYNC; 5612794Ssam break; 5712794Ssam 5813001Ssam case FIONREAD: 5913001Ssam *(int *)data = so->so_rcv.sb_cc; 6013001Ssam break; 6113001Ssam 6212794Ssam case SIOCSPGRP: 6312794Ssam so->so_pgrp = *(int *)data; 6412794Ssam break; 6512794Ssam 6612794Ssam case SIOCGPGRP: 6712794Ssam *(int *)data = so->so_pgrp; 6812794Ssam break; 6912794Ssam 7012794Ssam case SIOCATMARK: 7112794Ssam *(int *)data = (so->so_state&SS_RCVATMARK) != 0; 7212794Ssam break; 7312794Ssam 7412794Ssam /* routing table update calls */ 7512794Ssam case SIOCADDRT: 7612794Ssam case SIOCDELRT: 7712794Ssam if (!suser()) 7812794Ssam return (u.u_error); 7912794Ssam return (rtrequest(cmd, (struct rtentry *)data)); 8012794Ssam 8112794Ssam /* interface parameter requests */ 8212794Ssam case SIOCSIFADDR: 8312794Ssam case SIOCSIFFLAGS: 8412794Ssam case SIOCSIFDSTADDR: 8512794Ssam if (!suser()) 8612794Ssam return (u.u_error); 8712794Ssam return (ifrequest(cmd, data)); 8812794Ssam 8912794Ssam case SIOCGIFADDR: 9012794Ssam case SIOCGIFFLAGS: 9112794Ssam case SIOCGIFDSTADDR: 9212794Ssam return (ifrequest(cmd, data)); 9312794Ssam 9412794Ssam case SIOCGIFCONF: 9512794Ssam return (ifconf(cmd, data)); 9612794Ssam 9712794Ssam /* type/protocol specific ioctls */ 9812794Ssam default: 9912794Ssam return (ENOTTY); /* XXX */ 10012794Ssam } 10112794Ssam return (0); 10212794Ssam } 10312794Ssam 10412794Ssam soo_select(fp, which) 10512794Ssam struct file *fp; 10612794Ssam int which; 10712794Ssam { 10812794Ssam register struct socket *so = (struct socket *)fp->f_data; 10912794Ssam register int s = splnet(); 11012794Ssam 11112794Ssam switch (which) { 11212794Ssam 11312794Ssam case FREAD: 11412794Ssam if (soreadable(so)) { 11512794Ssam splx(s); 11612794Ssam return (1); 11712794Ssam } 11812794Ssam sbselqueue(&so->so_rcv); 11912794Ssam break; 12012794Ssam 12112794Ssam case FWRITE: 12212794Ssam if (sowriteable(so)) { 12312794Ssam splx(s); 12412794Ssam return (1); 12512794Ssam } 12612794Ssam sbselqueue(&so->so_snd); 12712794Ssam break; 12812794Ssam } 12912794Ssam splx(s); 13012794Ssam return (0); 13112794Ssam } 13212794Ssam 133*13045Ssam soo_stat(so, ub) 134*13045Ssam register struct socket *so; 13512794Ssam register struct stat *ub; 13612794Ssam { 13712794Ssam 13812794Ssam bzero((caddr_t)ub, sizeof (*ub)); 13912794Ssam #ifdef notdef 14012794Ssam return ((*so->so_proto->pr_usrreq)(so, PRU_SENSE, 14112794Ssam (struct mbuf *)ub, (struct mbuf *)0, 14212794Ssam (struct mbuf *)0)); 14312794Ssam #endif 14412794Ssam return (0); 14512794Ssam } 14612794Ssam 14712794Ssam soo_close(fp) 14812794Ssam struct file *fp; 14912794Ssam { 15012794Ssam int error = soclose((struct socket *)fp->f_data); 15112794Ssam 15212794Ssam fp->f_data = 0; 15312794Ssam return (error); 15412794Ssam } 155*13045Ssam 156*13045Ssam /*ARGSUSED*/ 157*13045Ssam soo_lock(so, pf, how) 158*13045Ssam struct socket *so; 159*13045Ssam u_char *pf; 160*13045Ssam int how; 161*13045Ssam { 162*13045Ssam 163*13045Ssam return (EOPNOTSUPP); 164*13045Ssam } 165*13045Ssam 166*13045Ssam /*ARGSUSED*/ 167*13045Ssam soo_unlock(so, flags) 168*13045Ssam struct socket *so; 169*13045Ssam int flags; 170*13045Ssam { 171*13045Ssam 172*13045Ssam panic("soo_unlock"); 173*13045Ssam } 174