[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.111.2.14 and 1.111.2.15

version 1.111.2.14, 2008/03/17 09:15:34 version 1.111.2.15, 2008/03/24 09:39:02
Line 1 
Line 1 
 /*      $NetBSD$        */  /*      $NetBSD$        */
   
 /*-  /*-
  * Copyright (c) 2002, 2007 The NetBSD Foundation, Inc.   * Copyright (c) 2002, 2007, 2008 The NetBSD Foundation, Inc.
  * All rights reserved.   * All rights reserved.
  *   *
  * This code is derived from software contributed to The NetBSD Foundation   * This code is derived from software contributed to The NetBSD Foundation
Line 526  int
Line 526  int
 fsocreate(int domain, struct socket **sop, int type, int protocol,  fsocreate(int domain, struct socket **sop, int type, int protocol,
     struct lwp *l, int *fdout)      struct lwp *l, int *fdout)
 {  {
         struct filedesc *fdp;  
         struct socket   *so;          struct socket   *so;
         struct file     *fp;          struct file     *fp;
         int             fd, error;          int             fd, error;
   
         fdp = l->l_proc->p_fd;          if ((error = fd_allocfile(&fp, &fd)) != 0)
         /* falloc() will use the desciptor for us */  
         if ((error = falloc(l, &fp, &fd)) != 0)  
                 return (error);                  return (error);
         fp->f_flag = FREAD|FWRITE;          fp->f_flag = FREAD|FWRITE;
         fp->f_type = DTYPE_SOCKET;          fp->f_type = DTYPE_SOCKET;
         fp->f_ops = &socketops;          fp->f_ops = &socketops;
         error = socreate(domain, &so, type, protocol, l);          error = socreate(domain, &so, type, protocol, l);
         if (error != 0) {          if (error != 0) {
                 FILE_UNUSE(fp, l);                  fd_abort(curproc, fp, fd);
                 fdremove(fdp, fd);  
                 ffree(fp);  
         } else {          } else {
                 if (sop != NULL)                  if (sop != NULL)
                         *sop = so;                          *sop = so;
                 fp->f_data = so;                  fp->f_data = so;
                 FILE_SET_MATURE(fp);                  fd_affix(curproc, fp, fd);
                 FILE_UNUSE(fp, l);  
                 *fdout = fd;                  *fdout = fd;
         }          }
         return error;          return error;
Line 1678  filt_sordetach(struct knote *kn)
Line 1672  filt_sordetach(struct knote *kn)
 {  {
         struct socket   *so;          struct socket   *so;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = ((file_t *)kn->kn_obj)->f_data;
         SLIST_REMOVE(&so->so_rcv.sb_sel.sel_klist, kn, knote, kn_selnext);          SLIST_REMOVE(&so->so_rcv.sb_sel.sel_klist, kn, knote, kn_selnext);
         if (SLIST_EMPTY(&so->so_rcv.sb_sel.sel_klist))          if (SLIST_EMPTY(&so->so_rcv.sb_sel.sel_klist))
                 so->so_rcv.sb_flags &= ~SB_KNOTE;                  so->so_rcv.sb_flags &= ~SB_KNOTE;
Line 1690  filt_soread(struct knote *kn, long hint)
Line 1684  filt_soread(struct knote *kn, long hint)
 {  {
         struct socket   *so;          struct socket   *so;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = ((file_t *)kn->kn_obj)->f_data;
         kn->kn_data = so->so_rcv.sb_cc;          kn->kn_data = so->so_rcv.sb_cc;
         if (so->so_state & SS_CANTRCVMORE) {          if (so->so_state & SS_CANTRCVMORE) {
                 kn->kn_flags |= EV_EOF;                  kn->kn_flags |= EV_EOF;
Line 1709  filt_sowdetach(struct knote *kn)
Line 1703  filt_sowdetach(struct knote *kn)
 {  {
         struct socket   *so;          struct socket   *so;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = ((file_t *)kn->kn_obj)->f_data;
         SLIST_REMOVE(&so->so_snd.sb_sel.sel_klist, kn, knote, kn_selnext);          SLIST_REMOVE(&so->so_snd.sb_sel.sel_klist, kn, knote, kn_selnext);
         if (SLIST_EMPTY(&so->so_snd.sb_sel.sel_klist))          if (SLIST_EMPTY(&so->so_snd.sb_sel.sel_klist))
                 so->so_snd.sb_flags &= ~SB_KNOTE;                  so->so_snd.sb_flags &= ~SB_KNOTE;
Line 1721  filt_sowrite(struct knote *kn, long hint
Line 1715  filt_sowrite(struct knote *kn, long hint
 {  {
         struct socket   *so;          struct socket   *so;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = ((file_t *)kn->kn_obj)->f_data;
         kn->kn_data = sbspace(&so->so_snd);          kn->kn_data = sbspace(&so->so_snd);
         if (so->so_state & SS_CANTSENDMORE) {          if (so->so_state & SS_CANTSENDMORE) {
                 kn->kn_flags |= EV_EOF;                  kn->kn_flags |= EV_EOF;
Line 1744  filt_solisten(struct knote *kn, long hin
Line 1738  filt_solisten(struct knote *kn, long hin
 {  {
         struct socket   *so;          struct socket   *so;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = ((file_t *)kn->kn_obj)->f_data;
   
         /*          /*
          * Set kn_data to number of incoming connections, not           * Set kn_data to number of incoming connections, not
Line 1767  soo_kqfilter(struct file *fp, struct kno
Line 1761  soo_kqfilter(struct file *fp, struct kno
         struct socket   *so;          struct socket   *so;
         struct sockbuf  *sb;          struct sockbuf  *sb;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = ((file_t *)kn->kn_obj)->f_data;
         switch (kn->kn_filter) {          switch (kn->kn_filter) {
         case EVFILT_READ:          case EVFILT_READ:
                 if (so->so_options & SO_ACCEPTCONN)                  if (so->so_options & SO_ACCEPTCONN)
Line 1788  soo_kqfilter(struct file *fp, struct kno
Line 1782  soo_kqfilter(struct file *fp, struct kno
         return (0);          return (0);
 }  }
   
   static int
   sodopoll(struct socket *so, int events)
   {
           int revents;
   
           revents = 0;
   
           if (events & (POLLIN | POLLRDNORM))
                   if (soreadable(so))
                           revents |= events & (POLLIN | POLLRDNORM);
   
           if (events & (POLLOUT | POLLWRNORM))
                   if (sowritable(so))
                           revents |= events & (POLLOUT | POLLWRNORM);
   
           if (events & (POLLPRI | POLLRDBAND))
                   if (so->so_oobmark || (so->so_state & SS_RCVATMARK))
                           revents |= events & (POLLPRI | POLLRDBAND);
   
           return revents;
   }
   
   int
   sopoll(struct socket *so, int events)
   {
           int revents = 0;
           int s;
   
           if ((revents = sodopoll(so, events)) != 0)
                   return revents;
   
           KERNEL_LOCK(1, curlwp);
           s = splsoftnet();
   
           if ((revents = sodopoll(so, events)) == 0) {
                   if (events & (POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND)) {
                           selrecord(curlwp, &so->so_rcv.sb_sel);
                           so->so_rcv.sb_flags |= SB_SEL;
                   }
   
                   if (events & (POLLOUT | POLLWRNORM)) {
                           selrecord(curlwp, &so->so_snd.sb_sel);
                           so->so_snd.sb_flags |= SB_SEL;
                   }
           }
   
           splx(s);
           KERNEL_UNLOCK_ONE(curlwp);
   
           return revents;
   }
   
   
 #include <sys/sysctl.h>  #include <sys/sysctl.h>
   
 static int sysctl_kern_somaxkva(SYSCTLFN_PROTO);  static int sysctl_kern_somaxkva(SYSCTLFN_PROTO);

Legend:
Removed from v.1.111.2.14  
changed lines
  Added in v.1.111.2.15

CVSweb <webmaster@jp.NetBSD.org>