+ if (unp->unp_conn)
+ unp_disconnect(unp);
+ while (unp->unp_refs)
+ unp_drop(unp->unp_refs, ECONNRESET);
+ soisdisconnected(unp->unp_socket);
+ unp->unp_socket->so_pcb = 0;
+ m_freem(unp->unp_remaddr);
+ (void) m_free(dtom(unp));
+}
+
+unp_bind(unp, nam)
+ struct unpcb *unp;
+ struct mbuf *nam;
+{
+ struct sockaddr_un *soun = mtod(nam, struct sockaddr_un *);
+ register struct inode *ip;
+ register struct nameidata *ndp = &u.u_nd;
+ int error;
+
+ ndp->ni_dirp = soun->sun_path;
+ if (nam->m_len == MLEN)
+ return (EINVAL);
+ *(mtod(nam, caddr_t) + nam->m_len) = 0;
+/* SHOULD BE ABLE TO ADOPT EXISTING AND wakeup() ALA FIFO's */
+ ndp->ni_nameiop = CREATE | FOLLOW;
+ ndp->ni_segflg = UIO_SYSSPACE;
+ ip = namei(ndp);
+ if (ip) {
+ iput(ip);
+ return (EADDRINUSE);
+ }
+ if (error = u.u_error) {
+ u.u_error = 0; /* XXX */
+ return (error);
+ }
+ ip = maknode(IFSOCK | 0777, ndp);
+ if (ip == NULL) {
+ error = u.u_error; /* XXX */
+ u.u_error = 0; /* XXX */
+ return (error);
+ }
+ ip->i_socket = unp->unp_socket;
+ unp->unp_inode = ip;
+ iunlock(ip); /* but keep reference */