From 9f032093947537055ecf2ebbd141091943436b26 Mon Sep 17 00:00:00 2001 From: mark Date: Mon, 13 Feb 2006 18:20:16 +0000 Subject: [PATCH] Finally, it works! --- w32api/ex.c | 3 ++- w32api/spawn.c | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/w32api/ex.c b/w32api/ex.c index 87ba0cc..99baf05 100755 --- a/w32api/ex.c +++ b/w32api/ex.c @@ -312,8 +312,9 @@ static int file_lock(lua_State *L, FILE *f, const char *mode, long offset, long HANDLE h = get_handle(f); DWORD flags; LARGE_INTEGER len = {0,0}; - OVERLAPPED ov = {.hEvent = INVALID_HANDLE_VALUE}; + OVERLAPPED ov = {0}; BOOL ret; + ov.hEvent = INVALID_HANDLE_VALUE; if (length) len.LowPart = length; else len.LowPart = GetFileSize(h, &len.HighPart); ov.Offset = offset; diff --git a/w32api/spawn.c b/w32api/spawn.c index 978a2fe..15ba85a 100755 --- a/w32api/spawn.c +++ b/w32api/spawn.c @@ -27,15 +27,11 @@ struct spawn_params { struct spawn_params *spawn_param_init(lua_State *L) { + static const STARTUPINFO si = {sizeof si}; struct spawn_params *p = lua_newuserdata(L, sizeof *p); p->L = L; - p->cmdline = 0; - p->environment = 0; - memset(&p->si, 0, sizeof p->si); - p->si.cb = 0; - p->si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); - p->si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); - p->si.hStdError = GetStdHandle(STD_ERROR_HANDLE); + p->cmdline = p->environment = 0; + p->si = si; return p; } @@ -114,12 +110,18 @@ void spawn_param_env(struct spawn_params *p) void spawn_param_redirect(struct spawn_params *p, const char *stdname, FILE *f) { HANDLE h = get_handle(f); + SetHandleInformation(h, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); + if (!(p->si.dwFlags & STARTF_USESTDHANDLES)) { + p->si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); + p->si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); + p->si.hStdError = GetStdHandle(STD_ERROR_HANDLE); + p->si.dwFlags |= STARTF_USESTDHANDLES; + } switch (stdname[3]) { case 'i': p->si.hStdInput = h; break; case 'o': p->si.hStdOutput = h; break; case 'e': p->si.hStdError = h; break; } - p->si.dwFlags |= STARTF_USESTDHANDLES; } struct process { @@ -143,7 +145,7 @@ int spawn_param_execute(struct spawn_params *p) c = strdup(p->cmdline); e = (char *)p->environment; /* strdup(p->environment); */ /* XXX does CreateProcess modify its environment argument? */ - ret = CreateProcess(0, c, 0, 0, 0, 0, e, 0, &p->si, &pi); + ret = CreateProcess(0, c, 0, 0, TRUE, 0, e, 0, &p->si, &pi); /* if (e) free(e); */ free(c); if (!ret)