1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-27 03:21:53 +03:00

r18477: Finish server code generator for Samba 3.

(This used to be commit 4e2f200424)
This commit is contained in:
Jelmer Vernooij 2006-09-13 15:45:20 +00:00 committed by Gerald (Jerry) Carter
parent 2fb4ecebc1
commit 6a2b541497

View File

@ -33,7 +33,75 @@ sub ParseFunction($$)
pidl "static BOOL api_$fn->{NAME}(pipes_struct *p)";
pidl "{";
indent;
pidl "struct ndr_pull *pull;";
pidl "struct ndr_push *push;";
pidl "DATA_BLOB blob;";
pidl "struct $fn->{NAME} r;";
pidl "TALLOC_CTX *mem_ctx = talloc_init(\"api_$fn->{NAME}\");";
pidl "";
pidl "if (!prs_data_blob(&p->in_data.data, &blob, mem_ctx)) {";
pidl "\ttalloc_free(mem_ctx);";
pidl "\treturn False;";
pidl "}";
pidl "";
pidl "pull = ndr_pull_init_blob(&blob, mem_ctx);";
pidl "if (pull == NULL)";
pidl "\treturn False;";
pidl "";
pidl "pull->flags |= LIBNDR_FLAG_REF_ALLOC;";
pidl "status = ndr_pull_$fn->{NAME}(pull, NDR_IN, &r);";
pidl "if (NT_STATUS_IS_ERR(status)) {";
pidl "\ttalloc_free(mem_ctx);";
pidl "\treturn False;";
pidl "}";
pidl "";
my $proto = "_$fn->{NAME}(pipes_struct *p";
my $ret = "_$fn->{NAME}(p";
foreach (@{$fn->{ELEMENTS}}) {
my @dir = @{$_->{DIRECTION}};
if (grep(@dir, /in/) and grep(@dir, /out/)) {
pidl "r.out.$_->{NAME} = r.in.$_->{NAME};";
}
if (grep(@dir, /in/)) { $ret .= ", r.in.$_->{NAME}"; }
else { $ret .= ", r.out.$_->{NAME}"; }
$proto .= ", " . DeclLong($_);
}
$ret .= ")";
$proto .= ");";
if ($fn->{RETURN_TYPE}) {
$ret = "r.out.result = $ret";
$proto = "$fn->{RETURN_TYPE} $proto";
} else {
$proto = "void $proto";
}
pidl_hdr "$proto";
pidl "$ret;";
pidl "";
pidl "push = ndr_push_init_ctx(mem_ctx);";
pidl "if (push == NULL) {";
pidl "\ttalloc_free(mem_ctx);";
pidl "\treturn False;";
pidl "}";
pidl "";
pidl "status = ndr_push_$fn->{NAME}(push, NDR_OUT, &r);";
pidl "if (NT_STATUS_IS_ERR(status)) {";
pidl "\ttalloc_free(mem_ctx);";
pidl "\treturn False;";
pidl "}";
pidl "";
pidl "blob = ndr_push_blob(push);";
pidl "if (!prs_init_data_blob(&p->in_data.rdata, &blob, p->mem_ctx)) {";
pidl "\ttalloc_free(mem_ctx);";
pidl "\treturn False;";
pidl "}";
pidl "";
pidl "talloc_free(mem_ctx);";
pidl "";
pidl "return True;";
deindent;
pidl "}";
pidl "";