From 3797b9776da93d7b22d9bbed0a5507b0d8bed781 Mon Sep 17 00:00:00 2001 From: kichik Date: Fri, 22 Nov 2002 11:02:22 +0000 Subject: [PATCH] Added ExecToStack git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@1814 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/ExDLL/exdll.h | 2 +- Contrib/nsExec/nsExec.dsp | 2 +- Contrib/nsExec/nsExec.txt | 9 +++- Contrib/nsExec/nsexec.c | 86 +++++++++++++++++++------------------- Contrib/nsExec/test.nsi | 22 ++++------ Plugins/nsExec.dll | Bin 5120 -> 5120 bytes 6 files changed, 61 insertions(+), 60 deletions(-) diff --git a/Contrib/ExDLL/exdll.h b/Contrib/ExDLL/exdll.h index 4f57e38c..32c73dbb 100644 --- a/Contrib/ExDLL/exdll.h +++ b/Contrib/ExDLL/exdll.h @@ -19,7 +19,7 @@ typedef struct _stack_t { } stack_t; -static int g_stringsize; +static unsigned int g_stringsize; static stack_t **g_stacktop; static char *g_variables; diff --git a/Contrib/nsExec/nsExec.dsp b/Contrib/nsExec/nsExec.dsp index 81ed9f42..57f38927 100644 --- a/Contrib/nsExec/nsExec.dsp +++ b/Contrib/nsExec/nsExec.dsp @@ -49,7 +49,7 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /entry:"_DllMainCRTStartup" /dll /machine:I386 /nodefaultlib /out:"../../Plugins/nsExec.dll" /opt:nowin98 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /entry:"_DllMainCRTStartup" /dll /map /machine:I386 /nodefaultlib /out:"../../Plugins/nsExec.dll" /opt:nowin98 # SUBTRACT LINK32 /pdb:none # Begin Target diff --git a/Contrib/nsExec/nsExec.txt b/Contrib/nsExec/nsExec.txt index 8c8e1bc1..dcf06c92 100644 --- a/Contrib/nsExec/nsExec.txt +++ b/Contrib/nsExec/nsExec.txt @@ -12,8 +12,13 @@ nsExec::Exec [/TIMEOUT=x] path nsExec::ExecToLog [/TIMEOUT=x] path -Both functions are the same except ExecToLog will print the output -to the logwindow. +-or- + +nsExec::ExecToStack [/TIMEOUT=x] path + +All functions are the same except ExecToLog will print the output +to the logwindow and ExecToStack will push up to ${NSIS_MAX_STRLEN} +characters of output onto the stack after the return value. The timeout value is optional. The timeout is the time in milliseconds nsExec will wait for output. If output from the diff --git a/Contrib/nsExec/nsexec.c b/Contrib/nsExec/nsexec.c index b6da251f..e526e71e 100644 --- a/Contrib/nsExec/nsexec.c +++ b/Contrib/nsExec/nsexec.c @@ -45,7 +45,7 @@ void __declspec(dllexport) Exec(HWND hwndParent, int string_size, char *variable g_hwndParent=hwndParent; EXDLL_INIT(); { - ExecScript(false); + ExecScript(0); } } @@ -53,7 +53,15 @@ void __declspec(dllexport) ExecToLog(HWND hwndParent, int string_size, char *var g_hwndParent=hwndParent; EXDLL_INIT(); { - ExecScript(true); + ExecScript(1); + } +} + +void __declspec(dllexport) ExecToStack(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { + g_hwndParent=hwndParent; + EXDLL_INIT(); + { + ExecScript(2); } } @@ -61,7 +69,9 @@ BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lp return TRUE; } -void ExecScript(BOOL log) { +void ExecScript(int log) { + char szRet[128] = ""; + g_to = 0; // default is no timeout g_hwndList = FindWindowEx(FindWindowEx(g_hwndParent,NULL,"#32770",NULL),NULL,"SysListView32",NULL); g_exec = (char *)GlobalAlloc(GPTR, sizeof(char)*g_stringsize+1); @@ -73,8 +83,8 @@ void ExecScript(BOOL log) { } } if (!g_exec[0]) { - pushstring("error"); - return; + lstrcpy(szRet, "error"); + goto done; } { STARTUPINFO si={sizeof(si),}; @@ -87,15 +97,14 @@ void ExecScript(BOOL log) { DWORD dwExit = !STILL_ACTIVE; DWORD dwLastOutput; static char szBuf[1024]; - char szRet[128] = ""; HGLOBAL hUnusedBuf; char *szUnusedBuf = 0; if (log) { - hUnusedBuf = GlobalAlloc(GHND, sizeof(szBuf)*4); + hUnusedBuf = GlobalAlloc(GHND, log & 2 ? g_stringsize : sizeof(szBuf)*4); if (!hUnusedBuf) { - pushstring("error"); - return; + lstrcpy(szRet, "error"); + goto done; } szUnusedBuf = (char *)GlobalLock(hUnusedBuf); } @@ -109,8 +118,8 @@ void ExecScript(BOOL log) { else sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = true; if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) { - pushstring("error"); - return; + lstrcpy(szRet, "error"); + goto done; } GetStartupInfo(&si); @@ -119,14 +128,8 @@ void ExecScript(BOOL log) { si.hStdOutput = newstdout; si.hStdError = newstdout; if (!CreateProcess(NULL,g_exec,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi)) { - pushstring("error"); - CloseHandle(newstdout); - CloseHandle(read_stdout); - if (log) { - GlobalUnlock(hUnusedBuf); - GlobalFree(hUnusedBuf); - } - return; + lstrcpy(szRet, "error"); + goto done; } dwLastOutput = GetTickCount(); @@ -140,37 +143,34 @@ void ExecScript(BOOL log) { if (log) { char *p, *lineBreak; SIZE_T iReqLen = lstrlen(szBuf) + lstrlen(szUnusedBuf); - if (GlobalSize(hUnusedBuf) < iReqLen) { + if (GlobalSize(hUnusedBuf) < iReqLen && (iReqLen < g_stringsize || !(log & 2))) { GlobalUnlock(hUnusedBuf); hUnusedBuf = GlobalReAlloc(hUnusedBuf, iReqLen+sizeof(szBuf), GHND); if (!hUnusedBuf) { - pushstring("error"); - CloseHandle(pi.hThread); - CloseHandle(pi.hProcess); - CloseHandle(newstdout); - CloseHandle(read_stdout); - if (log) { - GlobalUnlock(hUnusedBuf); - GlobalFree(hUnusedBuf); - } - return; + lstrcpy(szRet, "error"); + break; } szUnusedBuf = (char *)GlobalLock(hUnusedBuf); } p = szUnusedBuf; // get the old left overs - lstrcat(p, szBuf); - - while (lineBreak = my_strstr(p, "\r\n")) { - *lineBreak = 0; - LogMessage(p); - p = lineBreak + 2; + if (iReqLen < g_stringsize || !(log & 2)) lstrcat(p, szBuf); + else { + lstrcpyn(p + lstrlen(p), szBuf, g_stringsize - lstrlen(p)); } - // 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 (!(log & 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; + } } } } @@ -186,7 +186,9 @@ void ExecScript(BOOL log) { PeekNamedPipe(read_stdout, 0, 0, 0, &dwRead, NULL); } } - if (log && *szUnusedBuf) LogMessage(szUnusedBuf); +done: + if (log & 2) pushstring(szUnusedBuf); + if (log & 1 && *szUnusedBuf) LogMessage(szUnusedBuf); if (!szRet[0]) wsprintf(szRet,"%d",dwExit); pushstring(szRet); CloseHandle(pi.hThread); diff --git a/Contrib/nsExec/test.nsi b/Contrib/nsExec/test.nsi index 39af6d8f..d39b4832 100644 --- a/Contrib/nsExec/test.nsi +++ b/Contrib/nsExec/test.nsi @@ -6,25 +6,19 @@ ShowInstDetails show Section "MakeNSIS commands help" nsExec::ExecToLog '"${NSISDIR}\makensis.exe" /CMDHELP' - Pop $0 + Pop $0 # return value/error/timeout DetailPrint "" DetailPrint " Return value: $0" + DetailPrint "" SectionEnd Section "Output to variable" - ReadEnvStr $0 COMSPEC - GetTempFileName $1 - StrCpy $2 "${NSISDIR}\makensis.exe" - GetFullPathName /SHORT $2 $2 - StrCpy $0 '"$0" /C $2 /VERSION > "$1"' - nsExec::Exec $0 - FileOpen $0 $1 r - FileRead $0 $3 - FileClose $0 - SetDetailsPrint none - Delete $1 - SetDetailsPrint both + nsExec::ExecToStack '"${NSISDIR}\makensis.exe" /VERSION' + Pop $0 # return value/error/timeout + Pop $1 # printed text, up to ${NSIS_MAX_STRLEN} + DetailPrint '"${NSISDIR}\makensis.exe" /VERSION printed: $1' DetailPrint "" - DetailPrint "$2 /VERSION returned: $3" + DetailPrint " Return value: $0" DetailPrint "" + Return SectionEnd \ No newline at end of file diff --git a/Plugins/nsExec.dll b/Plugins/nsExec.dll index 293259e3e37a59871f95eb5663390798b689200d..65c761ec40a9e375a861ca256780b759bef45625 100644 GIT binary patch delta 1754 zcmb_cZEO=|9KUM|>!e$oNpT417&QzS@p>e0#SuOjsfpn5B`V2u#7)E)G#N9zNEXnNHKw{{f!O%?yIX@Me)W>ybN~0} z|MEP~ftmv~M@G$^w(GrD7SONs-j(Qx)=Dp?&ue>3y!IZbG3^r8h<2A=Z?e(-PnxdL z^fOwGrPd};6y+aGH@hrhlQz?`P;0X|JNnk~ltbF&3qPDn=KmtZ&kd;Oeh0x_naD_K zVP_TP2-PyMkwPx~Ix~{8U^9G((2n&K8S#>lwBUu=NiPH^JXk#5um_5hZJ@I`?Tlr1 z;yVjAPY(FysuQ~O&_Jm-yLbjg5kY59>JhX3X4v=*eO;x!#|Ad+;0FBaIhhbLl-!NA z8AS|UC|WIKMZ8Eza=0@*e7 z0jm!0qac%{B4YsqQb~wc$IVLMsw$33URBHjd9M<`L7dI7NDkP0s<4A< zl!zD}2-9MANPLT?DM}IFSH#n*INYfO`n*LWNeVlBk~G~vi8voG#u zIWu^&qZ9cpxEkZ_jJ4vU8V<+A4v=Pem)$!GClCJ;SI*l5SWMHHXq9I@?zcv;;aM@ z$89EivKPY-%{B@uWSh|Lbl%@E;g|RMQV(T6!LI6l(~!lbTllio_w=zF4e^5POScxr zEh&1{n!_b424hpHx#P|C#zl~Mv|HO>GAA)ioU^f=YFwm{4RMf=Lr=&W-btJ`T_@&H zFbo+m#p&34{5U}WnagdrE}f2L`6rgqg;F#=dm8ol!P0VhS}fF6Cgc)t_GevK_qKkO zW0fS9D+ZvZ1B9^aq4TzBp*PzFO3DJlx=2aW>Afm6U|zy)9wXan*9RZUS2pc>$TCSW759cY36rnaDL zo+jJc|M#d%%9c^9BVFCWwL5n0j082Y?5SB9bEI32cIqi}yieNO_6@`iX+zY|3m`s)3*FVSc8=W{0SqbA{<}%d`&onYE%z9=A6K1-ZeatcD zW9D<_E9P6~5_63iV}4~O7?a!Tu5>SU*ShQ6XWc)z$J|qHGwWjO*&rKXUt;^%57;l+ z3+xDci_NirvNO0jTn)E^Tg|m`0WQex;r4O|xg*?%+;#33F1M1S_*r}fKc8R1ui<_C zR{j`&obTs<;>Y;gyh*SM_Y2j+QsFV7QD_x53R?tONC}$ICww9NDBS8lQ}G1-H~RKv AYybcN delta 1629 zcmb_ce{2&~9Dmmq*tFX&;LS0e%+bUyZuoZh4hI8eu$zd3)!f!mZ3ShWr5OyiJJ5t# z$Xc`G(qwQk7$O3iU|45DvWd|It;{e~Vjx+X=^|;mN zzu$YG_s#8h?{^PO*oUqkJ2Y9wymaWU%y^BB%oEIrvD-$B)1bX=Tmk7d?lR4`EE?Wm z`-x#h!|kXt4mh}K*(*%8$-3BHj@VEYMyxD{T;`&cZ6=7NqTiG$4^8P}lX2Bi+B#uJ zD3AV>+>gSa%z34;;-A=@NFZBmT5(yz0@BJhJUq@ol)F-sSxbfD!(#VM>Xcu16AItnr zsSiTuZh>+;u_BPC1*SU^T3}{O$}rGO3#7F`c2IdNgjj^aYiX)(RFm!$MO!JQ9?GqU zTWeA_9`i#3up7YcJJ$(@O|6JaBVh)d2%NHf&vKMU5DSJTU7E6MflG1eqU?!F)50vs znMRMMUZ&g{D2XMDqQ66@cx+d0vsK{KrRg#0JqFIENkf`+CN7P4Xn_-+xg=Q*vtC)w zu_jZl*6O1c=eXKoLr51%1f0H`h85*%Ps@}0@ zC|3^7x(huROv*h9#(@h6W+A-RYk5k{aE|hNI2EutN4c(M+q{%}2;w0p?Bh*0o432; ztNYWZ?DO_7Nq=qLVy|t?;mXCIx)+c5)L-hJ>%BwgdDIloXH8Esl0GI<**r((jF_Z1&ldn zi=rQ!Pic|5>|dP9-;5pEnOdB$H_DF98w=HY$>_nzwiI%RWuGisTn>frm7Ao6!1iMrP z6+D1Yu)Djf8x0q;zcG;!C|`hCyckztf>+~4+>CeQJ-8P~@j?6!K8lay1pXW+@n!ro zzJ@dSE)LY3sySQpUCj?Qf7LAHpW!8b6Yt}Lyv`rxKjP2w=lLuAkNkE158fdZ3ofBj zcwSJ2UZGDoB77j67KVkSa8+=UMZ~>~yg*vXR;M1&