From 2b2967a3146f6a7f3f2b683d29338f87fefd6f69 Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Thu, 7 Jan 2010 09:27:40 +0000 Subject: [PATCH] 2010-01-07 10:27 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/include/hbvmpub.h * minor formatting * harbour/contrib/hbnetio/netio.h * harbour/contrib/hbnetio/netiosrv.c + added new PRG function: NETIO_RPCFUNC( [, ] ) -> NIL which allows to set user filter for RPC calls. is executed on each RPC request instead of requested function and receives as first parameter requested function symbol then function parameters. A simple wrapper may look like: static function rpc_filter( sFunc, ... ) ? "DO", sFunc:name, "WITH", ... return sFunc:exec( ... ) and can be activated by: netio_rpcfunc( pConnectionSocket, @rpc_filter() ) When NETIO_RPCFUNC() is called without valid function symbol then existing user RPC filter is cleared. Please remember that setting user RPC filter does not automatically enable RPC support for given connection socket. RPC support has to be enabled by NETIO_RPC() function or by 4-th parameter of NETIO_LISTEN() socket. --- harbour/ChangeLog | 23 ++++++ harbour/contrib/hbnetio/netio.h | 1 + harbour/contrib/hbnetio/netiosrv.c | 109 ++++++++++++++++++----------- harbour/include/hbvmpub.h | 14 ++-- 4 files changed, 100 insertions(+), 47 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 5800ee232a..60ddaddadf 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,29 @@ past entries belonging to author(s): Viktor Szakats. */ +2010-01-07 10:27 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/include/hbvmpub.h + * minor formatting + + * harbour/contrib/hbnetio/netio.h + * harbour/contrib/hbnetio/netiosrv.c + + added new PRG function: + NETIO_RPCFUNC( [, ] ) -> NIL + which allows to set user filter for RPC calls. is executed + on each RPC request instead of requested function and receives as + first parameter requested function symbol then function parameters. + A simple wrapper may look like: + static function rpc_filter( sFunc, ... ) + ? "DO", sFunc:name, "WITH", ... + return sFunc:exec( ... ) + and can be activated by: + netio_rpcfunc( pConnectionSocket, @rpc_filter() ) + When NETIO_RPCFUNC() is called without valid function symbol then + existing user RPC filter is cleared. Please remember that setting + user RPC filter does not automatically enable RPC support for + given connection socket. RPC support has to be enabled by NETIO_RPC() + function or by 4-th parameter of NETIO_LISTEN() socket. + 2010-01-06 18:57 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) * contrib/hbide/ideactions.prg * contrib/hbide/ideprojmanager.prg diff --git a/harbour/contrib/hbnetio/netio.h b/harbour/contrib/hbnetio/netio.h index 8242e212d8..c1d6d98431 100644 --- a/harbour/contrib/hbnetio/netio.h +++ b/harbour/contrib/hbnetio/netio.h @@ -128,3 +128,4 @@ #define NETIO_ERR_FILE_IO 0xff07 #define NETIO_ERR_NOT_EXISTS 0xff08 #define NETIO_ERR_UNSUPPORTED 0xff09 +#define NETIO_ERR_REFUSED 0xff10 diff --git a/harbour/contrib/hbnetio/netiosrv.c b/harbour/contrib/hbnetio/netiosrv.c index f6d87ccedb..2ade76f180 100644 --- a/harbour/contrib/hbnetio/netiosrv.c +++ b/harbour/contrib/hbnetio/netiosrv.c @@ -84,6 +84,7 @@ typedef struct _HB_CONSRV int firstFree; BOOL stop; BOOL rpc; + PHB_SYMB rpcFunc; int rootPathLen; char rootPath[ HB_PATH_MAX ]; } @@ -416,6 +417,16 @@ HB_FUNC( NETIO_RPC ) conn->rpc = hb_parl( 2 ); } } + hb_retl( fRPC ); +} + +HB_FUNC( NETIO_RPCFUNC ) +{ + PHB_CONSRV conn = s_consrvParam( 1 ); + if( conn ) + { + conn->rpcFunc = hb_itemGetSymbol( hb_param( 2, HB_IT_SYMBOL ) ); + } } HB_FUNC( NETIO_SERVERSTOP ) @@ -858,55 +869,73 @@ HB_FUNC( NETIO_SERVER ) errCode = NETIO_ERR_NOT_EXISTS; else if( uiMsg != NETIO_PROCIS ) { - ULONG ulSize = size - size2; - USHORT uiPCount = 0; - - data += size2; - - hb_vmPushDynSym( pDynSym ); - hb_vmPushNil(); - while( ulSize ) + if( hb_vmRequestReenter() ) { - PHB_ITEM pItem = hb_itemDeserialize( &data, &ulSize ); - if( !pItem ) + ULONG ulSize = size - size2; + USHORT uiPCount = 0; + + data += size2; + + if( conn->rpcFunc ) { - ulSize = 1; - break; + hb_vmPushSymbol( conn->rpcFunc ); + hb_vmPushNil(); + hb_vmPushDynSym( pDynSym ); + ++uiPCount; } - ++uiPCount; - hb_vmPush( pItem ); - hb_itemRelease( pItem ); - } - if( ulSize ) - { - errCode = NETIO_ERR_WRONG_PARAM; - uiPCount += 2; - do - hb_stackPop(); - while( --uiPCount ); + else + { + hb_vmPushDynSym( pDynSym ); + hb_vmPushNil(); + } + while( ulSize ) + { + PHB_ITEM pItem = hb_itemDeserialize( &data, &ulSize ); + if( !pItem ) + { + ulSize = 1; + break; + } + ++uiPCount; + hb_vmPush( pItem ); + hb_itemRelease( pItem ); + } + if( ulSize ) + { + errCode = NETIO_ERR_WRONG_PARAM; + uiPCount += 2; + do + hb_stackPop(); + while( --uiPCount ); + } + else + { + hb_vmProc( uiPCount ); + if( uiMsg == NETIO_FUNC ) + { + ULONG itmSize; + char * itmData = hb_itemSerialize( hb_stackReturnItem(), TRUE, &itmSize ); + if( itmSize <= sizeof( buffer ) - NETIO_MSGLEN ) + msg = buffer; + else if( !ptr || itmSize > ( ULONG ) size - NETIO_MSGLEN ) + { + if( ptr ) + hb_xfree( ptr ); + ptr = msg = ( BYTE * ) hb_xgrab( itmSize + NETIO_MSGLEN ); + } + memcpy( msg + NETIO_MSGLEN, itmData, itmSize ); + hb_xfree( itmData ); + len = itmSize; + } + } + hb_vmRequestRestore(); } else - hb_vmProc( uiPCount ); + errCode = NETIO_ERR_REFUSED; } } if( errCode == 0 && !fNoAnswer ) { - if( uiMsg == NETIO_FUNC ) - { - ULONG itmSize; - char * itmData = hb_itemSerialize( hb_stackReturnItem(), TRUE, &itmSize ); - if( itmSize <= sizeof( buffer ) - NETIO_MSGLEN ) - msg = buffer; - else if( !ptr || itmSize > ( ULONG ) size - NETIO_MSGLEN ) - { - if( ptr ) - hb_xfree( ptr ); - ptr = msg = ( BYTE * ) hb_xgrab( itmSize + NETIO_MSGLEN ); - } - memcpy( msg + NETIO_MSGLEN, itmData, itmSize ); - hb_xfree( itmData ); - len = itmSize; - } HB_PUT_LE_UINT32( &msg[ 0 ], uiMsg ); HB_PUT_LE_UINT32( &msg[ 4 ], len ); memset( msg + 8, '\0', NETIO_MSGLEN - 8 ); diff --git a/harbour/include/hbvmpub.h b/harbour/include/hbvmpub.h index 37f16c9ebd..a62af4c90b 100644 --- a/harbour/include/hbvmpub.h +++ b/harbour/include/hbvmpub.h @@ -119,16 +119,16 @@ struct _HB_SYMB; ( double ) (p)->item.asLong.value : \ (p)->item.asDouble.value ) ) -#define HB_VM_ISFUNC( pSym ) ( ( pSym )->value.pFunPtr ) +# define HB_VM_ISFUNC( pSym ) ( ( pSym )->value.pFunPtr ) -#define HB_VM_FUNCUNREF( pSym ) \ +# define HB_VM_FUNCUNREF( pSym ) \ do { \ if( ( ( pSym )->scope.value & HB_FS_DEFERRED ) && \ ( pSym )->pDynSym ) \ pSym = ( pSym )->pDynSym->pSymbol; \ } while( 0 ) -#define HB_VM_EXECUTE( pSym ) \ +# define HB_VM_EXECUTE( pSym ) \ do { \ /* Running pCode dynamic function from .hrb? */ \ if( ( pSym )->scope.value & HB_FS_PCODEFUNC ) \ @@ -142,16 +142,16 @@ struct _HB_SYMB; typedef struct _HB_DYNS { struct _HB_SYMB * pSymbol; /* pointer to its relative local symbol */ -#if !defined( HB_MT_VM ) +# if !defined( HB_MT_VM ) void * pMemvar; /* memvar pointer ( publics & privates ) */ USHORT uiArea; /* Workarea number */ -#endif /* !HB_MT_VM */ +# endif /* !HB_MT_VM */ USHORT uiSymNum; /* dynamic symbol number */ -#if !defined( HB_NO_PROFILER ) +# if !defined( HB_NO_PROFILER ) ULONG ulCalls; /* profiler support */ ULONG ulTime; /* profiler support */ ULONG ulRecurse; /* profiler support */ -#endif /* !HB_NO_PROFILER */ +# endif /* !HB_NO_PROFILER */ } HB_DYNS, * PHB_DYNS, * HB_DYNS_PTR; /* pCode dynamic function - HRB */