From: Sebastian Lackner Subject: wineconsole: Forward child process exitcode. Message-Id: <56036151.3020702@fds-team.de> Date: Thu, 24 Sep 2015 04:34:57 +0200 From: Michael Müller Signed-off-by: Michael Müller Signed-off-by: Sebastian Lackner --- programs/wineconsole/winecon_private.h | 1 + programs/wineconsole/wineconsole.c | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/programs/wineconsole/winecon_private.h b/programs/wineconsole/winecon_private.h index 2178dd0..5608f99 100644 --- a/programs/wineconsole/winecon_private.h +++ b/programs/wineconsole/winecon_private.h @@ -59,6 +59,7 @@ struct inner_data { HANDLE hConIn; /* console input handle */ HANDLE hConOut; /* screen buffer handle: has to be changed when active sb changes */ HANDLE hSynchro; /* waitable handle signalled by server when something in server has been modified */ + HANDLE hProcess; /* handle to the child process or NULL */ HWND hWnd; /* handle of 'user' window or NULL for 'curses' */ INT nCmdShow; /* argument of WinMain */ BOOL in_set_config; /* to handle re-entrant calls to WINECON_SetConfig */ diff --git a/programs/wineconsole/wineconsole.c b/programs/wineconsole/wineconsole.c index 4ea5f84..f92632c 100644 --- a/programs/wineconsole/wineconsole.c +++ b/programs/wineconsole/wineconsole.c @@ -541,6 +541,7 @@ static void WINECON_Delete(struct inner_data* data) if (data->hConIn) CloseHandle(data->hConIn); if (data->hConOut) CloseHandle(data->hConOut); if (data->hSynchro) CloseHandle(data->hSynchro); + if (data->hProcess) CloseHandle(data->hProcess); HeapFree(GetProcessHeap(), 0, data->curcfg.registry); HeapFree(GetProcessHeap(), 0, data->cells); HeapFree(GetProcessHeap(), 0, data); @@ -749,7 +750,7 @@ static BOOL WINECON_Spawn(struct inner_data* data, LPWSTR cmdLine) done = CreateProcessW(NULL, cmdLine, NULL, NULL, TRUE, 0L, NULL, NULL, &startup, &info); if (done) { - CloseHandle(info.hProcess); + data->hProcess = info.hProcess; CloseHandle(info.hThread); } @@ -892,8 +893,18 @@ int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, INT nCmdSh if (!ret) { - WINE_TRACE("calling MainLoop.\n"); - ret = data->fnMainLoop(data); + DWORD exitcode; + + WINE_TRACE("calling MainLoop.\n"); + ret = data->fnMainLoop(data); + + if (!ret && data->hProcess && + WaitForSingleObject(data->hProcess, INFINITE) == WAIT_OBJECT_0 && + GetExitCodeProcess(data->hProcess, &exitcode)) + { + WINE_TRACE("forwarding exitcode %u from child process\n", exitcode); + ret = exitcode; + } } WINECON_Delete(data); -- 2.5.1