#pragma ident "@(#)selfcheck.c 1.3 05/06/08 SMI"
#include <sys/types.h>
#include <sys/socket.h>
#include <ifaddrs.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <syslog.h>
#include <strings.h>
#include <stdio.h>
#include <netdb.h>
#include "autofs.h"
#include "automount.h"
static int self_check_af(char *, struct ifaddrs *, int);
int
self_check(hostname)
char *hostname;
{
int res;
struct ifaddrs *ifaddrs;
if (hostname[0] == '.') {
return (0);
}
if (getifaddrs(&ifaddrs) == -1) {
syslog(LOG_ERR, "getifaddrs failed: %s\n",
strerror(errno));
return (0);
}
res = self_check_af(hostname, ifaddrs, AF_INET6) ||
self_check_af(hostname, ifaddrs, AF_INET);
freeifaddrs(ifaddrs);
return (res);
}
static int
self_check_af(char *hostname, struct ifaddrs *ifaddrs, int family)
{
struct hostent *hostinfo;
int error_num;
char **hostptr;
struct ifaddrs *ifaddr;
struct sockaddr *addr;
struct sockaddr_in *addr_in;
struct sockaddr_in6 *addr_in6;
if ((hostinfo = getipnodebyname(hostname, family, AI_DEFAULT,
&error_num)) == NULL) {
if (error_num == TRY_AGAIN)
syslog(LOG_DEBUG,
"self_check: unknown host: %s (try again later)\n",
hostname);
else
syslog(LOG_DEBUG,
"self_check: unknown host: %s\n", hostname);
return (0);
}
for (hostptr = hostinfo->h_addr_list; *hostptr; hostptr++) {
for (ifaddr = ifaddrs; ifaddr != NULL; ifaddr = ifaddr->ifa_next) {
addr = ifaddr->ifa_addr;
if (addr->sa_family != hostinfo->h_addrtype)
continue;
switch (addr->sa_family) {
case AF_INET:
addr_in = (struct sockaddr_in *)addr;
if (memcmp(*hostptr, &addr_in->sin_addr,
hostinfo->h_length) == 0) {
freehostent(hostinfo);
return (1);
}
break;
case AF_INET6:
addr_in6 = (struct sockaddr_in6 *)addr;
if (memcmp(*hostptr, &addr_in6->sin6_addr,
hostinfo->h_length) == 0) {
freehostent(hostinfo);
return (1);
}
break;
default:
break;
}
}
}
freehostent(hostinfo);
return (0);
}