master
c 156 lines 4.36 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "../libnetdata.h"
4
5 // ----------------------------------------------------------------------------
6 // system functions
7 // to retrieve settings of the system
8
9 unsigned int system_hz = 100;
10 void os_get_system_HZ(void) {
11 long ticks;
12
13 if ((ticks = sysconf(_SC_CLK_TCK)) <= 0) {
14 netdata_log_error("Cannot get system clock ticks");
15 ticks = 100;
16 }
17
18 system_hz = (unsigned int) ticks;
19 }
20
21 // =====================================================================================================================
22 // os_type
23
24 #if defined(OS_LINUX)
25 const char *os_type = "linux";
26 #endif
27
28 #if defined(OS_FREEBSD)
29 const char *os_type = "freebsd";
30 #endif
31
32 #if defined(OS_MACOS)
33 const char *os_type = "macos";
34 #endif
35
36 #if defined(OS_WINDOWS)
37 const char *os_type = "windows";
38
39 #define OS_WINDOWS_PATH_TRANSLATION_MAX 8191
40
41 char *os_translate_msys_to_windows_path(const char *src) {
42 if (!src)
43 return strdupz("");
44
45 if (!*src)
46 return strdupz("");
47
48 if (src[0] == '/') {
49 ssize_t converted_size = cygwin_conv_path(CCP_POSIX_TO_WIN_A, src, NULL, 0);
50 if (converted_size > 0) {
51 char *converted_path = mallocz((size_t)converted_size);
52 if (cygwin_conv_path(CCP_POSIX_TO_WIN_A, src, converted_path, (size_t)converted_size) == 0)
53 return converted_path;
54
55 freez(converted_path);
56 }
57 }
58
59 size_t src_len = strnlen(src, OS_WINDOWS_PATH_TRANSLATION_MAX);
60 char *converted_path = mallocz(src_len + 3);
61 size_t i = 0;
62 size_t j = 0;
63
64 if (src_len >= 2 && isalpha((unsigned char)src[0]) && src[1] == ':') {
65 converted_path[j++] = (char)toupper((unsigned char)src[0]);
66 converted_path[j++] = ':';
67 i = 2;
68
69 if (src[i] == '\\' || src[i] == '/') {
70 converted_path[j++] = '\\';
71 i++;
72 }
73 }
74 else if (src_len >= 2 && src[0] == '/' && isalpha((unsigned char)src[1]) && (src_len == 2 || src[2] == '/')) {
75 converted_path[j++] = (char)toupper((unsigned char)src[1]);
76 converted_path[j++] = ':';
77 i = 2;
78
79 if (src[i] == '/') {
80 converted_path[j++] = '\\';
81 i++;
82 }
83 }
84 else if (src_len >= 2 && ((src[0] == '\\' && src[1] == '\\') || (src[0] == '/' && src[1] == '/'))) {
85 converted_path[j++] = '\\';
86 converted_path[j++] = '\\';
87 i = 2;
88 }
89
90 for (; i < src_len && j < src_len + 2; i++)
91 converted_path[j++] = (src[i] == '/') ? '\\' : src[i];
92
93 converted_path[j] = '\0';
94 return converted_path;
95 }
96
97 char *os_translate_path(char *dst, const char *src, size_t dst_size) {
98 if (!dst || !dst_size)
99 return dst;
100
101 if (!src) {
102 dst[0] = '\0';
103 return dst;
104 }
105
106 CLEAN_CHAR_P *translated = os_translate_msys_to_windows_path(src);
107 snprintfz(dst, dst_size, "%s", translated);
108 return dst;
109 }
110
111 char *os_translate_windows_to_msys_path(const char *src) {
112 if (!src)
113 return strdupz("");
114
115 // Keep already POSIX-style paths unchanged.
116 if (src[0] == '/')
117 return strdupz(src);
118
119 ssize_t converted_size = cygwin_conv_path(CCP_WIN_A_TO_POSIX, src, NULL, 0);
120 if (converted_size > 0) {
121 char *converted_path = mallocz((size_t)converted_size);
122 if (cygwin_conv_path(CCP_WIN_A_TO_POSIX, src, converted_path, (size_t)converted_size) == 0)
123 return converted_path;
124
125 freez(converted_path);
126 }
127
128 size_t src_len = strnlen(src, OS_WINDOWS_PATH_TRANSLATION_MAX);
129 char *converted_path = mallocz(src_len + 3);
130 size_t converted_size_fallback = src_len + 3;
131 size_t i = 0;
132 size_t j = 0;
133
134 if (src_len >= 2 && isalpha((unsigned char)src[0]) && src[1] == ':') {
135 converted_path[j++] = '/';
136 converted_path[j++] = (char)tolower((unsigned char)src[0]);
137
138 i = 2;
139 if (src[i] == '\\' || src[i] == '/') {
140 converted_path[j++] = '/';
141 i++; // consume the separator so the loop below doesn't emit it again
142 }
143 }
144 else if (src_len >= 2 && ((src[0] == '\\' && src[1] == '\\') || (src[0] == '/' && src[1] == '/'))) {
145 converted_path[j++] = '/';
146 converted_path[j++] = '/';
147 i = 2;
148 }
149
150 for (; i < src_len && j < converted_size_fallback - 1; i++)
151 converted_path[j++] = (src[i] == '\\') ? '/' : src[i];
152
153 converted_path[j] = '\0';
154 return converted_path;
155 }
156 #endif