From: Michael Chase-S. <mc...@us...> - 2011-09-07 00:11:16
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "SFCB - Small Footprint CIM Broker". The branch, master has been updated via 6d2b8dd1f7a0c4856feac9593cae24b491dd73da (commit) from dc564e899d7c6c574be09e2d6b5c9565261c2d00 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 6d2b8dd1f7a0c4856feac9593cae24b491dd73da Author: Michael Chase-Salerno <br...@li...> Date: Tue Sep 6 20:10:39 2011 -0400 [ 3400114 ] sfcb fails to start with ipv6 disabled ----------------------------------------------------------------------- Summary of changes: diff --git a/ChangeLog b/ChangeLog index e200d59..033aff1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-09-06 Michael Chase-Salerno <br...@li...> + + * httpAdapter.c: + [ 3400114 ] sfcb fails to start with ipv6 disabled + Patch from kkaempf + 2011-08-26 Chris Buccella <buc...@li...> * interopProvider.c: diff --git a/NEWS b/NEWS index 194ddda..3e33140 100644 --- a/NEWS +++ b/NEWS @@ -16,6 +16,7 @@ Bugs fixed: - 3199899 sfcb uninstall process should remove test mof's - 3300167 Memory leaks caused by cimRequest changes - 3101157 Failed to enable provider timing analysis with SfcbLocal +- 3400114 sfcb fails to start with ipv6 disabled Changes in 1.4.1 ================ diff --git a/httpAdapter.c b/httpAdapter.c index 8e2fa35..b308c7f 100644 --- a/httpAdapter.c +++ b/httpAdapter.c @@ -170,6 +170,10 @@ typedef struct _buffer { #define USE_INET6 #endif +#ifdef USE_INET6 +static int fallback_ipv4; +#endif + #define SET_HDR_CP(member, val) member = val + strspn(val, " \t"); \ void @@ -1432,6 +1436,7 @@ getSocket() if (fd < 0) { mlogf(M_INFO, M_SHOW, "--- Using IPv4 address\n"); fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + fallback_ipv4 = 1; } #else fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); @@ -1442,53 +1447,76 @@ getSocket() return fd; } -static int -bindToPort(int sock, int port, void *ssin, socklen_t * sin_len) -{ - #ifdef USE_INET6 +static struct sockaddr * +prepSockAddr6(int port, void *ssin, socklen_t * sin_len) +{ struct sockaddr_in6 *sin = ssin; -#else - struct sockaddr_in *sin = ssin; -#endif *sin_len = sizeof(*sin); - memset(sin, 0, *sin_len); - if (sock >= 0) { + sin->sin6_family = AF_INET6; + if (httpLocalOnly) + sin->sin6_addr = in6addr_loopback; + else + sin->sin6_addr = in6addr_any; + sin->sin6_port = htons(port); -#ifdef USE_INET6 - sin->sin6_family = AF_INET6; - if (httpLocalOnly) - sin->sin6_addr = in6addr_loopback; - else - sin->sin6_addr = in6addr_any; - sin->sin6_port = htons(port); -#else - sin->sin_family = AF_INET; - if (httpLocalOnly) { - const char *loopback_int = "127.0.0.1"; - inet_aton(loopback_int, &(sin->sin_addr)); - } else - sin->sin_addr.s_addr = INADDR_ANY; - sin->sin_port = htons(port); + return (struct sockaddr *) sin; +} #endif - if (bind(sock, (struct sockaddr *) sin, *sin_len) || listen(sock, 10)) { - mlogf(M_ERROR, M_SHOW, "--- Cannot listen on port %ld (%s)\n", port, - strerror(errno)); - sleep(1); - return 1; - } - return 0; +static struct sockaddr * +prepSockAddr4(int port, void *ssin, socklen_t * sin_len) +{ + struct sockaddr_in *sin = ssin; + + *sin_len = sizeof(*sin); + memset(sin, 0, *sin_len); + + sin->sin_family = AF_INET; + if (httpLocalOnly) { + const char *loopback_int = "127.0.0.1"; + inet_aton(loopback_int, &(sin->sin_addr)); + } else + sin->sin_addr.s_addr = INADDR_ANY; + sin->sin_port = htons(port); + return (struct sockaddr *) sin; +} + + +static int +bindToPort(int sock, int port, void *ssin, socklen_t * sin_len) +{ + struct sockaddr *sin; + + if (sock < 0) + return 1; + + if (getControlBool("httpLocalOnly", &httpLocalOnly)) + httpLocalOnly = 0; + +#ifdef USE_INET6 + if (!fallback_ipv4) + sin = prepSockAddr6(port, ssin, sin_len); + else +#endif + sin = prepSockAddr4(port, ssin, sin_len); + + if (bind(sock, sin, *sin_len) || listen(sock, 10)) { + mlogf(M_ERROR, M_SHOW, "--- Cannot listen on port %ld (%s)\n", port, + strerror(errno)); + sleep(1); + return 1; } - return 1; + return 0; } + #ifdef HAVE_UDS static int bindUDS(int fd, char *path, struct sockaddr_un *sun, socklen_t sun_len) hooks/post-receive -- SFCB - Small Footprint CIM Broker |