2005-07-02 05:21:17 +00:00
/*
Unix SMB / CIFS implementation .
provide interfaces to rpc calls from ejs scripts
Copyright ( C ) Andrew Tridgell 2005
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
# include "lib/ejs/ejs.h"
# include "librpc/gen_ndr/ndr_echo.h"
# include "lib/cmdline/popt_common.h"
2005-07-02 11:12:33 +00:00
# include "scripting/ejs/ejsrpc.h"
2005-07-02 05:21:17 +00:00
/*
connect to an rpc server
example :
var conn = new Object ( ) ;
status = rpc_connect ( conn , " ncacn_ip_tcp:localhost " , " rpcecho " ) ;
*/
static int ejs_rpc_connect ( MprVarHandle eid , int argc , struct MprVar * * argv )
{
const char * binding , * pipe_name ;
const struct dcerpc_interface_table * iface ;
NTSTATUS status ;
struct dcerpc_pipe * p ;
struct MprVar * conn ;
/* validate arguments */
if ( argc ! = 3 | |
argv [ 0 ] - > type ! = MPR_TYPE_OBJECT | |
argv [ 1 ] - > type ! = MPR_TYPE_STRING | |
argv [ 2 ] - > type ! = MPR_TYPE_STRING ) {
ejsSetErrorMsg ( eid , " rpc_connect invalid arguments " ) ;
return - 1 ;
}
conn = argv [ 0 ] ;
binding = mprToString ( argv [ 1 ] ) ;
pipe_name = mprToString ( argv [ 2 ] ) ;
iface = idl_iface_by_name ( pipe_name ) ;
if ( iface = = NULL ) {
status = NT_STATUS_OBJECT_NAME_INVALID ;
goto done ;
}
status = dcerpc_pipe_connect ( mprMemCtx ( ) , & p , binding ,
iface - > uuid , iface - > if_version ,
cmdline_credentials , NULL ) ;
2005-07-02 11:12:33 +00:00
if ( ! NT_STATUS_IS_OK ( status ) ) goto done ;
/* callers don't allocate ref vars in the ejs interface */
p - > conn - > flags | = DCERPC_NDR_REF_ALLOC ;
mprSetPtr ( conn , " pipe " , p ) ;
mprSetPtr ( conn , " iface " , iface ) ;
2005-07-02 05:21:17 +00:00
done :
ejsSetReturnValue ( eid , mprNTSTATUS ( status ) ) ;
return 0 ;
}
/*
make an rpc call
example :
status = rpc_call ( conn , " echo_AddOne " , io ) ;
*/
2005-07-07 06:25:04 +00:00
int ejs_rpc_call ( int eid , int argc , struct MprVar * * argv ,
const char * callname ,
ejs_pull_function_t ejs_pull , ejs_push_function_t ejs_push )
2005-07-02 05:21:17 +00:00
{
struct MprVar * conn , * io ;
2005-07-02 11:12:33 +00:00
const struct dcerpc_interface_table * iface ;
struct dcerpc_pipe * p ;
const struct dcerpc_interface_call * call ;
2005-07-02 05:21:17 +00:00
NTSTATUS status ;
2005-07-02 11:12:33 +00:00
void * ptr ;
struct rpc_request * req ;
int callnum ;
2005-07-02 05:21:17 +00:00
2005-07-07 06:25:04 +00:00
if ( argc ! = 2 | |
2005-07-02 05:21:17 +00:00
argv [ 0 ] - > type ! = MPR_TYPE_OBJECT | |
2005-07-07 06:25:04 +00:00
argv [ 1 ] - > type ! = MPR_TYPE_OBJECT ) {
2005-07-02 05:21:17 +00:00
ejsSetErrorMsg ( eid , " rpc_call invalid arguments " ) ;
return - 1 ;
}
2005-07-02 11:12:33 +00:00
conn = argv [ 0 ] ;
2005-07-07 06:25:04 +00:00
io = argv [ 1 ] ;
2005-07-02 05:21:17 +00:00
2005-07-02 11:12:33 +00:00
/* get the pipe info */
2005-07-02 05:21:17 +00:00
p = mprGetPtr ( conn , " pipe " ) ;
2005-07-02 11:12:33 +00:00
iface = mprGetPtr ( conn , " iface " ) ;
if ( p = = NULL | | iface = = NULL ) {
2005-07-02 05:21:17 +00:00
ejsSetErrorMsg ( eid , " rpc_call invalid pipe " ) ;
return - 1 ;
}
2005-07-02 11:12:33 +00:00
/* find the call by name */
call = dcerpc_iface_find_call ( iface , callname ) ;
if ( call = = NULL ) {
status = NT_STATUS_OBJECT_NAME_INVALID ;
goto done ;
}
callnum = call - iface - > calls ;
/* allocate the C structure */
ptr = talloc_zero_size ( mprMemCtx ( ) , call - > struct_size ) ;
if ( ptr = = NULL ) {
status = NT_STATUS_NO_MEMORY ;
goto done ;
}
/* convert the mpr object into a C structure */
2005-07-07 08:20:57 +00:00
status = ejs_pull_rpc ( eid , callname , io , ptr , ejs_pull ) ;
2005-07-02 11:12:33 +00:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
goto done ;
}
/* if requested, print the structure */
if ( p - > conn - > flags & DCERPC_DEBUG_PRINT_IN ) {
ndr_print_function_debug ( call - > ndr_print , call - > name , NDR_IN , ptr ) ;
}
/* make the actual call */
req = dcerpc_ndr_request_send ( p , NULL , iface , callnum , ptr , ptr ) ;
if ( req = = NULL ) {
status = NT_STATUS_NO_MEMORY ;
talloc_free ( ptr ) ;
goto done ;
}
status = dcerpc_ndr_request_recv ( req ) ;
/* print the 'out' structure, if needed */
if ( p - > conn - > flags & DCERPC_DEBUG_PRINT_OUT ) {
ndr_print_function_debug ( call - > ndr_print , call - > name , NDR_OUT , ptr ) ;
}
2005-07-07 08:20:57 +00:00
status = ejs_push_rpc ( eid , callname , io , ptr , ejs_push ) ;
2005-07-02 11:12:33 +00:00
talloc_free ( ptr ) ;
done :
2005-07-02 05:21:17 +00:00
ejsSetReturnValue ( eid , mprNTSTATUS ( status ) ) ;
2005-07-07 08:32:35 +00:00
if ( NT_STATUS_EQUAL ( status , NT_STATUS_INTERNAL_ERROR ) ) {
return - 1 ;
}
2005-07-02 05:21:17 +00:00
return 0 ;
}
2005-07-07 06:25:04 +00:00
2005-07-02 05:21:17 +00:00
/*
setup C functions that be called from ejs
*/
void smb_setup_ejs_rpc ( void )
{
2005-07-07 06:25:04 +00:00
void setup_ejs_rpcecho ( void ) ;
2005-07-08 08:18:52 +00:00
void setup_ejs_samr ( void ) ;
void setup_ejs_misc ( void ) ;
2005-07-02 05:21:17 +00:00
ejsDefineCFunction ( - 1 , " rpc_connect " , ejs_rpc_connect , NULL , MPR_VAR_SCRIPT_HANDLE ) ;
2005-07-07 06:25:04 +00:00
setup_ejs_rpcecho ( ) ;
2005-07-08 08:18:52 +00:00
setup_ejs_samr ( ) ;
setup_ejs_misc ( ) ;
2005-07-02 05:21:17 +00:00
}
2005-07-08 04:55:07 +00:00
/*
setup constants for rpc calls
*/
void smb_setup_ejs_rpc_constants ( int eid )
{
2005-07-08 08:18:52 +00:00
struct MprVar v ;
2005-07-08 04:55:07 +00:00
void setup_ejs_constants_rpcecho ( int ) ;
2005-07-08 08:18:52 +00:00
void setup_ejs_constants_samr ( int ) ;
void setup_ejs_constants_misc ( int ) ;
2005-07-08 04:55:07 +00:00
setup_ejs_constants_rpcecho ( eid ) ;
2005-07-08 08:18:52 +00:00
setup_ejs_constants_samr ( eid ) ;
setup_ejs_constants_misc ( eid ) ;
v = mprCreatePtrVar ( NULL , " NULL " ) ;
mprSetProperty ( ejsGetGlobalObject ( eid ) , " NULL " , & v ) ;
2005-07-08 04:55:07 +00:00
}