uipc_socket.c (26990) | uipc_socket.c (28270) |
---|---|
1/* 2 * Copyright (c) 1982, 1986, 1988, 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)uipc_socket.c 8.3 (Berkeley) 4/15/94 | 1/* 2 * Copyright (c) 1982, 1986, 1988, 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)uipc_socket.c 8.3 (Berkeley) 4/15/94 |
34 * $Id: uipc_socket.c,v 1.26 1997/04/27 20:00:44 wollman Exp $ | 34 * $Id: uipc_socket.c,v 1.27 1997/06/27 15:28:54 peter Exp $ |
35 */ 36 37#include <sys/param.h> 38#include <sys/queue.h> 39#include <sys/systm.h> 40#include <sys/proc.h> 41#include <sys/fcntl.h> 42#include <sys/malloc.h> --- 53 unchanged lines hidden (view full) --- 96 } 97 *aso = so; 98 return (0); 99} 100 101int 102sobind(so, nam, p) 103 struct socket *so; | 35 */ 36 37#include <sys/param.h> 38#include <sys/queue.h> 39#include <sys/systm.h> 40#include <sys/proc.h> 41#include <sys/fcntl.h> 42#include <sys/malloc.h> --- 53 unchanged lines hidden (view full) --- 96 } 97 *aso = so; 98 return (0); 99} 100 101int 102sobind(so, nam, p) 103 struct socket *so; |
104 struct mbuf *nam; | 104 struct sockaddr *nam; |
105 struct proc *p; 106{ 107 int s = splnet(); 108 int error; 109 110 error = (*so->so_proto->pr_usrreqs->pru_bind)(so, nam, p); 111 splx(s); 112 return (error); --- 115 unchanged lines hidden (view full) --- 228{ 229 230 return (*so->so_proto->pr_usrreqs->pru_abort)(so); 231} 232 233int 234soaccept(so, nam) 235 register struct socket *so; | 105 struct proc *p; 106{ 107 int s = splnet(); 108 int error; 109 110 error = (*so->so_proto->pr_usrreqs->pru_bind)(so, nam, p); 111 splx(s); 112 return (error); --- 115 unchanged lines hidden (view full) --- 228{ 229 230 return (*so->so_proto->pr_usrreqs->pru_abort)(so); 231} 232 233int 234soaccept(so, nam) 235 register struct socket *so; |
236 struct mbuf *nam; | 236 struct sockaddr **nam; |
237{ 238 int s = splnet(); 239 int error; 240 241 if ((so->so_state & SS_NOFDREF) == 0) 242 panic("soaccept: !NOFDREF"); 243 so->so_state &= ~SS_NOFDREF; 244 error = (*so->so_proto->pr_usrreqs->pru_accept)(so, nam); 245 splx(s); 246 return (error); 247} 248 249int 250soconnect(so, nam, p) 251 register struct socket *so; | 237{ 238 int s = splnet(); 239 int error; 240 241 if ((so->so_state & SS_NOFDREF) == 0) 242 panic("soaccept: !NOFDREF"); 243 so->so_state &= ~SS_NOFDREF; 244 error = (*so->so_proto->pr_usrreqs->pru_accept)(so, nam); 245 splx(s); 246 return (error); 247} 248 249int 250soconnect(so, nam, p) 251 register struct socket *so; |
252 struct mbuf *nam; | 252 struct sockaddr *nam; |
253 struct proc *p; 254{ 255 int s; 256 int error; 257 258 if (so->so_options & SO_ACCEPTCONN) 259 return (EOPNOTSUPP); 260 s = splnet(); --- 61 unchanged lines hidden (view full) --- 322 * if uio is not). Data provided in mbuf chain must be small 323 * enough to send all at once. 324 * 325 * Returns nonzero on error, timeout or signal; callers 326 * must check for short counts if EINTR/ERESTART are returned. 327 * Data and control buffers are freed on return. 328 */ 329int | 253 struct proc *p; 254{ 255 int s; 256 int error; 257 258 if (so->so_options & SO_ACCEPTCONN) 259 return (EOPNOTSUPP); 260 s = splnet(); --- 61 unchanged lines hidden (view full) --- 322 * if uio is not). Data provided in mbuf chain must be small 323 * enough to send all at once. 324 * 325 * Returns nonzero on error, timeout or signal; callers 326 * must check for short counts if EINTR/ERESTART are returned. 327 * Data and control buffers are freed on return. 328 */ 329int |
330sosend(so, addr, uio, top, control, flags) | 330sosend(so, addr, uio, top, control, flags, p) |
331 register struct socket *so; | 331 register struct socket *so; |
332 struct mbuf *addr; | 332 struct sockaddr *addr; |
333 struct uio *uio; 334 struct mbuf *top; 335 struct mbuf *control; 336 int flags; | 333 struct uio *uio; 334 struct mbuf *top; 335 struct mbuf *control; 336 int flags; |
337 struct proc *p; |
|
337{ | 338{ |
338 struct proc *p = curproc; /* XXX */ | |
339 struct mbuf **mp; 340 register struct mbuf *m; 341 register long space, len, resid; 342 int clen = 0, error, s, dontroute, mlen; 343 int atomic = sosendallatonce(so) || top; 344 345 if (uio) 346 resid = uio->uio_resid; --- 160 unchanged lines hidden (view full) --- 507 * Although the sockbuf is locked, new data may still be appended, 508 * and thus we must maintain consistency of the sockbuf during that time. 509 * 510 * The caller may receive the data as a single mbuf chain by supplying 511 * an mbuf **mp0 for use in returning the chain. The uio is then used 512 * only for the count in uio_resid. 513 */ 514int | 339 struct mbuf **mp; 340 register struct mbuf *m; 341 register long space, len, resid; 342 int clen = 0, error, s, dontroute, mlen; 343 int atomic = sosendallatonce(so) || top; 344 345 if (uio) 346 resid = uio->uio_resid; --- 160 unchanged lines hidden (view full) --- 507 * Although the sockbuf is locked, new data may still be appended, 508 * and thus we must maintain consistency of the sockbuf during that time. 509 * 510 * The caller may receive the data as a single mbuf chain by supplying 511 * an mbuf **mp0 for use in returning the chain. The uio is then used 512 * only for the count in uio_resid. 513 */ 514int |
515soreceive(so, paddr, uio, mp0, controlp, flagsp) | 515soreceive(so, psa, uio, mp0, controlp, flagsp) |
516 register struct socket *so; | 516 register struct socket *so; |
517 struct mbuf **paddr; | 517 struct sockaddr **psa; |
518 struct uio *uio; 519 struct mbuf **mp0; 520 struct mbuf **controlp; 521 int *flagsp; 522{ 523 register struct mbuf *m, **mp; 524 register int flags, len, error, s, offset; 525 struct protosw *pr = so->so_proto; 526 struct mbuf *nextrecord; 527 int moff, type = 0; 528 int orig_resid = uio->uio_resid; 529 530 mp = mp0; | 518 struct uio *uio; 519 struct mbuf **mp0; 520 struct mbuf **controlp; 521 int *flagsp; 522{ 523 register struct mbuf *m, **mp; 524 register int flags, len, error, s, offset; 525 struct protosw *pr = so->so_proto; 526 struct mbuf *nextrecord; 527 int moff, type = 0; 528 int orig_resid = uio->uio_resid; 529 530 mp = mp0; |
531 if (paddr) 532 *paddr = 0; | 531 if (psa) 532 *psa = 0; |
533 if (controlp) 534 *controlp = 0; 535 if (flagsp) 536 flags = *flagsp &~ MSG_EOR; 537 else 538 flags = 0; 539 if (flags & MSG_OOB) { 540 m = m_get(M_WAIT, MT_DATA); --- 84 unchanged lines hidden (view full) --- 625 uio->uio_procp->p_stats->p_ru.ru_msgrcv++; 626 nextrecord = m->m_nextpkt; 627 if (pr->pr_flags & PR_ADDR) { 628#ifdef DIAGNOSTIC 629 if (m->m_type != MT_SONAME) 630 panic("receive 1a"); 631#endif 632 orig_resid = 0; | 533 if (controlp) 534 *controlp = 0; 535 if (flagsp) 536 flags = *flagsp &~ MSG_EOR; 537 else 538 flags = 0; 539 if (flags & MSG_OOB) { 540 m = m_get(M_WAIT, MT_DATA); --- 84 unchanged lines hidden (view full) --- 625 uio->uio_procp->p_stats->p_ru.ru_msgrcv++; 626 nextrecord = m->m_nextpkt; 627 if (pr->pr_flags & PR_ADDR) { 628#ifdef DIAGNOSTIC 629 if (m->m_type != MT_SONAME) 630 panic("receive 1a"); 631#endif 632 orig_resid = 0; |
633 if (psa) 634 *psa = dup_sockaddr(mtod(m, struct sockaddr *), 635 mp0 == 0); |
|
633 if (flags & MSG_PEEK) { | 636 if (flags & MSG_PEEK) { |
634 if (paddr) 635 *paddr = m_copy(m, 0, m->m_len); | |
636 m = m->m_next; 637 } else { 638 sbfree(&so->so_rcv, m); | 637 m = m->m_next; 638 } else { 639 sbfree(&so->so_rcv, m); |
639 if (paddr) { 640 *paddr = m; 641 so->so_rcv.sb_mb = m->m_next; 642 m->m_next = 0; 643 m = so->so_rcv.sb_mb; 644 } else { 645 MFREE(m, so->so_rcv.sb_mb); 646 m = so->so_rcv.sb_mb; 647 } | 640 MFREE(m, so->so_rcv.sb_mb); 641 m = so->so_rcv.sb_mb; |
648 } 649 } 650 while (m && m->m_type == MT_CONTROL && error == 0) { 651 if (flags & MSG_PEEK) { 652 if (controlp) 653 *controlp = m_copy(m, 0, m->m_len); 654 m = m->m_next; 655 } else { --- 472 unchanged lines hidden --- | 642 } 643 } 644 while (m && m->m_type == MT_CONTROL && error == 0) { 645 if (flags & MSG_PEEK) { 646 if (controlp) 647 *controlp = m_copy(m, 0, m->m_len); 648 m = m->m_next; 649 } else { --- 472 unchanged lines hidden --- |