From 5c5ce97e2586699988d2c7a621cec7fc5530f0c5 Mon Sep 17 00:00:00 2001 From: kichik Date: Wed, 2 Oct 2002 16:00:18 +0000 Subject: [PATCH] Now doesn't crash when using Exec and not ExecToLog. ExecToLog timeout is not yet implemented. git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@1271 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/nsExec/nsExec.txt | 4 +- Contrib/nsExec/nsexec.c | 109 ++++++++++++++++++++------------------ Plugins/nsExec.dll | Bin 5120 -> 5120 bytes 3 files changed, 60 insertions(+), 53 deletions(-) diff --git a/Contrib/nsExec/nsExec.txt b/Contrib/nsExec/nsExec.txt index a89ba5e1..c58ca03f 100644 --- a/Contrib/nsExec/nsExec.txt +++ b/Contrib/nsExec/nsExec.txt @@ -17,7 +17,9 @@ to the logwindow. The timeout value is optional and is used to set the time in milliseconds for the plugin to wait for the process to return -before it quits. +before it quits, or the time in milliseconds for the plugin +to wait for output to come out before it quits if using +ExecToLog. The default is no timeout. Return Value diff --git a/Contrib/nsExec/nsexec.c b/Contrib/nsExec/nsexec.c index 83acbffb..b5b459f3 100644 --- a/Contrib/nsExec/nsexec.c +++ b/Contrib/nsExec/nsexec.c @@ -29,6 +29,7 @@ freely, subject to the following restrictions: #define false FALSE #endif #define TIMEOUT 15000 +#define NOLOG_TIMEOUT 600000 #define LOOPTIMEOUT 100 HINSTANCE g_hInstance; @@ -68,7 +69,7 @@ BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lp } void ExecScript(BOOL log) { - g_to = TIMEOUT; + g_to = INFINITE; g_foundto = FALSE; g_hwndDlg = FindWindowEx(g_hwndParent,NULL,"#32770",NULL); g_hwndList = FindWindowEx(g_hwndDlg,NULL,"SysListView32",NULL); @@ -78,7 +79,7 @@ void ExecScript(BOOL log) { if (my_strstr(g_szto,"/TIMEOUT=")) { g_szto += 9; g_to = my_atoi(g_szto); - if (g_to<0) g_to = TIMEOUT; + if (g_to<0) g_to = log?TIMEOUT:NOLOG_TIMEOUT; g_foundto = TRUE; } } @@ -112,20 +113,21 @@ void ExecScript(BOOL log) { return; } szUnusedBuf = (char *)GlobalLock(hUnusedBuf); + + GetVersionEx(&osv); + if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) { + InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION); + SetSecurityDescriptorDacl(&sd,true,NULL,false); + sa.lpSecurityDescriptor = &sd; + } + else sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = true; + if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) { + pushstring("error"); + return; + } } - GetVersionEx(&osv); - if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) { - InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION); - SetSecurityDescriptorDacl(&sd,true,NULL,false); - sa.lpSecurityDescriptor = &sd; - } - else sa.lpSecurityDescriptor = NULL; - sa.bInheritHandle = true; - if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) { - pushstring("error"); - return; - } GetStartupInfo(&si); si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; @@ -138,51 +140,54 @@ void ExecScript(BOOL log) { return; } - while (dwExit == STILL_ACTIVE || dwRead) { - PeekNamedPipe(read_stdout, 0, 0, 0, &dwRead, NULL); - if (dwRead) { - ReadFile(read_stdout, szBuf, sizeof(szBuf)-1, &dwRead, NULL); - szBuf[dwRead] = 0; - if (log) { - char *p, *lineBreak; - SIZE_T iReqLen = lstrlen(szBuf) + lstrlen(szUnusedBuf); - if (GlobalSize(hUnusedBuf) < iReqLen) { - GlobalUnlock(hUnusedBuf); - hUnusedBuf = GlobalReAlloc(hUnusedBuf, iReqLen+sizeof(szBuf), GHND); - if (!hUnusedBuf) { - pushstring("error"); - CloseHandle(pi.hThread); - CloseHandle(pi.hProcess); - CloseHandle(newstdout); - CloseHandle(read_stdout); - return; + if (log) { + while (dwExit == STILL_ACTIVE || dwRead) { + PeekNamedPipe(read_stdout, 0, 0, 0, &dwRead, NULL); + if (dwRead) { + ReadFile(read_stdout, szBuf, sizeof(szBuf)-1, &dwRead, NULL); + szBuf[dwRead] = 0; + { + char *p, *lineBreak; + SIZE_T iReqLen = lstrlen(szBuf) + lstrlen(szUnusedBuf); + if (GlobalSize(hUnusedBuf) < iReqLen) { + GlobalUnlock(hUnusedBuf); + hUnusedBuf = GlobalReAlloc(hUnusedBuf, iReqLen+sizeof(szBuf), GHND); + if (!hUnusedBuf) { + pushstring("error"); + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + CloseHandle(newstdout); + CloseHandle(read_stdout); + return; + } + szUnusedBuf = (char *)GlobalLock(hUnusedBuf); } - szUnusedBuf = (char *)GlobalLock(hUnusedBuf); - } - p = szUnusedBuf; // get the old left overs - lstrcat(p, szBuf); + p = szUnusedBuf; // get the old left overs + lstrcat(p, szBuf); - while (lineBreak = my_strstr(p, "\r\n")) { - *lineBreak = 0; - LogMessage(p); - p = lineBreak + 2; - } + while (lineBreak = my_strstr(p, "\r\n")) { + *lineBreak = 0; + LogMessage(p); + p = lineBreak + 2; + } - // If data was taken out from the unused buffer, move p contents to the start of szUnusedBuf - if (p != szUnusedBuf) { - char *p2 = szUnusedBuf; - while (*p) *p2++ = *p++; - *p2 = 0; + // If data was taken out from the unused buffer, move p contents to the start of szUnusedBuf + if (p != szUnusedBuf) { + char *p2 = szUnusedBuf; + while (*p) *p2++ = *p++; + *p2 = 0; + } } } + else Sleep(LOOPTIMEOUT); + GetExitCodeProcess(pi.hProcess, &dwExit); + if (dwExit != STILL_ACTIVE) { + PeekNamedPipe(read_stdout, 0, 0, 0, &dwRead, NULL); + } } - else Sleep(LOOPTIMEOUT); - GetExitCodeProcess(pi.hProcess, &dwExit); - if (dwExit != STILL_ACTIVE) { - PeekNamedPipe(read_stdout, 0, 0, 0, &dwRead, NULL); - } + if (*szUnusedBuf) LogMessage(szUnusedBuf); } - if (*szUnusedBuf) LogMessage(szUnusedBuf); + else WaitForSingleObject(pi.hProcess, g_to); wsprintf(szRet,"%d",dwExit); pushstring(szRet); CloseHandle(pi.hThread); diff --git a/Plugins/nsExec.dll b/Plugins/nsExec.dll index 391e8508d28c7a1038c7b3be20bf07741f686cf9..7594a60f09e810f118165b3bb504f4d3767b217a 100644 GIT binary patch delta 1928 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