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