describe ap (Kirk); delete lfs_mntinvalbuf, lfs_vinvalbuf, add
[unix-history] / usr / src / sys / kern / sys_socket.c
CommitLineData
da7c5cc6 1/*
ac79b8e6 2 * Copyright (c) 1982, 1986, 1990 Regents of the University of California.
e0813a30 3 * All rights reserved.
da7c5cc6 4 *
dbf0c423 5 * %sccs.include.redist.c%
e0813a30 6 *
77f9c500 7 * @(#)sys_socket.c 7.13 (Berkeley) %G%
da7c5cc6 8 */
48aab316 9
94368568
JB
10#include "param.h"
11#include "systm.h"
77f9c500 12#include "proc.h"
94368568
JB
13#include "file.h"
14#include "mbuf.h"
15#include "protosw.h"
16#include "socket.h"
17#include "socketvar.h"
18#include "ioctl.h"
94368568 19#include "stat.h"
48aab316 20
b6b0de03
MK
21#include "net/if.h"
22#include "net/route.h"
48aab316 23
48aab316 24struct fileops socketops =
c4ec2128 25 { soo_read, soo_write, soo_ioctl, soo_select, soo_close };
48aab316 26
c4ec2128
KM
27/* ARGSUSED */
28soo_read(fp, uio, cred)
48aab316 29 struct file *fp;
48aab316 30 struct uio *uio;
c4ec2128 31 struct ucred *cred;
48aab316 32{
48aab316 33
c4ec2128 34 return (soreceive((struct socket *)fp->f_data, (struct mbuf **)0,
ac79b8e6 35 uio, (struct mbuf **)0, (struct mbuf **)0, (int *)0));
c4ec2128
KM
36}
37
38/* ARGSUSED */
39soo_write(fp, uio, cred)
40 struct file *fp;
41 struct uio *uio;
42 struct ucred *cred;
43{
44
45 return (sosend((struct socket *)fp->f_data, (struct mbuf *)0,
ac79b8e6 46 uio, (struct mbuf *)0, (struct mbuf *)0, 0));
48aab316
SL
47}
48
8429d022 49soo_ioctl(fp, cmd, data, p)
48aab316
SL
50 struct file *fp;
51 int cmd;
52 register caddr_t data;
8429d022 53 struct proc *p;
48aab316
SL
54{
55 register struct socket *so = (struct socket *)fp->f_data;
56
57 switch (cmd) {
58
59 case FIONBIO:
60 if (*(int *)data)
61 so->so_state |= SS_NBIO;
62 else
63 so->so_state &= ~SS_NBIO;
1116b929 64 return (0);
48aab316
SL
65
66 case FIOASYNC:
d1ba3865 67 if (*(int *)data) {
48aab316 68 so->so_state |= SS_ASYNC;
d1ba3865
MK
69 so->so_rcv.sb_flags |= SB_ASYNC;
70 so->so_snd.sb_flags |= SB_ASYNC;
71 } else {
48aab316 72 so->so_state &= ~SS_ASYNC;
d1ba3865
MK
73 so->so_rcv.sb_flags &= ~SB_ASYNC;
74 so->so_snd.sb_flags &= ~SB_ASYNC;
75 }
1116b929 76 return (0);
48aab316 77
8b899dbe
SL
78 case FIONREAD:
79 *(int *)data = so->so_rcv.sb_cc;
1116b929 80 return (0);
8b899dbe 81
48aab316 82 case SIOCSPGRP:
a2aebb63 83 so->so_pgid = *(int *)data;
1116b929 84 return (0);
48aab316
SL
85
86 case SIOCGPGRP:
a2aebb63 87 *(int *)data = so->so_pgid;
1116b929 88 return (0);
48aab316
SL
89
90 case SIOCATMARK:
91 *(int *)data = (so->so_state&SS_RCVATMARK) != 0;
1116b929 92 return (0);
48aab316 93 }
1116b929
SL
94 /*
95 * Interface/routing/protocol specific ioctls:
96 * interface and routing ioctls should have a
97 * different entry since a socket's unnecessary
98 */
ac79b8e6 99 if (IOCGROUP(cmd) == 'i')
8429d022 100 return (ifioctl(so, cmd, data, p));
ac79b8e6 101 if (IOCGROUP(cmd) == 'r')
8429d022 102 return (rtioctl(cmd, data, p));
1116b929
SL
103 return ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL,
104 (struct mbuf *)cmd, (struct mbuf *)data, (struct mbuf *)0));
48aab316
SL
105}
106
8429d022 107soo_select(fp, which, p)
48aab316
SL
108 struct file *fp;
109 int which;
8429d022 110 struct proc *p;
48aab316
SL
111{
112 register struct socket *so = (struct socket *)fp->f_data;
113 register int s = splnet();
114
115 switch (which) {
116
117 case FREAD:
118 if (soreadable(so)) {
119 splx(s);
120 return (1);
121 }
77f9c500
KM
122 selrecord(p, &so->so_rcv.sb_sel);
123 so->so_rcv.sb_flags |= SB_SEL;
48aab316
SL
124 break;
125
126 case FWRITE:
127 if (sowriteable(so)) {
128 splx(s);
129 return (1);
130 }
77f9c500
KM
131 selrecord(p, &so->so_snd.sb_sel);
132 so->so_snd.sb_flags |= SB_SEL;
48aab316 133 break;
de2c74a5
MK
134
135 case 0:
77f9c500 136 if (so->so_oobmark || (so->so_state & SS_RCVATMARK)) {
de2c74a5
MK
137 splx(s);
138 return (1);
139 }
77f9c500
KM
140 selrecord(p, &so->so_rcv.sb_sel);
141 so->so_rcv.sb_flags |= SB_SEL;
de2c74a5 142 break;
48aab316
SL
143 }
144 splx(s);
145 return (0);
146}
147
92438dfc
SL
148soo_stat(so, ub)
149 register struct socket *so;
48aab316
SL
150 register struct stat *ub;
151{
48aab316
SL
152
153 bzero((caddr_t)ub, sizeof (*ub));
19ab7527 154 ub->st_mode = S_IFSOCK;
48aab316
SL
155 return ((*so->so_proto->pr_usrreq)(so, PRU_SENSE,
156 (struct mbuf *)ub, (struct mbuf *)0,
157 (struct mbuf *)0));
48aab316
SL
158}
159
9bb1dbe9
KM
160/* ARGSUSED */
161soo_close(fp, p)
48aab316 162 struct file *fp;
9bb1dbe9 163 struct proc *p;
48aab316 164{
ec04fec2 165 int error = 0;
e0813a30 166
ec04fec2
SL
167 if (fp->f_data)
168 error = soclose((struct socket *)fp->f_data);
48aab316
SL
169 fp->f_data = 0;
170 return (error);
171}