+raw_bind(so, nam)
+ register struct socket *so;
+ struct mbuf *nam;
+{
+ struct sockaddr *addr = mtod(nam, struct sockaddr *);
+ register struct rawcb *rp;
+
+ if (ifnet == 0)
+ return (EADDRNOTAVAIL);
+{
+#include "../h/domain.h"
+#include "../netinet/in.h"
+#include "../netinet/in_systm.h"
+/* BEGIN DUBIOUS */
+ /*
+ * Should we verify address not already in use?
+ * Some say yes, others no.
+ */
+ switch (addr->sa_family) {
+
+ case AF_IMPLINK:
+ case AF_INET:
+ if (((struct sockaddr_in *)addr)->sin_addr.s_addr &&
+ if_ifwithaddr(addr) == 0)
+ return (EADDRNOTAVAIL);
+ break;
+
+#ifdef PUP
+ /*
+ * Curious, we convert PUP address format to internet
+ * to allow us to verify we're asking for an Ethernet
+ * interface. This is wrong, but things are heavily
+ * oriented towards the internet addressing scheme, and
+ * converting internet to PUP would be very expensive.
+ */
+ case AF_PUP: {
+#include "../netpup/pup.h"
+ struct sockaddr_pup *spup = (struct sockaddr_pup *)addr;
+ struct sockaddr_in inpup;
+
+ bzero((caddr_t)&inpup, (unsigned)sizeof(inpup));
+ inpup.sin_family = AF_INET;
+ inpup.sin_addr.s_net = spup->sp_net;
+ inpup.sin_addr.s_impno = spup->sp_host;
+ if (inpup.sin_addr.s_addr &&
+ if_ifwithaddr((struct sockaddr *)&inpup) == 0)
+ return (EADDRNOTAVAIL);
+ break;
+ }
+#endif
+
+ default:
+ return (EAFNOSUPPORT);
+ }
+}
+/* END DUBIOUS */
+ rp = sotorawcb(so);
+ bcopy((caddr_t)addr, (caddr_t)&rp->rcb_laddr, sizeof (*addr));
+ rp->rcb_flags |= RAW_LADDR;
+ return (0);
+}
+