From 055bf1d65b792579314e49f0fe63ba6c55e3af70 Mon Sep 17 00:00:00 2001 From: rainwater Date: Thu, 5 Sep 2002 18:00:44 +0000 Subject: [PATCH] Some broken code, but fixes pipe issue git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@930 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/nsExec/nsexec.c | 66 +++++++++++++++++++++++----------------- Plugins/nsExec.dll | Bin 20480 -> 20480 bytes 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/Contrib/nsExec/nsexec.c b/Contrib/nsExec/nsexec.c index a1b8c999..d3c6964c 100644 --- a/Contrib/nsExec/nsexec.c +++ b/Contrib/nsExec/nsexec.c @@ -9,6 +9,7 @@ #define false FALSE #endif #define TIMEOUT 100000 +#define LOOPTIMEOUT 100 HINSTANCE g_hInstance; HWND g_hwndParent; @@ -19,7 +20,9 @@ char * g_szto; BOOL g_foundto; int g_to; + void ExecScript(BOOL log); +int LogMessages(const char *pStr); int LogMessage(const char *pStr); char *my_strstr(const char *string, const char *strCharSet); int my_atoi(char *s); @@ -81,9 +84,10 @@ void ExecScript(BOOL log) { OSVERSIONINFO osv={sizeof(osv)}; HANDLE newstdout=0,read_stdout=0; DWORD dwRead = 1; - DWORD dwExit; - HGLOBAL memory; - char *szBuf; + DWORD dwExit = !STILL_ACTIVE; + char szBuf[1024]; + char szBufTmp[1024]; + szBufTmp[0]=0; GetVersionEx(&osv); if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) { InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION); @@ -106,35 +110,22 @@ void ExecScript(BOOL log) { CloseHandle(read_stdout); pushstring("error"); } - if (WaitForSingleObject(pi.hProcess,INFINITE)==WAIT_TIMEOUT) { - TerminateProcess(pi.hProcess,GetExitCodeProcess(pi.hProcess,&dwExit)); - } - PeekNamedPipe(read_stdout, 0, 0, 0, &dwRead, NULL); - memory = GlobalAlloc(GMEM_MOVEABLE,dwRead+1); - szBuf = (char *)GlobalLock(memory); - ReadFile(read_stdout, szBuf, dwRead, &dwRead, NULL); - pushstring("success"); - if (log) { - if (my_strstr(szBuf,"\r")) { - while (*szBuf) { - char *i = my_strstr(szBuf,"\r"); - if (i==0) { - LogMessage(szBuf); - break; - } - *i=0; - if (*(i+1)=='\n') *(i+1)=0; - LogMessage(szBuf); - if (!*(i+1)) szBuf = i+2; - else szBuf = i+1; + 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) { + lstrcat(szBufTmp,szBuf); + LogMessages(szBufTmp); } } - else { - LogMessage(szBuf); + else Sleep(LOOPTIMEOUT); + GetExitCodeProcess(pi.hProcess, &dwExit); + if (dwExit != STILL_ACTIVE) { + PeekNamedPipe(read_stdout, 0, 0, 0, &dwRead, NULL); } } - GlobalUnlock(memory); - GlobalFree(memory); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); CloseHandle(newstdout); @@ -143,12 +134,31 @@ void ExecScript(BOOL log) { } +int LogMessages(const char *pStr) { + if (my_strstr(pStr,"\r")) { + while (*pStr) { + char *i = my_strstr(pStr,"\r"); + if (i==0) { + LogMessage(pStr); + break; + } + *i=0; + if (*(i+1)=='\n') *(i+1)=0; + LogMessage(pStr); + if (!*(i+1)) pStr = i+2; + else pStr = i+1; + } + } + return 1; +} + // code I stole (err borrowed) from Tim Kosse // all credits/problems are his int LogMessage(const char *pStr) { LVITEM item={0}; int nItemCount; if (!g_hwndList) return -1; + if (lstrlen(pStr)==0) return -1; nItemCount=SendMessage(g_hwndList, LVM_GETITEMCOUNT, 0, 0); item.mask=LVIF_TEXT; item.pszText=(char *)pStr; diff --git a/Plugins/nsExec.dll b/Plugins/nsExec.dll index f6e497622493b0031b1f0c64a65b9d9911db3174..9353969ed5246828054c0e45a3b9994121b739b4 100644 GIT binary patch delta 2153 zcmcIlZ){Ul6u+-4tec%Hp&dmhc5ovF2HyU4lPwM@15K6JzEU8}&B;o-GTdZcM$E8V zHq5$5V`qsjGR;Ocn!pEj#xXLXp@bnuVoX?KH1Y+L!i*t-7!ypMzx%puGk&(odFR~U zIrp63J@-$0$AsQ7Az35*FkHL6>R}{u`_d!Y$wgTk@80N9V73N}b2O(ZTONLJmUw^&m)wP5K2_gGZ+k|z(NUB-m)LJkcu6Vq7OEh#W z3Lhy_oL@vgBPuNi4vKLH1C6gv3icu;V5X-}F9wauVk5 z&nDs4%3i9I1JsaSh!_4Fziu%;?L>m}0)WeUlKl5?oagBK-CRV76bs5OuZ0*KKkt>o z6!@jFw*?}J@meni@h5iStISGaBeW!@nL3nJrn0LN6St+SfcYYI%B*bS3rN@C^Sqw} zV!94??)Wl7`mbm&ayBP2U7m4{hIROex!4LVcj``LqMKE`KT|Y6ty}eIw`S9v%JJp% zlw6$BoUU4>7TqY9@Or-7>U-g63W86zE@c`Wr_s}}n6!vD=o+*lu#56qx1Oh+z#&|SF4KT_FN2wKj6;mBp^-t3=Owx4G zM1Wd@e#Jz9N>ai@SrE*%7$v;a$~n$yG2Mc=a_%I0cXqb916Z((v*wy9CQ>j$z@t}MT_1!SRqGR2IK#rSQ- zq0seTQ=0m(ShI2uWqTD9!;+W6<2(*;g9toAA|$Le5W@G=#2sjb&Ihm%pdW|a4ALat zLn~pk<=pnras=aDlS}x72ob|85$vl_W*Z$Dwelh{SkfN3jp|X5Om-m0CEU&46+9D9^?$< zbI3I0I;0HpHiU4&?>6*OklI3_4)Re!TW9p>!RF|iZG?QN@rRmQ>Ra1FguJN{ zL!rYjHy;VLh^-x=)cY0P`n$r;w)WSW+v<;oLMi>)5f`}QAG5ob>rt#kfY!{*AjV0^ z2!!B}FvzE{&rRH1yQw7Ap{YyhS*1`iv5jR)Q@w&QhJX>omax_ANk&;Mdx7m{0TyC? z>>W13K4E9s1iQd4vuo@I`-%O^?lNLqW?N;m*q*jMW2?38u)Sn!vUS^fYy&p4eT%)u z-eNyuAF`ja-?0B;pR*H3p`*hwKt;8JHK>JIlpuM?cCrhd&4celkU^* WFWeX0Gw$!*x7@$E|8Rp}r1T%E+F-N* delta 2119 zcmcIkZ){Ul6u+-4V}ngf?3)!PbnGhAF}&?7b+XM2?fyV2y!Lh75C$7tp(|xW=mHY7 zz&2cY)C{Wz4JKQf5EJ=8GLu1^aiNPazKFz40w$VZLgR=bK?uf#=kLB&!T8ymoO{px zo!>q8ocqo@hlYhi!@^LtFma;hwRMS5=$9Yn8^<2WoUseoPv&eKyMpz*vM0u-v6hvS zu^Fu1u8tt*lI)P{2yqKWQrdUodUyWtGD7^Yv?V-3sc3dF@0$vvn;9{wE?N*Gu|hZWnAn0j*@h{t zz`@4U5X?r^P4iSAH6{Py3;*SpKH?{<;ozJA;6ecz`u8||yBLNM?n#L@`PEfED=|qo znw1~}^!4yjfhcmU#)nPp85y%SqXey-Ehj7Wt*VEruBybrHOX3Fo=~keql!F(qzlul zUJl5~M(F9{IfV308o%P<3{3R8MmQQYW0IrkvpL+DH!u;Y(DA;B{OqwJqkgO^mE@tk zotq7*f`>Gl_p%;Zq+BiJ_j%IiGHm!M4;BDP-^u`6x3q3LJjpXosUp94g!8?!COQy( z^t=f{NfYsdwB@3U`drxE{al)ouEyNd5%bZSn2S>AmC)BfFFQ{`iI3A$Sb)`C?58K8 zexM%&ur_{N2ew0h-2{=CM= zUIC|kaNY=->WWf}D)I-3_0u8Tj)i9er&jp%$sR=snVJ;Es~}Gvo`8qk9y>+PK-WZ? zxvLZKYWzI5H#|7xM3hf z?WYbTfMTplMfL{?ixQJRZPy`Qf~}QHBHI9Sl$VV90Hs;=XT*7|L5TMV)$<0I_T~(> z5`VfI`5&v}o>r&g`wS6-dhb{^$JMFcarGcAp0)VX4WL1{f;XG*Pgi0KwOJEghzm=( zn+J{(%e#fm)LDy6y-nLR(#&MeV4Sp$+8rF-xjzCkq`+QQOhzO z#Z4JLvJrKbH^TW|*yeH@s?m(B2ui37`iflWIzLYpIWa^$!6!lVYBSQr7VbXVIg}$qx{YWXU%!}6>`3K~G)d)AMMgEvc6M2GgmeQNimaIda zfaBF8ykq$LCh}zT3z7GeY;WK7)p6bF!dMXwkKQRVJBgnbY` zR+kXc2x)uqhew`}j&j@lO3pS4T&P4-Uv5&LobH}>!C zH|=-rM0!dpm0pt8OFN{n)GvJ^O-m1@IgWLXR!8vxN76CnSm-QwGG~?3<9x%p!@0{D Pbq+Y+bB@|r=YqcgLTyt<