1/*	$FreeBSD$	*/
2
3/*
4 * larp.c (C) 1995-1998 Darren Reed
5 *
6 * See the IPFILTER.LICENCE file for details on licencing.
7 *
8 */
9#if !defined(lint)
10static const char sccsid[] = "@(#)larp.c	1.1 8/19/95 (C)1995 Darren Reed";
11static const char rcsid[] = "@(#)$Id$";
12#endif
13#include <sys/param.h>
14#include <sys/types.h>
15#include <sys/socket.h>
16#include <sys/ioctl.h>
17#include <netinet/in.h>
18#include <net/if.h>
19#include <net/if_arp.h>
20#include <stdio.h>
21#include <netdb.h>
22#include <errno.h>
23
24#include "ip_compat.h"
25#include "iplang/iplang.h"
26
27/*
28 * lookup host and return
29 * its IP address in address
30 * (4 bytes)
31 */
32int	resolve(host, address)
33	char	*host, *address;
34{
35        struct	hostent	*hp;
36        u_long	add;
37
38	add = inet_addr(host);
39	if (add == -1)
40	    {
41		if (!(hp = gethostbyname(host)))
42		    {
43			fprintf(stderr, "unknown host: %s\n", host);
44			return -1;
45		    }
46		bcopy((char *)hp->h_addr, (char *)address, 4);
47		return 0;
48	}
49	bcopy((char*)&add, address, 4);
50	return 0;
51}
52
53/*
54 * ARP for the MAC address corresponding
55 * to the IP address.  This taken from
56 * some BSD program, I cant remember which.
57 */
58int	arp(ip, ether)
59	char	*ip;
60	char	*ether;
61{
62	static	int	s = -1;
63	struct	arpreq	ar;
64	struct	sockaddr_in	*sin;
65	char	*inet_ntoa();
66
67#ifdef	IP_SEND
68	if (arp_getipv4(ip, ether) == 0)
69		return 0;
70#endif
71	bzero((char *)&ar, sizeof(ar));
72	sin = (struct sockaddr_in *)&ar.arp_pa;
73	sin->sin_family = AF_INET;
74	bcopy(ip, (char *)&sin->sin_addr.s_addr, 4);
75
76	if (s == -1)
77		if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
78		    {
79			perror("arp: socket");
80			return -1;
81		    }
82
83	if (ioctl(s, SIOCGARP, (caddr_t)&ar) == -1)
84	    {
85		fprintf(stderr, "(%s):", inet_ntoa(sin->sin_addr));
86		if (errno != ENXIO)
87			perror("SIOCGARP");
88		return -1;
89	    }
90
91	bcopy(ar.arp_ha.sa_data, ether, 6);
92	return 0;
93}
94