summaryrefslogtreecommitdiff
path: root/src/lib/libc/net/ethers.c
diff options
context:
space:
mode:
authorderaadt <>1995-10-18 08:42:23 +0000
committerderaadt <>1995-10-18 08:42:23 +0000
commit0527d29da443886d92e9a418180c5b25a5f8d270 (patch)
tree86b3a64928451a669cefa27900e5884036b4e349 /src/lib/libc/net/ethers.c
downloadopenbsd-0527d29da443886d92e9a418180c5b25a5f8d270.tar.gz
openbsd-0527d29da443886d92e9a418180c5b25a5f8d270.tar.bz2
openbsd-0527d29da443886d92e9a418180c5b25a5f8d270.zip
initial import of NetBSD tree
Diffstat (limited to 'src/lib/libc/net/ethers.c')
-rw-r--r--src/lib/libc/net/ethers.c178
1 files changed, 178 insertions, 0 deletions
diff --git a/src/lib/libc/net/ethers.c b/src/lib/libc/net/ethers.c
new file mode 100644
index 0000000000..0f32b9b71b
--- /dev/null
+++ b/src/lib/libc/net/ethers.c
@@ -0,0 +1,178 @@
1/* $NetBSD: ethers.c,v 1.5 1995/02/25 06:20:28 cgd Exp $ */
2
3/*
4 * ethers(3N) a la Sun.
5 *
6 * Written by Roland McGrath <roland@frob.com> 10/14/93.
7 * Public domain.
8 */
9
10#include <sys/types.h>
11#include <sys/socket.h>
12#include <net/if.h>
13#include <netinet/in.h>
14#include <netinet/if_ether.h>
15#include <sys/param.h>
16#include <paths.h>
17#include <errno.h>
18#include <stdio.h>
19#include <stdlib.h>
20#include <string.h>
21
22#ifndef _PATH_ETHERS
23#define _PATH_ETHERS "/etc/ethers"
24#endif
25
26char *
27ether_ntoa(e)
28 struct ether_addr *e;
29{
30 static char a[] = "xx:xx:xx:xx:xx:xx";
31
32 sprintf(a, "%02x:%02x:%02x:%02x:%02x:%02x",
33 e->ether_addr_octet[0], e->ether_addr_octet[1],
34 e->ether_addr_octet[2], e->ether_addr_octet[3],
35 e->ether_addr_octet[4], e->ether_addr_octet[5]);
36 return a;
37}
38
39struct ether_addr *
40ether_aton(s)
41 char *s;
42{
43 static struct ether_addr n;
44 u_int i[6];
45
46 if (sscanf(s, " %x:%x:%x:%x:%x:%x ", &i[0], &i[1],
47 &i[2], &i[3], &i[4], &i[5]) == 6) {
48 n.ether_addr_octet[0] = (u_char)i[0];
49 n.ether_addr_octet[1] = (u_char)i[1];
50 n.ether_addr_octet[2] = (u_char)i[2];
51 n.ether_addr_octet[3] = (u_char)i[3];
52 n.ether_addr_octet[4] = (u_char)i[4];
53 n.ether_addr_octet[5] = (u_char)i[5];
54 return &n;
55 }
56 return NULL;
57}
58
59ether_ntohost(hostname, e)
60 char *hostname;
61 struct ether_addr *e;
62{
63 FILE *f;
64 char buf[BUFSIZ];
65 struct ether_addr try;
66
67#ifdef YP
68 char trybuf[sizeof "xx:xx:xx:xx:xx:xx"];
69 int trylen;
70
71 sprintf(trybuf, "%x:%x:%x:%x:%x:%x",
72 e->ether_addr_octet[0], e->ether_addr_octet[1],
73 e->ether_addr_octet[2], e->ether_addr_octet[3],
74 e->ether_addr_octet[4], e->ether_addr_octet[5]);
75 trylen = strlen(trybuf);
76#endif
77
78 f = fopen(_PATH_ETHERS, "r");
79 if (f==NULL)
80 return -1;
81 while (fgets(buf, sizeof buf, f)) {
82#ifdef YP
83 /* A + in the file means try YP now. */
84 if (!strncmp(buf, "+\n", sizeof buf)) {
85 char *ypbuf, *ypdom;
86 int ypbuflen;
87
88 if (yp_get_default_domain(&ypdom))
89 continue;
90 if (yp_match(ypdom, "ethers.byaddr", trybuf,
91 trylen, &ypbuf, &ypbuflen))
92 continue;
93 if (ether_line(ypbuf, &try, hostname) == 0) {
94 free(ypbuf);
95 (void)fclose(f);
96 return 0;
97 }
98 free(ypbuf);
99 continue;
100 }
101#endif
102 if (ether_line(buf, &try, hostname) == 0 &&
103 bcmp((char *)&try, (char *)e, sizeof try) == 0) {
104 (void)fclose(f);
105 return 0;
106 }
107 }
108 (void)fclose(f);
109 errno = ENOENT;
110 return -1;
111}
112
113ether_hostton(hostname, e)
114 char *hostname;
115 struct ether_addr *e;
116{
117 FILE *f;
118 char buf[BUFSIZ];
119 char try[MAXHOSTNAMELEN];
120#ifdef YP
121 int hostlen = strlen(hostname);
122#endif
123
124 f = fopen(_PATH_ETHERS, "r");
125 if (f==NULL)
126 return -1;
127
128 while (fgets(buf, sizeof buf, f)) {
129#ifdef YP
130 /* A + in the file means try YP now. */
131 if (!strncmp(buf, "+\n", sizeof buf)) {
132 char *ypbuf, *ypdom;
133 int ypbuflen;
134
135 if (yp_get_default_domain(&ypdom))
136 continue;
137 if (yp_match(ypdom, "ethers.byname", hostname, hostlen,
138 &ypbuf, &ypbuflen))
139 continue;
140 if (ether_line(ypbuf, e, try) == 0) {
141 free(ypbuf);
142 (void)fclose(f);
143 return 0;
144 }
145 free(ypbuf);
146 continue;
147 }
148#endif
149 if (ether_line(buf, e, try) == 0 && strcmp(hostname, try) == 0) {
150 (void)fclose(f);
151 return 0;
152 }
153 }
154 (void)fclose(f);
155 errno = ENOENT;
156 return -1;
157}
158
159ether_line(l, e, hostname)
160 char *l;
161 struct ether_addr *e;
162 char *hostname;
163{
164 u_int i[6];
165
166 if (sscanf(l, " %x:%x:%x:%x:%x:%x %s\n", &i[0], &i[1],
167 &i[2], &i[3], &i[4], &i[5], hostname) == 7) {
168 e->ether_addr_octet[0] = (u_char)i[0];
169 e->ether_addr_octet[1] = (u_char)i[1];
170 e->ether_addr_octet[2] = (u_char)i[2];
171 e->ether_addr_octet[3] = (u_char)i[3];
172 e->ether_addr_octet[4] = (u_char)i[4];
173 e->ether_addr_octet[5] = (u_char)i[5];
174 return 0;
175 }
176 errno = EINVAL;
177 return -1;
178}