Deleted Added
full compact
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 ---