]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Fix not being able to colour format output to stderr on Windows.
authorSadie Powell <sadie@witchery.services>
Wed, 3 Mar 2021 01:52:27 +0000 (01:52 +0000)
committerSadie Powell <sadie@witchery.services>
Wed, 3 Mar 2021 01:52:27 +0000 (01:52 +0000)
include/consolecolors.h
src/inspircd.cpp
win/inspircd_win32wrapper.cpp
win/inspircd_win32wrapper.h

index fdc351f5a4b6e52059d5c0d1148ba6e7c6060318..e8329c44e85534240bd4047787c1f9500227dff1 100644 (file)
 #include <stdio.h>
 
 #ifdef _WIN32
+# include <iostream>
 # include <io.h>
 # define isatty(x) _isatty((x))
 # define fileno(x) _fileno((x))
+extern WindowsStream StandardError;
+extern WindowsStream StandardOutput;
 #else
 # include <unistd.h>
 #endif
@@ -42,55 +45,83 @@ namespace
                return isatty(fileno(stdout));
 #endif
        }
+
+#ifdef _WIN32
+       inline WindowsStream& GetStreamHandle(std::ostream& os)
+       {
+               if (os.rdbuf() == std::cerr.rdbuf())
+                       return StandardError;
+
+               if (os.rdbuf() == std::cout.rdbuf())
+                       return StandardOutput;
+
+               // This will never happen.
+               throw std::invalid_argument("Tried to write color codes to a stream other than stdout or stderr!");
+       }
+#endif
 }
 
 #ifdef _WIN32
 
 #include <windows.h>
 
-extern WORD g_wOriginalColors;
-extern WORD g_wBackgroundColor;
-extern HANDLE g_hStdout;
-
 inline std::ostream& con_green(std::ostream& stream)
 {
        if (CanUseColors())
-               SetConsoleTextAttribute(g_hStdout, FOREGROUND_GREEN|FOREGROUND_INTENSITY|g_wBackgroundColor);
+       {
+               const WindowsStream& ws = GetStreamHandle(stream);
+               SetConsoleTextAttribute(ws.Handle, FOREGROUND_GREEN | FOREGROUND_INTENSITY | ws.BackgroundColor);
+       }
        return stream;
 }
 
 inline std::ostream& con_red(std::ostream& stream)
 {
        if (CanUseColors())
-               SetConsoleTextAttribute(g_hStdout, FOREGROUND_RED|FOREGROUND_INTENSITY|g_wBackgroundColor);
+       {
+               const WindowsStream& ws = GetStreamHandle(stream);
+               SetConsoleTextAttribute(ws.Handle, FOREGROUND_RED | FOREGROUND_INTENSITY | ws.BackgroundColor);
+       }
        return stream;
 }
 
 inline std::ostream& con_white(std::ostream& stream)
 {
        if (CanUseColors())
-               SetConsoleTextAttribute(g_hStdout, FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|g_wBackgroundColor);
+       {
+               const WindowsStream& ws = GetStreamHandle(stream);
+               SetConsoleTextAttribute(ws.Handle, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | ws.BackgroundColor);
+       }
        return stream;
 }
 
 inline std::ostream& con_white_bright(std::ostream& stream)
 {
        if (CanUseColors())
-               SetConsoleTextAttribute(g_hStdout, FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY|g_wBackgroundColor);
+       {
+               const WindowsStream& ws = GetStreamHandle(stream);
+               SetConsoleTextAttribute(ws.Handle, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY | ws.BackgroundColor);
+       }
        return stream;
 }
 
 inline std::ostream& con_bright(std::ostream& stream)
 {
        if (CanUseColors())
-               SetConsoleTextAttribute(g_hStdout, FOREGROUND_INTENSITY|g_wBackgroundColor);
+       {
+               const WindowsStream& ws = GetStreamHandle(stream);
+               SetConsoleTextAttribute(ws.Handle, FOREGROUND_INTENSITY | ws.BackgroundColor);
+       }
        return stream;
 }
 
 inline std::ostream& con_reset(std::ostream& stream)
 {
        if (CanUseColors())
-               SetConsoleTextAttribute(g_hStdout, g_wOriginalColors);
+       {
+               const WindowsStream& ws = GetStreamHandle(stream);
+               SetConsoleTextAttribute(ws.Handle, ws.ForegroundColor);
+       }
        return stream;
 }
 
index c0d7a1614c53168b91525ae81c70c112378b8d6c..fca3af6b4cba66ee087215e4e3607e62c871cab4 100644 (file)
        #include <pwd.h> // setuid
        #include <grp.h> // setgid
 #else
-       WORD g_wOriginalColors;
-       WORD g_wBackgroundColor;
-       HANDLE g_hStdout;
+       /** Manages formatting lines written to stderr on Windows. */
+       WindowsStream StandardError(STD_ERROR_HANDLE);
+
+       /** Manages formatting lines written to stdout on Windows. */
+       WindowsStream StandardOutput(STD_OUTPUT_HANDLE);
 #endif
 
 #include <fstream>
@@ -492,22 +494,6 @@ InspIRCd::InspIRCd(int argc, char** argv)
        this->Config->cmdline.argc = argc;
        ParseOptions();
 
-#ifdef _WIN32
-       // Initialize the console values
-       g_hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
-       CONSOLE_SCREEN_BUFFER_INFO bufinf;
-       if(GetConsoleScreenBufferInfo(g_hStdout, &bufinf))
-       {
-               g_wOriginalColors = bufinf.wAttributes & 0x00FF;
-               g_wBackgroundColor = bufinf.wAttributes & 0x00F0;
-       }
-       else
-       {
-               g_wOriginalColors = FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN;
-               g_wBackgroundColor = 0;
-       }
-#endif
-
        {
                ServiceProvider* provs[] =
                {
index c6f5d8232923c7ae1c8f27a93669927d02723ec8..169741ba55950c3dc9bb00f555cf9a3466eeced7 100644 (file)
@@ -55,3 +55,16 @@ DWORD CWin32Exception::GetErrorCode()
 {
        return dwErrorCode;
 }
+
+WindowsStream::WindowsStream(DWORD handle)
+       : BackgroundColor(0)
+       , ForegroundColor(FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN)
+{
+       this->Handle = GetStdHandle(handle);
+       CONSOLE_SCREEN_BUFFER_INFO bufinf;
+       if (GetConsoleScreenBufferInfo(this->Handle, &bufinf))
+       {
+               this->BackgroundColor = bufinf.wAttributes & 0x00F0;
+               this->ForegroundColor = bufinf.wAttributes & 0x00FF;
+       }
+}
index 49fc1c6657a17fa1aa52fdbe6ed3a071ba9dc58c..0f492c9247377b05cd6b68ce515e6669d337f301 100644 (file)
@@ -196,3 +196,11 @@ struct sockaddr_un
        ADDRESS_FAMILY sun_family;
        char sun_path[6];
 };
+
+struct WindowsStream
+{
+       WORD BackgroundColor;
+       WORD ForegroundColor;
+       HANDLE Handle;
+       WindowsStream(DWORD handle);
+};
\ No newline at end of file