From: Toni Wilen Date: Sat, 17 Jan 2026 10:57:10 +0000 (+0200) Subject: Log redirection to a file and -version command line parameter X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=5d32d4bb7df717b0499089363bc8003ed5171c9d;p=francis%2Fwinuae.git Log redirection to a file and -version command line parameter --- diff --git a/od-win32/win32.cpp b/od-win32/win32.cpp index ddd633a4..b6be0363 100644 --- a/od-win32/win32.cpp +++ b/od-win32/win32.cpp @@ -3422,8 +3422,10 @@ void remove_brkhandler (void) static void WIN32_UnregisterClasses (void) { - systray (hHiddenWnd, TRUE); - DestroyWindow (hHiddenWnd); + if (hHiddenWnd) { + systray (hHiddenWnd, TRUE); + DestroyWindow (hHiddenWnd); + } } static int WIN32_RegisterClasses (void) @@ -3847,7 +3849,7 @@ void logging_init (void) } } - write_log (_T("\n%s (%d.%d.%d %s%s[%d])"), VersionStr, + write_log (_T("%s (%d.%d.%d %s%s[%d])"), VersionStr, osVersion.dwMajorVersion, osVersion.dwMinorVersion, osVersion.dwBuildNumber, osVersion.szCSDVersion, _tcslen (osVersion.szCSDVersion) > 0 ? _T(" ") : _T(""), os_admin); write_log (_T(" %d-bit %X.%X.%X %d %s %d"), @@ -7452,6 +7454,7 @@ static int PASCAL WinMain2 (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR HANDLE hMutex; TCHAR **argv = NULL, **argv2 = NULL, **argv3; int argc, i; + int versiononly = 0; if (!osdetect ()) return 0; @@ -7473,101 +7476,106 @@ static int PASCAL WinMain2 (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR argv2 = WIN32_InitRegistry (argv); if (regqueryint (NULL, _T("log_disabled"), &i)) { - if (i) + if (i) { logging_disabled = true; + } } getstartpaths (); makeverstr (VersionStr); logging_init (); - if (_tcslen (lpCmdLine) > 0) + + if (_tcslen (lpCmdLine) > 0) { write_log (_T("'%s'\n"), lpCmdLine); + } if (argv3 && argv3[0]) { write_log (_T("params:\n")); - for (i = 0; argv3[i]; i++) + for (i = 0; argv3[i]; i++) { write_log (_T("%d: '%s'\n"), i + 1, argv3[i]); + if (!_tcsicmp(argv3[i], _T("-version"))) { + versiononly = 1; + } + if (!_tcsicmp(argv3[i], _T("-bootlogonly"))) { + versiononly = -1; + } + } } if (argv2) { write_log (_T("extra params:\n")); - for (i = 0; argv2[i]; i++) + for (i = 0; argv2[i]; i++) { write_log (_T("%d: '%s'\n"), i + 1, argv2[i]); + } } - if (preinit_shm () && WIN32_RegisterClasses () && WIN32_InitLibraries ()) { - DWORD i; + + if (versiononly <= 0) { + if (preinit_shm () && WIN32_RegisterClasses () && WIN32_InitLibraries ()) { + DWORD i; #ifdef RETROPLATFORM - if (rp_param != NULL) { - if (FAILED (rp_init ())) - goto end; - } -#endif - WIN32_HandleRegistryStuff (); - write_log (_T("Enumerating display devices.. \n")); - enumeratedisplays (); - write_log (_T("Sorting devices and modes..\n")); - sortdisplays (); - enumerate_sound_devices (); - for (i = 0; i < MAX_SOUND_DEVICES && sound_devices[i]; i++) { - int type = sound_devices[i]->type; - write_log (_T("%d:%s: %s\n"), i, type == SOUND_DEVICE_XAUDIO2 ? _T("XA") : (type == SOUND_DEVICE_DS ? _T("DS") : (type == SOUND_DEVICE_AL ? _T("AL") : (type == SOUND_DEVICE_WASAPI ? _T("WA") : (type == SOUND_DEVICE_WASAPI_EXCLUSIVE ? _T("WX") : _T("PA"))))), sound_devices[i]->name); - } - write_log (_T("Enumerating recording devices:\n")); - for (i = 0; i < MAX_SOUND_DEVICES && record_devices[i]; i++) { - int type = record_devices[i]->type; - write_log (_T("%d:%s: %s\n"), i, type == SOUND_DEVICE_XAUDIO2 ? _T("XA") : (type == SOUND_DEVICE_DS ? _T("DS") : (type == SOUND_DEVICE_AL ? _T("AL") : (type == SOUND_DEVICE_WASAPI ? _T("WA") : (type == SOUND_DEVICE_WASAPI_EXCLUSIVE ? _T("WX") : _T("PA"))))), record_devices[i]->name); - } - write_log (_T("done\n")); -#if 0 - DEVMODE devmode; - memset (&devmode, 0, sizeof (devmode)); - devmode.dmSize = sizeof (DEVMODE); - if (EnumDisplaySettings (NULL, ENUM_CURRENT_SETTINGS, &devmode)) { - default_freq = devmode.dmDisplayFrequency; - if (default_freq >= 70) - default_freq = 70; - else - default_freq = 60; - } + if (rp_param != NULL) { + if (FAILED (rp_init ())) + goto end; + } #endif - WIN32_InitLang (); - unicode_init (); - can_D3D11(false); - if (betamessage ()) { - keyboard_settrans (); + WIN32_HandleRegistryStuff (); + write_log (_T("Enumerating display devices.. \n")); + enumeratedisplays (); + write_log (_T("Sorting devices and modes..\n")); + sortdisplays (); + enumerate_sound_devices (); + for (i = 0; i < MAX_SOUND_DEVICES && sound_devices[i]; i++) { + int type = sound_devices[i]->type; + write_log (_T("%d:%s: %s\n"), i, type == SOUND_DEVICE_XAUDIO2 ? _T("XA") : (type == SOUND_DEVICE_DS ? _T("DS") : (type == SOUND_DEVICE_AL ? _T("AL") : (type == SOUND_DEVICE_WASAPI ? _T("WA") : (type == SOUND_DEVICE_WASAPI_EXCLUSIVE ? _T("WX") : _T("PA"))))), sound_devices[i]->name); + } + write_log (_T("Enumerating recording devices:\n")); + for (i = 0; i < MAX_SOUND_DEVICES && record_devices[i]; i++) { + int type = record_devices[i]->type; + write_log (_T("%d:%s: %s\n"), i, type == SOUND_DEVICE_XAUDIO2 ? _T("XA") : (type == SOUND_DEVICE_DS ? _T("DS") : (type == SOUND_DEVICE_AL ? _T("AL") : (type == SOUND_DEVICE_WASAPI ? _T("WA") : (type == SOUND_DEVICE_WASAPI_EXCLUSIVE ? _T("WX") : _T("PA"))))), record_devices[i]->name); + } + write_log (_T("done\n")); + WIN32_InitLang (); + unicode_init (); + can_D3D11(false); + if (betamessage ()) { + keyboard_settrans (); #ifdef CATWEASEL - catweasel_init (); + catweasel_init (); #endif #ifdef PARALLEL_PORT - paraport_mask = paraport_init (); + paraport_mask = paraport_init (); #endif - globalipc = createIPC (_T("WinUAE"), 0); - shmem_serial_create(); - enumserialports (); - enummidiports (); - real_main (argc, argv); + globalipc = createIPC (_T("WinUAE"), 0); + shmem_serial_create(); + enumserialports (); + enummidiports (); + if (!versiononly) { + real_main (argc, argv); + } + } } - } -end: - closeIPC (globalipc); - shmem_serial_delete(); - write_disk_history (); - target_save_debugger_config(); - timeend (); + end: + closeIPC (globalipc); + shmem_serial_delete(); + write_disk_history (); + target_save_debugger_config(); + timeend (); #ifdef AVIOUTPUT - AVIOutput_Release (); + AVIOutput_Release (); #endif #ifdef AHI - ahi_close_sound (); + ahi_close_sound (); #endif #ifdef PARALLEL_PORT - paraport_free (); - closeprinter (); + paraport_free (); + closeprinter (); #endif - create_afnewdir (1); + create_afnewdir (1); #ifdef RETROPLATFORM - rp_free (); + rp_free (); #endif + } + CloseHandle (hMutex); WIN32_CleanupLibraries (); WIN32_UnregisterClasses (); diff --git a/od-win32/writelog.cpp b/od-win32/writelog.cpp index f009d638..f734ac04 100644 --- a/od-win32/writelog.cpp +++ b/od-win32/writelog.cpp @@ -62,6 +62,7 @@ static HANDLE stdinput,stdoutput; static int bootlogmode; static CRITICAL_SECTION cs; static int cs_init; +static bool logtostdoutput; FILE *debugfile = NULL; int console_logging = 0; @@ -110,8 +111,8 @@ static void getconsole (void) { CONSOLE_SCREEN_BUFFER_INFO csbi; - stdinput = GetStdHandle (STD_INPUT_HANDLE); - stdoutput = GetStdHandle (STD_OUTPUT_HANDLE); + stdinput = GetStdHandle(STD_INPUT_HANDLE); + stdoutput = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleMode (stdinput, ENABLE_PROCESSED_INPUT|ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT|ENABLE_PROCESSED_OUTPUT); console_input_linemode = 1; SetConsoleCP (65001); @@ -159,6 +160,9 @@ void activate_console(void) static void open_console_window (void) { + if (logtostdoutput) { + return; + } if (!consoleopen) { previousactivewindow = GetForegroundWindow(); } @@ -231,6 +235,8 @@ void reopen_console (void) return; if (consoleopen >= 0) return; + if (logtostdoutput) + return; hwnd = myGetConsoleWindow (); if (hwnd) { int newpos = 1; @@ -640,8 +646,9 @@ void write_logx(const TCHAR *format, ...) TCHAR *bufp; va_list parms; - if (!cs_init) + if (!cs_init) { return; + } EnterCriticalSection (&cs); va_start (parms, format); @@ -650,8 +657,9 @@ void write_logx(const TCHAR *format, ...) count = _vsntprintf (bufp, bufsize - 1, format, parms); if (count < 0) { bufsize *= 10; - if (bufp != buffer) + if (bufp != buffer) { xfree (bufp); + } bufp = xmalloc (TCHAR, bufsize); continue; } @@ -665,11 +673,13 @@ void write_logx(const TCHAR *format, ...) _ftprintf (debugfile, _T("%s"), bufp); } lfdetected = 0; - if (bufp[0] != '\0' && bufp[_tcslen (bufp) - 1] == '\n') + if (bufp[0] != '\0' && bufp[_tcslen (bufp) - 1] == '\n') { lfdetected = 1; + } va_end (parms); - if (bufp != buffer) + if (bufp != buffer) { xfree (bufp); + } LeaveCriticalSection (&cs); } @@ -681,16 +691,19 @@ void write_log (const TCHAR *format, ...) TCHAR *bufp; va_list parms; - if (!SHOW_CONSOLE && !console_logging && !debugfile) + if (!SHOW_CONSOLE && !console_logging && !debugfile) { return; + } - if (!cs_init) + if (!cs_init) { return; + } premsg (); - if (!_tcsicmp (format, _T("*"))) + if (!_tcsicmp (format, _T("*"))) { count = 0; + } EnterCriticalSection (&cs); va_start (parms, format); @@ -707,21 +720,36 @@ void write_log (const TCHAR *format, ...) break; } bufp[bufsize - 1] = 0; - if (!_tcsncmp (bufp, _T("write "), 6)) + if (!_tcsncmp (bufp, _T("write "), 6)) { bufsize--; + } ts = write_log_get_ts(); - if (bufp[0] == '*') + if (bufp[0] == '*') { count++; + } if (SHOW_CONSOLE || console_logging) { - if (lfdetected && ts) + if (lfdetected && ts) { writeconsole (ts); + } writeconsole (bufp); } if (debugfile) { - if (lfdetected && ts) + if (lfdetected && ts) { _ftprintf (debugfile, _T("%s"), ts); + } _ftprintf (debugfile, _T("%s"), bufp); } + if (logtostdoutput) { + DWORD temp; + if (lfdetected && ts) { + char *utf8_ts = uutf8(ts); + WriteFile(stdoutput, utf8_ts, strlen(utf8_ts), &temp, NULL); + xfree(utf8_ts); + } + char *utf8 = uutf8(bufp); + WriteFile(stdoutput, utf8, strlen(utf8), &temp, NULL); + xfree(utf8); + } #if 0 static int is_debugger_present = -1; @@ -734,20 +762,27 @@ void write_log (const TCHAR *format, ...) #endif lfdetected = 0; - if (bufp[0] != '\0' && bufp[_tcslen (bufp) - 1] == '\n') + if (bufp[0] != '\0' && bufp[_tcslen (bufp) - 1] == '\n') { lfdetected = 1; + } va_end (parms); - if (bufp != buffer) + if (bufp != buffer) { xfree (bufp); - if (always_flush_log) + } + if (always_flush_log) { flush_log (); + if (logtostdoutput) { + FlushFileBuffers(stdoutput); + } + } LeaveCriticalSection (&cs); } void flush_log (void) { - if (debugfile) + if (debugfile) { fflush (debugfile); + } flushconsole (); } @@ -758,8 +793,9 @@ void f_out (void *f, const TCHAR *format, ...) va_list parms; va_start (parms, format); - if (f == NULL || !consoleopen) + if (f == NULL || !consoleopen) { return; + } count = _vsntprintf (buffer, WRITE_LOG_BUF_SIZE - 1, format, parms); openconsole (); writeconsole (buffer); @@ -772,8 +808,9 @@ TCHAR *buf_out(TCHAR *buffer, int *bufsize, const TCHAR *format, ...) va_list parms; va_start (parms, format); - if (buffer == NULL) + if (buffer == NULL) { return 0; + } count = _vsntprintf(buffer, (*bufsize) - 1, format, parms); va_end (parms); *bufsize -= uaetcslen(buffer); @@ -784,8 +821,17 @@ FILE *log_open (const TCHAR *name, int append, int bootlog, TCHAR *outpath) { FILE *f = NULL; - if (!cs_init) + if (!cs_init) { InitializeCriticalSection (&cs); + HANDLE so = GetStdHandle(STD_OUTPUT_HANDLE); + if (so) { + if (GetFileType(so) == FILE_TYPE_DISK) { + logtostdoutput = true; + stdinput = GetStdHandle(STD_INPUT_HANDLE); + stdoutput = so; + } + } + } cs_init = 1; if (name != NULL) {