Index: win_installer/installer/src/includes/Ports.nsh =================================================================== diff -u --- win_installer/installer/src/includes/Ports.nsh (revision 0) +++ win_installer/installer/src/includes/Ports.nsh (revision 373004ca450c6c4cc3952edd88e4ce9df9a764a9) @@ -0,0 +1,118 @@ +# Usage: +# Push "Tcp" or "Udp" +# Push "port_number" +# Call IsPortOpen +# Pop $0 ; "open" or "closed" or anything else for error +# +# Or with the LogicLib +# ${If} ${TCPPortOpen} 80 +# ${EndIf} +# ${If} ${UDPPortOpen} 137 +# ${EndIf} +# +Function IsPortOpen + + Exch $R0 # port to check + Exch + Exch $R1 + Push $0 + Push $1 + Push $2 + + System::Call 'iphlpapi::Get$R1Table(*i.r0, *i .r1, i 1) i .r2' + ${If} $2 != 122 # ERROR_INSUFFICIENT_BUFFER + StrCpy $R0 "" + Pop $2 + Pop $1 + Pop $0 + Exch $R1 + Exch + Exch $R0 + Return + ${EndIf} + + System::Alloc $1 + Pop $0 + + System::Call 'iphlpapi::Get$R1Table(ir0, *i r1, i 1) i .r2' + ${If} $2 != 0 # NO_ERROR + System::Free $0 + StrCpy $R0 "" + Pop $2 + Pop $1 + Pop $0 + Exch $R1 + Exch + Exch $R0 + Return + ${EndIf} + + Push $3 + Push $4 + Push $5 + + System::Call *$0(i.r2) + IntOp $2 $2 - 1 + ${For} $3 0 $2 + IntOp $4 $0 + 4 # skip dwNumEntries + ${If} $R1 == "Tcp" + IntOp $5 $3 * 20 # sizeof(MIB_TCPROW) + IntOp $4 $4 + $5 # skip to entry + System::Call *$4(i.r1,i,i.r4,i,i) + ${If} $1 <> 2 # $1 = dwState, 2 = MIB_TCP_STATE_LISTEN + ${Continue} + ${EndIf} + ${Else} + IntOp $5 $3 * 8 # sizeof(MIB_UDPROW) + IntOp $4 $4 + $5 # skip to entry + System::Call *$4(i,i.r4) + ${EndIf} + System::Call ws2_32::ntohs(ir4)i.r4 + + ${If} $4 = $R0 + StrCpy $R0 "open" + ${Break} + ${EndIf} + ${Next} + + ${If} $R0 != "open" + StrCpy $R0 "closed" + ${EndIf} + + System::Free $0 + + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + Exch $R1 + Exch + Exch $R0 + +FunctionEnd + +# LogicLib macros for IsPortOpen + +!include LogicLib.nsh + +!macro _PortOpen _a _b _t _f + !insertmacro _LOGICLIB_TEMP + Push `${_a}` + Push `${_b}` + Call IsPortOpen + Pop $_LOGICLIB_TEMP + !insertmacro _== $_LOGICLIB_TEMP "open" `${_t}` `${_f}` +!macroend +!define PortOpen `PortOpen` + +!macro _TCPPortOpen _a _b _t _f + !insertmacro _PortOpen Tcp `${_b}` `${_t}` `${_f}` +!macroend +!define TCPPortOpen `"" TCPPortOpen` + +!macro _UDPPortOpen _a _b _t _f + !insertmacro _PortOpen Udp `${_b}` `${_t}` `${_f}` +!macroend +!define UDPPortOpen `"" UDPPortOpen` \ No newline at end of file Index: win_installer/installer/src/installer.nsi =================================================================== diff -u -r6bea96a2ac932bc49e6f7dfa37b890d8dc1ce149 -r373004ca450c6c4cc3952edd88e4ce9df9a764a9 --- win_installer/installer/src/installer.nsi (.../installer.nsi) (revision 6bea96a2ac932bc49e6f7dfa37b890d8dc1ce149) +++ win_installer/installer/src/installer.nsi (.../installer.nsi) (revision 373004ca450c6c4cc3952edd88e4ce9df9a764a9) @@ -25,6 +25,8 @@ !include "MUI.nsh" !include "LogicLib.nsh" !include "x64.nsh" +!include "Ports.nsh" + # functions from TextFunc.nsh !insertmacro FileJoin !insertmacro LineFind @@ -216,11 +218,19 @@ !insertmacro MUI_INSTALLOPTIONS_DISPLAY "lams2.ini" FunctionEnd Function PostLAMS2Config - !insertmacro MUI_INSTALLOPTIONS_READ $LAMS_DOMAIN "lams2.ini" "Field 8" "State" - !insertmacro MUI_INSTALLOPTIONS_READ $LAMS_PORT "lams2.ini" "Field 9" "State" - !insertmacro MUI_INSTALLOPTIONS_READ $LAMS_LOCALE "lams2.ini" "Field 12" "State" - !insertmacro MUI_INSTALLOPTIONS_READ $LAMS_USER "lams2.ini" "Field 2" "State" - !insertmacro MUI_INSTALLOPTIONS_READ $LAMS_PASS "lams2.ini" "Field 5" "State" + !insertmacro MUI_INSTALLOPTIONS_READ $LAMS_DOMAIN "lams2.ini" "Field 8" "State" + !insertmacro MUI_INSTALLOPTIONS_READ $LAMS_PORT "lams2.ini" "Field 9" "State" + !insertmacro MUI_INSTALLOPTIONS_READ $LAMS_LOCALE "lams2.ini" "Field 12" "State" + !insertmacro MUI_INSTALLOPTIONS_READ $LAMS_USER "lams2.ini" "Field 2" "State" + !insertmacro MUI_INSTALLOPTIONS_READ $LAMS_PASS "lams2.ini" "Field 5" "State" + + # check that there's no other app running on that port + + ${If} ${TCPPortOpen} $LAMS_PORT + MessageBox MB_OK "The port $LAMS_PORT is in used by another application. Please choose another one (ie: 8181)" + Abort + ${EndIf} + FunctionEnd Function PreFinal !insertmacro MUI_INSTALLOPTIONS_WRITE "final.ini" "Field 2" "Text" "Click 'Install' to commence installation of LAMS ${VERSION}"