diff --git a/harbour/ChangeLog b/harbour/ChangeLog index e2f7565e08..6c1ddaacef 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -16,6 +16,12 @@ The license applies to all entries newer than 2009-04-28. */ +2011-01-25 17:53 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) + * contrib/hbnetio/utils/netiosrv/netiosrv.prg + * contrib/hbnetio/utils/netiosrv/netiocmd.prg + + Added command to stop specific or every connection. + Using 'stop ' or 'stop all'. + 2011-01-25 16:54 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/src/vm/itemapi.c * do not clear parameter when NULL item is passed to diff --git a/harbour/contrib/hbnetio/utils/netiosrv/netiocmd.prg b/harbour/contrib/hbnetio/utils/netiosrv/netiocmd.prg index 96e327d062..209d7854d7 100644 --- a/harbour/contrib/hbnetio/utils/netiosrv/netiocmd.prg +++ b/harbour/contrib/hbnetio/utils/netiosrv/netiocmd.prg @@ -15,13 +15,14 @@ FUNCTION hbnetiosrv_LoadCmds( bQuit, bShowInfo ) LOCAL hCmds := { ; - "?" => { "Synonym for 'help'." , {|| cmdHelp( hCmds ) } },; - "clear" => { "Clear screen." , {|| Scroll(), SetPos( 0, 0 ) } },; - "config" => { "Show server configuration." , bShowInfo },; - "sysinfo" => { "Show system/build information.", {|| cmdSysInfo() } },; - "conn" => { "Show connection information." , {| cCommand, netiosrv | HB_SYMBOL_UNUSED( cCommand ), cmdConnInfo( netiosrv ) } },; - "quit" => { "Stop server and exit." , bQuit },; - "help" => { "Display this help." , {|| cmdHelp( hCmds ) } }; + "?" => { "" , "Synonym for 'help'." , {|| cmdHelp( hCmds ) } },; + "clear" => { "" , "Clear screen." , {|| Scroll(), SetPos( 0, 0 ) } },; + "config" => { "" , "Show server configuration." , bShowInfo },; + "sysinfo" => { "" , "Show system/build information.", {|| cmdSysInfo() } },; + "conn" => { "" , "Show connection information." , {| cCommand, netiosrv | HB_SYMBOL_UNUSED( cCommand ), cmdConnInfo( netiosrv ) } },; + "stop" => { "[|all]", "Stop specified connection(s)." , {| cCommand, netiosrv | cmdConnStop( cCommand, netiosrv ) } },; + "quit" => { "" , "Stop server and exit." , bQuit },; + "help" => { "" , "Display this help." , {|| cmdHelp( hCmds ) } }; } RETURN hCmds @@ -44,13 +45,13 @@ STATIC PROCEDURE cmdHelp( hCommands ) LOCAL n, c, m m := 0 - hb_HEval( hCommands, {| k | m := Max( m, Len( k ) ) } ) + hb_HEval( hCommands, {| k, l | m := Max( m, Len( k + iif( Empty( l[ 1 ] ), "", " " + l[ 1 ] ) ) ) } ) AAdd( aTexts, "Commands:" ) /* Processing commands */ FOR EACH n IN hCommands - AAdd( aTexts, " " + PadR( n:__enumKey(), m ) + " - " + n[ 1 ] ) + AAdd( aTexts, " " + PadR( n:__enumKey() + iif( Empty( n[ 1 ] ), "", " " + n[ 1 ] ), m ) + " - " + n[ 2 ] ) NEXT ASort( aTexts, 2 ) diff --git a/harbour/contrib/hbnetio/utils/netiosrv/netiosrv.prg b/harbour/contrib/hbnetio/utils/netiosrv/netiosrv.prg index c885488414..7bce98348e 100644 --- a/harbour/contrib/hbnetio/utils/netiosrv/netiosrv.prg +++ b/harbour/contrib/hbnetio/utils/netiosrv/netiosrv.prg @@ -64,6 +64,7 @@ PROCEDURE Main( ... ) LOCAL netiosrv[ _NETIOSRV_MAX_ ] LOCAL cParam + LOCAL aCommand LOCAL cCommand LOCAL cPassword @@ -78,7 +79,6 @@ PROCEDURE Main( ... ) LOCAL hCommands LOCAL nSavedRow LOCAL nPos - LOCAL aCmd LOCAL cExt LOCAL cFile @@ -98,6 +98,8 @@ PROCEDURE Main( ... ) netiosrv[ _NETIOSRV_hConnection ] := { => } netiosrv[ _NETIOSRV_mtxConnection ] := hb_mutexCreate() + hb_HKeepOrder( netiosrv[ _NETIOSRV_hConnection ], .T. ) + FOR EACH cParam IN { ... } DO CASE CASE Lower( Left( cParam, 6 ) ) == "-port=" @@ -238,10 +240,9 @@ PROCEDURE Main( ... ) ENDIF nHistIndex := Len( aHistory ) + 1 - nPos := iif( Empty( cCommand ), 0, hb_HPos( hCommands, Lower( cCommand ) ) ) - IF nPos > 0 - aCmd := hb_HValueAt( hCommands, nPos ) - Eval( aCmd[ 2 ], cCommand, netiosrv ) + aCommand := hb_ATokens( cCommand, " " ) + IF ! Empty( aCommand ) .AND. ( nPos := hb_HPos( hCommands, Lower( aCommand[ 1 ] ) ) ) > 0 + Eval( hb_HValueAt( hCommands, nPos )[ 3 ], cCommand, netiosrv ) ELSE QQOut( "Error: Unknown command '" + cCommand + "'.", hb_eol() ) ENDIF @@ -296,6 +297,37 @@ STATIC PROCEDURE netiosrv_conn_unregister( netiosrv, pConnectionSocket ) RETURN +PROCEDURE cmdConnStop( cCommand, netiosrv ) + LOCAL aToken := hb_ATokens( cCommand, " " ) + + LOCAL aAddressPeer + LOCAL cIPPort + LOCAL nconn + + IF Len( aToken ) > 1 + + cIPPort := Lower( aToken[ 2 ] ) + + hb_mutexLock( netiosrv[ _NETIOSRV_mtxConnection ] ) + + FOR EACH nconn IN netiosrv[ _NETIOSRV_hConnection ] + + aAddressPeer := NIL + netio_srvStatus( nconn[ _NETIOSRV_CONN_pConnection ], NETIO_SRVINFO_PEERADDRESS, @aAddressPeer ) + + IF cIPPort == "all" .OR. cIPPort == AddrToIPPort( aAddressPeer ) + QQOut( "Stopping connection on " + AddrToIPPort( aAddressPeer ), hb_eol() ) + netio_serverStop( nconn[ _NETIOSRV_CONN_pConnection ], .T. ) + ENDIF + NEXT + + hb_mutexUnlock( netiosrv[ _NETIOSRV_mtxConnection ] ) + ELSE + QQOut( "Error: Invalid syntax.", hb_eol() ) + ENDIF + + RETURN + PROCEDURE cmdConnInfo( netiosrv ) LOCAL nconn @@ -323,7 +355,7 @@ PROCEDURE cmdConnInfo( netiosrv ) netio_srvStatus( nconn[ _NETIOSRV_CONN_pConnection ], NETIO_SRVINFO_PEERADDRESS , @aAddressPeer ) QQOut( "#" + hb_ntos( nconn:__enumIndex() ) + " " +; - hb_TToC( nconn[ _NETIOSRV_CONN_tStart ] ) + " " +; + hb_TToC( nconn[ _NETIOSRV_CONN_tStart ], "YYYY.MM.DD", "HH:MM:SS" ) + " " +; PadR( ConnStatusStr( nStatus ), 12 ) + " " +; "fcnt: " + Str( nFilesCount ) + " " +; "send: " + Str( nBytesSent ) + " " +;