aboutsummaryrefslogtreecommitdiffstats
path: root/usr.sbin/rarpd/ether_addr.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/rarpd/ether_addr.c')
-rw-r--r--usr.sbin/rarpd/ether_addr.c108
1 files changed, 108 insertions, 0 deletions
diff --git a/usr.sbin/rarpd/ether_addr.c b/usr.sbin/rarpd/ether_addr.c
new file mode 100644
index 000000000000..197c15715562
--- /dev/null
+++ b/usr.sbin/rarpd/ether_addr.c
@@ -0,0 +1,108 @@
+/*
+ * rarpd support routines
+ *
+ * Written by Bill Paul <wpaul@ctr.columbia.edu>
+ * Center for Telecommunications Research
+ * Columbia University, New York City
+ *
+ * This code is public domain. There is no copyright. There are no
+ * distribution or usage restrictions. There are no strings attached.
+ *
+ * Have a party.
+ *
+ * $Id$
+ */
+
+
+#include <stdio.h>
+
+#ifndef _PATH_ETHERS
+#define _PATH_ETHERS "/etc/ethers"
+#endif
+
+/*
+ * This should be defined in <netinet/if_ether.h> but it isn't.
+ */
+struct ether_addr {
+ unsigned char octet[6];
+};
+
+/*
+ * Parse a string of text containing an ethernet address and hostname
+ * and separate it into its component parts.
+ */
+int ether_line(l, e, hostname)
+ char *l;
+ struct ether_addr *e;
+ char *hostname;
+{
+ int i, o[6];
+
+ i = sscanf(l, "%x:%x:%x:%x:%x:%x %s", &o[0], &o[1], &o[2],
+ &o[3], &o[4], &o[5],
+ hostname);
+ if (i != 7)
+ return (-1);
+
+ for (i=0; i<6; i++)
+ e->octet[i] = o[i];
+ return (0);
+}
+
+/*
+ * Map an ethernet address to a hostname. Use either /etc/ethers or
+ * NIS/YP.
+ */
+
+int ether_ntohost(hostname, e)
+ char *hostname;
+ struct ether_addr *e;
+{
+ FILE *fp;
+ static char buf[BUFSIZ];
+ static struct ether_addr local_ether;
+ static char *local_host;
+ static char *result;
+ int resultlen, i;
+ extern int yp_get_default_domain();
+ extern int yp_match();
+ static char *yp_domain;
+ static char ether_a[BUFSIZ];
+
+ if ((fp = fopen(_PATH_ETHERS, "r")) == NULL) {
+ perror(_PATH_ETHERS);
+ return (-1);
+ }
+
+ while (fgets(buf,BUFSIZ,fp)) {
+ if (buf[0] == '+') {
+ if (yp_get_default_domain(&yp_domain))
+ return(-1);
+ sprintf(ether_a,"%x:%x:%x:%x:%x:%x",
+ e->octet[0], e->octet[1],
+ e->octet[2], e->octet[3],
+ e->octet[4], e->octet[5]);
+ if (yp_match(yp_domain, "ethers.byaddr", ether_a,
+ strlen(ether_a),&result, &resultlen))
+ return(-1);
+ if (ether_line(result, &local_ether,
+ &local_host) == 0) {
+ strcpy(hostname, (char *)&local_host);
+ return(0);
+ } else
+ return(-1);
+ }
+ if (ether_line(&buf, &local_ether, &local_host) == 0) {
+ for (i = 0; i < 6; i++)
+ if (local_ether.octet[i] != e->octet[i])
+ goto nomatch;
+ /* We have a match */
+ strcpy(hostname, (char *)&local_host);
+ fclose(fp);
+ return(0);
+ }
+nomatch:
+ }
+
+return (-1);
+}