2005-07-02 15:12:33 +04: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"
2005-07-13 04:06:38 +04:00
# include "lib/appweb/ejs/ejs.h"
2005-07-10 06:37:50 +04:00
# include "scripting/ejs/smbcalls.h"
2005-07-08 12:18:52 +04:00
# include "librpc/gen_ndr/ndr_security.h"
2005-07-09 09:28:42 +04:00
# include "librpc/gen_ndr/ndr_lsa.h"
# include "scripting/ejs/ejsrpc.h"
2005-07-02 15:12:33 +04:00
2005-07-08 07:10:30 +04:00
/*
set the switch var to be used by the next union switch
*/
void ejs_set_switch ( struct ejs_rpc * ejs , uint32_t switch_var )
{
ejs - > switch_var = switch_var ;
}
2005-07-02 15:12:33 +04:00
2005-07-07 12:20:57 +04:00
/*
panic in the ejs wrapper code
*/
NTSTATUS ejs_panic ( struct ejs_rpc * ejs , const char * why )
{
ejsSetErrorMsg ( ejs - > eid , " rpc_call '%s' failed - %s " , ejs - > callname , why ) ;
return NT_STATUS_INTERNAL_ERROR ;
}
2005-07-07 10:25:04 +04:00
/*
start the ejs pull process for a structure
*/
NTSTATUS ejs_pull_struct_start ( struct ejs_rpc * ejs , struct MprVar * * v , const char * name )
{
2005-07-09 16:53:50 +04:00
return mprGetVar ( v , name ) ;
2005-07-07 10:25:04 +04:00
}
/*
start the ejs push process for a structure
*/
NTSTATUS ejs_push_struct_start ( struct ejs_rpc * ejs , struct MprVar * * v , const char * name )
{
2005-07-11 14:18:26 +04:00
NDR_CHECK ( mprSetVar ( * v , name , mprObject ( name ) ) ) ;
2005-07-09 16:53:50 +04:00
return mprGetVar ( v , name ) ;
2005-07-07 10:25:04 +04:00
}
2005-07-04 05:31:34 +04:00
/*
pull a uint8 from a mpr variable to a C element
*/
NTSTATUS ejs_pull_uint8 ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , uint8_t * r )
{
2005-07-09 16:53:50 +04:00
NDR_CHECK ( mprGetVar ( & v , name ) ) ;
* r = mprVarToInteger ( v ) ;
2005-07-04 05:31:34 +04:00
return NT_STATUS_OK ;
}
NTSTATUS ejs_push_uint8 ( struct ejs_rpc * ejs ,
2005-07-07 11:42:47 +04:00
struct MprVar * v , const char * name , const uint8_t * r )
2005-07-04 05:31:34 +04:00
{
2005-07-07 11:42:47 +04:00
return mprSetVar ( v , name , mprCreateIntegerVar ( * r ) ) ;
2005-07-04 05:31:34 +04:00
}
/*
pull a uint16 from a mpr variable to a C element
*/
NTSTATUS ejs_pull_uint16 ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , uint16_t * r )
{
2005-07-09 16:53:50 +04:00
NDR_CHECK ( mprGetVar ( & v , name ) ) ;
* r = mprVarToInteger ( v ) ;
2005-07-04 05:31:34 +04:00
return NT_STATUS_OK ;
}
NTSTATUS ejs_push_uint16 ( struct ejs_rpc * ejs ,
2005-07-07 11:42:47 +04:00
struct MprVar * v , const char * name , const uint16_t * r )
2005-07-04 05:31:34 +04:00
{
2005-07-07 11:42:47 +04:00
return mprSetVar ( v , name , mprCreateIntegerVar ( * r ) ) ;
2005-07-04 05:31:34 +04:00
}
2005-07-02 15:12:33 +04:00
/*
pull a uint32 from a mpr variable to a C element
*/
NTSTATUS ejs_pull_uint32 ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , uint32_t * r )
{
2005-07-09 16:53:50 +04:00
NDR_CHECK ( mprGetVar ( & v , name ) ) ;
* r = mprVarToInteger ( v ) ;
2005-07-02 15:12:33 +04:00
return NT_STATUS_OK ;
}
NTSTATUS ejs_push_uint32 ( struct ejs_rpc * ejs ,
2005-07-07 11:42:47 +04:00
struct MprVar * v , const char * name , const uint32_t * r )
2005-07-02 15:12:33 +04:00
{
2005-07-07 11:42:47 +04:00
return mprSetVar ( v , name , mprCreateIntegerVar ( * r ) ) ;
2005-07-02 15:12:33 +04:00
}
2005-07-07 10:25:04 +04:00
2005-07-09 16:53:50 +04:00
/*
pull a int32 from a mpr variable to a C element
*/
NTSTATUS ejs_pull_int32 ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , int32_t * r )
{
NDR_CHECK ( mprGetVar ( & v , name ) ) ;
* r = mprVarToInteger ( v ) ;
return NT_STATUS_OK ;
}
NTSTATUS ejs_push_int32 ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , const int32_t * r )
{
return mprSetVar ( v , name , mprCreateIntegerVar ( * r ) ) ;
}
2005-07-07 10:25:04 +04:00
NTSTATUS ejs_pull_hyper ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , uint64_t * r )
{
2005-07-09 16:53:50 +04:00
NDR_CHECK ( mprGetVar ( & v , name ) ) ;
2005-07-19 10:07:10 +04:00
* r = mprVarToNumber ( v ) ;
2005-07-07 10:25:04 +04:00
return NT_STATUS_OK ;
}
NTSTATUS ejs_push_hyper ( struct ejs_rpc * ejs ,
2005-07-07 11:42:47 +04:00
struct MprVar * v , const char * name , const uint64_t * r )
2005-07-07 10:25:04 +04:00
{
2005-07-19 10:07:10 +04:00
return mprSetVar ( v , name , mprCreateNumberVar ( * r ) ) ;
2005-07-07 10:25:04 +04:00
}
2005-07-08 12:18:52 +04:00
NTSTATUS ejs_pull_dlong ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , uint64_t * r )
{
2005-07-19 10:07:10 +04:00
return ejs_pull_hyper ( ejs , v , name , r ) ;
2005-07-08 12:18:52 +04:00
}
NTSTATUS ejs_push_dlong ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , const uint64_t * r )
{
2005-07-19 10:07:10 +04:00
return ejs_push_hyper ( ejs , v , name , r ) ;
2005-07-08 12:18:52 +04:00
}
NTSTATUS ejs_pull_udlong ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , uint64_t * r )
{
2005-07-19 10:07:10 +04:00
return ejs_pull_hyper ( ejs , v , name , r ) ;
2005-07-08 12:18:52 +04:00
}
NTSTATUS ejs_push_udlong ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , const uint64_t * r )
{
2005-07-19 10:07:10 +04:00
return ejs_push_hyper ( ejs , v , name , r ) ;
2005-07-08 12:18:52 +04:00
}
NTSTATUS ejs_pull_NTTIME ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , uint64_t * r )
{
2005-07-19 10:07:10 +04:00
return ejs_pull_hyper ( ejs , v , name , r ) ;
2005-07-08 12:18:52 +04:00
}
NTSTATUS ejs_push_NTTIME ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , const uint64_t * r )
{
2005-07-19 10:07:10 +04:00
return ejs_push_hyper ( ejs , v , name , r ) ;
2005-07-08 12:18:52 +04:00
}
2005-07-07 10:25:04 +04:00
/*
pull a enum from a mpr variable to a C element
a enum is just treating as an unsigned integer at this level
*/
NTSTATUS ejs_pull_enum ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , unsigned * r )
{
2005-07-09 16:53:50 +04:00
NDR_CHECK ( mprGetVar ( & v , name ) ) ;
* r = mprVarToInteger ( v ) ;
2005-07-07 10:25:04 +04:00
return NT_STATUS_OK ;
}
NTSTATUS ejs_push_enum ( struct ejs_rpc * ejs ,
2005-07-07 11:42:47 +04:00
struct MprVar * v , const char * name , const unsigned * r )
2005-07-07 10:25:04 +04:00
{
2005-07-07 11:42:47 +04:00
return mprSetVar ( v , name , mprCreateIntegerVar ( * r ) ) ;
2005-07-07 10:25:04 +04:00
}
2005-07-07 12:20:57 +04:00
/*
pull a string
*/
NTSTATUS ejs_pull_string ( struct ejs_rpc * ejs ,
2005-07-08 12:18:52 +04:00
struct MprVar * v , const char * name , const char * * s )
2005-07-07 12:20:57 +04:00
{
2005-07-09 16:53:50 +04:00
NDR_CHECK ( mprGetVar ( & v , name ) ) ;
* s = mprToString ( v ) ;
2005-07-07 12:20:57 +04:00
return NT_STATUS_OK ;
}
/*
push a string
*/
NTSTATUS ejs_push_string ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , const char * s )
{
2005-07-12 09:53:51 +04:00
return mprSetVar ( v , name , mprString ( s ) ) ;
2005-07-07 12:20:57 +04:00
}
2005-07-08 08:55:07 +04:00
2005-07-08 12:18:52 +04:00
NTSTATUS ejs_pull_dom_sid ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , struct dom_sid * r )
{
struct dom_sid * sid ;
2005-07-09 16:53:50 +04:00
NDR_CHECK ( mprGetVar ( & v , name ) ) ;
sid = dom_sid_parse_talloc ( ejs , mprToString ( v ) ) ;
2005-07-08 12:18:52 +04:00
NT_STATUS_HAVE_NO_MEMORY ( sid ) ;
* r = * sid ;
return NT_STATUS_OK ;
}
NTSTATUS ejs_push_dom_sid ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , const struct dom_sid * r )
{
char * sidstr = dom_sid_string ( ejs , r ) ;
NT_STATUS_HAVE_NO_MEMORY ( sidstr ) ;
2005-07-12 09:53:51 +04:00
return mprSetVar ( v , name , mprString ( sidstr ) ) ;
2005-07-08 12:18:52 +04:00
}
NTSTATUS ejs_pull_GUID ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , struct GUID * r )
{
2005-07-09 16:53:50 +04:00
NDR_CHECK ( mprGetVar ( & v , name ) ) ;
return GUID_from_string ( mprToString ( v ) , r ) ;
2005-07-08 12:18:52 +04:00
}
NTSTATUS ejs_push_GUID ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , const struct GUID * r )
{
char * guid = GUID_string ( ejs , r ) ;
NT_STATUS_HAVE_NO_MEMORY ( guid ) ;
2005-07-12 09:53:51 +04:00
return mprSetVar ( v , name , mprString ( guid ) ) ;
2005-07-08 12:18:52 +04:00
}
2005-07-08 14:29:18 +04:00
NTSTATUS ejs_push_null ( struct ejs_rpc * ejs , struct MprVar * v , const char * name )
{
2005-07-12 02:40:32 +04:00
return mprSetVar ( v , name , mprCreatePtrVar ( NULL ) ) ;
2005-07-08 14:29:18 +04:00
}
BOOL ejs_pull_null ( struct ejs_rpc * ejs , struct MprVar * v , const char * name )
{
2005-07-09 16:53:50 +04:00
NTSTATUS status = mprGetVar ( & v , name ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
return False ;
2005-07-08 14:29:18 +04:00
}
if ( v - > type = = MPR_TYPE_PTR & & v - > ptr = = NULL ) {
return True ;
}
return False ;
}
2005-07-09 09:28:42 +04:00
/*
pull a lsa_String
*/
NTSTATUS ejs_pull_lsa_String ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , struct lsa_String * r )
{
return ejs_pull_string ( ejs , v , name , & r - > string ) ;
}
/*
push a lsa_String
*/
NTSTATUS ejs_push_lsa_String ( struct ejs_rpc * ejs ,
struct MprVar * v , const char * name , const struct lsa_String * r )
{
return ejs_push_string ( ejs , v , name , r - > string ) ;
}
2005-07-09 16:53:50 +04:00