+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);
+/* BEGIN DUBIOUS */
+ /*
+ * Should we verify address not already in use?
+ * Some say yes, others no.
+ */
+ switch (addr->sa_family) {
+
+#ifdef INET
+ case AF_IMPLINK:
+ case AF_INET: {
+ if (((struct sockaddr_in *)addr)->sin_addr.s_addr &&
+ if_ifwithaddr(addr) == 0)
+ return (EADDRNOTAVAIL);
+ break;
+ }
+#endif
+
+#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: {
+ 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 = if_makeaddr(spup->spup_net, spup->spup_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);
+}
+