xref: /csrg-svn/sys/kern/sys_socket.c (revision 13045)
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