uipc_sockbuf.c (1817) | uipc_sockbuf.c (3308) |
---|---|
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_socket2.c 8.1 (Berkeley) 6/10/93 | 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_socket2.c 8.1 (Berkeley) 6/10/93 |
34 * $Id$ | 34 * $Id: uipc_socket2.c,v 1.3 1994/08/02 07:43:08 davidg Exp $ |
35 */ 36 37#include <sys/param.h> 38#include <sys/systm.h> 39#include <sys/proc.h> 40#include <sys/file.h> 41#include <sys/buf.h> 42#include <sys/malloc.h> 43#include <sys/mbuf.h> 44#include <sys/protosw.h> | 35 */ 36 37#include <sys/param.h> 38#include <sys/systm.h> 39#include <sys/proc.h> 40#include <sys/file.h> 41#include <sys/buf.h> 42#include <sys/malloc.h> 43#include <sys/mbuf.h> 44#include <sys/protosw.h> |
45#include <sys/stat.h> |
|
45#include <sys/socket.h> 46#include <sys/socketvar.h> | 46#include <sys/socket.h> 47#include <sys/socketvar.h> |
48#include <sys/signalvar.h> |
|
47 | 49 |
48void soqinsque __P((struct socket *, struct socket *, int)); 49void sowakeup __P((struct socket *, struct sockbuf *)); 50void sbrelease __P((struct sockbuf *)); 51void sbappendrecord __P((struct sockbuf *, struct mbuf *)); 52void sbcompress __P((struct sockbuf *, struct mbuf *, struct mbuf *)); 53void sbflush __P((struct sockbuf *)); 54void sbdrop __P((struct sockbuf *, int)); 55 | |
56/* 57 * Primitive routines for operating on sockets and socket buffers 58 */ 59 60/* strings for sleep message: */ 61char netio[] = "netio"; 62char netcon[] = "netcon"; 63char netcls[] = "netcls"; --- 230 unchanged lines hidden (view full) --- 294int 295sb_lock(sb) 296 register struct sockbuf *sb; 297{ 298 int error; 299 300 while (sb->sb_flags & SB_LOCK) { 301 sb->sb_flags |= SB_WANT; | 50/* 51 * Primitive routines for operating on sockets and socket buffers 52 */ 53 54/* strings for sleep message: */ 55char netio[] = "netio"; 56char netcon[] = "netcon"; 57char netcls[] = "netcls"; --- 230 unchanged lines hidden (view full) --- 288int 289sb_lock(sb) 290 register struct sockbuf *sb; 291{ 292 int error; 293 294 while (sb->sb_flags & SB_LOCK) { 295 sb->sb_flags |= SB_WANT; |
302 if (error = tsleep((caddr_t)&sb->sb_flags, | 296 error = tsleep((caddr_t)&sb->sb_flags, |
303 (sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK|PCATCH, | 297 (sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK|PCATCH, |
304 netio, 0)) | 298 netio, 0); 299 if (error) |
305 return (error); 306 } 307 sb->sb_flags |= SB_LOCK; 308 return (0); 309} 310 311/* 312 * Wakeup processes waiting on a socket buffer. --- 143 unchanged lines hidden (view full) --- 456sbappend(sb, m) 457 struct sockbuf *sb; 458 struct mbuf *m; 459{ 460 register struct mbuf *n; 461 462 if (m == 0) 463 return; | 300 return (error); 301 } 302 sb->sb_flags |= SB_LOCK; 303 return (0); 304} 305 306/* 307 * Wakeup processes waiting on a socket buffer. --- 143 unchanged lines hidden (view full) --- 451sbappend(sb, m) 452 struct sockbuf *sb; 453 struct mbuf *m; 454{ 455 register struct mbuf *n; 456 457 if (m == 0) 458 return; |
464 if (n = sb->sb_mb) { | 459 n = sb->sb_mb; 460 if (n) { |
465 while (n->m_nextpkt) 466 n = n->m_nextpkt; 467 do { 468 if (n->m_flags & M_EOR) { 469 sbappendrecord(sb, m); /* XXXXXX!!!! */ 470 return; 471 } 472 } while (n->m_next && (n = n->m_next)); --- 33 unchanged lines hidden (view full) --- 506sbappendrecord(sb, m0) 507 register struct sockbuf *sb; 508 register struct mbuf *m0; 509{ 510 register struct mbuf *m; 511 512 if (m0 == 0) 513 return; | 461 while (n->m_nextpkt) 462 n = n->m_nextpkt; 463 do { 464 if (n->m_flags & M_EOR) { 465 sbappendrecord(sb, m); /* XXXXXX!!!! */ 466 return; 467 } 468 } while (n->m_next && (n = n->m_next)); --- 33 unchanged lines hidden (view full) --- 502sbappendrecord(sb, m0) 503 register struct sockbuf *sb; 504 register struct mbuf *m0; 505{ 506 register struct mbuf *m; 507 508 if (m0 == 0) 509 return; |
514 if (m = sb->sb_mb) | 510 m = sb->sb_mb; 511 if (m) |
515 while (m->m_nextpkt) 516 m = m->m_nextpkt; 517 /* 518 * Put the first mbuf on the queue. 519 * Note this permits zero length records. 520 */ 521 sballoc(sb, m0); 522 if (m) --- 19 unchanged lines hidden (view full) --- 542 register struct sockbuf *sb; 543 register struct mbuf *m0; 544{ 545 register struct mbuf *m; 546 register struct mbuf **mp; 547 548 if (m0 == 0) 549 return; | 512 while (m->m_nextpkt) 513 m = m->m_nextpkt; 514 /* 515 * Put the first mbuf on the queue. 516 * Note this permits zero length records. 517 */ 518 sballoc(sb, m0); 519 if (m) --- 19 unchanged lines hidden (view full) --- 539 register struct sockbuf *sb; 540 register struct mbuf *m0; 541{ 542 register struct mbuf *m; 543 register struct mbuf **mp; 544 545 if (m0 == 0) 546 return; |
550 for (mp = &sb->sb_mb; m = *mp; mp = &((*mp)->m_nextpkt)) { | 547 for (mp = &sb->sb_mb; *mp ; mp = &((*mp)->m_nextpkt)) { 548 m = *mp; |
551 again: 552 switch (m->m_type) { 553 554 case MT_OOBDATA: 555 continue; /* WANT next train */ 556 557 case MT_CONTROL: | 549 again: 550 switch (m->m_type) { 551 552 case MT_OOBDATA: 553 continue; /* WANT next train */ 554 555 case MT_CONTROL: |
558 if (m = m->m_next) | 556 m = m->m_next; 557 if (m) |
559 goto again; /* inspect THIS train further */ 560 } 561 break; 562 } 563 /* 564 * Put the first mbuf on the queue. 565 * Note this permits zero length records. 566 */ --- 44 unchanged lines hidden (view full) --- 611 bcopy((caddr_t)asa, mtod(m, caddr_t), asa->sa_len); 612 if (n) 613 n->m_next = m0; /* concatenate data to control */ 614 else 615 control = m0; 616 m->m_next = control; 617 for (n = m; n; n = n->m_next) 618 sballoc(sb, n); | 558 goto again; /* inspect THIS train further */ 559 } 560 break; 561 } 562 /* 563 * Put the first mbuf on the queue. 564 * Note this permits zero length records. 565 */ --- 44 unchanged lines hidden (view full) --- 610 bcopy((caddr_t)asa, mtod(m, caddr_t), asa->sa_len); 611 if (n) 612 n->m_next = m0; /* concatenate data to control */ 613 else 614 control = m0; 615 m->m_next = control; 616 for (n = m; n; n = n->m_next) 617 sballoc(sb, n); |
619 if (n = sb->sb_mb) { | 618 n = sb->sb_mb; 619 if (n) { |
620 while (n->m_nextpkt) 621 n = n->m_nextpkt; 622 n->m_nextpkt = m; 623 } else 624 sb->sb_mb = m; 625 return (1); 626} 627 --- 15 unchanged lines hidden (view full) --- 643 n = m; /* save pointer to last control buffer */ 644 for (m = m0; m; m = m->m_next) 645 space += m->m_len; 646 if (space > sbspace(sb)) 647 return (0); 648 n->m_next = m0; /* concatenate data to control */ 649 for (m = control; m; m = m->m_next) 650 sballoc(sb, m); | 620 while (n->m_nextpkt) 621 n = n->m_nextpkt; 622 n->m_nextpkt = m; 623 } else 624 sb->sb_mb = m; 625 return (1); 626} 627 --- 15 unchanged lines hidden (view full) --- 643 n = m; /* save pointer to last control buffer */ 644 for (m = m0; m; m = m->m_next) 645 space += m->m_len; 646 if (space > sbspace(sb)) 647 return (0); 648 n->m_next = m0; /* concatenate data to control */ 649 for (m = control; m; m = m->m_next) 650 sballoc(sb, m); |
651 if (n = sb->sb_mb) { | 651 n = sb->sb_mb; 652 if (n) { |
652 while (n->m_nextpkt) 653 n = n->m_nextpkt; 654 n->m_nextpkt = control; 655 } else 656 sb->sb_mb = control; 657 return (1); 658} 659 --- 118 unchanged lines hidden (view full) --- 778 register struct mbuf *m, *mn; 779 780 m = sb->sb_mb; 781 if (m) { 782 sb->sb_mb = m->m_nextpkt; 783 do { 784 sbfree(sb, m); 785 MFREE(m, mn); | 653 while (n->m_nextpkt) 654 n = n->m_nextpkt; 655 n->m_nextpkt = control; 656 } else 657 sb->sb_mb = control; 658 return (1); 659} 660 --- 118 unchanged lines hidden (view full) --- 779 register struct mbuf *m, *mn; 780 781 m = sb->sb_mb; 782 if (m) { 783 sb->sb_mb = m->m_nextpkt; 784 do { 785 sbfree(sb, m); 786 MFREE(m, mn); |
786 } while (m = mn); | 787 m = mn; 788 } while (m); |
787 } 788} | 789 } 790} |