Finally, it works!

master
mark 20 years ago
parent 7adc71403b
commit 9f03209394

@ -312,8 +312,9 @@ static int file_lock(lua_State *L, FILE *f, const char *mode, long offset, long
HANDLE h = get_handle(f); HANDLE h = get_handle(f);
DWORD flags; DWORD flags;
LARGE_INTEGER len = {0,0}; LARGE_INTEGER len = {0,0};
OVERLAPPED ov = {.hEvent = INVALID_HANDLE_VALUE}; OVERLAPPED ov = {0};
BOOL ret; BOOL ret;
ov.hEvent = INVALID_HANDLE_VALUE;
if (length) len.LowPart = length; if (length) len.LowPart = length;
else len.LowPart = GetFileSize(h, &len.HighPart); else len.LowPart = GetFileSize(h, &len.HighPart);
ov.Offset = offset; ov.Offset = offset;

@ -27,15 +27,11 @@ struct spawn_params {
struct spawn_params *spawn_param_init(lua_State *L) struct spawn_params *spawn_param_init(lua_State *L)
{ {
static const STARTUPINFO si = {sizeof si};
struct spawn_params *p = lua_newuserdata(L, sizeof *p); struct spawn_params *p = lua_newuserdata(L, sizeof *p);
p->L = L; p->L = L;
p->cmdline = 0; p->cmdline = p->environment = 0;
p->environment = 0; p->si = si;
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);
return p; 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) void spawn_param_redirect(struct spawn_params *p, const char *stdname, FILE *f)
{ {
HANDLE h = get_handle(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]) { switch (stdname[3]) {
case 'i': p->si.hStdInput = h; break; case 'i': p->si.hStdInput = h; break;
case 'o': p->si.hStdOutput = h; break; case 'o': p->si.hStdOutput = h; break;
case 'e': p->si.hStdError = h; break; case 'e': p->si.hStdError = h; break;
} }
p->si.dwFlags |= STARTF_USESTDHANDLES;
} }
struct process { struct process {
@ -143,7 +145,7 @@ int spawn_param_execute(struct spawn_params *p)
c = strdup(p->cmdline); c = strdup(p->cmdline);
e = (char *)p->environment; /* strdup(p->environment); */ e = (char *)p->environment; /* strdup(p->environment); */
/* XXX does CreateProcess modify its environment argument? */ /* 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); */ /* if (e) free(e); */
free(c); free(c);
if (!ret) if (!ret)

Loading…
Cancel
Save