diff options
-rw-r--r-- | source4/build/pidl/ejs.pm | 88 | ||||
-rw-r--r-- | source4/scripting/ejs/ejsrpc.c | 27 | ||||
-rw-r--r-- | source4/scripting/ejs/ejsrpc.h | 17 |
3 files changed, 71 insertions, 61 deletions
diff --git a/source4/build/pidl/ejs.pm b/source4/build/pidl/ejs.pm index db8db00014..1b5c34510c 100644 --- a/source4/build/pidl/ejs.pm +++ b/source4/build/pidl/ejs.pm @@ -90,60 +90,87 @@ sub get_value_of($) ########################### # pull a scalar element -sub EjsPullScalar($$) +sub EjsPullScalar($$$$$) { - my $e = shift; - my $env = shift; - my $var = util::ParseExpr($e->{NAME}, $env); - my $ptr = get_pointer_to($var); - pidl "\tNDR_CHECK(ejs_pull_$e->{TYPE}(ejs, v, \"$e->{NAME}\", $ptr));\n"; + my ($e, $l, $var, $name, $env) = @_; + $var = get_pointer_to($var); + pidl "\tNDR_CHECK(ejs_pull_$e->{TYPE}(ejs, v, $name, $var));\n"; +} + +########################### +# pull a pointer element +sub EjsPullPointer($$$$$) +{ + my ($e, $l, $var, $name, $env) = @_; + pidl "EJS_ALLOC(ejs, $var);\n"; + $var = get_value_of($var); + EjsPullElement($e, Ndr::GetNextLevel($e, $l), $var, $name, $env); } ########################### # pull a string element -sub EjsPullString($$$) +sub EjsPullString($$$$$) { - my $e = shift; - my $l = shift; - my $env = shift; - my $var = util::ParseExpr($e->{NAME}, $env); - my $ptr = get_pointer_to($var); - pidl "\tNDR_CHECK(ejs_pull_string(ejs, v, \"$e->{NAME}\", $ptr));\n"; + my ($e, $l, $var, $name, $env) = @_; + $var = get_pointer_to($var); + pidl "\tNDR_CHECK(ejs_pull_string(ejs, v, $name, $var));\n"; } ########################### # pull an arrar element -# only handles a very limited range of array types so far -sub EjsPullArray($$$) +sub EjsPullArray($$$$$) { - my $e = shift; - my $l = shift; - my $env = shift; + my ($e, $l, $var, $name, $env) = @_; my $length = util::ParseExpr($l->{LENGTH_IS}, $env); - my $var = util::ParseExpr($e->{NAME}, $env); - my $ptr = get_pointer_to($var); - pidl "\tNDR_CHECK(ejs_pull_array(ejs, v, \"$e->{NAME}\", $length, sizeof($var\[0]), (void **)$ptr, (ejs_pull_t)ejs_pull_$e->{TYPE}));\n"; + pidl "{ uint32_t i; EJS_ALLOC_N(ejs, $var, $length); for (i=0;i<$length;i++) {\n"; + pidl "\tconst char *id = talloc_asprintf(ejs, \"%s.%u\", $name, i);\n"; + EjsPullElement($e, Ndr::GetNextLevel($e, $l), $var . "[i]", "id", $env); + pidl "}\nejs_push_uint32(ejs, v, $name \".length\", &i); }\n"; +} + +########################### +# pull a switch element +sub EjsPullSwitch($$$$$) +{ + my ($e, $l, $var, $name, $env) = @_; + my $switch_var = util::ParseExpr($l->{SWITCH_IS}, $env); + pidl "ejs_set_switch(ejs, $switch_var);\n"; + EjsPullElement($e, Ndr::GetNextLevel($e, $l), $var, $name, $env); } ########################### # pull a structure element -sub EjsPullElement($$) +sub EjsPullElement($$$$$) { - my $e = shift; - my $env = shift; - my $l = $e->{LEVELS}[0]; + my ($e, $l, $var, $name, $env) = @_; if (util::has_property($e, "charset")) { - EjsPullString($e, $l, $env); + EjsPullString($e, $l, $var, $name, $env); } elsif ($l->{TYPE} eq "ARRAY") { - EjsPullArray($e, $l, $env); + EjsPullArray($e, $l, $var, $name, $env); } elsif ($l->{TYPE} eq "DATA") { - EjsPullScalar($e, $env); + EjsPullScalar($e, $l, $var, $name, $env); + } elsif (($l->{TYPE} eq "POINTER")) { + EjsPullPointer($e, $l, $var, $name, $env); + } elsif (($l->{TYPE} eq "SWITCH")) { + EjsPullSwitch($e, $l, $var, $name, $env); } else { pidl "return ejs_panic(ejs, \"unhandled pull type $l->{TYPE}\");\n"; } } +############################################# +# pull a structure/union element at top level +sub EjsPullElementTop($$) +{ + my $e = shift; + my $env = shift; + my $l = $e->{LEVELS}[0]; + my $var = util::ParseExpr($e->{NAME}, $env); + my $name = "\"$e->{NAME}\""; + EjsPullElement($e, $l, $var, $name, $env); +} + ########################### # pull a struct sub EjsStructPull($$) @@ -154,7 +181,7 @@ sub EjsStructPull($$) pidl "\nstatic NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, struct $name *r)\n{\n"; pidl "\tNDR_CHECK(ejs_pull_struct_start(ejs, &v, name));\n"; foreach my $e (@{$d->{ELEMENTS}}) { - EjsPullElement($e, $env); + EjsPullElementTop($e, $env); } pidl "\treturn NT_STATUS_OK;\n"; pidl "}\n\n"; @@ -227,7 +254,7 @@ sub EjsPullFunction($) foreach my $e (@{$d->{ELEMENTS}}) { next unless (grep(/in/, @{$e->{DIRECTION}})); - EjsPullElement($e, $env); + EjsPullElementTop($e, $env); } pidl "\treturn NT_STATUS_OK;\n"; @@ -274,7 +301,6 @@ sub EjsPushSwitch($$$$$) ########################### # push an arrar element -# only handles a very limited range of array types so far sub EjsPushArray($$$$$) { my ($e, $l, $var, $name, $env) = @_; diff --git a/source4/scripting/ejs/ejsrpc.c b/source4/scripting/ejs/ejsrpc.c index 965fd8d447..574c75b7de 100644 --- a/source4/scripting/ejs/ejsrpc.c +++ b/source4/scripting/ejs/ejsrpc.c @@ -254,33 +254,6 @@ NTSTATUS ejs_push_enum(struct ejs_rpc *ejs, /* - pull an array of elements -*/ -NTSTATUS ejs_pull_array(struct ejs_rpc *ejs, - struct MprVar *v, const char *name, uint32_t length, - size_t elsize, void **r, ejs_pull_t ejs_pull) -{ - int i; - char *data; - - NDR_CHECK(ejs_pull_struct_start(ejs, &v, name)); - - (*r) = talloc_array_size(ejs, elsize, length); - NT_STATUS_HAVE_NO_MEMORY(*r); - - data = *r; - - for (i=0;i<length;i++) { - char *id = talloc_asprintf(ejs, "%u", i); - NT_STATUS_HAVE_NO_MEMORY(id); - NDR_CHECK(ejs_pull(ejs, v, id, (i*elsize)+data)); - talloc_free(id); - } - return NT_STATUS_OK; -} - - -/* pull a string */ NTSTATUS ejs_pull_string(struct ejs_rpc *ejs, diff --git a/source4/scripting/ejs/ejsrpc.h b/source4/scripting/ejs/ejsrpc.h index 67b81b3411..fdf15c027c 100644 --- a/source4/scripting/ejs/ejsrpc.h +++ b/source4/scripting/ejs/ejsrpc.h @@ -64,10 +64,21 @@ NTSTATUS ejs_pull_enum(struct ejs_rpc *ejs, struct MprVar *v, const char *name, unsigned *r); NTSTATUS ejs_push_enum(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const unsigned *r); -NTSTATUS ejs_pull_array(struct ejs_rpc *ejs, - struct MprVar *v, const char *name, uint32_t length, - size_t elsize, void **r, ejs_pull_t ejs_pull); NTSTATUS ejs_pull_string(struct ejs_rpc *ejs, struct MprVar *v, const char *name, char **s); NTSTATUS ejs_push_string(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const char *s); + +#define EJS_ALLOC_SIZE(ejs, s, size) do { \ + (s) = talloc_size(ejs, size); \ + if (!(s)) return ejs_panic(ejs, "out of memory"); \ +} while (0) + +#define EJS_ALLOC(ejs, s) EJS_ALLOC_SIZE(ejs, s, sizeof(*(s))) + +#define EJS_ALLOC_N_SIZE(ejs, s, n, elsize) do { \ + (s) = talloc_array_size(ejs, elsize, n); \ + if (!(s)) return ejs_panic(ejs, "out of memory"); \ +} while (0) + +#define EJS_ALLOC_N(ejs, s, n) EJS_ALLOC_N_SIZE(ejs, s, n, sizeof(*(s))) |