/* * Copyright (c) 2019 TAOS Data, Inc. * * This program is free software: you can use, redistribute, and/or modify * it under the terms of the GNU Affero General Public License, version 3 * or later ("AGPL"), as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tglobalcfg.h" #include "tlog.h" #include "tsdb.h" #include "tutil.h" char configDir[TSDB_FILENAME_LEN] = "/etc/taos"; char tsDirectory[TSDB_FILENAME_LEN] = "/var/lib/taos"; char dataDir[TSDB_FILENAME_LEN] = "/var/lib/taos"; char logDir[TSDB_FILENAME_LEN] = "/var/log/taos"; char scriptDir[TSDB_FILENAME_LEN] = "/etc/taos"; int64_t str2int64(char *str) { char *endptr = NULL; return strtoll(str, &endptr, 10); } /* to make taosMsleep work, signal SIGALRM shall be blocked in the calling thread, sigset_t set; sigemptyset(&set); sigaddset(&set, SIGALRM); pthread_sigmask(SIG_BLOCK, &set, NULL); */ void taosMsleep(int mseconds) { struct timeval timeout; int seconds, useconds; seconds = mseconds / 1000; useconds = (mseconds % 1000) * 1000; timeout.tv_sec = seconds; timeout.tv_usec = useconds; /* sigset_t set; */ /* sigemptyset(&set); */ /* sigaddset(&set, SIGALRM); */ /* pthread_sigmask(SIG_BLOCK, &set, NULL); */ select(0, NULL, NULL, NULL, &timeout); /* pthread_sigmask(SIG_UNBLOCK, &set, NULL); */ } bool taosCheckPthreadValid(pthread_t thread) { return thread != 0; } void taosResetPthread(pthread_t *thread) { *thread = 0; } int64_t taosGetPthreadId() { return (int64_t)pthread_self(); } /* * Function to get the private ip address of current machine. If get IP * successfully, return 0, else, return -1. The return values is ip. * * Use: * if (taosGetPrivateIp(ip) != 0) { * perror("Fail to get private IP address\n"); * exit(EXIT_FAILURE); * } */ int taosGetPrivateIp(char *const ip) { bool hasLoCard = false; struct ifaddrs *ifaddr, *ifa; int family, s; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { return -1; } /* Walk through linked list, maintaining head pointer so we can free list later */ int flag = 0; for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; family = ifa->ifa_addr->sa_family; if (strcmp("lo", ifa->ifa_name) == 0) { hasLoCard = true; continue; } if (family == AF_INET) { /* printf("%-8s", ifa->ifa_name); */ s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (s != 0) { freeifaddrs(ifaddr); return -1; } strcpy(ip, host); flag = 1; break; } } freeifaddrs(ifaddr); if (flag) { return 0; } else { if (hasLoCard) { pPrint("no net card was found, use lo:127.0.0.1 as default"); strcpy(ip, "127.0.0.1"); return 0; } return -1; } } int taosSetNonblocking(int sock, int on) { int flags = 0; if ((flags = fcntl(sock, F_GETFL, 0)) < 0) { pError("fcntl(F_GETFL) error: %d (%s)\n", errno, strerror(errno)); return 1; } if (on) flags |= O_NONBLOCK; else flags &= ~O_NONBLOCK; if ((flags = fcntl(sock, F_SETFL, flags)) < 0) { pError("fcntl(F_SETFL) error: %d (%s)\n", errno, strerror(errno)); return 1; } return 0; } int taosSetSockOpt(int socketfd, int level, int optname, void *optval, int optlen) { return setsockopt(socketfd, level, optname, optval, (socklen_t)optlen); } int taosOpenUDClientSocket(char *ip, short port) { int sockFd = 0; struct sockaddr_un serverAddr; int ret; char name[128]; sprintf(name, "%s.%d", ip, port); sockFd = socket(AF_UNIX, SOCK_STREAM, 0); if (sockFd < 0) { pError("failed to open the UD socket:%s, reason:%s", name, strerror(errno)); return -1; } memset((char *)&serverAddr, 0, sizeof(serverAddr)); serverAddr.sun_family = AF_UNIX; strcpy(serverAddr.sun_path + 1, name); ret = connect(sockFd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); if (ret != 0) { pError("failed to connect UD socket, name:%d, reason: %s", name, strerror(errno)); sockFd = -1; } return sockFd; } int taosOpenUDServerSocket(char *ip, short port) { struct sockaddr_un serverAdd; int sockFd; char name[128]; pTrace("open ud socket:%s", name); // if (tsAllowLocalhost) ip = "0.0.0.0"; sprintf(name, "%s.%d", ip, port); bzero((char *)&serverAdd, sizeof(serverAdd)); serverAdd.sun_family = AF_UNIX; strcpy(serverAdd.sun_path + 1, name); unlink(name); if ((sockFd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { pError("failed to open UD socket:%s, reason:%s", name, strerror(errno)); return -1; } /* bind socket to server address */ if (bind(sockFd, (struct sockaddr *)&serverAdd, sizeof(serverAdd)) < 0) { pError("bind socket:%s failed, reason:%s", name, strerror(errno)); tclose(sockFd); return -1; } if (listen(sockFd, 10) < 0) { pError("listen socket:%s failed, reason:%s", name, strerror(errno)); return -1; } return sockFd; } int taosInitTimer(void *(*callback)(void *), int ms) { /******************************************************** * Create SIGALRM loop thread ********************************************************/ pthread_t thread; pthread_attr_t tattr; if (pthread_attr_init(&tattr)) { return -1; } if (pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED)) { return -1; } int *tms = (int *)malloc(sizeof(int)); *tms = ms; if (pthread_create(&thread, &tattr, callback, (void *)tms)) { return -1; } if (pthread_attr_destroy(&tattr)) { return -1; } return 0; }