krb5 commit: Fix Leash console option

Greg Hudson ghudson at mit.edu
Wed Sep 9 17:39:03 EDT 2020


https://github.com/krb5/krb5/commit/01164c45c84e2292a2c29ff125d5d2e8fb9cd675
commit 01164c45c84e2292a2c29ff125d5d2e8fb9cd675
Author: Greg Hudson <ghudson at mit.edu>
Date:   Tue Aug 18 12:46:50 2020 -0400

    Fix Leash console option
    
    Remove out2con.cpp, which no longer works.  Replace it with a simple
    method for creating a console and redirecting stdout and stderr to it.
    
    ticket: 8937 (new)

 src/windows/leash/Leash.cpp   |    6 +-
 src/windows/leash/Makefile.in |    1 -
 src/windows/leash/out2con.cpp |  124 -----------------------------------------
 src/windows/leash/out2con.h   |   38 -------------
 4 files changed, 4 insertions(+), 165 deletions(-)

diff --git a/src/windows/leash/Leash.cpp b/src/windows/leash/Leash.cpp
index a9bb8ea..5aada73 100644
--- a/src/windows/leash/Leash.cpp
+++ b/src/windows/leash/Leash.cpp
@@ -25,7 +25,6 @@
 #include "reminder.h"
 #include <leasherr.h>
 #include "lglobals.h"
-#include "out2con.h"
 #include <krb5.h>
 #include <com_err.h>
 
@@ -291,7 +290,10 @@ BOOL CLeashApp::InitInstance()
             else if (0 == stricmp(optionParam+1, "console") ||
                      0 == stricmp(optionParam+1, "c"))
             {
-                CreateConsoleEcho();
+                FILE *dummy;
+                AllocConsole();
+                freopen_s(&dummy, "CONOUT$", "w", stderr);
+                freopen_s(&dummy, "CONOUT$", "w", stdout);
             }
             else if (0 == stricmp(optionParam+1, "noribbon"))
             {
diff --git a/src/windows/leash/Makefile.in b/src/windows/leash/Makefile.in
index 4ed42f7..645cdec 100644
--- a/src/windows/leash/Makefile.in
+++ b/src/windows/leash/Makefile.in
@@ -16,7 +16,6 @@ OBJS=   \
 	$(OUTPRE)LeashUICommandHandler.obj \
 	$(OUTPRE)LeashView.obj \
 	$(OUTPRE)MainFrm.obj \
-	$(OUTPRE)out2con.obj \
 	$(OUTPRE)StdAfx.obj \
 	$(OUTPRE)KrbListTickets.obj
 
diff --git a/src/windows/leash/out2con.cpp b/src/windows/leash/out2con.cpp
deleted file mode 100644
index 877eac1..0000000
--- a/src/windows/leash/out2con.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-#include "out2con.h"
-
-#include <windows.h>
-#include <stdio.h>
-#include <io.h>
-
-class ConsoleEcho
-{
-public:
-    ConsoleEcho();
-    ~ConsoleEcho();
-
-private:
-    DWORD ThreadLoop();
-
-    static DWORD WINAPI ThreadFunc(void* param);
-
-    FILE m_originalStdout;
-    int m_stdoutfd;
-    int m_pipefd;
-    HANDLE m_hReadPipe, m_hWritePipe;
-    HANDLE m_hThread;
-
-    static const int BUFSIZE=512;
-};
-
-
-ConsoleEcho *
-CreateConsoleEcho()
-{
-    return new ConsoleEcho;
-}
-
-void
-DestroyConsoleEcho(ConsoleEcho *echo)
-{
-    delete echo;
-}
-
-
-DWORD WINAPI ConsoleEcho::ThreadFunc(void* param)
-{
-    return ((ConsoleEcho*)(param))->ThreadLoop();
-}
-
-
-DWORD ConsoleEcho::ThreadLoop()
-{
-    DWORD dwRead, dwWritten;
-    CHAR chBuf[BUFSIZE];
-    BOOL bSuccess = FALSE;
-    // Note that the following does not work when running in the msvc2010
-    // debugger with redirected output; you still get the redirected file
-    // handle, not the console:
-    //HANDLE hConsoleStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
-    // This seems to be more reliable:
-    HANDLE hConsoleStdOut = CreateFile("CONOUT$",
-                                       GENERIC_WRITE,
-                                       FILE_SHARE_WRITE,
-                                       NULL, OPEN_EXISTING, 0, 0);
-    for (;;) {
-        // read from redirected stdout
-        bSuccess = ReadFile(m_hReadPipe, chBuf, BUFSIZE, &dwRead, NULL);
-        if (!bSuccess || (dwRead == 0))
-            break;
-
-        // write to console
-        WriteFile(hConsoleStdOut, chBuf, dwRead, &dwWritten, NULL);
-        // also write to original stdout
-        if (m_stdoutfd>=0) {
-            _write(m_stdoutfd, chBuf, dwRead);
-            // _commit() causes assert if m_stdoutfd is a device (e.g., console or NUL).
-            if (!_isatty(m_stdoutfd))
-                _commit(m_stdoutfd);
-        }
-    }
-    CloseHandle(hConsoleStdOut);
-    return 0;
-}
-
-ConsoleEcho::ConsoleEcho()
-{
-    // setup console
-    AllocConsole();
-    // create pipe
-    CreatePipe(&m_hReadPipe, &m_hWritePipe, NULL, 0);
-    // save original stdout to preserve commandline-specified redirection
-    m_stdoutfd = _fileno(stdout);
-    // and copy the whole damn FILE structure so we can restore it
-    // when we're done.  I don't know any other way to restore the
-    // crazy windows gui default '-2' filedesc stdout.
-    m_originalStdout = *stdout;
-    // hook up the write end of our pipe to stdout
-    m_pipefd = _open_osfhandle((intptr_t)m_hWritePipe, 0);
-    // take our os file handle and allocate a crt FILE for it
-    FILE* fp = _fdopen(m_pipefd, "w");
-    // copy to stdout
-    *stdout = *fp;
-    // fp leaks, but we can't close it without closing the OS file handle
-
-    // disable buffering
-    setvbuf(stdout, NULL, _IONBF, 0);
-
-    // Create a thread to process our pipe, forwarding output
-    // to both the console and the original stdout
-    m_hThread = CreateThread(NULL, 0, &ThreadFunc, this, 0, NULL);
-}
-
-ConsoleEcho::~ConsoleEcho()
-{
-    // fclose() unfortunately immediately invalidates the read pipe before the
-    // pipe thread has a chance to flush it, so don't do that.
-    //fclose(stdout);
-
-    // instead, just slam the original stdout
-    *stdout = m_originalStdout;
-    //printf("Safe to printf now and no longer echoed to console.\n");
-    // Close write pipe
-    _close(m_pipefd);
-    // and wait here for pipe thread to exit
-    WaitForSingleObject(m_hThread, 1000);
-    // now close read pipe as well
-    CloseHandle(m_hReadPipe);
-}
diff --git a/src/windows/leash/out2con.h b/src/windows/leash/out2con.h
deleted file mode 100644
index ebd3859..0000000
--- a/src/windows/leash/out2con.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef OUT2CON_H
-#define OUT2CON_H
-
-/* Call CreateConsoleEcho() to create a console and begin echoing stdout to it.
- * The original stream (if any) will still receive output from stdout.
- * Call DestroyConsoleEcho() to stop echoing stdout to the console.
- * The original stream continues to receive stdout.
- *
- * WARNING: it is not safe to use stdout from another thread during
- *          CreateConsoleEcho() or DestroyConsoleEcho()
- */
-
-class ConsoleEcho;
-
-ConsoleEcho *
-CreateConsoleEcho();
-
-void
-DestroyConsoleEcho(ConsoleEcho *consoleEcho);
-
-// Convenience class to automatically echo to console within a scope
-class AutoConsoleEcho
-{
-public:
-    AutoConsoleEcho() : m_echo(CreateConsoleEcho())
-    {
-    }
-
-    ~AutoConsoleEcho()
-    {
-        DestroyConsoleEcho(m_echo);
-    }
-private:
-    ConsoleEcho* m_echo;
-};
-
-
-#endif


More information about the cvs-krb5 mailing list