/*
* $Id: device-common.c,v 1.3 2009/08/20 17:03:05 sdhsdh Exp $
*
* Authors:
* Lars Fenneberg
*
* This software is Copyright 1996,1997 by the above mentioned author(s),
* All Rights Reserved.
*
* The license which is distributed with this software in the file COPYRIGHT
* applies to this software. If your distribution is missing this file, you
* may request it from .
*
*/
#include "config.h"
#include "includes.h"
#include "radvd.h"
#include "defaults.h"
int
check_device(int sock, struct Interface *iface)
{
struct ifreq ifr;
strncpy(ifr.ifr_name, iface->Name, IFNAMSIZ-1);
ifr.ifr_name[IFNAMSIZ-1] = '\0';
if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0)
{
if (!iface->IgnoreIfMissing)
flog(LOG_ERR, "ioctl(SIOCGIFFLAGS) failed for %s: %s",
iface->Name, strerror(errno));
return (-1);
}
if (!(ifr.ifr_flags & IFF_UP))
{
if (!iface->IgnoreIfMissing)
flog(LOG_ERR, "interface %s is not UP", iface->Name);
return (-1);
}
if (! iface->UnicastOnly && !(ifr.ifr_flags & IFF_MULTICAST))
{
flog(LOG_WARNING, "interface %s does not support multicast",
iface->Name);
flog(LOG_WARNING, " do you need to add the UnicastOnly flag?");
}
#if 0
/* SDH : ignore these warnings... */
if (! iface->UnicastOnly && !(ifr.ifr_flags & IFF_BROADCAST))
{
flog(LOG_WARNING, "interface %s does not support broadcast",
iface->Name);
flog(LOG_WARNING, " do you need to add the UnicastOnly flag?");
}
#endif
return 0;
}
int
get_v4addr(const char *ifn, unsigned int *dst)
{
struct ifreq ifr;
struct sockaddr_in *addr;
int fd;
if( ( fd = socket(AF_INET,SOCK_DGRAM,0) ) < 0 )
{
flog(LOG_ERR, "create socket for IPv4 ioctl failed for %s: %s",
ifn, strerror(errno));
return (-1);
}
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ifn, IFNAMSIZ-1);
ifr.ifr_name[IFNAMSIZ-1] = '\0';
ifr.ifr_addr.sa_family = AF_INET;
if (ioctl(fd, SIOCGIFADDR, &ifr) < 0)
{
flog(LOG_ERR, "ioctl(SIOCGIFADDR) failed for %s: %s",
ifn, strerror(errno));
close( fd );
return (-1);
}
addr = (struct sockaddr_in *)(&ifr.ifr_addr);
dlog(LOG_DEBUG, 3, "IPv4 address for %s is %s", ifn,
inet_ntoa( addr->sin_addr ) );
*dst = addr->sin_addr.s_addr;
close( fd );
return 0;
}