+sobind(so, nam, opt)
+ struct socket *so;
+ struct mbuf *nam;
+ struct socketopt *opt;
+{
+ int s = splnet();
+ int error;
+
+ error =
+ (*so->so_proto->pr_usrreq)(so, PRU_BIND,
+ (struct mbuf *)0, nam, opt);
+ splx(s);
+ return (error);
+}
+
+solisten(so, backlog)
+ struct socket *so;
+ int backlog;
+{
+ int s = splnet();
+ int error;
+
+ error = (*so->so_proto->pr_usrreq)(so, PRU_LISTEN,
+ (struct mbuf *)0, (struct mbuf *)0, (struct socketopt *)0);
+ if (error) {
+ splx(s);
+ return (error);
+ }
+ if (so->so_q == 0) {
+ so->so_q = so;
+ so->so_q0 = so;
+ so->so_options |= SO_ACCEPTCONN;
+ }
+ if (backlog < 0)
+ backlog = 0;
+ so->so_qlimit = backlog < 5 ? backlog : 5;
+ so->so_options |= SO_NEWFDONCONN;
+ return (0);
+}
+
+sofree(so)
+ struct socket *so;
+{
+
+ if (so->so_head) {
+ if (!soqremque(so, 0) && !soqremque(so, 1))
+ panic("sofree dq");
+ so->so_head = 0;
+ }
+ if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0)
+ return;
+ sbrelease(&so->so_snd);
+ sbrelease(&so->so_rcv);
+ (void) m_free(dtom(so));
+}
+