1*13050Ssam /* sys_socket.c 4.4 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 1913045Ssam int soo_rw(), soo_ioctl(), soo_select(), soo_close(); 2012794Ssam struct fileops socketops = 2113045Ssam { 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; 49*13050Ssam return (0); 5012794Ssam 5112794Ssam case FIOASYNC: 5212794Ssam if (*(int *)data) 5312794Ssam so->so_state |= SS_ASYNC; 5412794Ssam else 5512794Ssam so->so_state &= ~SS_ASYNC; 56*13050Ssam return (0); 5712794Ssam 5813001Ssam case FIONREAD: 5913001Ssam *(int *)data = so->so_rcv.sb_cc; 60*13050Ssam return (0); 6113001Ssam 6212794Ssam case SIOCSPGRP: 6312794Ssam so->so_pgrp = *(int *)data; 64*13050Ssam return (0); 6512794Ssam 6612794Ssam case SIOCGPGRP: 6712794Ssam *(int *)data = so->so_pgrp; 68*13050Ssam return (0); 6912794Ssam 7012794Ssam case SIOCATMARK: 7112794Ssam *(int *)data = (so->so_state&SS_RCVATMARK) != 0; 72*13050Ssam return (0); 7312794Ssam } 74*13050Ssam /* 75*13050Ssam * Interface/routing/protocol specific ioctls: 76*13050Ssam * interface and routing ioctls should have a 77*13050Ssam * different entry since a socket's unnecessary 78*13050Ssam */ 79*13050Ssam #define cmdbyte(x) (((x) >> 8) & 0xff) 80*13050Ssam if (cmdbyte(cmd) == 'i') 81*13050Ssam return (ifioctl(cmd, data)); 82*13050Ssam if (cmdbyte(cmd) == 'r') 83*13050Ssam return (rtioctl(cmd, data)); 84*13050Ssam return ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL, 85*13050Ssam (struct mbuf *)cmd, (struct mbuf *)data, (struct mbuf *)0)); 8612794Ssam } 8712794Ssam 8812794Ssam soo_select(fp, which) 8912794Ssam struct file *fp; 9012794Ssam int which; 9112794Ssam { 9212794Ssam register struct socket *so = (struct socket *)fp->f_data; 9312794Ssam register int s = splnet(); 9412794Ssam 9512794Ssam switch (which) { 9612794Ssam 9712794Ssam case FREAD: 9812794Ssam if (soreadable(so)) { 9912794Ssam splx(s); 10012794Ssam return (1); 10112794Ssam } 10212794Ssam sbselqueue(&so->so_rcv); 10312794Ssam break; 10412794Ssam 10512794Ssam case FWRITE: 10612794Ssam if (sowriteable(so)) { 10712794Ssam splx(s); 10812794Ssam return (1); 10912794Ssam } 11012794Ssam sbselqueue(&so->so_snd); 11112794Ssam break; 11212794Ssam } 11312794Ssam splx(s); 11412794Ssam return (0); 11512794Ssam } 11612794Ssam 11713045Ssam soo_stat(so, ub) 11813045Ssam register struct socket *so; 11912794Ssam register struct stat *ub; 12012794Ssam { 12112794Ssam 12212794Ssam bzero((caddr_t)ub, sizeof (*ub)); 12312794Ssam #ifdef notdef 12412794Ssam return ((*so->so_proto->pr_usrreq)(so, PRU_SENSE, 12512794Ssam (struct mbuf *)ub, (struct mbuf *)0, 12612794Ssam (struct mbuf *)0)); 12712794Ssam #endif 12812794Ssam return (0); 12912794Ssam } 13012794Ssam 13112794Ssam soo_close(fp) 13212794Ssam struct file *fp; 13312794Ssam { 13412794Ssam int error = soclose((struct socket *)fp->f_data); 13512794Ssam 13612794Ssam fp->f_data = 0; 13712794Ssam return (error); 13812794Ssam } 13913045Ssam 14013045Ssam /*ARGSUSED*/ 14113045Ssam soo_lock(so, pf, how) 14213045Ssam struct socket *so; 14313045Ssam u_char *pf; 14413045Ssam int how; 14513045Ssam { 14613045Ssam 14713045Ssam return (EOPNOTSUPP); 14813045Ssam } 14913045Ssam 15013045Ssam /*ARGSUSED*/ 15113045Ssam soo_unlock(so, flags) 15213045Ssam struct socket *so; 15313045Ssam int flags; 15413045Ssam { 15513045Ssam 15613045Ssam panic("soo_unlock"); 15713045Ssam } 158