[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.223 and 1.232

version 1.223, 2014/05/18 14:46:15 version 1.232, 2014/08/05 07:55:31
Line 490  soinit1(void)
Line 490  soinit1(void)
  *   *
  * => Caller may specify another socket for lock sharing (must not be held).   * => Caller may specify another socket for lock sharing (must not be held).
  * => Returns the new socket without lock held.   * => Returns the new socket without lock held.
 */   */
 int  int
 socreate(int dom, struct socket **aso, int type, int proto, struct lwp *l,  socreate(int dom, struct socket **aso, int type, int proto, struct lwp *l,
          struct socket *lockso)           struct socket *lockso)
Line 538  socreate(int dom, struct socket **aso, i
Line 538  socreate(int dom, struct socket **aso, i
         uid = kauth_cred_geteuid(l->l_cred);          uid = kauth_cred_geteuid(l->l_cred);
         so->so_uidinfo = uid_find(uid);          so->so_uidinfo = uid_find(uid);
         so->so_cpid = l->l_proc->p_pid;          so->so_cpid = l->l_proc->p_pid;
         if (lockso != NULL) {  
                 /* Caller wants us to share a lock. */          /*
            * Lock assigned and taken during PCB attach, unless we share
            * the lock with another socket, e.g. socketpair(2) case.
            */
           if (lockso) {
                 lock = lockso->so_lock;                  lock = lockso->so_lock;
                 so->so_lock = lock;                  so->so_lock = lock;
                 mutex_obj_hold(lock);                  mutex_obj_hold(lock);
                 /* XXX Why is this not solock, to match sounlock? */  
                 mutex_enter(lock);                  mutex_enter(lock);
         } else {  
                 /* Lock assigned and taken during PRU_ATTACH. */  
         }          }
         error = (*prp->pr_usrreqs->pr_generic)(so, PRU_ATTACH, NULL,  
             (struct mbuf *)(long)proto, NULL, l);          /* Attach the PCB (returns with the socket lock held). */
           error = (*prp->pr_usrreqs->pr_attach)(so, proto);
         KASSERT(solocked(so));          KASSERT(solocked(so));
         if (error != 0) {  
           if (error) {
                 KASSERT(so->so_pcb == NULL);                  KASSERT(so->so_pcb == NULL);
                 so->so_state |= SS_NOFDREF;                  so->so_state |= SS_NOFDREF;
                 sofree(so);                  sofree(so);
Line 559  socreate(int dom, struct socket **aso, i
Line 562  socreate(int dom, struct socket **aso, i
         }          }
         so->so_cred = kauth_cred_dup(l->l_cred);          so->so_cred = kauth_cred_dup(l->l_cred);
         sounlock(so);          sounlock(so);
   
         *aso = so;          *aso = so;
         return 0;          return 0;
 }  }
Line 625  sobind(struct socket *so, struct mbuf *n
Line 629  sobind(struct socket *so, struct mbuf *n
         int     error;          int     error;
   
         solock(so);          solock(so);
         error = (*so->so_proto->pr_usrreqs->pr_generic)(so,          error = (*so->so_proto->pr_usrreqs->pr_bind)(so, nam, l);
             PRU_BIND, NULL, nam, NULL, l);  
         sounlock(so);          sounlock(so);
         return error;          return error;
 }  }
Line 642  solisten(struct socket *so, int backlog,
Line 645  solisten(struct socket *so, int backlog,
                 sounlock(so);                  sounlock(so);
                 return EINVAL;                  return EINVAL;
         }          }
         error = (*so->so_proto->pr_usrreqs->pr_generic)(so,          error = (*so->so_proto->pr_usrreqs->pr_listen)(so, l);
             PRU_LISTEN, NULL, NULL, NULL, l);  
         if (error != 0) {          if (error != 0) {
                 sounlock(so);                  sounlock(so);
                 return error;                  return error;
Line 752  soclose(struct socket *so)
Line 754  soclose(struct socket *so)
         }          }
  drop:   drop:
         if (so->so_pcb) {          if (so->so_pcb) {
                 int error2 = (*so->so_proto->pr_usrreqs->pr_generic)(so,                  KASSERT(solocked(so));
                     PRU_DETACH, NULL, NULL, NULL, NULL);                  (*so->so_proto->pr_usrreqs->pr_detach)(so);
                 if (error == 0)  
                         error = error2;  
         }          }
  discard:   discard:
         KASSERT((so->so_state & SS_NOFDREF) == 0);          KASSERT((so->so_state & SS_NOFDREF) == 0);
Line 778  soabort(struct socket *so)
Line 778  soabort(struct socket *so)
         KASSERT(so->so_head == NULL);          KASSERT(so->so_head == NULL);
   
         so->so_aborting++;              /* XXX */          so->so_aborting++;              /* XXX */
         error = (*so->so_proto->pr_usrreqs->pr_generic)(so,          error = (*so->so_proto->pr_usrreqs->pr_abort)(so);
             PRU_ABORT, NULL, NULL, NULL, NULL);  
         refs = --so->so_aborting;       /* XXX */          refs = --so->so_aborting;       /* XXX */
         if (error || (refs == 0)) {          if (error || (refs == 0)) {
                 sofree(so);                  sofree(so);
Line 800  soaccept(struct socket *so, struct mbuf 
Line 799  soaccept(struct socket *so, struct mbuf 
         so->so_state &= ~SS_NOFDREF;          so->so_state &= ~SS_NOFDREF;
         if ((so->so_state & SS_ISDISCONNECTED) == 0 ||          if ((so->so_state & SS_ISDISCONNECTED) == 0 ||
             (so->so_proto->pr_flags & PR_ABRTACPTDIS) == 0)              (so->so_proto->pr_flags & PR_ABRTACPTDIS) == 0)
                 error = (*so->so_proto->pr_usrreqs->pr_generic)(so,                  error = (*so->so_proto->pr_usrreqs->pr_accept)(so, nam);
                     PRU_ACCEPT, NULL, nam, NULL, NULL);  
         else          else
                 error = ECONNABORTED;                  error = ECONNABORTED;
   
Line 828  soconnect(struct socket *so, struct mbuf
Line 826  soconnect(struct socket *so, struct mbuf
             (error = sodisconnect(so))))              (error = sodisconnect(so))))
                 error = EISCONN;                  error = EISCONN;
         else          else
                 error = (*so->so_proto->pr_usrreqs->pr_generic)(so,                  error = (*so->so_proto->pr_usrreqs->pr_connect)(so, nam, l);
                     PRU_CONNECT, NULL, nam, NULL, l);  
   
         return error;          return error;
 }  }
Line 855  sodisconnect(struct socket *so)
Line 852  sodisconnect(struct socket *so)
         } else if (so->so_state & SS_ISDISCONNECTING) {          } else if (so->so_state & SS_ISDISCONNECTING) {
                 error = EALREADY;                  error = EALREADY;
         } else {          } else {
                 error = (*so->so_proto->pr_usrreqs->pr_generic)(so,                  error = (*so->so_proto->pr_usrreqs->pr_disconnect)(so);
                     PRU_DISCONNECT, NULL, NULL, NULL, NULL);  
         }          }
         return (error);          return (error);
 }  }
Line 1052  sosend(struct socket *so, struct mbuf *a
Line 1048  sosend(struct socket *so, struct mbuf *a
                                 so->so_options |= SO_DONTROUTE;                                  so->so_options |= SO_DONTROUTE;
                         if (resid > 0)                          if (resid > 0)
                                 so->so_state |= SS_MORETOCOME;                                  so->so_state |= SS_MORETOCOME;
                         error = (*so->so_proto->pr_usrreqs->pr_generic)(so,                          if (flags & MSG_OOB)
                             (flags & MSG_OOB) ? PRU_SENDOOB : PRU_SEND,                                  error = (*so->so_proto->pr_usrreqs->pr_sendoob)(so,
                             top, addr, control, curlwp);                                      top, control);
                           else
                                   error = (*so->so_proto->pr_usrreqs->pr_send)(so,
                                       top, addr, control, l);
                         if (dontroute)                          if (dontroute)
                                 so->so_options &= ~SO_DONTROUTE;                                  so->so_options &= ~SO_DONTROUTE;
                         if (resid > 0)                          if (resid > 0)
Line 1166  soreceive(struct socket *so, struct mbuf
Line 1165  soreceive(struct socket *so, struct mbuf
         if (flags & MSG_OOB) {          if (flags & MSG_OOB) {
                 m = m_get(M_WAIT, MT_DATA);                  m = m_get(M_WAIT, MT_DATA);
                 solock(so);                  solock(so);
                 error = (*pr->pr_usrreqs->pr_generic)(so, PRU_RCVOOB, m,                  error = (*pr->pr_usrreqs->pr_recvoob)(so, m, flags & MSG_PEEK);
                     (struct mbuf *)(long)(flags & MSG_PEEK), NULL, l);  
                 sounlock(so);                  sounlock(so);
                 if (error)                  if (error)
                         goto bad;                          goto bad;
Line 1611  soshutdown(struct socket *so, int how)
Line 1609  soshutdown(struct socket *so, int how)
                 error = 0;                  error = 0;
         }          }
         if (how == SHUT_WR || how == SHUT_RDWR)          if (how == SHUT_WR || how == SHUT_RDWR)
                 error = (*pr->pr_usrreqs->pr_generic)(so,                  error = (*pr->pr_usrreqs->pr_shutdown)(so);
                     PRU_SHUTDOWN, NULL, NULL, NULL, NULL);  
   
         return error;          return error;
 }  }

Legend:
Removed from v.1.223  
changed lines
  Added in v.1.232

CVSweb <webmaster@jp.NetBSD.org>