diff --git a/ChangeLog b/ChangeLog index a8c0aa8..befa50c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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) diff --git a/config.h.in b/config.h.in index d9c51ba..bf8f9ab 100644 --- a/config.h.in +++ b/config.h.in @@ -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 header file. */ #undef HAVE_GETOPT_H diff --git a/configure.in b/configure.in index f24277b..3aebb0c 100644 --- a/configure.in +++ b/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) diff --git a/src/Makefile.am b/src/Makefile.am index cf814fc..d2fe321 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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`\"" # diff --git a/src/sip_utils.c b/src/sip_utils.c index e134014..2da97f9 100644 --- a/src/sip_utils.c +++ b/src/sip_utils.c @@ -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; } diff --git a/src/utils.c b/src/utils.c index ef627f5..0ecb665 100644 --- a/src/utils.c +++ b/src/utils.c @@ -34,6 +34,10 @@ #include #include +#ifdef HAVE_GETIFADDRS +# include +#endif + #ifdef _SOLARIS2 # include #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;