MCPcopy Create free account
hub / github.com/F-Stack/f-stack / soo_ioctl

Function soo_ioctl

freebsd/kern/sys_socket.c:161–289  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

159}
160
161static int
162soo_ioctl(struct file *fp, u_long cmd, void *data, struct ucred *active_cred,
163 struct thread *td)
164{
165 struct socket *so = fp->f_data;
166 int error = 0;
167
168 switch (cmd) {
169 case FIONBIO:
170 SOCK_LOCK(so);
171 if (*(int *)data)
172 so->so_state |= SS_NBIO;
173 else
174 so->so_state &= ~SS_NBIO;
175 SOCK_UNLOCK(so);
176 break;
177
178 case FIOASYNC:
179 if (*(int *)data) {
180 SOCK_LOCK(so);
181 so->so_state |= SS_ASYNC;
182 if (SOLISTENING(so)) {
183 so->sol_sbrcv_flags |= SB_ASYNC;
184 so->sol_sbsnd_flags |= SB_ASYNC;
185 } else {
186 SOCKBUF_LOCK(&so->so_rcv);
187 so->so_rcv.sb_flags |= SB_ASYNC;
188 SOCKBUF_UNLOCK(&so->so_rcv);
189 SOCKBUF_LOCK(&so->so_snd);
190 so->so_snd.sb_flags |= SB_ASYNC;
191 SOCKBUF_UNLOCK(&so->so_snd);
192 }
193 SOCK_UNLOCK(so);
194 } else {
195 SOCK_LOCK(so);
196 so->so_state &= ~SS_ASYNC;
197 if (SOLISTENING(so)) {
198 so->sol_sbrcv_flags &= ~SB_ASYNC;
199 so->sol_sbsnd_flags &= ~SB_ASYNC;
200 } else {
201 SOCKBUF_LOCK(&so->so_rcv);
202 so->so_rcv.sb_flags &= ~SB_ASYNC;
203 SOCKBUF_UNLOCK(&so->so_rcv);
204 SOCKBUF_LOCK(&so->so_snd);
205 so->so_snd.sb_flags &= ~SB_ASYNC;
206 SOCKBUF_UNLOCK(&so->so_snd);
207 }
208 SOCK_UNLOCK(so);
209 }
210 break;
211
212 case FIONREAD:
213 /* Unlocked read. */
214 if (SOLISTENING(so)) {
215 error = EINVAL;
216 } else {
217 *(int *)data = sbavail(&so->so_rcv);
218 }

Callers

nothing calls this directly

Calls 7

fsetownFunction · 0.85
fgetownFunction · 0.85
ifioctlFunction · 0.85
rtioctl_fibFunction · 0.85
sbavailFunction · 0.50
sbusedFunction · 0.50
sbspaceFunction · 0.50

Tested by

no test coverage detected