123386Smckusick /* 240935Skarels * Copyright (c) 1982, 1986, 1990 Regents of the University of California. 333921Sbostic * All rights reserved. 423386Smckusick * 5*44445Sbostic * %sccs.include.redist.c% 633921Sbostic * 7*44445Sbostic * @(#)sys_socket.c 7.8 (Berkeley) 06/28/90 823386Smckusick */ 912794Ssam 1017095Sbloom #include "param.h" 1117095Sbloom #include "systm.h" 1217095Sbloom #include "user.h" 1317095Sbloom #include "file.h" 1417095Sbloom #include "mbuf.h" 1517095Sbloom #include "protosw.h" 1617095Sbloom #include "socket.h" 1717095Sbloom #include "socketvar.h" 1817095Sbloom #include "ioctl.h" 1917095Sbloom #include "uio.h" 2017095Sbloom #include "stat.h" 2112794Ssam 2212794Ssam #include "../net/if.h" 2312794Ssam #include "../net/route.h" 2412794Ssam 2537728Smckusick int soo_read(), soo_write(), soo_ioctl(), soo_select(), soo_close(); 2612794Ssam struct fileops socketops = 2737728Smckusick { soo_read, soo_write, soo_ioctl, soo_select, soo_close }; 2812794Ssam 2937728Smckusick /* ARGSUSED */ 3037728Smckusick soo_read(fp, uio, cred) 3112794Ssam struct file *fp; 3212794Ssam struct uio *uio; 3337728Smckusick struct ucred *cred; 3412794Ssam { 3512794Ssam 3637728Smckusick return (soreceive((struct socket *)fp->f_data, (struct mbuf **)0, 3740935Skarels uio, (struct mbuf **)0, (struct mbuf **)0, (int *)0)); 3812794Ssam } 3912794Ssam 4037728Smckusick /* ARGSUSED */ 4137728Smckusick soo_write(fp, uio, cred) 4237728Smckusick struct file *fp; 4337728Smckusick struct uio *uio; 4437728Smckusick struct ucred *cred; 4537728Smckusick { 4637728Smckusick 4737728Smckusick return (sosend((struct socket *)fp->f_data, (struct mbuf *)0, 4840935Skarels uio, (struct mbuf *)0, (struct mbuf *)0, 0)); 4937728Smckusick } 5037728Smckusick 5112794Ssam soo_ioctl(fp, cmd, data) 5212794Ssam struct file *fp; 5312794Ssam int cmd; 5412794Ssam register caddr_t data; 5512794Ssam { 5612794Ssam register struct socket *so = (struct socket *)fp->f_data; 5712794Ssam 5812794Ssam switch (cmd) { 5912794Ssam 6012794Ssam case FIONBIO: 6112794Ssam if (*(int *)data) 6212794Ssam so->so_state |= SS_NBIO; 6312794Ssam else 6412794Ssam so->so_state &= ~SS_NBIO; 6513050Ssam return (0); 6612794Ssam 6712794Ssam case FIOASYNC: 6843897Skarels if (*(int *)data) { 6912794Ssam so->so_state |= SS_ASYNC; 7043897Skarels so->so_rcv.sb_flags |= SB_ASYNC; 7143897Skarels so->so_snd.sb_flags |= SB_ASYNC; 7243897Skarels } else { 7312794Ssam so->so_state &= ~SS_ASYNC; 7443897Skarels so->so_rcv.sb_flags &= ~SB_ASYNC; 7543897Skarels so->so_snd.sb_flags &= ~SB_ASYNC; 7643897Skarels } 7713050Ssam return (0); 7812794Ssam 7913001Ssam case FIONREAD: 8013001Ssam *(int *)data = so->so_rcv.sb_cc; 8113050Ssam return (0); 8213001Ssam 8312794Ssam case SIOCSPGRP: 8437478Ssklower so->so_pgid = *(int *)data; 8513050Ssam return (0); 8612794Ssam 8712794Ssam case SIOCGPGRP: 8837478Ssklower *(int *)data = so->so_pgid; 8913050Ssam return (0); 9012794Ssam 9112794Ssam case SIOCATMARK: 9212794Ssam *(int *)data = (so->so_state&SS_RCVATMARK) != 0; 9313050Ssam return (0); 9412794Ssam } 9513050Ssam /* 9613050Ssam * Interface/routing/protocol specific ioctls: 9713050Ssam * interface and routing ioctls should have a 9813050Ssam * different entry since a socket's unnecessary 9913050Ssam */ 10040935Skarels if (IOCGROUP(cmd) == 'i') 10118366Skarels return (ifioctl(so, cmd, data)); 10240935Skarels if (IOCGROUP(cmd) == 'r') 10313050Ssam return (rtioctl(cmd, data)); 10413050Ssam return ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL, 10513050Ssam (struct mbuf *)cmd, (struct mbuf *)data, (struct mbuf *)0)); 10612794Ssam } 10712794Ssam 10812794Ssam soo_select(fp, which) 10912794Ssam struct file *fp; 11012794Ssam int which; 11112794Ssam { 11212794Ssam register struct socket *so = (struct socket *)fp->f_data; 11312794Ssam register int s = splnet(); 11412794Ssam 11512794Ssam switch (which) { 11612794Ssam 11712794Ssam case FREAD: 11812794Ssam if (soreadable(so)) { 11912794Ssam splx(s); 12012794Ssam return (1); 12112794Ssam } 12212794Ssam sbselqueue(&so->so_rcv); 12312794Ssam break; 12412794Ssam 12512794Ssam case FWRITE: 12612794Ssam if (sowriteable(so)) { 12712794Ssam splx(s); 12812794Ssam return (1); 12912794Ssam } 13012794Ssam sbselqueue(&so->so_snd); 13112794Ssam break; 13224768Skarels 13324768Skarels case 0: 13424768Skarels if (so->so_oobmark || 13524768Skarels (so->so_state & SS_RCVATMARK)) { 13624768Skarels splx(s); 13724768Skarels return (1); 13824768Skarels } 13924768Skarels sbselqueue(&so->so_rcv); 14024768Skarels break; 14112794Ssam } 14212794Ssam splx(s); 14312794Ssam return (0); 14412794Ssam } 14512794Ssam 14613099Ssam /*ARGSUSED*/ 14713045Ssam soo_stat(so, ub) 14813045Ssam register struct socket *so; 14912794Ssam register struct stat *ub; 15012794Ssam { 15112794Ssam 15212794Ssam bzero((caddr_t)ub, sizeof (*ub)); 15312794Ssam return ((*so->so_proto->pr_usrreq)(so, PRU_SENSE, 15412794Ssam (struct mbuf *)ub, (struct mbuf *)0, 15512794Ssam (struct mbuf *)0)); 15612794Ssam } 15712794Ssam 15812794Ssam soo_close(fp) 15912794Ssam struct file *fp; 16012794Ssam { 16114032Ssam int error = 0; 16233921Sbostic 16314032Ssam if (fp->f_data) 16414032Ssam error = soclose((struct socket *)fp->f_data); 16512794Ssam fp->f_data = 0; 16612794Ssam return (error); 16712794Ssam } 168