diff --git a/include/os/osSocket.h b/include/os/osSocket.h index 57baabef03..86b6cf406c 100644 --- a/include/os/osSocket.h +++ b/include/os/osSocket.h @@ -63,8 +63,6 @@ int32_t taosCloseSocket(SocketFd fd); void taosShutDownSocketRD(SOCKET fd); void taosShutDownSocketWR(SOCKET fd); int32_t taosSetNonblocking(SOCKET sock, int32_t on); -void taosIgnSIGPIPE(); -void taosSetMaskSIGPIPE(); int32_t taosSetSockOpt(SOCKET socketfd, int32_t level, int32_t optname, void *optval, int32_t optlen); int32_t taosGetSockOpt(SOCKET socketfd, int32_t level, int32_t optname, void *optval, int32_t *optlen); @@ -94,14 +92,15 @@ SOCKET taosOpenTcpClientSocket(uint32_t ip, uint16_t port, uint32_t localIp); SOCKET taosOpenTcpServerSocket(uint32_t ip, uint16_t port); int32_t taosKeepTcpAlive(SOCKET sockFd); -int32_t taosGetFqdn(char *); -uint32_t taosGetIpv4FromFqdn(const char *); -void tinet_ntoa(char *ipstr, uint32_t ip); -uint32_t ip2uint(const char *const ip_addr); - #endif void taosBlockSIGPIPE(); +uint32_t taosGetIpv4FromFqdn(const char *); +int32_t taosGetFqdn(char *); +void tinet_ntoa(char *ipstr, uint32_t ip); +uint32_t ip2uint(const char *const ip_addr); +void taosIgnSIGPIPE(); +void taosSetMaskSIGPIPE(); #ifdef __cplusplus } diff --git a/source/os/CMakeLists.txt b/source/os/CMakeLists.txt index c3bf94e888..916c9ab2a3 100644 --- a/source/os/CMakeLists.txt +++ b/source/os/CMakeLists.txt @@ -7,4 +7,7 @@ target_include_directories( ) target_link_libraries( os pthread dl rt m -) \ No newline at end of file +) +if(${BUILD_WITH_UV}) + add_definitions(-DUSE_UV) +endif(${BUILD_TEST}) \ No newline at end of file diff --git a/source/os/src/osSocket.c b/source/os/src/osSocket.c index f27ad3a1e0..0c2ccbf344 100644 --- a/source/os/src/osSocket.c +++ b/source/os/src/osSocket.c @@ -131,18 +131,8 @@ int32_t taosSetNonblocking(SOCKET sock, int32_t on) { return 0; } -void taosIgnSIGPIPE() { signal(SIGPIPE, SIG_IGN); } -void taosSetMaskSIGPIPE() { - sigset_t signal_mask; - sigemptyset(&signal_mask); - sigaddset(&signal_mask, SIGPIPE); - int32_t rc = pthread_sigmask(SIG_SETMASK, &signal_mask, NULL); - if (rc != 0) { - //printf("failed to setmask SIGPIPE"); - } -} #endif @@ -223,9 +213,6 @@ int32_t taosSetNonblocking(SOCKET sock, int32_t on) { return 0; } -void taosIgnSIGPIPE() {} -void taosSetMaskSIGPIPE() {} - int32_t taosSetSockOpt(SOCKET socketfd, int32_t level, int32_t optname, void *optval, int32_t optlen) { if (level == SOL_SOCKET && optname == TCP_KEEPCNT) { return 0; @@ -282,98 +269,6 @@ uint64_t htonll(uint64_t val) { return (((uint64_t)htonl(val)) << 32) + htonl(va #define TCP_CONN_TIMEOUT 3000 // conn timeout -int32_t taosGetFqdn(char *fqdn) { - char hostname[1024]; - hostname[1023] = '\0'; - if (gethostname(hostname, 1023) == -1) { - //printf("failed to get hostname, reason:%s", strerror(errno)); - return -1; - } - - struct addrinfo hints = {0}; - struct addrinfo *result = NULL; -#ifdef __APPLE__ - // on macosx, hostname -f has the form of xxx.local - // which will block getaddrinfo for a few seconds if AI_CANONNAME is set - // thus, we choose AF_INET (ipv4 for the moment) to make getaddrinfo return - // immediately - hints.ai_family = AF_INET; -#else // __APPLE__ - hints.ai_flags = AI_CANONNAME; -#endif // __APPLE__ - int32_t ret = getaddrinfo(hostname, NULL, &hints, &result); - if (!result) { - //printf("failed to get fqdn, code:%d, reason:%s", ret, gai_strerror(ret)); - return -1; - } - -#ifdef __APPLE__ - // refer to comments above - strcpy(fqdn, hostname); -#else // __APPLE__ - strcpy(fqdn, result->ai_canonname); -#endif // __APPLE__ - freeaddrinfo(result); - return 0; -} - -uint32_t taosGetIpv4FromFqdn(const char *fqdn) { - struct addrinfo hints = {0}; - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_STREAM; - - struct addrinfo *result = NULL; - - int32_t ret = getaddrinfo(fqdn, NULL, &hints, &result); - if (result) { - struct sockaddr * sa = result->ai_addr; - struct sockaddr_in *si = (struct sockaddr_in *)sa; - struct in_addr ia = si->sin_addr; - uint32_t ip = ia.s_addr; - freeaddrinfo(result); - return ip; - } else { -#ifdef EAI_SYSTEM - if (ret == EAI_SYSTEM) { - //printf("failed to get the ip address, fqdn:%s, since:%s", fqdn, strerror(errno)); - } else { - //printf("failed to get the ip address, fqdn:%s, since:%s", fqdn, gai_strerror(ret)); - } -#else - //printf("failed to get the ip address, fqdn:%s, since:%s", fqdn, gai_strerror(ret)); -#endif - return 0xFFFFFFFF; - } -} - -// Function converting an IP address string to an uint32_t. -uint32_t ip2uint(const char *const ip_addr) { - char ip_addr_cpy[20]; - char ip[5]; - - tstrncpy(ip_addr_cpy, ip_addr, sizeof(ip_addr_cpy)); - - char *s_start, *s_end; - s_start = ip_addr_cpy; - s_end = ip_addr_cpy; - - int32_t k; - - for (k = 0; *s_start != '\0'; s_start = s_end) { - for (s_end = s_start; *s_end != '.' && *s_end != '\0'; s_end++) { - } - if (*s_end == '.') { - *s_end = '\0'; - s_end++; - } - ip[k++] = (char)atoi(s_start); - } - - ip[k] = '\0'; - - return *((uint32_t *)ip); -} - int32_t taosWriteMsg(SOCKET fd, void *buf, int32_t nbytes) { int32_t nleft, nwritten; char * ptr = (char *)buf; @@ -754,10 +649,6 @@ SOCKET taosOpenTcpServerSocket(uint32_t ip, uint16_t port) { return sockFd; } -void tinet_ntoa(char *ipstr, uint32_t ip) { - sprintf(ipstr, "%d.%d.%d.%d", ip & 0xFF, (ip >> 8) & 0xFF, (ip >> 16) & 0xFF, ip >> 24); -} - #define COPY_SIZE 32768 // sendfile shall be used @@ -799,8 +690,9 @@ int64_t taosCopyFds(SOCKET sfd, int32_t dfd, int64_t len) { -#if !(defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)) void taosBlockSIGPIPE() { +#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32) +#else sigset_t signal_mask; sigemptyset(&signal_mask); sigaddset(&signal_mask, SIGPIPE); @@ -808,7 +700,122 @@ void taosBlockSIGPIPE() { if (rc != 0) { //printf("failed to block SIGPIPE"); } +#endif } + +uint32_t taosGetIpv4FromFqdn(const char *fqdn) { + struct addrinfo hints = {0}; + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + + struct addrinfo *result = NULL; + + int32_t ret = getaddrinfo(fqdn, NULL, &hints, &result); + if (result) { + struct sockaddr * sa = result->ai_addr; + struct sockaddr_in *si = (struct sockaddr_in *)sa; + struct in_addr ia = si->sin_addr; + uint32_t ip = ia.s_addr; + freeaddrinfo(result); + return ip; + } else { +#ifdef EAI_SYSTEM + if (ret == EAI_SYSTEM) { + //printf("failed to get the ip address, fqdn:%s, since:%s", fqdn, strerror(errno)); + } else { + //printf("failed to get the ip address, fqdn:%s, since:%s", fqdn, gai_strerror(ret)); + } #else -void taosBlockSIGPIPE() {} -#endif \ No newline at end of file + //printf("failed to get the ip address, fqdn:%s, since:%s", fqdn, gai_strerror(ret)); +#endif + return 0xFFFFFFFF; + } +} + +int32_t taosGetFqdn(char *fqdn) { + char hostname[1024]; + hostname[1023] = '\0'; + if (gethostname(hostname, 1023) == -1) { + //printf("failed to get hostname, reason:%s", strerror(errno)); + return -1; + } + + struct addrinfo hints = {0}; + struct addrinfo *result = NULL; +#ifdef __APPLE__ + // on macosx, hostname -f has the form of xxx.local + // which will block getaddrinfo for a few seconds if AI_CANONNAME is set + // thus, we choose AF_INET (ipv4 for the moment) to make getaddrinfo return + // immediately + hints.ai_family = AF_INET; +#else // __APPLE__ + hints.ai_flags = AI_CANONNAME; +#endif // __APPLE__ + int32_t ret = getaddrinfo(hostname, NULL, &hints, &result); + if (!result) { + //printf("failed to get fqdn, code:%d, reason:%s", ret, gai_strerror(ret)); + return -1; + } + +#ifdef __APPLE__ + // refer to comments above + strcpy(fqdn, hostname); +#else // __APPLE__ + strcpy(fqdn, result->ai_canonname); +#endif // __APPLE__ + freeaddrinfo(result); + return 0; +} + +// Function converting an IP address string to an uint32_t. +uint32_t ip2uint(const char *const ip_addr) { + char ip_addr_cpy[20]; + char ip[5]; + + tstrncpy(ip_addr_cpy, ip_addr, sizeof(ip_addr_cpy)); + + char *s_start, *s_end; + s_start = ip_addr_cpy; + s_end = ip_addr_cpy; + + int32_t k; + + for (k = 0; *s_start != '\0'; s_start = s_end) { + for (s_end = s_start; *s_end != '.' && *s_end != '\0'; s_end++) { + } + if (*s_end == '.') { + *s_end = '\0'; + s_end++; + } + ip[k++] = (char)atoi(s_start); + } + + ip[k] = '\0'; + + return *((uint32_t *)ip); +} + +void tinet_ntoa(char *ipstr, uint32_t ip) { + sprintf(ipstr, "%d.%d.%d.%d", ip & 0xFF, (ip >> 8) & 0xFF, (ip >> 16) & 0xFF, ip >> 24); +} + + +void taosIgnSIGPIPE() { +#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32) +#else + signal(SIGPIPE, SIG_IGN); +#endif +} + +void taosSetMaskSIGPIPE() { +#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32) +#else + sigset_t signal_mask; + sigemptyset(&signal_mask); + sigaddset(&signal_mask, SIGPIPE); + int32_t rc = pthread_sigmask(SIG_SETMASK, &signal_mask, NULL); + if (rc != 0) { + //printf("failed to setmask SIGPIPE"); + } +#endif +} \ No newline at end of file diff --git a/source/util/CMakeLists.txt b/source/util/CMakeLists.txt index 42950b2284..0bfa9dc96d 100644 --- a/source/util/CMakeLists.txt +++ b/source/util/CMakeLists.txt @@ -17,6 +17,7 @@ if(${BUILD_WITH_UV}) util PUBLIC uv_a ) + add_definitions(-DUSE_UV) endif(${BUILD_TEST}) if(${BUILD_TEST}) diff --git a/source/util/src/thttp.c b/source/util/src/thttp.c index 9d5df20337..59e73d2242 100644 --- a/source/util/src/thttp.c +++ b/source/util/src/thttp.c @@ -128,7 +128,7 @@ static void clientConnCb(uv_connect_t* req, int32_t status) { uv_close((uv_handle_t*)req->handle, NULL); } -int32_t taosSendHttpReport(const char* server, uint16_t port, const char* pCont, int32_t contLen, EHttpCompFlag flag) { +int32_t taosSendHttpReport(const char* server, uint16_t port, char* pCont, int32_t contLen, EHttpCompFlag flag) { uint32_t ipv4 = taosGetIpv4FromFqdn(server); if (ipv4 == 0xffffffff) { terrno = TAOS_SYSTEM_ERROR(errno);