123386Smckusick /* 263178Sbostic * Copyright (c) 1982, 1986, 1990, 1993 363178Sbostic * The Regents of the University of California. All rights reserved. 423386Smckusick * 544445Sbostic * %sccs.include.redist.c% 633921Sbostic * 7*68171Scgd * @(#)sys_socket.c 8.2 (Berkeley) 01/09/95 823386Smckusick */ 912794Ssam 1056517Sbostic #include <sys/param.h> 1156517Sbostic #include <sys/systm.h> 1256517Sbostic #include <sys/proc.h> 1356517Sbostic #include <sys/file.h> 1456517Sbostic #include <sys/mbuf.h> 1556517Sbostic #include <sys/protosw.h> 1656517Sbostic #include <sys/socket.h> 1756517Sbostic #include <sys/socketvar.h> 1856517Sbostic #include <sys/ioctl.h> 1956517Sbostic #include <sys/stat.h> 2012794Ssam 2156517Sbostic #include <net/if.h> 2256517Sbostic #include <net/route.h> 2312794Ssam 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; 51*68171Scgd u_long 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 } 12252524Smckusick selrecord(p, &so->so_rcv.sb_sel); 12352524Smckusick so->so_rcv.sb_flags |= SB_SEL; 12412794Ssam break; 12512794Ssam 12612794Ssam case FWRITE: 12712794Ssam if (sowriteable(so)) { 12812794Ssam splx(s); 12912794Ssam return (1); 13012794Ssam } 13152524Smckusick selrecord(p, &so->so_snd.sb_sel); 13252524Smckusick so->so_snd.sb_flags |= SB_SEL; 13312794Ssam break; 13424768Skarels 13524768Skarels case 0: 13652524Smckusick if (so->so_oobmark || (so->so_state & SS_RCVATMARK)) { 13724768Skarels splx(s); 13824768Skarels return (1); 13924768Skarels } 14052524Smckusick selrecord(p, &so->so_rcv.sb_sel); 14152524Smckusick so->so_rcv.sb_flags |= SB_SEL; 14224768Skarels break; 14312794Ssam } 14412794Ssam splx(s); 14512794Ssam return (0); 14612794Ssam } 14712794Ssam 14813045Ssam soo_stat(so, ub) 14913045Ssam register struct socket *so; 15012794Ssam register struct stat *ub; 15112794Ssam { 15212794Ssam 15312794Ssam bzero((caddr_t)ub, sizeof (*ub)); 15450429Skarels ub->st_mode = S_IFSOCK; 15512794Ssam return ((*so->so_proto->pr_usrreq)(so, PRU_SENSE, 15612794Ssam (struct mbuf *)ub, (struct mbuf *)0, 15712794Ssam (struct mbuf *)0)); 15812794Ssam } 15912794Ssam 16048028Smckusick /* ARGSUSED */ 16148028Smckusick soo_close(fp, p) 16212794Ssam struct file *fp; 16348028Smckusick struct proc *p; 16412794Ssam { 16514032Ssam int error = 0; 16633921Sbostic 16714032Ssam if (fp->f_data) 16814032Ssam error = soclose((struct socket *)fp->f_data); 16912794Ssam fp->f_data = 0; 17012794Ssam return (error); 17112794Ssam } 172