2007-02-14 17:23:59 +03:00
#!/usr/bin/perl
# (C) 2007 Jelmer Vernooij <jelmer@samba.org>
# Published under the GNU General Public License
use strict ;
use warnings ;
2010-08-25 12:07:54 +04:00
use Test::More tests = > 8 ;
2007-02-14 17:23:59 +03:00
use FindBin qw( $RealBin ) ;
use lib "$RealBin" ;
use Util ;
use Parse::Pidl::Util qw( MyDumper ) ;
2010-08-25 12:07:54 +04:00
use Parse::Pidl::Samba3::ClientNDR qw( ParseFunction ) ;
2008-01-13 20:15:12 +03:00
use Parse::Pidl::Samba4::Header qw( GenerateFunctionInEnv GenerateFunctionOutEnv ) ;
2007-02-14 17:23:59 +03:00
# Make sure GenerateFunctionInEnv and GenerateFunctionOutEnv work
my $ fn = { ELEMENTS = > [ { DIRECTION = > [ "in" ] , NAME = > "foo" } ] } ;
2007-08-15 12:55:16 +04:00
is_deeply ( { "foo" = > "r.in.foo" } , GenerateFunctionInEnv ( $ fn , "r." ) ) ;
is_deeply ( { "foo" = > "r.in.foo" } , GenerateFunctionOutEnv ( $ fn , "r." ) ) ;
2007-02-14 17:23:59 +03:00
$ fn = { ELEMENTS = > [ { DIRECTION = > [ "out" , "in" ] , NAME = > "foo" } ] } ;
2007-08-15 12:55:16 +04:00
is_deeply ( { "foo" = > "r.in.foo" } , GenerateFunctionInEnv ( $ fn , "r." ) ) ;
is_deeply ( { "foo" = > "r.out.foo" } , GenerateFunctionOutEnv ( $ fn , "r." ) ) ;
2007-02-14 17:23:59 +03:00
$ fn = { ELEMENTS = > [ { DIRECTION = > [ "out" ] , NAME = > "foo" } ] } ;
2007-08-15 12:55:16 +04:00
is_deeply ( { } , GenerateFunctionInEnv ( $ fn , "r." ) ) ;
is_deeply ( { "foo" = > "r.out.foo" } , GenerateFunctionOutEnv ( $ fn , "r." ) ) ;
2007-02-14 17:23:59 +03:00
2007-04-22 18:19:22 +04:00
my $ x = new Parse::Pidl::Samba3:: ClientNDR ( ) ;
2007-02-14 17:23:59 +03:00
$ fn = { NAME = > "bar" , ELEMENTS = > [ ] } ;
2007-04-22 18:19:22 +04:00
$ x - > ParseFunction ( "foo" , $ fn ) ;
2008-01-10 22:38:14 +03:00
is ( $ x - > { res } ,
2009-08-12 12:01:12 +04:00
" struct rpccli_bar_state {
TALLOC_CTX * out_mem_ctx ;
} ;
static void rpccli_bar_done ( struct tevent_req * subreq ) ;
struct tevent_req * rpccli_bar_send ( TALLOC_CTX * mem_ctx ,
struct tevent_context * ev ,
struct rpc_pipe_client * cli )
{
struct tevent_req * req ;
struct rpccli_bar_state * state ;
struct tevent_req * subreq ;
req = tevent_req_create ( mem_ctx , & state ,
struct rpccli_bar_state ) ;
if ( req == NULL ) {
return NULL ;
}
state - > out_mem_ctx = NULL ;
2010-08-05 23:01:25 +04:00
subreq = dcerpc_bar_send ( state ,
ev ,
cli - > binding_handle ) ;
2009-08-12 12:01:12 +04:00
if ( tevent_req_nomem ( subreq , req ) ) {
return tevent_req_post ( req , ev ) ;
}
tevent_req_set_callback ( subreq , rpccli_bar_done , req ) ;
return req ;
}
static void rpccli_bar_done ( struct tevent_req * subreq )
{
struct tevent_req * req = tevent_req_callback_data (
subreq , struct tevent_req ) ;
struct rpccli_bar_state * state = tevent_req_data (
req , struct rpccli_bar_state ) ;
NTSTATUS status ;
TALLOC_CTX * mem_ctx ;
if ( state - > out_mem_ctx ) {
mem_ctx = state - > out_mem_ctx ;
} else {
mem_ctx = state ;
}
2010-08-05 23:01:25 +04:00
status = dcerpc_bar_recv ( subreq ,
mem_ctx ) ;
2009-08-12 12:01:12 +04:00
TALLOC_FREE ( subreq ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
tevent_req_nterror ( req , status ) ;
return ;
}
tevent_req_done ( req ) ;
}
NTSTATUS rpccli_bar_recv ( struct tevent_req * req ,
TALLOC_CTX * mem_ctx )
{
struct rpccli_bar_state * state = tevent_req_data (
req , struct rpccli_bar_state ) ;
NTSTATUS status ;
if ( tevent_req_is_nterror ( req , & status ) ) {
tevent_req_received ( req ) ;
return status ;
}
2010-08-16 23:12:52 +04:00
/* Steal possible out parameters to the callers context */
2009-08-12 12:01:12 +04:00
talloc_steal ( mem_ctx , state - > out_mem_ctx ) ;
tevent_req_received ( req ) ;
return NT_STATUS_OK ;
}
NTSTATUS rpccli_bar ( struct rpc_pipe_client * cli ,
2008-01-10 22:38:14 +03:00
TALLOC_CTX * mem_ctx )
2007-02-14 17:23:59 +03:00
{
2009-11-09 16:26:55 +03:00
NTSTATUS status ;
2008-01-10 22:38:14 +03:00
2010-08-05 23:01:25 +04:00
status = dcerpc_bar ( cli - > binding_handle ,
mem_ctx ) ;
2009-11-09 16:26:55 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return status ;
}
2008-01-10 22:38:14 +03:00
2009-11-09 16:26:55 +03:00
/* Return result */
return NT_STATUS_OK ;
2007-02-14 17:23:59 +03:00
}
" ) ;
2007-12-03 19:51:50 +03:00
$ x = new Parse::Pidl::Samba3:: ClientNDR ( ) ;
$ fn = { NAME = > "bar" , ELEMENTS = > [ ] , RETURN_TYPE = > "WERROR" } ;
$ x - > ParseFunction ( "foo" , $ fn ) ;
2008-01-10 22:38:14 +03:00
is ( $ x - > { res } ,
2009-08-12 12:01:12 +04:00
" struct rpccli_bar_state {
TALLOC_CTX * out_mem_ctx ;
2010-08-05 23:01:25 +04:00
WERROR result ;
2009-08-12 12:01:12 +04:00
} ;
static void rpccli_bar_done ( struct tevent_req * subreq ) ;
struct tevent_req * rpccli_bar_send ( TALLOC_CTX * mem_ctx ,
struct tevent_context * ev ,
struct rpc_pipe_client * cli )
{
struct tevent_req * req ;
struct rpccli_bar_state * state ;
struct tevent_req * subreq ;
req = tevent_req_create ( mem_ctx , & state ,
struct rpccli_bar_state ) ;
if ( req == NULL ) {
return NULL ;
}
state - > out_mem_ctx = NULL ;
2010-08-05 23:01:25 +04:00
subreq = dcerpc_bar_send ( state ,
ev ,
cli - > binding_handle ) ;
2009-08-12 12:01:12 +04:00
if ( tevent_req_nomem ( subreq , req ) ) {
return tevent_req_post ( req , ev ) ;
}
tevent_req_set_callback ( subreq , rpccli_bar_done , req ) ;
return req ;
}
static void rpccli_bar_done ( struct tevent_req * subreq )
{
struct tevent_req * req = tevent_req_callback_data (
subreq , struct tevent_req ) ;
struct rpccli_bar_state * state = tevent_req_data (
req , struct rpccli_bar_state ) ;
NTSTATUS status ;
TALLOC_CTX * mem_ctx ;
if ( state - > out_mem_ctx ) {
mem_ctx = state - > out_mem_ctx ;
} else {
mem_ctx = state ;
}
2010-08-05 23:01:25 +04:00
status = dcerpc_bar_recv ( subreq ,
mem_ctx ,
& state - > result ) ;
2009-08-12 12:01:12 +04:00
TALLOC_FREE ( subreq ) ;
if ( ! NT_STATUS_IS_OK ( status ) ) {
tevent_req_nterror ( req , status ) ;
return ;
}
tevent_req_done ( req ) ;
}
NTSTATUS rpccli_bar_recv ( struct tevent_req * req ,
TALLOC_CTX * mem_ctx ,
WERROR * result )
{
struct rpccli_bar_state * state = tevent_req_data (
req , struct rpccli_bar_state ) ;
NTSTATUS status ;
if ( tevent_req_is_nterror ( req , & status ) ) {
tevent_req_received ( req ) ;
return status ;
}
2010-08-16 23:12:52 +04:00
/* Steal possible out parameters to the callers context */
2009-08-12 12:01:12 +04:00
talloc_steal ( mem_ctx , state - > out_mem_ctx ) ;
/* Return result */
2010-08-05 23:01:25 +04:00
* result = state - > result ;
2009-08-12 12:01:12 +04:00
tevent_req_received ( req ) ;
return NT_STATUS_OK ;
}
NTSTATUS rpccli_bar ( struct rpc_pipe_client * cli ,
2008-01-10 22:38:14 +03:00
TALLOC_CTX * mem_ctx ,
WERROR * werror )
2007-12-03 19:51:50 +03:00
{
2010-08-05 23:01:25 +04:00
WERROR result ;
2009-11-09 16:26:55 +03:00
NTSTATUS status ;
2008-01-10 22:38:14 +03:00
2010-08-05 23:01:25 +04:00
status = dcerpc_bar ( cli - > binding_handle ,
mem_ctx ,
& result ) ;
2009-11-09 16:26:55 +03:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
return status ;
}
2008-01-10 22:38:14 +03:00
2009-11-09 16:26:55 +03:00
/* Return result */
if ( werror ) {
2010-08-05 23:01:25 +04:00
* werror = result ;
2009-11-09 16:26:55 +03:00
}
2008-01-10 22:38:14 +03:00
2010-08-05 23:01:25 +04:00
return werror_to_ntstatus ( result ) ;
2007-12-03 19:51:50 +03:00
}
" ) ;
2008-04-15 18:00:07 +04:00