[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.54.2.5 and 1.56.2.5

version 1.54.2.5, 2001/10/08 20:11:44 version 1.56.2.5, 2002/03/16 16:01:52
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>
 #include <sys/lwp.h>  
 #include <sys/proc.h>  #include <sys/proc.h>
 #include <sys/file.h>  #include <sys/file.h>
 #include <sys/malloc.h>  #include <sys/malloc.h>
Line 52 
Line 52 
 #include <sys/signalvar.h>  #include <sys/signalvar.h>
 #include <sys/resourcevar.h>  #include <sys/resourcevar.h>
 #include <sys/pool.h>  #include <sys/pool.h>
   #include <sys/event.h>
   
   static void     filt_sordetach(struct knote *kn);
   static int      filt_soread(struct knote *kn, long hint);
   static void     filt_sowdetach(struct knote *kn);
   static int      filt_sowrite(struct knote *kn, long hint);
   static int      filt_solisten(struct knote *kn, long hint);
   
   static const struct filterops solisten_filtops =
           { 1, NULL, filt_sordetach, filt_solisten };
   const struct filterops soread_filtops =
           { 1, NULL, filt_sordetach, filt_soread };
   const struct filterops sowrite_filtops =
           { 1, NULL, filt_sowdetach, filt_sowrite };
   
 struct pool     socket_pool;  struct pool     socket_pool;
   
Line 63  soinit(void)
Line 77  soinit(void)
 {  {
   
         pool_init(&socket_pool, sizeof(struct socket), 0, 0, 0,          pool_init(&socket_pool, sizeof(struct socket), 0, 0, 0,
             "sockpl", 0, NULL, NULL, M_SOCKET);              "sockpl", NULL);
 }  }
   
 /*  /*
Line 82  socreate(int dom, struct socket **aso, i
Line 96  socreate(int dom, struct socket **aso, i
         struct socket   *so;          struct socket   *so;
         int             error, s;          int             error, s;
   
         p = curproc->l_proc;    /* XXX */          p = curproc;            /* XXX */
         if (proto)          if (proto)
                 prp = pffindproto(dom, proto, type);                  prp = pffindproto(dom, proto, type);
         else          else
Line 110  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 274  soconnect(struct socket *so, struct mbuf
Line 281  soconnect(struct socket *so, struct mbuf
         struct proc     *p;          struct proc     *p;
         int             s, error;          int             s, error;
   
         p = curproc->l_proc;            /* XXX */          p = curproc;            /* XXX */
         if (so->so_options & SO_ACCEPTCONN)          if (so->so_options & SO_ACCEPTCONN)
                 return (EOPNOTSUPP);                  return (EOPNOTSUPP);
         s = splsoftnet();          s = splsoftnet();
Line 357  sosend(struct socket *so, struct mbuf *a
Line 364  sosend(struct socket *so, struct mbuf *a
         long            space, len, resid, clen, mlen;          long            space, len, resid, clen, mlen;
         int             error, s, dontroute, atomic;          int             error, s, dontroute, atomic;
   
         p = curproc->l_proc;            /* XXX */          p = curproc;            /* XXX */
         clen = 0;          clen = 0;
         atomic = sosendallatonce(so) || top;          atomic = sosendallatonce(so) || top;
         if (uio)          if (uio)
Line 1111  sohasoutofband(struct socket *so)
Line 1118  sohasoutofband(struct socket *so)
                 psignal(p, SIGURG);                  psignal(p, SIGURG);
         selwakeup(&so->so_rcv.sb_sel);          selwakeup(&so->so_rcv.sb_sel);
 }  }
   
   
   int
   soo_kqfilter(struct file *fp, struct knote *kn)
   {
           struct socket   *so;
           struct sockbuf  *sb;
   
           so = (struct socket *)kn->kn_fp->f_data;
           switch (kn->kn_filter) {
           case EVFILT_READ:
                   if (so->so_options & SO_ACCEPTCONN)
                           kn->kn_fop = &solisten_filtops;
                   else
                           kn->kn_fop = &soread_filtops;
                   sb = &so->so_rcv;
                   break;
           case EVFILT_WRITE:
                   kn->kn_fop = &sowrite_filtops;
                   sb = &so->so_snd;
                   break;
           default:
                   return (1);
           }
           SLIST_INSERT_HEAD(&sb->sb_sel.si_klist, kn, kn_selnext);
           sb->sb_flags |= SB_KNOTE;
           return (0);
   }
   
   static void
   filt_sordetach(struct knote *kn)
   {
           struct socket   *so;
   
           so = (struct socket *)kn->kn_fp->f_data;
           SLIST_REMOVE(&so->so_rcv.sb_sel.si_klist, kn, knote, kn_selnext);
           if (SLIST_EMPTY(&so->so_rcv.sb_sel.si_klist))
                   so->so_rcv.sb_flags &= ~SB_KNOTE;
   }
   
   /*ARGSUSED*/
   static int
   filt_soread(struct knote *kn, long hint)
   {
           struct socket   *so;
   
           so = (struct socket *)kn->kn_fp->f_data;
           kn->kn_data = so->so_rcv.sb_cc;
           if (so->so_state & SS_CANTRCVMORE) {
                   kn->kn_flags |= EV_EOF;
                   kn->kn_fflags = so->so_error;
                   return (1);
           }
           if (so->so_error)       /* temporary udp error */
                   return (1);
           if (kn->kn_sfflags & NOTE_LOWAT)
                   return (kn->kn_data >= kn->kn_sdata);
           return (kn->kn_data >= so->so_rcv.sb_lowat);
   }
   
   static void
   filt_sowdetach(struct knote *kn)
   {
           struct socket   *so;
   
           so = (struct socket *)kn->kn_fp->f_data;
           SLIST_REMOVE(&so->so_snd.sb_sel.si_klist, kn, knote, kn_selnext);
           if (SLIST_EMPTY(&so->so_snd.sb_sel.si_klist))
                   so->so_snd.sb_flags &= ~SB_KNOTE;
   }
   
   /*ARGSUSED*/
   static int
   filt_sowrite(struct knote *kn, long hint)
   {
           struct socket   *so;
   
           so = (struct socket *)kn->kn_fp->f_data;
           kn->kn_data = sbspace(&so->so_snd);
           if (so->so_state & SS_CANTSENDMORE) {
                   kn->kn_flags |= EV_EOF;
                   kn->kn_fflags = so->so_error;
                   return (1);
           }
           if (so->so_error)       /* temporary udp error */
                   return (1);
           if (((so->so_state & SS_ISCONNECTED) == 0) &&
               (so->so_proto->pr_flags & PR_CONNREQUIRED))
                   return (0);
           if (kn->kn_sfflags & NOTE_LOWAT)
                   return (kn->kn_data >= kn->kn_sdata);
           return (kn->kn_data >= so->so_snd.sb_lowat);
   }
   
   /*ARGSUSED*/
   static int
   filt_solisten(struct knote *kn, long hint)
   {
           struct socket   *so;
   
           so = (struct socket *)kn->kn_fp->f_data;
   
           /*
            * Set kn_data to number of incoming connections, not
            * counting partial (incomplete) connections.
            */
           kn->kn_data = so->so_qlen;
           return (kn->kn_data > 0);
   }

Legend:
Removed from v.1.54.2.5  
changed lines
  Added in v.1.56.2.5

CVSweb <webmaster@jp.NetBSD.org>