Hi ----- Original Message ----- > These utility use some trick to use console even if they are GUI > application (not supposed to have a console by default). > This make output redirection harder as output by default will tend > to go to console of parent process instead of using redirected output. > This utility avoid remote-viewer/virt-viewer to see the calling process > console keeping the wanted redirection. This looks like it should replace windows-cmdline-wrapper altogether. > > Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > --- > src/Makefile.am | 4 ++ > src/output-redirect-wrapper.c | 92 > +++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 96 insertions(+) > create mode 100644 src/output-redirect-wrapper.c > > diff --git a/src/Makefile.am b/src/Makefile.am > index e76f5bc..01b9bc8 100644 > --- a/src/Makefile.am > +++ b/src/Makefile.am > @@ -155,6 +155,10 @@ bin_PROGRAMS += windows-cmdline-wrapper > windows_cmdline_wrapper_SOURCES = windows-cmdline-wrapper.c > windows_cmdline_wrapper_LDFLAGS = -lpsapi > > +bin_PROGRAMS += output-redirect-wrapper > +output_redirect_wrapper_SOURCES = output-redirect-wrapper.c > +output_redirect_wrapper_CPPFLAGS = -DUNICODE -D_UNICODE > + > virt-viewer_rc.$(OBJEXT): $(VIRT_VIEWER_RES) $(ICONDIR)/virt-viewer.ico > $(AM_V_GEN)$(WINDRES) \ > -DICONDIR='\"$(ICONDIR)\"' \ > diff --git a/src/output-redirect-wrapper.c b/src/output-redirect-wrapper.c > new file mode 100644 > index 0000000..ed807bb > --- /dev/null > +++ b/src/output-redirect-wrapper.c > @@ -0,0 +1,92 @@ > +/* > + * Windows cmd: a command line wrapper for GUI applications > + * > + * Copyright (C) 2012-2016 Red Hat, Inc. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of the GNU General Public License as published by > + * the Free Software Foundation; either version 2 of the License, or > + * (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > + * > + * Usage: > + * This wrapper allows to redirect output even if your application > + * tries to redirect its output to console. > + * > + * For instance you can use from console with a syntax like > + * > + * output-redirect-wrapper remote-viewer.exe --debug > log.txt > + * > + * Based on Marc-André Lureau wrappers > + */ > + > +#include <windows.h> > +#include <stdio.h> > +#include <string.h> > +#include <tchar.h> > + > +int main(void) > +{ > + STARTUPINFO si = { 0, }; > + PROCESS_INFORMATION pi = { 0, }; > + > + // pass same input/output handles > + si.cb = sizeof(si); > + si.dwFlags = STARTF_USESTDHANDLES; > + si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); > + // redirect all to single output > + si.hStdError = si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); > + SetHandleInformation(si.hStdInput, HANDLE_FLAG_INHERIT, > HANDLE_FLAG_INHERIT); > + SetHandleInformation(si.hStdOutput, HANDLE_FLAG_INHERIT, > HANDLE_FLAG_INHERIT); > + > + // parse command line, strip executable > + TCHAR *cmdline = GetCommandLine(); > + cmdline += _tcsspn(cmdline, _T(" \t\v")); > + TCHAR *end = _tcsstr(cmdline, cmdline[0] == _T('\"') ? _T("\" ") : _T(" > ")); > + if (!end) { > + fprintf(stderr, "Please pass executable to call\n"); > + return 1; > + } > + cmdline = end + 1; > + cmdline += _tcsspn(cmdline, _T(" \t\v")); > + > + // release console so program launched do not redirect to it > + FreeConsole(); > + > + if (!CreateProcess(NULL, > + cmdline, > + NULL, // Process handle not inheritable > + NULL, // Thread handle not inheritable > + TRUE, // Handle inheritance > + 0, // No creation flags > + NULL, // Use parent's environment block > + NULL, // Use parent's starting directory > + &si, > + &pi)) { > + fprintf(stderr, "CreateProcess failed (%ld).\n", (long) > GetLastError()); > + return 1; > + } > + // Close unneeded handle > + CloseHandle(pi.hThread); > + > + // Wait until child process exits. > + WaitForSingleObject(pi.hProcess, INFINITE); > + > + DWORD exit_code; > + GetExitCodeProcess(pi.hProcess, &exit_code); > + > + // Close process handle > + CloseHandle(pi.hProcess); > + > + // return same output of application > + ExitProcess(exit_code); > + return 0; > +} > -- > 2.5.0 > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/spice-devel > _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel