[BACK]Return to uipc_socket.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / kern

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/kern/uipc_socket.c between version 1.66 and 1.66.4.2

version 1.66, 2002/05/07 08:06:35 version 1.66.4.2, 2002/11/08 09:31:35
Line 797  soreceive(struct socket *so, struct mbuf
Line 797  soreceive(struct socket *so, struct mbuf
         int             flags, len, error, s, offset, moff, type, orig_resid;          int             flags, len, error, s, offset, moff, type, orig_resid;
         struct protosw  *pr;          struct protosw  *pr;
         struct mbuf     *nextrecord;          struct mbuf     *nextrecord;
           int             mbuf_removed = 0;
   
         pr = so->so_proto;          pr = so->so_proto;
         mp = mp0;          mp = mp0;
Line 918  soreceive(struct socket *so, struct mbuf
Line 919  soreceive(struct socket *so, struct mbuf
                         m = m->m_next;                          m = m->m_next;
                 } else {                  } else {
                         sbfree(&so->so_rcv, m);                          sbfree(&so->so_rcv, m);
                           mbuf_removed = 1;
                         if (paddr) {                          if (paddr) {
                                 *paddr = m;                                  *paddr = m;
                                 so->so_rcv.sb_mb = m->m_next;                                  so->so_rcv.sb_mb = m->m_next;
Line 936  soreceive(struct socket *so, struct mbuf
Line 938  soreceive(struct socket *so, struct mbuf
                         m = m->m_next;                          m = m->m_next;
                 } else {                  } else {
                         sbfree(&so->so_rcv, m);                          sbfree(&so->so_rcv, m);
                           mbuf_removed = 1;
                         if (controlp) {                          if (controlp) {
                                 if (pr->pr_domain->dom_externalize &&                                  if (pr->pr_domain->dom_externalize &&
                                     mtod(m, struct cmsghdr *)->cmsg_type ==                                      mtod(m, struct cmsghdr *)->cmsg_type ==
Line 992  soreceive(struct socket *so, struct mbuf
Line 995  soreceive(struct socket *so, struct mbuf
                         splx(s);                          splx(s);
                         error = uiomove(mtod(m, caddr_t) + moff, (int)len, uio);                          error = uiomove(mtod(m, caddr_t) + moff, (int)len, uio);
                         s = splsoftnet();                          s = splsoftnet();
                         if (error)                          if (error) {
                                   /*
                                    * If any part of the record has been removed
                                    * (such as the MT_SONAME mbuf, which will
                                    * happen when PR_ADDR, and thus also
                                    * PR_ATOMIC, is set), then drop the entire
                                    * record to maintain the atomicity of the
                                    * receive operation.
                                    *
                                    * This avoids a later panic("receive 1a")
                                    * when compiled with DIAGNOSTIC.
                                    */
                                   if (m && mbuf_removed
                                       && (pr->pr_flags & PR_ATOMIC))
                                           (void) sbdroprecord(&so->so_rcv);
   
                                 goto release;                                  goto release;
                           }
                 } else                  } else
                         uio->uio_resid -= len;                          uio->uio_resid -= len;
                 if (len == m->m_len - moff) {                  if (len == m->m_len - moff) {
Line 1054  soreceive(struct socket *so, struct mbuf
Line 1073  soreceive(struct socket *so, struct mbuf
                     !sosendallatonce(so) && !nextrecord) {                      !sosendallatonce(so) && !nextrecord) {
                         if (so->so_error || so->so_state & SS_CANTRCVMORE)                          if (so->so_error || so->so_state & SS_CANTRCVMORE)
                                 break;                                  break;
                           /*
                            * If we are peeking and the socket receive buffer is
                            * full, stop since we can't get more data to peek at.
                            */
                           if ((flags & MSG_PEEK) && sbspace(&so->so_rcv) <= 0)
                                   break;
                           /*
                            * If we've drained the socket buffer, tell the
                            * protocol in case it needs to do something to
                            * get it filled again.
                            */
                           if ((pr->pr_flags & PR_WANTRCVD) && so->so_pcb)
                                   (*pr->pr_usrreq)(so, PRU_RCVD,
                                       (struct mbuf *)0,
                                       (struct mbuf *)(long)flags,
                                       (struct mbuf *)0,
                                       (struct proc *)0);
                         error = sbwait(&so->so_rcv);                          error = sbwait(&so->so_rcv);
                         if (error) {                          if (error) {
                                 sbunlock(&so->so_rcv);                                  sbunlock(&so->so_rcv);

Legend:
Removed from v.1.66  
changed lines
  Added in v.1.66.4.2

CVSweb <webmaster@jp.NetBSD.org>