1145519Sdarrenr/*	$FreeBSD$	*/
2145510Sdarrenr
322514Sdarrenr/*
422514Sdarrenr * Based upon 4.4BSD's /usr/sbin/arp
522514Sdarrenr */
622514Sdarrenr#include <sys/param.h>
722514Sdarrenr#include <sys/file.h>
822514Sdarrenr#include <sys/socket.h>
922514Sdarrenr#include <sys/sysctl.h>
1022514Sdarrenr#include <net/if.h>
11145510Sdarrenr#if __FreeBSD_version >= 300000
12145510Sdarrenr# include <net/if_var.h>
13145510Sdarrenr#endif
1422514Sdarrenr#include <net/if_dl.h>
1522514Sdarrenr#include <net/if_types.h>
16170268Sdarrenr#ifndef __osf__
17170268Sdarrenr# include <net/route.h>
18170268Sdarrenr#endif
1922514Sdarrenr#include <netinet/in.h>
2022514Sdarrenr#include <netinet/if_ether.h>
2122514Sdarrenr#include <arpa/inet.h>
22145510Sdarrenr#include <netinet/in.h>
23145510Sdarrenr#include <netinet/in_systm.h>
24145510Sdarrenr#include <netinet/ip.h>
25145510Sdarrenr#include <netinet/ip_var.h>
26145510Sdarrenr#include <netinet/tcp.h>
27145510Sdarrenr#include <unistd.h>
28145510Sdarrenr#include <string.h>
29145510Sdarrenr#include <stdlib.h>
3022514Sdarrenr#include <netdb.h>
3122514Sdarrenr#include <errno.h>
3222514Sdarrenr#include <nlist.h>
3322514Sdarrenr#include <stdio.h>
3424583Sdarrenr#include "ipsend.h"
3553024Sguido#include "iplang/iplang.h"
3622514Sdarrenr
3724583Sdarrenr
3822514Sdarrenr/*
3922514Sdarrenr * lookup host and return
4022514Sdarrenr * its IP address in address
4122514Sdarrenr * (4 bytes)
4222514Sdarrenr */
43145510Sdarrenrint	resolve(host, address)
44255332Scy	char	*host, *address;
4522514Sdarrenr{
4622514Sdarrenr        struct	hostent	*hp;
4722514Sdarrenr        u_long	add;
4822514Sdarrenr
4922514Sdarrenr	add = inet_addr(host);
5022514Sdarrenr	if (add == -1)
5122514Sdarrenr	    {
5222514Sdarrenr		if (!(hp = gethostbyname(host)))
5322514Sdarrenr		    {
5422514Sdarrenr			fprintf(stderr, "unknown host: %s\n", host);
5522514Sdarrenr			return -1;
5622514Sdarrenr		    }
5722514Sdarrenr		bcopy((char *)hp->h_addr, (char *)address, 4);
5822514Sdarrenr		return 0;
5922514Sdarrenr	}
6022514Sdarrenr	bcopy((char*)&add, address, 4);
6122514Sdarrenr	return 0;
6222514Sdarrenr}
6322514Sdarrenr
6422514Sdarrenr
6522514Sdarrenrint	arp(addr, eaddr)
66255332Scy	char	*addr, *eaddr;
6722514Sdarrenr{
6822514Sdarrenr	int	mib[6];
6922514Sdarrenr	size_t	needed;
7023279Speter	char	*lim, *buf, *next;
7122514Sdarrenr	struct	rt_msghdr	*rtm;
72246143Sglebius	struct	sockaddr_in	*sin;
7322514Sdarrenr	struct	sockaddr_dl	*sdl;
7422514Sdarrenr
7553024Sguido#ifdef	IPSEND
7667615Sdarrenr	if (arp_getipv4(addr, ether) == 0)
7753024Sguido		return 0;
7853024Sguido#endif
7953024Sguido
80145510Sdarrenr	if (!addr)
81145510Sdarrenr		return -1;
82145510Sdarrenr
8322514Sdarrenr	mib[0] = CTL_NET;
8422514Sdarrenr	mib[1] = PF_ROUTE;
8522514Sdarrenr	mib[2] = 0;
8622514Sdarrenr	mib[3] = AF_INET;
8722514Sdarrenr	mib[4] = NET_RT_FLAGS;
88186119Sqingli#ifdef RTF_LLINFO
8922514Sdarrenr	mib[5] = RTF_LLINFO;
90186119Sqingli#else
91186119Sqingli	mib[5] = 0;
92186119Sqingli#endif
93186119Sqingli
9422514Sdarrenr	if (sysctl(mib, 6, NULL, &needed, NULL, 0) == -1)
9522514Sdarrenr	    {
9622514Sdarrenr		perror("route-sysctl-estimate");
9722514Sdarrenr		exit(-1);
9822514Sdarrenr	    }
9922514Sdarrenr	if ((buf = malloc(needed)) == NULL)
10022514Sdarrenr	    {
10122514Sdarrenr		perror("malloc");
10222514Sdarrenr		exit(-1);
10322514Sdarrenr	    }
10422514Sdarrenr	if (sysctl(mib, 6, buf, &needed, NULL, 0) == -1)
10522514Sdarrenr	    {
10622514Sdarrenr		perror("actual retrieval of routing table");
10722514Sdarrenr		exit(-1);
10822514Sdarrenr	    }
10922514Sdarrenr	lim = buf + needed;
11022514Sdarrenr	for (next = buf; next < lim; next += rtm->rtm_msglen)
11122514Sdarrenr	    {
11222514Sdarrenr		rtm = (struct rt_msghdr *)next;
113246143Sglebius		sin = (struct sockaddr_in *)(rtm + 1);
11422514Sdarrenr		sdl = (struct sockaddr_dl *)(sin + 1);
115145510Sdarrenr		if (!bcmp(addr, (char *)&sin->sin_addr,
116145510Sdarrenr			  sizeof(struct in_addr)))
11722514Sdarrenr		    {
11822514Sdarrenr			bcopy(LLADDR(sdl), eaddr, sdl->sdl_alen);
11922514Sdarrenr			return 0;
12022514Sdarrenr		    }
12122514Sdarrenr	    }
12222514Sdarrenr	return -1;
12322514Sdarrenr}
124