123386Smckusick /* 240935Skarels * Copyright (c) 1982, 1986, 1990 Regents of the University of California. 333921Sbostic * All rights reserved. 423386Smckusick * 544445Sbostic * %sccs.include.redist.c% 633921Sbostic * 7*47975Skarels * @(#)sys_socket.c 7.10 (Berkeley) 04/12/91 823386Smckusick */ 912794Ssam 1017095Sbloom #include "param.h" 1117095Sbloom #include "systm.h" 1217095Sbloom #include "file.h" 1317095Sbloom #include "mbuf.h" 1417095Sbloom #include "protosw.h" 1517095Sbloom #include "socket.h" 1617095Sbloom #include "socketvar.h" 1717095Sbloom #include "ioctl.h" 1817095Sbloom #include "stat.h" 1912794Ssam 20*47975Skarels #include "net/if.h" 21*47975Skarels #include "net/route.h" 2212794Ssam 2337728Smckusick int soo_read(), soo_write(), soo_ioctl(), soo_select(), soo_close(); 2412794Ssam struct fileops socketops = 2537728Smckusick { soo_read, soo_write, soo_ioctl, soo_select, soo_close }; 2612794Ssam 2737728Smckusick /* ARGSUSED */ 2837728Smckusick soo_read(fp, uio, cred) 2912794Ssam struct file *fp; 3012794Ssam struct uio *uio; 3137728Smckusick struct ucred *cred; 3212794Ssam { 3312794Ssam 3437728Smckusick return (soreceive((struct socket *)fp->f_data, (struct mbuf **)0, 3540935Skarels uio, (struct mbuf **)0, (struct mbuf **)0, (int *)0)); 3612794Ssam } 3712794Ssam 3837728Smckusick /* ARGSUSED */ 3937728Smckusick soo_write(fp, uio, cred) 4037728Smckusick struct file *fp; 4137728Smckusick struct uio *uio; 4237728Smckusick struct ucred *cred; 4337728Smckusick { 4437728Smckusick 4537728Smckusick return (sosend((struct socket *)fp->f_data, (struct mbuf *)0, 4640935Skarels uio, (struct mbuf *)0, (struct mbuf *)0, 0)); 4737728Smckusick } 4837728Smckusick 4947540Skarels soo_ioctl(fp, cmd, data, p) 5012794Ssam struct file *fp; 5112794Ssam int cmd; 5212794Ssam register caddr_t data; 5347540Skarels struct proc *p; 5412794Ssam { 5512794Ssam register struct socket *so = (struct socket *)fp->f_data; 5612794Ssam 5712794Ssam switch (cmd) { 5812794Ssam 5912794Ssam case FIONBIO: 6012794Ssam if (*(int *)data) 6112794Ssam so->so_state |= SS_NBIO; 6212794Ssam else 6312794Ssam so->so_state &= ~SS_NBIO; 6413050Ssam return (0); 6512794Ssam 6612794Ssam case FIOASYNC: 6743897Skarels if (*(int *)data) { 6812794Ssam so->so_state |= SS_ASYNC; 6943897Skarels so->so_rcv.sb_flags |= SB_ASYNC; 7043897Skarels so->so_snd.sb_flags |= SB_ASYNC; 7143897Skarels } else { 7212794Ssam so->so_state &= ~SS_ASYNC; 7343897Skarels so->so_rcv.sb_flags &= ~SB_ASYNC; 7443897Skarels so->so_snd.sb_flags &= ~SB_ASYNC; 7543897Skarels } 7613050Ssam return (0); 7712794Ssam 7813001Ssam case FIONREAD: 7913001Ssam *(int *)data = so->so_rcv.sb_cc; 8013050Ssam return (0); 8113001Ssam 8212794Ssam case SIOCSPGRP: 8337478Ssklower so->so_pgid = *(int *)data; 8413050Ssam return (0); 8512794Ssam 8612794Ssam case SIOCGPGRP: 8737478Ssklower *(int *)data = so->so_pgid; 8813050Ssam return (0); 8912794Ssam 9012794Ssam case SIOCATMARK: 9112794Ssam *(int *)data = (so->so_state&SS_RCVATMARK) != 0; 9213050Ssam return (0); 9312794Ssam } 9413050Ssam /* 9513050Ssam * Interface/routing/protocol specific ioctls: 9613050Ssam * interface and routing ioctls should have a 9713050Ssam * different entry since a socket's unnecessary 9813050Ssam */ 9940935Skarels if (IOCGROUP(cmd) == 'i') 10047540Skarels return (ifioctl(so, cmd, data, p)); 10140935Skarels if (IOCGROUP(cmd) == 'r') 10247540Skarels return (rtioctl(cmd, data, p)); 10313050Ssam return ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL, 10413050Ssam (struct mbuf *)cmd, (struct mbuf *)data, (struct mbuf *)0)); 10512794Ssam } 10612794Ssam 10747540Skarels soo_select(fp, which, p) 10812794Ssam struct file *fp; 10912794Ssam int which; 11047540Skarels struct proc *p; 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 } 12247540Skarels sbselqueue(&so->so_rcv, p); 12312794Ssam break; 12412794Ssam 12512794Ssam case FWRITE: 12612794Ssam if (sowriteable(so)) { 12712794Ssam splx(s); 12812794Ssam return (1); 12912794Ssam } 13047540Skarels sbselqueue(&so->so_snd, p); 13112794Ssam break; 13224768Skarels 13324768Skarels case 0: 13424768Skarels if (so->so_oobmark || 13524768Skarels (so->so_state & SS_RCVATMARK)) { 13624768Skarels splx(s); 13724768Skarels return (1); 13824768Skarels } 13947540Skarels sbselqueue(&so->so_rcv, p); 14024768Skarels break; 14112794Ssam } 14212794Ssam splx(s); 14312794Ssam return (0); 14412794Ssam } 14512794Ssam 14613045Ssam soo_stat(so, ub) 14713045Ssam register struct socket *so; 14812794Ssam register struct stat *ub; 14912794Ssam { 15012794Ssam 15112794Ssam bzero((caddr_t)ub, sizeof (*ub)); 15212794Ssam return ((*so->so_proto->pr_usrreq)(so, PRU_SENSE, 15312794Ssam (struct mbuf *)ub, (struct mbuf *)0, 15412794Ssam (struct mbuf *)0)); 15512794Ssam } 15612794Ssam 15712794Ssam soo_close(fp) 15812794Ssam struct file *fp; 15912794Ssam { 16014032Ssam int error = 0; 16133921Sbostic 16214032Ssam if (fp->f_data) 16314032Ssam error = soclose((struct socket *)fp->f_data); 16412794Ssam fp->f_data = 0; 16512794Ssam return (error); 16612794Ssam } 167