FreeRDP
Loading...
Searching...
No Matches
winpr.c
1
21#include <winpr/config.h>
22
23#include <winpr/buildflags.h>
24
25#include <stdlib.h>
26#include <stdio.h>
27#include <winpr/crt.h>
28#include <winpr/string.h>
29#include <winpr/winpr.h>
30#include <winpr/version.h>
31#include <winpr/wlog.h>
32#include <winpr/file.h>
33#include <winpr/build-config.h>
34
35#include "../utils.h"
36
37#if !defined(WIN32)
38#include <pthread.h>
39#endif
40
41static INIT_ONCE s_winpr_app_details_once = INIT_ONCE_STATIC_INIT;
42static char s_winpr_vendor_string[MAX_PATH] = WINPR_C_ARRAY_INIT;
43static char s_winpr_product_string[MAX_PATH] = WINPR_C_ARRAY_INIT;
44static SSIZE_T s_winpr_version = -1;
45static BOOL s_winpr_app_details_are_custom = FALSE;
46
47static BOOL CALLBACK init_app_details(WINPR_ATTR_UNUSED PINIT_ONCE once,
48 WINPR_ATTR_UNUSED PVOID param,
49 WINPR_ATTR_UNUSED PVOID* context)
50{
51 const size_t vlen = sizeof(WINPR_VENDOR_STRING);
52 const size_t plen = sizeof(WINPR_PRODUCT_STRING);
53 if (!strncpy(s_winpr_vendor_string, WINPR_VENDOR_STRING, vlen))
54 return FALSE;
55
56 if (!strncpy(s_winpr_product_string, WINPR_PRODUCT_STRING, plen))
57 return FALSE;
58
59#if defined(WITH_RESOURCE_VERSIONING)
60 s_winpr_version = WINPR_VERSION_MAJOR;
61#else
62 s_winpr_version = -1;
63#endif
64 return TRUE;
65}
66
67WINPR_ATTR_NODISCARD
68static BOOL initializeApplicationDetails(void)
69{
70 return InitOnceExecuteOnce(&s_winpr_app_details_once, init_app_details, nullptr, nullptr);
71}
72
73BOOL winpr_setApplicationDetails(const char* vendor, const char* product, SSIZE_T version)
74{
75 if (!initializeApplicationDetails())
76 return -1;
77
78 if (!vendor || !product)
79 return FALSE;
80 const size_t vlen = strnlen(vendor, MAX_PATH);
81 const size_t plen = strnlen(product, MAX_PATH);
82 if ((vlen == MAX_PATH) || (plen == MAX_PATH))
83 return FALSE;
84
85 if (!strncpy(s_winpr_vendor_string, vendor, vlen + 1))
86 return FALSE;
87
88 if (!strncpy(s_winpr_product_string, product, plen + 1))
89 return FALSE;
90
91 s_winpr_version = version;
92 s_winpr_app_details_are_custom = TRUE;
93 return TRUE;
94}
95
96const char* winpr_getApplicationDetailsVendor(void)
97{
98 if (!initializeApplicationDetails())
99 return nullptr;
100 return s_winpr_vendor_string;
101}
102
103const char* winpr_getApplicationDetailsProduct(void)
104{
105 if (!initializeApplicationDetails())
106 return nullptr;
107 return s_winpr_product_string;
108}
109
110#if !defined(WITHOUT_WINPR_3x_DEPRECATED)
111char* winpr_getApplicatonDetailsRegKey(const char* fmt)
112{
113 char* val = winpr_getApplicatonDetailsCombined('\\');
114 if (!val)
115 return nullptr;
116
117 char* str = nullptr;
118 size_t slen = 0;
119 (void)winpr_asprintf(&str, &slen, fmt, val);
120 free(val);
121 return str;
122}
123#endif
124
125char* winpr_getApplicatonDetailsCombined(char separator)
126{
127 const SSIZE_T version = winpr_getApplicationDetailsVersion();
128 const char* vendor = winpr_getApplicationDetailsVendor();
129 const char* product = winpr_getApplicationDetailsProduct();
130
131 size_t slen = 0;
132 char* str = nullptr;
133 if (version < 0)
134 {
135 (void)winpr_asprintf(&str, &slen, "%s%c%s", vendor, separator, product);
136 }
137 else
138 {
139 (void)winpr_asprintf(&str, &slen, "%s%c%s%" PRIdz, vendor, separator, product, version);
140 }
141
142 return str;
143}
144
145SSIZE_T winpr_getApplicationDetailsVersion(void)
146{
147 if (!initializeApplicationDetails())
148 return -1;
149 return s_winpr_version;
150}
151
152BOOL winpr_areApplicationDetailsCustomized(void)
153{
154 return s_winpr_app_details_are_custom;
155}
156
157void winpr_get_version(int* major, int* minor, int* revision)
158{
159 if (major)
160 *major = WINPR_VERSION_MAJOR;
161 if (minor)
162 *minor = WINPR_VERSION_MINOR;
163 if (revision)
164 *revision = WINPR_VERSION_REVISION;
165}
166
167const char* winpr_get_version_string(void)
168{
169 return WINPR_VERSION_FULL;
170}
171
172const char* winpr_get_build_revision(void)
173{
174 return WINPR_GIT_REVISION;
175}
176
177const char* winpr_get_build_config(void)
178{
179 static const char build_config[] =
180 "Build configuration: " WINPR_BUILD_CONFIG "\n"
181 "Build type: " WINPR_BUILD_TYPE "\n"
182 "CFLAGS: " WINPR_CFLAGS "\n"
183 "Compiler: " WINPR_COMPILER_ID ", " WINPR_COMPILER_VERSION "\n"
184 "Target architecture: " WINPR_TARGET_ARCH "\n";
185
186 return build_config;
187}
188
189WCHAR* winpr_wcsndup(const WCHAR* str, size_t charCount)
190{
191 if (!str || (charCount == 0))
192 return nullptr;
193
194 WCHAR* copy = calloc(charCount + 1, sizeof(WCHAR));
195 if (!copy)
196 return nullptr;
197 memcpy(copy, str, charCount * sizeof(WCHAR));
198 return copy;
199}