NetBSD/lib/libc/net/ethers.c
jtc 43fa6fe319 If port provides __weak_alias(), provide an Standard C and POSIX pure
identifier namespace by renaming non standard functions and variables
such that they have a leading underscore.  The library will use those
names internally.  Weak aliases are used to provide the original names
to the API.

This is only the first part of this change.  It is most of the functions
which are implemented in C for all NetBSD ports.  Subsequent changes are
to add the same support to the remaining C files, to assembly files, and
to the automagically generated assembly source used for system calls.
When all of the above is done, ports with weak alias support should add
a definition for __weak_alias to <sys/cdefs.h>.
1997-07-21 14:06:24 +00:00

194 lines
4.0 KiB
C

/* $NetBSD: ethers.c,v 1.10 1997/07/21 14:07:52 jtc Exp $ */
/*
* ethers(3N) a la Sun.
*
* Written by Roland McGrath <roland@frob.com> 10/14/93.
* Public domain.
*/
#include "namespace.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/if_ether.h>
#include <netinet/in.h>
#include <sys/param.h>
#include <paths.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef YP
#include <rpcsvc/ypclnt.h>
#endif
#ifdef __weak_alias
__weak_alias(ether_aton,_ether_aton);
__weak_alias(ether_hostton,_ether_hostton);
__weak_alias(ether_line,_ether_line);
__weak_alias(ether_ntoa,_ether_ntoa);
__weak_alias(ether_ntohost,_ether_ntohost);
#endif
#ifndef _PATH_ETHERS
#define _PATH_ETHERS "/etc/ethers"
#endif
char *
ether_ntoa(e)
struct ether_addr *e;
{
static char a[] = "xx:xx:xx:xx:xx:xx";
snprintf(a, sizeof a, "%02x:%02x:%02x:%02x:%02x:%02x",
e->ether_addr_octet[0], e->ether_addr_octet[1],
e->ether_addr_octet[2], e->ether_addr_octet[3],
e->ether_addr_octet[4], e->ether_addr_octet[5]);
return a;
}
struct ether_addr *
ether_aton(s)
char *s;
{
static struct ether_addr n;
u_int i[6];
if (sscanf(s, " %x:%x:%x:%x:%x:%x ", &i[0], &i[1],
&i[2], &i[3], &i[4], &i[5]) == 6) {
n.ether_addr_octet[0] = (u_char)i[0];
n.ether_addr_octet[1] = (u_char)i[1];
n.ether_addr_octet[2] = (u_char)i[2];
n.ether_addr_octet[3] = (u_char)i[3];
n.ether_addr_octet[4] = (u_char)i[4];
n.ether_addr_octet[5] = (u_char)i[5];
return &n;
}
return NULL;
}
int
ether_ntohost(hostname, e)
char *hostname;
struct ether_addr *e;
{
FILE *f;
char buf[BUFSIZ];
struct ether_addr try;
#ifdef YP
char trybuf[sizeof "xx:xx:xx:xx:xx:xx"];
int trylen;
(void)snprintf(trybuf, sizeof trybuf, "%x:%x:%x:%x:%x:%x",
e->ether_addr_octet[0], e->ether_addr_octet[1],
e->ether_addr_octet[2], e->ether_addr_octet[3],
e->ether_addr_octet[4], e->ether_addr_octet[5]);
trylen = strlen(trybuf);
#endif
f = fopen(_PATH_ETHERS, "r");
if (f==NULL)
return -1;
while (fgets(buf, sizeof buf, f)) {
#ifdef YP
/* A + in the file means try YP now. */
if (!strncmp(buf, "+\n", sizeof buf)) {
char *ypbuf, *ypdom;
int ypbuflen;
if (yp_get_default_domain(&ypdom))
continue;
if (yp_match(ypdom, "ethers.byaddr", trybuf,
trylen, &ypbuf, &ypbuflen))
continue;
if (ether_line(ypbuf, &try, hostname) == 0) {
free(ypbuf);
(void)fclose(f);
return 0;
}
free(ypbuf);
continue;
}
#endif
if (ether_line(buf, &try, hostname) == 0 &&
bcmp((char *)&try, (char *)e, sizeof try) == 0) {
(void)fclose(f);
return 0;
}
}
(void)fclose(f);
errno = ENOENT;
return -1;
}
int
ether_hostton(hostname, e)
char *hostname;
struct ether_addr *e;
{
FILE *f;
char buf[BUFSIZ];
char try[MAXHOSTNAMELEN];
#ifdef YP
int hostlen = strlen(hostname);
#endif
f = fopen(_PATH_ETHERS, "r");
if (f==NULL)
return -1;
while (fgets(buf, sizeof buf, f)) {
#ifdef YP
/* A + in the file means try YP now. */
if (!strncmp(buf, "+\n", sizeof buf)) {
char *ypbuf, *ypdom;
int ypbuflen;
if (yp_get_default_domain(&ypdom))
continue;
if (yp_match(ypdom, "ethers.byname", hostname, hostlen,
&ypbuf, &ypbuflen))
continue;
if (ether_line(ypbuf, e, try) == 0) {
free(ypbuf);
(void)fclose(f);
return 0;
}
free(ypbuf);
continue;
}
#endif
if (ether_line(buf, e, try) == 0 && strcmp(hostname, try) == 0) {
(void)fclose(f);
return 0;
}
}
(void)fclose(f);
errno = ENOENT;
return -1;
}
int
ether_line(l, e, hostname)
char *l;
struct ether_addr *e;
char *hostname;
{
u_int i[6];
if (sscanf(l, " %x:%x:%x:%x:%x:%x %s\n", &i[0], &i[1],
&i[2], &i[3], &i[4], &i[5], hostname) == 7) {
e->ether_addr_octet[0] = (u_char)i[0];
e->ether_addr_octet[1] = (u_char)i[1];
e->ether_addr_octet[2] = (u_char)i[2];
e->ether_addr_octet[3] = (u_char)i[3];
e->ether_addr_octet[4] = (u_char)i[4];
e->ether_addr_octet[5] = (u_char)i[5];
return 0;
}
errno = EINVAL;
return -1;
}