Jacek Caban : wineconsole: Move WINECON_Spawn call to WINECON_Init.
Alexandre Julliard
julliard at winehq.org
Thu Jul 30 15:31:25 CDT 2020
Module: wine
Branch: master
Commit: 504d6eaa9a0642e6c71aa320cb5ac1e88dc44a01
URL: https://source.winehq.org/git/wine.git/?a=commit;h=504d6eaa9a0642e6c71aa320cb5ac1e88dc44a01
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jul 30 17:15:19 2020 +0200
wineconsole: Move WINECON_Spawn call to WINECON_Init.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/wineconsole/wineconsole.c | 113 +++++++++++++++++--------------------
1 file changed, 53 insertions(+), 60 deletions(-)
diff --git a/programs/wineconsole/wineconsole.c b/programs/wineconsole/wineconsole.c
index 8752ec6b13..c78a7f814b 100644
--- a/programs/wineconsole/wineconsole.c
+++ b/programs/wineconsole/wineconsole.c
@@ -579,6 +579,53 @@ static BOOL WINECON_GetServerConfig(struct inner_data* data)
return TRUE;
}
+/******************************************************************
+ * WINECON_Spawn
+ *
+ * Spawn the child process when invoked with wineconsole foo bar
+ */
+static BOOL WINECON_Spawn(struct inner_data* data, LPWSTR cmdLine)
+{
+ PROCESS_INFORMATION info;
+ STARTUPINFOW startup;
+ BOOL done;
+
+ /* we're in the case wineconsole <exe> <options>... spawn the new process */
+ memset(&startup, 0, sizeof(startup));
+ startup.cb = sizeof(startup);
+ startup.dwFlags = STARTF_USESTDHANDLES;
+
+ /* the attributes of wineconsole's handles are not adequate for inheritance, so
+ * get them with the correct attributes before process creation
+ */
+ if (!DuplicateHandle(GetCurrentProcess(), data->hConIn, GetCurrentProcess(),
+ &startup.hStdInput, GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE, TRUE, 0) ||
+ !DuplicateHandle(GetCurrentProcess(), data->hConOut, GetCurrentProcess(),
+ &startup.hStdOutput, GENERIC_READ|GENERIC_WRITE, TRUE, 0) ||
+ !DuplicateHandle(GetCurrentProcess(), data->hConOut, GetCurrentProcess(),
+ &startup.hStdError, GENERIC_READ|GENERIC_WRITE, TRUE, 0))
+ {
+ WINE_ERR("Can't dup handles\n");
+ /* no need to delete handles, we're exiting the program anyway */
+ return FALSE;
+ }
+
+ done = CreateProcessW(NULL, cmdLine, NULL, NULL, TRUE, 0L, NULL, NULL, &startup, &info);
+ if (done)
+ {
+ data->hProcess = info.hProcess;
+ CloseHandle(info.hThread);
+ }
+ else printf_res(IDS_CMD_LAUNCH_FAILED, wine_dbgstr_w(cmdLine));
+
+ /* we no longer need the handles passed to the child for the console */
+ CloseHandle(startup.hStdInput);
+ CloseHandle(startup.hStdOutput);
+ CloseHandle(startup.hStdError);
+
+ return done;
+}
+
/******************************************************************
* WINECON_Init
*
@@ -587,7 +634,7 @@ static BOOL WINECON_GetServerConfig(struct inner_data* data)
*/
static struct inner_data* WINECON_Init(HINSTANCE hInst, DWORD pid, LPCWSTR appname,
enum init_return (*backend)(struct inner_data*),
- INT nCmdShow)
+ INT nCmdShow, WCHAR *cmdline)
{
struct condrv_input_info_params input_params;
OBJECT_ATTRIBUTES attr = {sizeof(attr)};
@@ -708,7 +755,9 @@ static struct inner_data* WINECON_Init(HINSTANCE hInst, DWORD pid, LPCWSTR appna
lstrlenW(appname) * sizeof(WCHAR), NULL, 0, NULL, NULL);
if (!ret) goto error;
+ if (cmdline && !WINECON_Spawn(data, cmdline)) goto error;
return data;
+
case init_failed:
break;
}
@@ -720,52 +769,6 @@ static struct inner_data* WINECON_Init(HINSTANCE hInst, DWORD pid, LPCWSTR appna
return NULL;
}
-/******************************************************************
- * WINECON_Spawn
- *
- * Spawn the child process when invoked with wineconsole foo bar
- */
-static int WINECON_Spawn(struct inner_data* data, LPWSTR cmdLine)
-{
- PROCESS_INFORMATION info;
- STARTUPINFOW startup;
- BOOL done;
-
- /* we're in the case wineconsole <exe> <options>... spawn the new process */
- memset(&startup, 0, sizeof(startup));
- startup.cb = sizeof(startup);
- startup.dwFlags = STARTF_USESTDHANDLES;
-
- /* the attributes of wineconsole's handles are not adequate for inheritance, so
- * get them with the correct attributes before process creation
- */
- if (!DuplicateHandle(GetCurrentProcess(), data->hConIn, GetCurrentProcess(),
- &startup.hStdInput, GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE, TRUE, 0) ||
- !DuplicateHandle(GetCurrentProcess(), data->hConOut, GetCurrentProcess(),
- &startup.hStdOutput, GENERIC_READ|GENERIC_WRITE, TRUE, 0) ||
- !DuplicateHandle(GetCurrentProcess(), data->hConOut, GetCurrentProcess(),
- &startup.hStdError, GENERIC_READ|GENERIC_WRITE, TRUE, 0))
- {
- WINE_ERR("Can't dup handles\n");
- /* no need to delete handles, we're exiting the program anyway */
- return 1;
- }
-
- done = CreateProcessW(NULL, cmdLine, NULL, NULL, TRUE, 0L, NULL, NULL, &startup, &info);
- if (done)
- {
- data->hProcess = info.hProcess;
- CloseHandle(info.hThread);
- }
-
- /* we no longer need the handles passed to the child for the console */
- CloseHandle(startup.hStdInput);
- CloseHandle(startup.hStdOutput);
- CloseHandle(startup.hStdError);
-
- return !done;
-}
-
struct wc_init {
LPCSTR ptr;
enum {from_event, from_process_name} mode;
@@ -859,7 +862,7 @@ int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, INT nCmdSh
{
case from_event:
/* case of wineconsole <evt>, signal process that created us that we're up and running */
- if (!(data = WINECON_Init(hInst, 0, NULL, wci.backend, nCmdShow))) return 1;
+ if (!(data = WINECON_Init(hInst, 0, NULL, wci.backend, nCmdShow, NULL))) return 1;
ret = !SetEvent(wci.event);
if (ret != 0) WINE_ERR("SetEvent failed.\n");
break;
@@ -876,19 +879,9 @@ int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, INT nCmdSh
MultiByteToWideChar(CP_ACP, 0, wci.ptr, -1, buffer, len);
- if (!(data = WINECON_Init(hInst, GetCurrentProcessId(), buffer, wci.backend, nCmdShow)))
- {
- HeapFree(GetProcessHeap(), 0, buffer);
- return 1;
- }
- ret = WINECON_Spawn(data, buffer);
+ data = WINECON_Init(hInst, GetCurrentProcessId(), buffer, wci.backend, nCmdShow, buffer);
HeapFree(GetProcessHeap(), 0, buffer);
- if (ret != 0)
- {
- WINECON_Delete(data);
- printf_res(IDS_CMD_LAUNCH_FAILED, wine_dbgstr_a(wci.ptr));
- return ret;
- }
+ if (!data) return 1;
}
break;
default:
More information about the wine-cvs
mailing list