]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Log redirection to a file and -version command line parameter
authorToni Wilen <twilen@winuae.net>
Sat, 17 Jan 2026 10:57:10 +0000 (12:57 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 17 Jan 2026 10:57:10 +0000 (12:57 +0200)
od-win32/win32.cpp
od-win32/writelog.cpp

index ddd633a412c6a32c6e6c85dc8194ef7141f81444..b6be0363b0f06939bede10f03518398eb0156b9e 100644 (file)
@@ -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 ();
index f009d6389361f705b88439ecbf1f7279817a3b91..f734ac044f7e769e460e8699dc43887777c6c6d6 100644 (file)
@@ -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) {