more-or-less working with new proc & user structs
[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 *
8429d022 7 * @(#)sys_socket.c 7.9 (Berkeley) %G%
da7c5cc6 8 */
48aab316 9
94368568
JB
10#include "param.h"
11#include "systm.h"
94368568
JB
12#include "user.h"
13#include "file.h"
14#include "mbuf.h"
15#include "protosw.h"
16#include "socket.h"
17#include "socketvar.h"
18#include "ioctl.h"
19#include "uio.h"
20#include "stat.h"
48aab316
SL
21
22#include "../net/if.h"
23#include "../net/route.h"
24
c4ec2128 25int soo_read(), soo_write(), soo_ioctl(), soo_select(), soo_close();
48aab316 26struct fileops socketops =
c4ec2128 27 { soo_read, soo_write, soo_ioctl, soo_select, soo_close };
48aab316 28
c4ec2128
KM
29/* ARGSUSED */
30soo_read(fp, uio, cred)
48aab316 31 struct file *fp;
48aab316 32 struct uio *uio;
c4ec2128 33 struct ucred *cred;
48aab316 34{
48aab316 35
c4ec2128 36 return (soreceive((struct socket *)fp->f_data, (struct mbuf **)0,
ac79b8e6 37 uio, (struct mbuf **)0, (struct mbuf **)0, (int *)0));
c4ec2128
KM
38}
39
40/* ARGSUSED */
41soo_write(fp, uio, cred)
42 struct file *fp;
43 struct uio *uio;
44 struct ucred *cred;
45{
46
47 return (sosend((struct socket *)fp->f_data, (struct mbuf *)0,
ac79b8e6 48 uio, (struct mbuf *)0, (struct mbuf *)0, 0));
48aab316
SL
49}
50
8429d022 51soo_ioctl(fp, cmd, data, p)
48aab316
SL
52 struct file *fp;
53 int cmd;
54 register caddr_t data;
8429d022 55 struct proc *p;
48aab316
SL
56{
57 register struct socket *so = (struct socket *)fp->f_data;
58
59 switch (cmd) {
60
61 case FIONBIO:
62 if (*(int *)data)
63 so->so_state |= SS_NBIO;
64 else
65 so->so_state &= ~SS_NBIO;
1116b929 66 return (0);
48aab316
SL
67
68 case FIOASYNC:
d1ba3865 69 if (*(int *)data) {
48aab316 70 so->so_state |= SS_ASYNC;
d1ba3865
MK
71 so->so_rcv.sb_flags |= SB_ASYNC;
72 so->so_snd.sb_flags |= SB_ASYNC;
73 } else {
48aab316 74 so->so_state &= ~SS_ASYNC;
d1ba3865
MK
75 so->so_rcv.sb_flags &= ~SB_ASYNC;
76 so->so_snd.sb_flags &= ~SB_ASYNC;
77 }
1116b929 78 return (0);
48aab316 79
8b899dbe
SL
80 case FIONREAD:
81 *(int *)data = so->so_rcv.sb_cc;
1116b929 82 return (0);
8b899dbe 83
48aab316 84 case SIOCSPGRP:
a2aebb63 85 so->so_pgid = *(int *)data;
1116b929 86 return (0);
48aab316
SL
87
88 case SIOCGPGRP:
a2aebb63 89 *(int *)data = so->so_pgid;
1116b929 90 return (0);
48aab316
SL
91
92 case SIOCATMARK:
93 *(int *)data = (so->so_state&SS_RCVATMARK) != 0;
1116b929 94 return (0);
48aab316 95 }
1116b929
SL
96 /*
97 * Interface/routing/protocol specific ioctls:
98 * interface and routing ioctls should have a
99 * different entry since a socket's unnecessary
100 */
ac79b8e6 101 if (IOCGROUP(cmd) == 'i')
8429d022 102 return (ifioctl(so, cmd, data, p));
ac79b8e6 103 if (IOCGROUP(cmd) == 'r')
8429d022 104 return (rtioctl(cmd, data, p));
1116b929
SL
105 return ((*so->so_proto->pr_usrreq)(so, PRU_CONTROL,
106 (struct mbuf *)cmd, (struct mbuf *)data, (struct mbuf *)0));
48aab316
SL
107}
108
8429d022 109soo_select(fp, which, p)
48aab316
SL
110 struct file *fp;
111 int which;
8429d022 112 struct proc *p;
48aab316
SL
113{
114 register struct socket *so = (struct socket *)fp->f_data;
115 register int s = splnet();
116
117 switch (which) {
118
119 case FREAD:
120 if (soreadable(so)) {
121 splx(s);
122 return (1);
123 }
8429d022 124 sbselqueue(&so->so_rcv, p);
48aab316
SL
125 break;
126
127 case FWRITE:
128 if (sowriteable(so)) {
129 splx(s);
130 return (1);
131 }
8429d022 132 sbselqueue(&so->so_snd, p);
48aab316 133 break;
de2c74a5
MK
134
135 case 0:
136 if (so->so_oobmark ||
137 (so->so_state & SS_RCVATMARK)) {
138 splx(s);
139 return (1);
140 }
8429d022 141 sbselqueue(&so->so_rcv, p);
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));
48aab316
SL
154 return ((*so->so_proto->pr_usrreq)(so, PRU_SENSE,
155 (struct mbuf *)ub, (struct mbuf *)0,
156 (struct mbuf *)0));
48aab316
SL
157}
158
159soo_close(fp)
160 struct file *fp;
161{
ec04fec2 162 int error = 0;
e0813a30 163
ec04fec2
SL
164 if (fp->f_data)
165 error = soclose((struct socket *)fp->f_data);
48aab316
SL
166 fp->f_data = 0;
167 return (error);
168}