- use CFLAGS -Wall only with GCC compiler
- fixed a number of compiler warnings (by Norm Brandinger) [3086593,3086371,3086351] - use getifaddrs() to get the IP address of local interfaces. This seems to be required with FreeeBSD jails.
This commit is contained in:
parent
7be49c4329
commit
f2c98485f8
@ -1,5 +1,10 @@
|
||||
0.8.1
|
||||
=====
|
||||
09-Jan-2011: - use CFLAGS -Wall only with GCC compiler
|
||||
14-Oct-2010: - fixed a number of compiler warnings (by Norm Brandinger)
|
||||
[3086593,3086371,3086351]
|
||||
03-Oct-2010: - use getifaddrs() to get the IP address of local interfaces.
|
||||
This seems to be required with FreeeBSD jails.
|
||||
19-Jun-2010: - fix: include correct ltdl.h for system & convenience libltdl
|
||||
26-Apr-2010: - Clean building from distribuion TAR did fail if the host
|
||||
installed libltdl lib was used (and not the convenience lib)
|
||||
|
||||
@ -45,6 +45,9 @@
|
||||
/* Define to 1 if you have the `gethostbyname' function. */
|
||||
#undef HAVE_GETHOSTBYNAME
|
||||
|
||||
/* Define to 1 if you have the `getifaddrs' function. */
|
||||
#undef HAVE_GETIFADDRS
|
||||
|
||||
/* Define to 1 if you have the <getopt.h> header file. */
|
||||
#undef HAVE_GETOPT_H
|
||||
|
||||
|
||||
13
configure.in
13
configure.in
@ -50,6 +50,7 @@ dnl and fall back using convenienve libltdl (WARN)
|
||||
dnl 26-Apr-2010 tries Fresh building from distribuion TAR did fail if
|
||||
dnl the host-installed libltdl lib is used (and not the
|
||||
dnl convenience lib)
|
||||
dnl 09-Jan-2011 tries use CFLAGS -Wall only with GCC compiler
|
||||
dnl
|
||||
dnl
|
||||
|
||||
@ -234,6 +235,17 @@ dnl
|
||||
fi
|
||||
|
||||
|
||||
dnl
|
||||
dnl Use -Wall if we have gcc.
|
||||
dnl
|
||||
if test "x$GCC" = "xyes"; then
|
||||
case " $CFLAGS " in
|
||||
*[\ ]-Wall[\ ]*) ;;
|
||||
*) CFLAGS="$CFLAGS -Wall" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
|
||||
dnl
|
||||
dnl target platform specific stuff
|
||||
dnl
|
||||
@ -471,6 +483,7 @@ ACX_WHICH_GETHOSTBYNAME_R()
|
||||
AC_CHECK_FUNCS(getopt_long setsid syslog)
|
||||
AC_CHECK_FUNCS(getuid setuid getgid setgid getpwnam chroot)
|
||||
AC_CHECK_FUNCS(socket bind select read send sendto fcntl)
|
||||
AC_CHECK_FUNCS(getifaddrs)
|
||||
AC_CHECK_FUNCS(strcmp strcasecmp)
|
||||
AC_CHECK_FUNCS(strncpy strchr strstr sprintf vfprintf vsnprintf)
|
||||
AC_CHECK_FUNCS(listen accept)
|
||||
|
||||
@ -23,7 +23,7 @@ if use_convenience_ltdl
|
||||
LTDLDEF = -DLTDL_CONVLIB
|
||||
endif
|
||||
|
||||
AM_CFLAGS = -Wall -D_GNU_SOURCE $(LTDLDEF) \
|
||||
AM_CFLAGS = -D_GNU_SOURCE $(LTDLDEF) \
|
||||
-DBUILDSTR="\"`cat .buildno`\""
|
||||
|
||||
#
|
||||
|
||||
@ -428,7 +428,7 @@ int is_sipuri_local (sip_ticket_t *ticket) {
|
||||
/* need name resolution */
|
||||
sts=get_ip_by_host(sip->req_uri->host, &addr_uri);
|
||||
if (sts == STS_FAILURE) {
|
||||
DEBUGC(DBCLASS_PROXY, "sip_gen_response: cannot resolve via [%s]",
|
||||
DEBUGC(DBCLASS_PROXY, "sip_gen_response: cannot resolve request uri [%s]",
|
||||
sip->req_uri->host);
|
||||
return STS_FALSE;
|
||||
}
|
||||
|
||||
84
src/utils.c
84
src/utils.c
@ -34,6 +34,10 @@
|
||||
#include <net/if.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#ifdef HAVE_GETIFADDRS
|
||||
# include <ifaddrs.h>
|
||||
#endif
|
||||
|
||||
#ifdef _SOLARIS2
|
||||
# include <sys/sockio.h>
|
||||
#endif
|
||||
@ -401,11 +405,9 @@ int get_interface_real_ip(int interface, struct in_addr *retaddr) {
|
||||
* STS_FAILURE if interface is DOWN or other problem
|
||||
*/
|
||||
int get_ip_by_ifname(char *ifname, struct in_addr *retaddr) {
|
||||
struct ifreq ifr;
|
||||
struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr;
|
||||
int sockfd;
|
||||
struct in_addr ifaddr; /* resulting IP */
|
||||
int i, j;
|
||||
int ifflags, isup;
|
||||
int ifflags=0, isup=0;
|
||||
time_t t;
|
||||
static struct {
|
||||
time_t timestamp;
|
||||
@ -414,6 +416,14 @@ int get_ip_by_ifname(char *ifname, struct in_addr *retaddr) {
|
||||
char ifname[IFNAME_SIZE+1];
|
||||
} ifaddr_cache[IFADR_CACHE_SIZE];
|
||||
static int cache_initialized=0;
|
||||
#ifdef HAVE_GETIFADDRS
|
||||
struct ifaddrs *ifa;
|
||||
struct ifaddrs *ifa_list;
|
||||
#else
|
||||
struct ifreq ifr;
|
||||
struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr;
|
||||
int sockfd;
|
||||
#endif
|
||||
|
||||
if (ifname == NULL) {
|
||||
WARN("get_ip_by_ifname: got NULL ifname passed - please check config"
|
||||
@ -457,38 +467,83 @@ int get_ip_by_ifname(char *ifname, struct in_addr *retaddr) {
|
||||
} /* for i */
|
||||
|
||||
/* not found in cache, go and get it */
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
|
||||
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
|
||||
ERROR("Error in socket: %s\n",strerror(errno));
|
||||
#ifdef HAVE_GETIFADDRS
|
||||
if (getifaddrs(&ifa_list)) {
|
||||
ERROR("Error in getifaddrs: %s",strerror(errno));
|
||||
return STS_FAILURE;
|
||||
}
|
||||
|
||||
i=0; /* use "found" marker */
|
||||
for (ifa = ifa_list; ifa->ifa_next; ifa = ifa->ifa_next) {
|
||||
DEBUGC(DBCLASS_BABBLE,"getifaddrs - %s / %s, ifa_addr=%p, addrfamily=%i",
|
||||
ifname, ifa->ifa_name,ifa->ifa_addr,
|
||||
(ifa->ifa_addr)?ifa->ifa_addr->sa_family:-1);
|
||||
|
||||
if (ifa && ifa->ifa_name && ifa->ifa_addr &&
|
||||
ifa->ifa_addr->sa_family == AF_INET &&
|
||||
strcmp(ifa->ifa_name, ifname) == 0) {
|
||||
/* found the entry */
|
||||
i=1;
|
||||
/*&&&*/DEBUGC(DBCLASS_BABBLE,"&&&1 ifname=0x%p",ifname);
|
||||
memcpy(&ifaddr, &((struct sockaddr_in*)ifa->ifa_addr)->sin_addr, sizeof(struct in_addr));
|
||||
/*&&&*/DEBUGC(DBCLASS_BABBLE,"&&&2 ifname=0x%p",ifname);
|
||||
ifflags=ifa->ifa_flags;
|
||||
DEBUGC(DBCLASS_BABBLE,"getifaddrs - MATCH, sin_addr=%s",
|
||||
utils_inet_ntoa(ifaddr));
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*&&&*/DEBUGC(DBCLASS_BABBLE,"&&&4 ifname=0x%p",ifname);
|
||||
freeifaddrs(ifa_list);
|
||||
/*&&&*/DEBUGC(DBCLASS_BABBLE,"&&&5 ifname=0x%p",ifname);
|
||||
|
||||
if (i==0) {
|
||||
DEBUGC(DBCLASS_DNS,"Interface %s not found.", ifname);
|
||||
return STS_FAILURE;
|
||||
}
|
||||
|
||||
#else
|
||||
memset(&ifr, 0, sizeof(ifr));
|
||||
|
||||
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
|
||||
ERROR("Error in socket: %s",strerror(errno));
|
||||
return STS_FAILURE;
|
||||
}
|
||||
|
||||
/*&&&*/DEBUGC(DBCLASS_BABBLE,"&&&6 ifname=0x%p",ifname);
|
||||
strcpy(ifr.ifr_name, ifname);
|
||||
sin->sin_family = AF_INET;
|
||||
|
||||
/* get interface flags */
|
||||
if(ioctl(sockfd, SIOCGIFFLAGS, &ifr) != 0) {
|
||||
ERROR("Error in ioctl SIOCGIFFLAGS: %s [%s]\n",
|
||||
ERROR("Error in ioctl SIOCGIFFLAGS: %s [%s]",
|
||||
strerror(errno), ifname);
|
||||
close(sockfd);
|
||||
return STS_FAILURE;
|
||||
}
|
||||
ifflags=ifr.ifr_flags;
|
||||
/*&&&*/DEBUGC(DBCLASS_BABBLE,"&&&7 ifname=0x%p",ifname);
|
||||
|
||||
/* get address */
|
||||
if(ioctl(sockfd, SIOCGIFADDR, &ifr) != 0) {
|
||||
ERROR("Error in ioctl SIOCGIFADDR: %s (interface %s)\n",
|
||||
ERROR("Error in ioctl SIOCGIFADDR: %s (interface %s)",
|
||||
strerror(errno), ifname);
|
||||
close(sockfd);
|
||||
return STS_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
/*&&&*/DEBUGC(DBCLASS_BABBLE,"&&&8 ifname=0x%p",ifname);
|
||||
memcpy(&ifaddr, &sin->sin_addr, sizeof(struct in_addr));
|
||||
/*&&&*/DEBUGC(DBCLASS_BABBLE,"&&&9 ifname=0x%p",ifname);
|
||||
close(sockfd);
|
||||
#endif
|
||||
|
||||
if (ifflags & IFF_UP) isup=1;
|
||||
else isup=0;
|
||||
|
||||
DEBUGC(DBCLASS_DNS, "get_ip_by_ifname: if %s has IP:%s (flags=%x) %s",
|
||||
ifname, utils_inet_ntoa(sin->sin_addr), ifflags,
|
||||
ifname, utils_inet_ntoa(ifaddr), ifflags,
|
||||
(isup)? "UP":"DOWN");
|
||||
|
||||
/*
|
||||
@ -513,12 +568,11 @@ int get_ip_by_ifname(char *ifname, struct in_addr *retaddr) {
|
||||
memset(&ifaddr_cache[i], 0, sizeof(ifaddr_cache[0]));
|
||||
strncpy(ifaddr_cache[i].ifname, ifname, IFNAME_SIZE);
|
||||
ifaddr_cache[i].timestamp=t;
|
||||
memcpy(&ifaddr_cache[i].ifaddr, &sin->sin_addr, sizeof(sin->sin_addr));
|
||||
memcpy(&ifaddr_cache[i].ifaddr, &ifaddr, sizeof(struct in_addr));
|
||||
ifaddr_cache[i].isup=isup;
|
||||
|
||||
if (retaddr) memcpy(retaddr, &sin->sin_addr, sizeof(sin->sin_addr));
|
||||
if (retaddr) memcpy(retaddr, &ifaddr, sizeof(struct in_addr));
|
||||
|
||||
close(sockfd);
|
||||
return (isup)? STS_SUCCESS : STS_FAILURE;
|
||||
}
|
||||
|
||||
@ -540,7 +594,7 @@ char *utils_inet_ntoa(struct in_addr in) {
|
||||
#if defined(HAVE_INET_NTOP)
|
||||
static char string[INET_ADDRSTRLEN];
|
||||
if ((inet_ntop(AF_INET, &in, string, INET_ADDRSTRLEN)) == NULL) {
|
||||
ERROR("inet_ntop() failed: %s\n",strerror(errno));
|
||||
ERROR("inet_ntop() failed: %s",strerror(errno));
|
||||
string[0]='\0';
|
||||
}
|
||||
return string;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user