The branch, master has been updated via 5796da6948379ffc101e813a4d68676e4a661c61 (commit) via 6392f14cd78d3f0585615ccf0a6b0a961187f68f (commit) from ed051ce424a93e08f59cd65ae0abe1a8926286a3 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 5796da6948379ffc101e813a4d68676e4a661c61 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Aug 12 10:24:01 2009 +0200 pidl: fix parse_idl test after idl.yp changes We now generate 'FILE' and 'LINE' elements for each layer. This change makes the expected PIDL trees human readable:-) metze commit 6392f14cd78d3f0585615ccf0a6b0a961187f68f Author: Stefan Metzmacher <me...@samba.org> Date: Wed Aug 12 10:01:12 2009 +0200 pidl: fix samba3-cli test after the async function were added metze ----------------------------------------------------------------------- Summary of changes: pidl/tests/parse_idl.pl | 131 ++++++++++++++++++++++------ pidl/tests/samba3-cli.pl | 214 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 315 insertions(+), 30 deletions(-) Changeset truncated at 500 lines: diff --git a/pidl/tests/parse_idl.pl b/pidl/tests/parse_idl.pl index 9d43ddc..e06526d 100755 --- a/pidl/tests/parse_idl.pl +++ b/pidl/tests/parse_idl.pl @@ -113,52 +113,127 @@ testok "cpp-quote", "cpp_quote(\"bla\")"; my $x = Parse::Pidl::IDL::parse_string("interface foo { struct x {}; }", "<foo>"); -is_deeply($x, - [ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [ - { 'NAME' => 'x', 'TYPE' => 'STRUCT', ELEMENTS => [] } ], - 'TYPE' => 'INTERFACE', 'LINE' => 0 } ]); +is_deeply($x, [ { + 'TYPE' => 'INTERFACE', + 'NAME' => 'foo', + 'DATA' => [ { + 'TYPE' => 'STRUCT', + 'NAME' => 'x', + 'ELEMENTS' => [], + 'FILE' => '<foo>', + 'LINE' => 0 + } ], + 'FILE' => '<foo>', + 'LINE' => 0 +}]); $x = Parse::Pidl::IDL::parse_string("interface foo { struct x; }", "<foo>"); -is_deeply($x, - [ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [ - { 'NAME' => 'x', 'TYPE' => 'STRUCT' } ], - 'TYPE' => 'INTERFACE', 'LINE' => 0 } ]); +is_deeply($x, [ { + 'TYPE' => 'INTERFACE', + 'NAME' => 'foo', + 'DATA' => [ { + 'TYPE' => 'STRUCT', + 'NAME' => 'x', + 'FILE' => '<foo>', + 'LINE' => 0 + } ], + 'FILE' => '<foo>', + 'LINE' => 0 +}]); $x = Parse::Pidl::IDL::parse_string("cpp_quote(\"foobar\")", "<quote>"); -is_deeply($x, - [ { 'FILE' => '<quote>', 'DATA' => '"foobar"', - 'TYPE' => 'CPP_QUOTE', 'LINE' => 0 } ]); +is_deeply($x, [ { + 'TYPE' => 'CPP_QUOTE', + 'DATA' => '"foobar"', + 'FILE' => '<quote>', + 'LINE' => 0 +}]); # A typedef of a struct without body $x = Parse::Pidl::IDL::parse_string("interface foo { typedef struct x y; }", "<foo>"); -is_deeply($x, - [ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [ - { 'FILE' => '<foo>', 'LINE' => 0, 'NAME' => 'y', 'TYPE' => 'TYPEDEF', DATA => { - TYPE => 'STRUCT', NAME => 'x' } } ], - 'TYPE' => 'INTERFACE', 'LINE' => 0 } ]); +is_deeply($x, [ { + 'TYPE' => 'INTERFACE', + 'NAME' => 'foo', + 'DATA' => [ { + 'TYPE' => 'TYPEDEF', + 'NAME' => 'y', + 'DATA' => { + 'TYPE' => 'STRUCT', + 'NAME' => 'x', + 'FILE' => '<foo>', + 'LINE' => 0, + }, + 'FILE' => '<foo>', + 'LINE' => 0, + } ], + 'FILE' => '<foo>', + 'LINE' => 0 +}]); # A typedef of a struct with empty body $x = Parse::Pidl::IDL::parse_string("interface foo { typedef struct {} y; }", "<foo>"); -is_deeply($x, - [ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [ - { 'FILE' => '<foo>', 'LINE' => 0, 'NAME' => 'y', 'TYPE' => 'TYPEDEF', DATA => { TYPE => 'STRUCT', ELEMENTS => [] } } ], - 'TYPE' => 'INTERFACE', 'LINE' => 0 } ]); +is_deeply($x, [ { + 'TYPE' => 'INTERFACE', + 'NAME' => 'foo', + 'DATA' => [ { + 'TYPE' => 'TYPEDEF', + 'NAME' => 'y', + 'DATA' => { + 'TYPE' => 'STRUCT', + 'ELEMENTS' => [], + 'FILE' => '<foo>', + 'LINE' => 0 + }, + 'FILE' => '<foo>', + 'LINE' => 0 + } ], + 'FILE' => '<foo>', + 'LINE' => 0 +}]); # A typedef of a bitmap with no body $x = Parse::Pidl::IDL::parse_string("interface foo { typedef bitmap x y; }", "<foo>"); -is_deeply($x, - [ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [ - { 'FILE' => '<foo>', 'LINE' => 0, 'NAME' => 'y', 'TYPE' => 'TYPEDEF', DATA => { TYPE => 'BITMAP', NAME => 'x' } } ], - 'TYPE' => 'INTERFACE', 'LINE' => 0 } ]); +is_deeply($x, [ { + 'TYPE' => 'INTERFACE', + 'NAME' => 'foo', + 'DATA' => [ { + 'TYPE' => 'TYPEDEF', + 'NAME' => 'y', + 'DATA' => { + 'TYPE' => 'BITMAP', + 'NAME' => 'x', + 'FILE' => '<foo>', + 'LINE' => 0 + }, + 'FILE' => '<foo>', + 'LINE' => 0 + } ], + 'FILE' => '<foo>', + 'LINE' => 0 +}]); # A typedef of a union with no body $x = Parse::Pidl::IDL::parse_string("interface foo { typedef union x y; }", "<foo>"); -is_deeply($x, - [ { 'FILE' => '<foo>', 'NAME' => 'foo', 'DATA' => [ - { 'FILE' => '<foo>', 'LINE' => 0, 'NAME' => 'y', 'TYPE' => 'TYPEDEF', DATA => { TYPE => 'UNION', NAME => 'x' } } ], - 'TYPE' => 'INTERFACE', 'LINE' => 0 } ]); +is_deeply($x, [ { + 'TYPE' => 'INTERFACE', + 'NAME' => 'foo', + 'DATA' => [ { + 'TYPE' => 'TYPEDEF', + 'NAME' => 'y', + 'DATA' => { + 'TYPE' => 'UNION', + 'NAME' => 'x', + 'FILE' => '<foo>', + 'LINE' => 0 + }, + 'FILE' => '<foo>', + 'LINE' => 0 + } ], + 'FILE' => '<foo>', + 'LINE' => 0 +}]); diff --git a/pidl/tests/samba3-cli.pl b/pidl/tests/samba3-cli.pl index 5a55163..be4bf0a 100755 --- a/pidl/tests/samba3-cli.pl +++ b/pidl/tests/samba3-cli.pl @@ -30,7 +30,107 @@ my $x = new Parse::Pidl::Samba3::ClientNDR(); $fn = { NAME => "bar", ELEMENTS => [ ] }; $x->ParseFunction("foo", $fn); is($x->{res}, -"NTSTATUS rpccli_bar(struct rpc_pipe_client *cli, +"struct rpccli_bar_state { + struct bar orig; + struct bar tmp; + TALLOC_CTX *out_mem_ctx; + NTSTATUS (*dispatch_recv)(struct tevent_req *req, TALLOC_CTX *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; + state->dispatch_recv = cli->dispatch_recv; + + /* In parameters */ + + /* Out parameters */ + + if (DEBUGLEVEL >= 10) { + NDR_PRINT_IN_DEBUG(bar, &state->orig); + } + + /* make a temporary copy, that we pass to the dispatch function */ + state->tmp = state->orig; + + subreq = cli->dispatch_send(state, ev, cli, + &ndr_table_foo, + NDR_BAR, + &state->tmp); + 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; + } + + status = state->dispatch_recv(subreq, mem_ctx); + TALLOC_FREE(subreq); + if (!NT_STATUS_IS_OK(status)) { + tevent_req_nterror(req, status); + return; + } + + /* Copy out parameters */ + + /* Reset temporary structure */ + ZERO_STRUCT(state->tmp); + + if (DEBUGLEVEL >= 10) { + NDR_PRINT_OUT_DEBUG(bar, &state->orig); + } + + 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; + } + + /* Steal possbile out parameters to the callers context */ + talloc_steal(mem_ctx, state->out_mem_ctx); + + tevent_req_received(req); + return NT_STATUS_OK; +} + +NTSTATUS rpccli_bar(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx) { \tstruct bar r; @@ -73,7 +173,117 @@ $x = new Parse::Pidl::Samba3::ClientNDR(); $fn = { NAME => "bar", ELEMENTS => [ ], RETURN_TYPE => "WERROR" }; $x->ParseFunction("foo", $fn); is($x->{res}, -"NTSTATUS rpccli_bar(struct rpc_pipe_client *cli, +"struct rpccli_bar_state { + struct bar orig; + struct bar tmp; + TALLOC_CTX *out_mem_ctx; + NTSTATUS (*dispatch_recv)(struct tevent_req *req, TALLOC_CTX *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; + state->dispatch_recv = cli->dispatch_recv; + + /* In parameters */ + + /* Out parameters */ + + /* Result */ + ZERO_STRUCT(state->orig.out.result); + + if (DEBUGLEVEL >= 10) { + NDR_PRINT_IN_DEBUG(bar, &state->orig); + } + + /* make a temporary copy, that we pass to the dispatch function */ + state->tmp = state->orig; + + subreq = cli->dispatch_send(state, ev, cli, + &ndr_table_foo, + NDR_BAR, + &state->tmp); + 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; + } + + status = state->dispatch_recv(subreq, mem_ctx); + TALLOC_FREE(subreq); + if (!NT_STATUS_IS_OK(status)) { + tevent_req_nterror(req, status); + return; + } + + /* Copy out parameters */ + + /* Copy result */ + state->orig.out.result = state->tmp.out.result; + + /* Reset temporary structure */ + ZERO_STRUCT(state->tmp); + + if (DEBUGLEVEL >= 10) { + NDR_PRINT_OUT_DEBUG(bar, &state->orig); + } + + 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; + } + + /* Steal possbile out parameters to the callers context */ + talloc_steal(mem_ctx, state->out_mem_ctx); + + /* Return result */ + *result = state->orig.out.result; + + tevent_req_received(req); + return NT_STATUS_OK; +} + +NTSTATUS rpccli_bar(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, WERROR *werror) { -- Samba Shared Repository