[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.176 and 1.177

version 1.176, 2008/10/12 09:26:50 version 1.177, 2008/10/14 13:45:26
Line 65 
Line 65 
 #include <sys/cdefs.h>  #include <sys/cdefs.h>
 __KERNEL_RCSID(0, "$NetBSD$");  __KERNEL_RCSID(0, "$NetBSD$");
   
 #include "opt_inet.h"  
 #include "opt_sock_counters.h"  #include "opt_sock_counters.h"
 #include "opt_sosend_loan.h"  #include "opt_sosend_loan.h"
 #include "opt_mbuftrace.h"  #include "opt_mbuftrace.h"
Line 615  sofree(struct socket *so)
Line 614  sofree(struct socket *so)
         KASSERT(!cv_has_waiters(&so->so_snd.sb_cv));          KASSERT(!cv_has_waiters(&so->so_snd.sb_cv));
         sorflush(so);          sorflush(so);
         refs = so->so_aborting; /* XXX */          refs = so->so_aborting; /* XXX */
         /* remove acccept filter if one is present. */          /* Remove acccept filter if one is present. */
         if (so->so_accf != NULL)          if (so->so_accf != NULL)
                 do_setopt_accept_filter(so, NULL);                  (void)accept_filt_clear(so);
         sounlock(so);          sounlock(so);
         if (refs == 0)          /* XXX */          if (refs == 0)          /* XXX */
                 soput(so);                  soput(so);
Line 1579  sosetopt1(struct socket *so, const struc
Line 1578  sosetopt1(struct socket *so, const struc
         switch (sopt->sopt_name) {          switch (sopt->sopt_name) {
   
         case SO_ACCEPTFILTER:          case SO_ACCEPTFILTER:
                 error = do_setopt_accept_filter(so, sopt);                  error = accept_filt_setopt(so, sopt);
                 if (error)                  KASSERT(solocked(so));
                         return error;  
                 break;                  break;
   
         case SO_LINGER:          case SO_LINGER:
                 error = sockopt_get(sopt, &l, sizeof(l));                  error = sockopt_get(sopt, &l, sizeof(l));
                   solock(so);
                 if (error)                  if (error)
                         return (error);                          break;
   
                 if (l.l_linger < 0 || l.l_linger > USHRT_MAX ||                  if (l.l_linger < 0 || l.l_linger > USHRT_MAX ||
                     l.l_linger > (INT_MAX / hz))                      l.l_linger > (INT_MAX / hz)) {
                         return EDOM;                          error = EDOM;
                           break;
                   }
                 so->so_linger = l.l_linger;                  so->so_linger = l.l_linger;
                 if (l.l_onoff)                  if (l.l_onoff)
                         so->so_options |= SO_LINGER;                          so->so_options |= SO_LINGER;
                 else                  else
                         so->so_options &= ~SO_LINGER;                          so->so_options &= ~SO_LINGER;
                   break;
                 break;  
   
         case SO_DEBUG:          case SO_DEBUG:
         case SO_KEEPALIVE:          case SO_KEEPALIVE:
Line 1610  sosetopt1(struct socket *so, const struc
Line 1609  sosetopt1(struct socket *so, const struc
         case SO_OOBINLINE:          case SO_OOBINLINE:
         case SO_TIMESTAMP:          case SO_TIMESTAMP:
                 error = sockopt_getint(sopt, &optval);                  error = sockopt_getint(sopt, &optval);
                   solock(so);
                 if (error)                  if (error)
                         return (error);                          break;
   
                 if (optval)                  if (optval)
                         so->so_options |= sopt->sopt_name;                          so->so_options |= sopt->sopt_name;
                 else                  else
Line 1624  sosetopt1(struct socket *so, const struc
Line 1623  sosetopt1(struct socket *so, const struc
         case SO_SNDLOWAT:          case SO_SNDLOWAT:
         case SO_RCVLOWAT:          case SO_RCVLOWAT:
                 error = sockopt_getint(sopt, &optval);                  error = sockopt_getint(sopt, &optval);
                   solock(so);
                 if (error)                  if (error)
                         return (error);                          break;
   
                 /*                  /*
                  * Values < 1 make no sense for any of these                   * Values < 1 make no sense for any of these
                  * options, so disallow them.                   * options, so disallow them.
                  */                   */
                 if (optval < 1)                  if (optval < 1) {
                         return EINVAL;                          error = EINVAL;
                           break;
                   }
   
                 switch (sopt->sopt_name) {                  switch (sopt->sopt_name) {
                 case SO_SNDBUF:                  case SO_SNDBUF:
                         if (sbreserve(&so->so_snd, (u_long)optval, so) == 0)                          if (sbreserve(&so->so_snd, (u_long)optval, so) == 0) {
                                 return ENOBUFS;                                  error = ENOBUFS;
                                   break;
                           }
                         so->so_snd.sb_flags &= ~SB_AUTOSIZE;                          so->so_snd.sb_flags &= ~SB_AUTOSIZE;
                         break;                          break;
   
                 case SO_RCVBUF:                  case SO_RCVBUF:
                         if (sbreserve(&so->so_rcv, (u_long)optval, so) == 0)                          if (sbreserve(&so->so_rcv, (u_long)optval, so) == 0) {
                                 return ENOBUFS;                                  error = ENOBUFS;
                                   break;
                           }
                         so->so_rcv.sb_flags &= ~SB_AUTOSIZE;                          so->so_rcv.sb_flags &= ~SB_AUTOSIZE;
                         break;                          break;
   
Line 1672  sosetopt1(struct socket *so, const struc
Line 1676  sosetopt1(struct socket *so, const struc
         case SO_SNDTIMEO:          case SO_SNDTIMEO:
         case SO_RCVTIMEO:          case SO_RCVTIMEO:
                 error = sockopt_get(sopt, &tv, sizeof(tv));                  error = sockopt_get(sopt, &tv, sizeof(tv));
                   solock(so);
                 if (error)                  if (error)
                         return (error);                          break;
   
                 if (tv.tv_sec > (INT_MAX - tv.tv_usec / tick) / hz)                  if (tv.tv_sec > (INT_MAX - tv.tv_usec / tick) / hz) {
                         return EDOM;                          error = EDOM;
                           break;
                   }
   
                 optval = tv.tv_sec * hz + tv.tv_usec / tick;                  optval = tv.tv_sec * hz + tv.tv_usec / tick;
                 if (optval == 0 && tv.tv_usec != 0)                  if (optval == 0 && tv.tv_usec != 0)
Line 1693  sosetopt1(struct socket *so, const struc
Line 1700  sosetopt1(struct socket *so, const struc
                 break;                  break;
   
         default:          default:
                 return ENOPROTOOPT;                  solock(so);
                   error = ENOPROTOOPT;
                   break;
         }          }
         return 0;          KASSERT(solocked(so));
           return error;
 }  }
   
 int  int
Line 1703  sosetopt(struct socket *so, struct socko
Line 1713  sosetopt(struct socket *so, struct socko
 {  {
         int error, prerr;          int error, prerr;
   
         solock(so);          if (sopt->sopt_level == SOL_SOCKET) {
         if (sopt->sopt_level == SOL_SOCKET)  
                 error = sosetopt1(so, sopt);                  error = sosetopt1(so, sopt);
         else                  KASSERT(solocked(so));
           } else {
                 error = ENOPROTOOPT;                  error = ENOPROTOOPT;
                   solock(so);
           }
   
         if ((error == 0 || error == ENOPROTOOPT) &&          if ((error == 0 || error == ENOPROTOOPT) &&
             so->so_proto != NULL && so->so_proto->pr_ctloutput != NULL) {              so->so_proto != NULL && so->so_proto->pr_ctloutput != NULL) {
Line 1757  sogetopt1(struct socket *so, struct sock
Line 1769  sogetopt1(struct socket *so, struct sock
         switch (sopt->sopt_name) {          switch (sopt->sopt_name) {
   
         case SO_ACCEPTFILTER:          case SO_ACCEPTFILTER:
                 error = do_getopt_accept_filter(so, sopt);                  error = accept_filt_getopt(so, sopt);
                 break;                  break;
   
         case SO_LINGER:          case SO_LINGER:

Legend:
Removed from v.1.176  
changed lines
  Added in v.1.177

CVSweb <webmaster@jp.NetBSD.org>