Merge pull request #19232 from taosdata/FIX/xsren/winSort
Fix/xsren/win sort & mac fqdn
This commit is contained in:
commit
8ca0cdfa40
|
@ -70,6 +70,7 @@ typedef struct {
|
|||
|
||||
SysNameInfo taosGetSysNameInfo();
|
||||
bool taosCheckCurrentInDll();
|
||||
int taosGetlocalhostname(char *hostname, size_t maxLen);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -44,6 +44,10 @@ if(TD_WINDOWS)
|
|||
os PUBLIC ws2_32 iconv msvcregex wcwidth winmm crashdump
|
||||
)
|
||||
elseif(TD_DARWIN_64)
|
||||
find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation)
|
||||
target_link_libraries(os PUBLIC ${CORE_FOUNDATION_FRAMEWORK})
|
||||
find_library(SYSTEM_CONFIGURATION_FRAMEWORK SystemConfiguration)
|
||||
target_link_libraries(os PUBLIC ${SYSTEM_CONFIGURATION_FRAMEWORK})
|
||||
target_link_libraries(
|
||||
os PUBLIC dl m iconv
|
||||
)
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#define ALLOW_FORBID_FUNC
|
||||
#define _DEFAULT_SOURCE
|
||||
#include "os.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef WINDOWS
|
||||
void swapStr(char* j, char* J, int width) {
|
||||
|
@ -33,16 +34,5 @@ void swapStr(char* j, char* J, int width) {
|
|||
|
||||
// todo refactor: 1) move away; 2) use merge sort instead; 3) qsort is not a stable sort actually.
|
||||
void taosSort(void* arr, int64_t sz, int64_t width, __compar_fn_t compar) {
|
||||
#ifdef WINDOWS
|
||||
int64_t i, j;
|
||||
for (i = 0; i < sz - 1; i++) {
|
||||
for (j = 0; j < sz - 1 - i; j++) {
|
||||
if (compar((char*)arr + j * width, (char*)arr + (j + 1) * width) > 0.00) {
|
||||
swapStr((char*)arr + j * width, (char*)arr + (j + 1) * width, width);
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
qsort(arr, sz, width, compar);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -988,7 +988,7 @@ int32_t taosGetFqdn(char *fqdn) {
|
|||
#endif
|
||||
char hostname[1024];
|
||||
hostname[1023] = '\0';
|
||||
if (gethostname(hostname, 1023) == -1) {
|
||||
if (taosGetlocalhostname(hostname, 1023) == -1) {
|
||||
#ifdef WINDOWS
|
||||
printf("failed to get hostname, reason:%s\n", strerror(WSAGetLastError()));
|
||||
#else
|
||||
|
@ -998,30 +998,28 @@ int32_t taosGetFqdn(char *fqdn) {
|
|||
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;
|
||||
// hints.ai_family = AF_INET;
|
||||
strcpy(fqdn, hostname);
|
||||
strcpy(fqdn+strlen(hostname), ".local");
|
||||
#else // __APPLE__
|
||||
struct addrinfo hints = {0};
|
||||
struct addrinfo *result = NULL;
|
||||
hints.ai_flags = AI_CANONNAME;
|
||||
#endif // __APPLE__
|
||||
|
||||
int32_t ret = getaddrinfo(hostname, NULL, &hints, &result);
|
||||
if (!result) {
|
||||
fprintf(stderr, "failed to get fqdn, code:%d, reason:%s\n", 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);
|
||||
#endif // __APPLE__
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -98,6 +98,9 @@ LONG WINAPI exceptionHandler(LPEXCEPTION_POINTERS exception);
|
|||
#include <errno.h>
|
||||
#include <libproc.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <SystemConfiguration/SCDynamicStoreCopySpecific.h>
|
||||
#include <CoreFoundation/CFString.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#else
|
||||
|
||||
|
@ -1003,6 +1006,11 @@ SysNameInfo taosGetSysNameInfo() {
|
|||
tstrncpy(info.machine, uts.machine, sizeof(info.machine));
|
||||
}
|
||||
|
||||
char localHostName[512];
|
||||
taosGetlocalhostname(localHostName, 512);
|
||||
TdCmdPtr pCmd = taosOpenCmd("scutil --get LocalHostName");
|
||||
tstrncpy(info.nodename, localHostName, sizeof(info.nodename));
|
||||
|
||||
return info;
|
||||
#else
|
||||
SysNameInfo info = {0};
|
||||
|
@ -1038,3 +1046,46 @@ bool taosCheckCurrentInDll() {
|
|||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef _TD_DARWIN_64
|
||||
int taosGetMaclocalhostnameByCommand(char *hostname, size_t maxLen) {
|
||||
TdCmdPtr pCmd = taosOpenCmd("scutil --get LocalHostName");
|
||||
if (pCmd != NULL) {
|
||||
if (taosGetsCmd(pCmd, maxLen - 1, hostname) > 0) {
|
||||
int len = strlen(hostname);
|
||||
if (hostname[len - 1] == '\n') {
|
||||
hostname[len - 1] = '\0';
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
taosCloseCmd(&pCmd);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int getMacLocalHostNameBySCD(char *hostname, size_t maxLen) {
|
||||
SCDynamicStoreRef store = SCDynamicStoreCreate(NULL, CFSTR(""), NULL, NULL);
|
||||
CFStringRef hostname_cfstr = SCDynamicStoreCopyLocalHostName(store);
|
||||
if (hostname_cfstr != NULL) {
|
||||
CFStringGetCString(hostname_cfstr, hostname, maxLen - 1, kCFStringEncodingMacRoman);
|
||||
CFRelease(hostname_cfstr);
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
CFRelease(store);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int taosGetlocalhostname(char *hostname, size_t maxLen) {
|
||||
#ifdef _TD_DARWIN_64
|
||||
int res = getMacLocalHostNameBySCD(hostname, maxLen);
|
||||
if (res != 0) {
|
||||
return taosGetMaclocalhostnameByCommand(hostname, maxLen);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
return gethostname(hostname, maxLen);
|
||||
#endif
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue