1145519Sdarrenr/*	$FreeBSD: releng/10.3/contrib/ipfilter/ipsend/larp.c 255332 2013-09-06 23:11:19Z cy $	*/
2145510Sdarrenr
322514Sdarrenr/*
453024Sguido * larp.c (C) 1995-1998 Darren Reed
522514Sdarrenr *
680486Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
7145510Sdarrenr *
822514Sdarrenr */
931183Speter#if !defined(lint)
1031183Speterstatic const char sccsid[] = "@(#)larp.c	1.1 8/19/95 (C)1995 Darren Reed";
11255332Scystatic const char rcsid[] = "@(#)$Id$";
1222514Sdarrenr#endif
13145510Sdarrenr#include <sys/param.h>
1422514Sdarrenr#include <sys/types.h>
1522514Sdarrenr#include <sys/socket.h>
1622514Sdarrenr#include <sys/ioctl.h>
1722514Sdarrenr#include <netinet/in.h>
1822514Sdarrenr#include <net/if.h>
1922514Sdarrenr#include <net/if_arp.h>
20145510Sdarrenr#include <stdio.h>
21145510Sdarrenr#include <netdb.h>
22145510Sdarrenr#include <errno.h>
2322514Sdarrenr
2453024Sguido#include "ip_compat.h"
2553024Sguido#include "iplang/iplang.h"
2653024Sguido
2722514Sdarrenr/*
2822514Sdarrenr * lookup host and return
2922514Sdarrenr * its IP address in address
3022514Sdarrenr * (4 bytes)
3122514Sdarrenr */
32145510Sdarrenrint	resolve(host, address)
33255332Scy	char	*host, *address;
3422514Sdarrenr{
3522514Sdarrenr        struct	hostent	*hp;
3622514Sdarrenr        u_long	add;
3722514Sdarrenr
3822514Sdarrenr	add = inet_addr(host);
3922514Sdarrenr	if (add == -1)
4022514Sdarrenr	    {
4122514Sdarrenr		if (!(hp = gethostbyname(host)))
4222514Sdarrenr		    {
4322514Sdarrenr			fprintf(stderr, "unknown host: %s\n", host);
4422514Sdarrenr			return -1;
4522514Sdarrenr		    }
4622514Sdarrenr		bcopy((char *)hp->h_addr, (char *)address, 4);
4722514Sdarrenr		return 0;
4822514Sdarrenr	}
4922514Sdarrenr	bcopy((char*)&add, address, 4);
5022514Sdarrenr	return 0;
5122514Sdarrenr}
5222514Sdarrenr
5322514Sdarrenr/*
5422514Sdarrenr * ARP for the MAC address corresponding
5522514Sdarrenr * to the IP address.  This taken from
5622514Sdarrenr * some BSD program, I cant remember which.
5722514Sdarrenr */
5822514Sdarrenrint	arp(ip, ether)
59255332Scy	char	*ip;
60255332Scy	char	*ether;
6122514Sdarrenr{
6222514Sdarrenr	static	int	s = -1;
6322514Sdarrenr	struct	arpreq	ar;
6422514Sdarrenr	struct	sockaddr_in	*sin;
6522514Sdarrenr	char	*inet_ntoa();
6622514Sdarrenr
6753024Sguido#ifdef	IP_SEND
6853024Sguido	if (arp_getipv4(ip, ether) == 0)
6953024Sguido		return 0;
7053024Sguido#endif
7122514Sdarrenr	bzero((char *)&ar, sizeof(ar));
7222514Sdarrenr	sin = (struct sockaddr_in *)&ar.arp_pa;
7322514Sdarrenr	sin->sin_family = AF_INET;
7422514Sdarrenr	bcopy(ip, (char *)&sin->sin_addr.s_addr, 4);
7522514Sdarrenr
7622514Sdarrenr	if (s == -1)
7722514Sdarrenr		if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
7822514Sdarrenr		    {
7922514Sdarrenr			perror("arp: socket");
8022514Sdarrenr			return -1;
8122514Sdarrenr		    }
8222514Sdarrenr
8322514Sdarrenr	if (ioctl(s, SIOCGARP, (caddr_t)&ar) == -1)
8422514Sdarrenr	    {
8522514Sdarrenr		fprintf(stderr, "(%s):", inet_ntoa(sin->sin_addr));
8622514Sdarrenr		if (errno != ENXIO)
8722514Sdarrenr			perror("SIOCGARP");
8822514Sdarrenr		return -1;
8922514Sdarrenr	    }
9022514Sdarrenr
9122514Sdarrenr	bcopy(ar.arp_ha.sa_data, ether, 6);
9222514Sdarrenr	return 0;
9322514Sdarrenr}
94