|
@@ -1,9 +1,117 @@
|
|
|
#include "log4upload.h"
|
|
|
#include "log4vendor.h"
|
|
|
#include <algorithm>
|
|
|
-
|
|
|
+#include <string>
|
|
|
+#include <cctype>
|
|
|
|
|
|
#if defined(_MSC_VER)
|
|
|
+#include <Windows.h>
|
|
|
+#define LOG_SDKNAME "RvcLogSdk.dll"
|
|
|
+
|
|
|
+static void log4vendor__format_fallback_error(log4vendor_lib_t* lib, int errorno)
|
|
|
+{
|
|
|
+ static const CHAR fallback_error[] = "error: %1!d!";
|
|
|
+ DWORD_PTR args[1];
|
|
|
+ args[0] = (DWORD_PTR)errorno;
|
|
|
+
|
|
|
+ FormatMessageA(FORMAT_MESSAGE_FROM_STRING |
|
|
|
+ FORMAT_MESSAGE_ARGUMENT_ARRAY |
|
|
|
+ FORMAT_MESSAGE_ALLOCATE_BUFFER,
|
|
|
+ fallback_error, 0, 0,
|
|
|
+ (LPSTR)&lib->errmsg,
|
|
|
+ 0, (va_list*)args);
|
|
|
+}
|
|
|
+
|
|
|
+int log4vendor__dlerror(log4vendor_lib_t* lib, const char* filename, DWORD errorno)
|
|
|
+{
|
|
|
+ DWORD_PTR arg;
|
|
|
+ DWORD res;
|
|
|
+ char* msg;
|
|
|
+
|
|
|
+ if (lib->errmsg) {
|
|
|
+ LocalFree(lib->errmsg);
|
|
|
+ lib->errmsg = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (errorno == 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
|
+ FORMAT_MESSAGE_FROM_SYSTEM |
|
|
|
+ FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno,
|
|
|
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
|
|
|
+ (LPSTR)&lib->errmsg, 0, NULL);
|
|
|
+
|
|
|
+ if (!res && (GetLastError() == ERROR_MUI_FILE_NOT_FOUND ||
|
|
|
+ GetLastError() == ERROR_RESOURCE_TYPE_NOT_FOUND)) {
|
|
|
+ res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
|
+ FORMAT_MESSAGE_FROM_SYSTEM |
|
|
|
+ FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorno,
|
|
|
+ 0, (LPSTR)&lib->errmsg, 0, NULL);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (res && errorno == ERROR_BAD_EXE_FORMAT && strstr(lib->errmsg, "%1")) {
|
|
|
+ msg = lib->errmsg;
|
|
|
+ lib->errmsg = NULL;
|
|
|
+ arg = (DWORD_PTR)filename;
|
|
|
+ res = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
|
+ FORMAT_MESSAGE_ARGUMENT_ARRAY |
|
|
|
+ FORMAT_MESSAGE_FROM_STRING,
|
|
|
+ msg,
|
|
|
+ 0, 0, (LPSTR)&lib->errmsg, 0, (va_list*)&arg);
|
|
|
+ LocalFree(msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!res)
|
|
|
+ log4vendor__format_fallback_error(lib, errorno);
|
|
|
+
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+int log4vendor_dlopen(const char* filename, log4vendor_lib_t* lib)
|
|
|
+{
|
|
|
+ WCHAR filename_w[1024];
|
|
|
+
|
|
|
+ lib->handle = NULL;
|
|
|
+ lib->errmsg = NULL;
|
|
|
+
|
|
|
+ if (!MultiByteToWideChar(CP_UTF8,
|
|
|
+ 0,
|
|
|
+ filename,
|
|
|
+ -1,
|
|
|
+ filename_w,
|
|
|
+ (sizeof(filename_w)/sizeof((filename_w)[0])))) {
|
|
|
+ return log4vendor__dlerror(lib, filename, GetLastError());
|
|
|
+ }
|
|
|
+
|
|
|
+ lib->handle = LoadLibraryExW(filename_w, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
|
|
|
+ if (lib->handle == NULL) {
|
|
|
+ return log4vendor__dlerror(lib, filename, GetLastError());
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void log4vendor_dlclose(log4vendor_lib_t* lib)
|
|
|
+{
|
|
|
+ if (lib->errmsg) {
|
|
|
+ LocalFree((void*)lib->errmsg);
|
|
|
+ lib->errmsg = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (lib->handle) {
|
|
|
+ /* Ignore errors. No good way to signal them without leaking memory. */
|
|
|
+ FreeLibrary(lib->handle);
|
|
|
+ lib->handle = NULL;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int log4vendor_dlsym(log4vendor_lib_t* lib, const char* name, void** ptr)
|
|
|
+{
|
|
|
+ *ptr = (void*)(uintptr_t)GetProcAddress(lib->handle, name);
|
|
|
+ return log4vendor__dlerror(lib, "", *ptr ? 0 : GetLastError());
|
|
|
+}
|
|
|
+
|
|
|
#else
|
|
|
#include <dlfcn.h>
|
|
|
#include <errno.h>
|
|
@@ -55,13 +163,14 @@ int log4vendor_dlsym(log4vendor_lib_t* lib, const char* name, void** ptr)
|
|
|
return log4vendor__dlerror(lib);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+#endif //_MSC_VER
|
|
|
+
|
|
|
const char* log4vendor_dlerror(const log4vendor_lib_t* lib)
|
|
|
{
|
|
|
return lib->errmsg ? lib->errmsg : "no error";
|
|
|
}
|
|
|
|
|
|
-#endif //_MSC_VER
|
|
|
-
|
|
|
std::string to_lower(std::string str)
|
|
|
{
|
|
|
std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) {
|
|
@@ -99,7 +208,11 @@ bool upload_helper::initialize(const cmb::log_init_config& cfg)
|
|
|
memset(value, '\0', sizeof(value));
|
|
|
strcpy(value, "0");
|
|
|
pinst_log_producer_config_set_skyeye_item(config, value);
|
|
|
- pinst_log_producer_config_set_persistent_file_path(config, "/opt/rvc/terminaldbstorage");
|
|
|
+#if defined(_MSC_VER)
|
|
|
+ pinst_log_producer_config_set_persistent_file_path(config, "C:\\rvc\\terminaldbstorage");
|
|
|
+#else
|
|
|
+ pinst_log_producer_config_set_persistent_file_path(config, "/opt/rvc/terminaldbstorage");
|
|
|
+#endif
|
|
|
|
|
|
//мÓͳһÈÕÖ¾ÅäÖÃ
|
|
|
pinst_log_producer_config_set_united_appname(config, (char*)"LR04");
|