[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.56.2.2 and 1.56.2.4

version 1.56.2.2, 2001/09/07 22:01:53 version 1.56.2.4, 2002/03/15 21:36:11
Line 35 
Line 35 
  *      @(#)uipc_socket.c       8.6 (Berkeley) 5/2/95   *      @(#)uipc_socket.c       8.6 (Berkeley) 5/2/95
  */   */
   
 #include "opt_compat_sunos.h"  #include <sys/cdefs.h>
   __KERNEL_RCSID(0, "$NetBSD$");
   
 #include <sys/param.h>  #include <sys/param.h>
 #include <sys/systm.h>  #include <sys/systm.h>
Line 123  socreate(int dom, struct socket **aso, i
Line 124  socreate(int dom, struct socket **aso, i
                 splx(s);                  splx(s);
                 return (error);                  return (error);
         }          }
 #ifdef COMPAT_SUNOS  
         {  
                 extern struct emul emul_sunos;  
                 if (p->p_emul == &emul_sunos && type == SOCK_DGRAM)  
                         so->so_options |= SO_BROADCAST;  
         }  
 #endif  
         splx(s);          splx(s);
         *aso = so;          *aso = so;
         return (0);          return (0);
Line 367  sosend(struct socket *so, struct mbuf *a
Line 361  sosend(struct socket *so, struct mbuf *a
 {  {
         struct proc     *p;          struct proc     *p;
         struct mbuf     **mp, *m;          struct mbuf     **mp, *m;
         long            space, len, resid;          long            space, len, resid, clen, mlen;
         int             clen, error, s, dontroute, mlen, atomic;          int             error, s, dontroute, atomic;
   
         p = curproc;            /* XXX */          p = curproc;            /* XXX */
         clen = 0;          clen = 0;
Line 461  sosend(struct socket *so, struct mbuf *a
Line 455  sosend(struct socket *so, struct mbuf *a
                                                 goto nopages;                                                  goto nopages;
                                         mlen = MCLBYTES;                                          mlen = MCLBYTES;
 #ifdef  MAPPED_MBUFS  #ifdef  MAPPED_MBUFS
                                         len = min(MCLBYTES, resid);                                          len = lmin(MCLBYTES, resid);
 #else  #else
                                         if (atomic && top == 0) {                                          if (atomic && top == 0) {
                                                 len = min(MCLBYTES - max_hdr,                                                  len = lmin(MCLBYTES - max_hdr,
                                                     resid);                                                      resid);
                                                 m->m_data += max_hdr;                                                  m->m_data += max_hdr;
                                         } else                                          } else
                                                 len = min(MCLBYTES, resid);                                                  len = lmin(MCLBYTES, resid);
 #endif  #endif
                                         space -= len;                                          space -= len;
                                 } else {                                  } else {
 nopages:  nopages:
                                         len = min(min(mlen, resid), space);                                          len = lmin(lmin(mlen, resid), space);
                                         space -= len;                                          space -= len;
                                         /*                                          /*
                                          * For datagram protocols, leave room                                           * For datagram protocols, leave room
Line 750  soreceive(struct socket *so, struct mbuf
Line 744  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)
                                   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 1129  soo_kqfilter(struct file *fp, struct kno
Line 1125  soo_kqfilter(struct file *fp, struct kno
 {  {
         struct socket   *so;          struct socket   *so;
         struct sockbuf  *sb;          struct sockbuf  *sb;
         int             s;  
   
         so = (struct socket *)kn->kn_fp->f_data;          so = (struct socket *)kn->kn_fp->f_data;
         switch (kn->kn_filter) {          switch (kn->kn_filter) {
Line 1147  soo_kqfilter(struct file *fp, struct kno
Line 1142  soo_kqfilter(struct file *fp, struct kno
         default:          default:
                 return (1);                  return (1);
         }          }
         s = splnet();           /* XXXLUKEM: maybe splsoftnet() ? */  
         SLIST_INSERT_HEAD(&sb->sb_sel.si_klist, kn, kn_selnext);          SLIST_INSERT_HEAD(&sb->sb_sel.si_klist, kn, kn_selnext);
         sb->sb_flags |= SB_KNOTE;          sb->sb_flags |= SB_KNOTE;
         splx(s);  
         return (0);          return (0);
 }  }
   
Line 1158  static void
Line 1151  static void
 filt_sordetach(struct knote *kn)  filt_sordetach(struct knote *kn)
 {  {
         struct socket   *so;          struct socket   *so;
         int             s;  
   
         so = (struct socket *)kn->kn_fp->f_data;          so = (struct socket *)kn->kn_fp->f_data;
         s = splnet();           /* XXXLUKEM: maybe splsoftnet() ? */  
         SLIST_REMOVE(&so->so_rcv.sb_sel.si_klist, kn, knote, kn_selnext);          SLIST_REMOVE(&so->so_rcv.sb_sel.si_klist, kn, knote, kn_selnext);
         if (SLIST_EMPTY(&so->so_rcv.sb_sel.si_klist))          if (SLIST_EMPTY(&so->so_rcv.sb_sel.si_klist))
                 so->so_rcv.sb_flags &= ~SB_KNOTE;                  so->so_rcv.sb_flags &= ~SB_KNOTE;
         splx(s);  
 }  }
   
 /*ARGSUSED*/  /*ARGSUSED*/
Line 1192  static void
Line 1182  static void
 filt_sowdetach(struct knote *kn)  filt_sowdetach(struct knote *kn)
 {  {
         struct socket   *so;          struct socket   *so;
         int             s;  
   
         so = (struct socket *)kn->kn_fp->f_data;          so = (struct socket *)kn->kn_fp->f_data;
         s = splnet();           /* XXXLUKEM: maybe splsoftnet() ? */  
         SLIST_REMOVE(&so->so_snd.sb_sel.si_klist, kn, knote, kn_selnext);          SLIST_REMOVE(&so->so_snd.sb_sel.si_klist, kn, knote, kn_selnext);
         if (SLIST_EMPTY(&so->so_snd.sb_sel.si_klist))          if (SLIST_EMPTY(&so->so_snd.sb_sel.si_klist))
                 so->so_snd.sb_flags &= ~SB_KNOTE;                  so->so_snd.sb_flags &= ~SB_KNOTE;
         splx(s);  
 }  }
   
 /*ARGSUSED*/  /*ARGSUSED*/
Line 1232  filt_solisten(struct knote *kn, long hin
Line 1219  filt_solisten(struct knote *kn, long hin
         struct socket   *so;          struct socket   *so;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = (struct socket *)kn->kn_fp->f_data;
 #if 0  
         /*          /*
          * XXXLUKEM:    this was freebsd's code. it appears that they           * Set kn_data to number of incoming connections, not
          * XXXLUKEM:    modified the socket code to store the count           * counting partial (incomplete) connections.
          * XXXLUKEM:    of all connections in so_qlen, and separately           */
          * XXXLUKEM:    track the number of incompletes in so_incqlen.  
          * XXXLUKEM:    as we appear to keep only completed connections  
          * XXXLUKEM:    on so_qlen we can just return that.  
          * XXXLUKEM:    that said, a socket guru should double check for me :)  
          */  
         kn->kn_data = so->so_qlen - so->so_incqlen;  
         return (! TAILQ_EMPTY(&so->so_comp));  
 #else  
         kn->kn_data = so->so_qlen;          kn->kn_data = so->so_qlen;
         return (kn->kn_data > 0);          return (kn->kn_data > 0);
 #endif  
 }  }

Legend:
Removed from v.1.56.2.2  
changed lines
  Added in v.1.56.2.4

CVSweb <webmaster@jp.NetBSD.org>