summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/build/pidl/Parse/Pidl/Samba/EJS.pm86
-rw-r--r--source4/librpc/config.mk14
-rw-r--r--source4/librpc/idl/irpc.idl2
3 files changed, 87 insertions, 15 deletions
diff --git a/source4/build/pidl/Parse/Pidl/Samba/EJS.pm b/source4/build/pidl/Parse/Pidl/Samba/EJS.pm
index 72f280add0..ed35d2d237 100644
--- a/source4/build/pidl/Parse/Pidl/Samba/EJS.pm
+++ b/source4/build/pidl/Parse/Pidl/Samba/EJS.pm
@@ -122,11 +122,12 @@ sub EjsPullScalar($$$$$)
return if (Parse::Pidl::Util::has_property($e, "value"));
- $var = get_pointer_to($var);
- # have to handle strings specially :(
- if ($e->{TYPE} eq "string") {
- $var = get_pointer_to($var);
- }
+ my $pl = Parse::Pidl::NDR::GetPrevLevel($e, $l);
+ $var = get_pointer_to($var);
+ # have to handle strings specially :(
+ if ($e->{TYPE} eq "string" && $pl && $pl->{TYPE} eq "POINTER") {
+ $var = get_pointer_to($var);
+ }
pidl "NDR_CHECK(ejs_pull_$e->{TYPE}(ejs, v, $name, $var));";
}
@@ -369,7 +370,11 @@ sub EjsPullFunction($)
sub EjsPushScalar($$$$$)
{
my ($e, $l, $var, $name, $env) = @_;
- $var = get_pointer_to($var);
+ # have to handle strings specially :(
+ my $pl = Parse::Pidl::NDR::GetPrevLevel($e, $l);
+ if ($e->{TYPE} ne "string" || ($pl && $pl->{TYPE} eq "POINTER")) {
+ $var = get_pointer_to($var);
+ }
pidl "NDR_CHECK(ejs_push_$e->{TYPE}(ejs, v, $name, $var));";
}
@@ -645,17 +650,17 @@ sub EjsConst($)
#####################################################################
# parse the interface definitions
-sub EjsInterface($)
+sub EjsInterface($$)
{
- my($interface) = shift;
+ my($interface,$needed) = @_;
my @fns = ();
my $name = $interface->{NAME};
%constants = ();
foreach my $d (@{$interface->{TYPEDEFS}}) {
- EjsTypedefPush($d);
- EjsTypedefPull($d);
+ ($needed->{"push_$d->{NAME}"}) && EjsTypedefPush($d);
+ ($needed->{"pull_$d->{NAME}"}) && EjsTypedefPull($d);
}
foreach my $d (@{$interface->{FUNCTIONS}}) {
@@ -722,13 +727,68 @@ sub Parse($$)
#include \"$ejs_hdr\"
";
+
+ my %needed = ();
+
+ foreach my $x (@{$ndr}) {
+ ($x->{TYPE} eq "INTERFACE") && NeededInterface($x, \%needed);
+ }
+
foreach my $x (@{$ndr}) {
- if ($x->{TYPE} eq "INTERFACE") {
- ($x->{TYPE} eq "INTERFACE") && EjsInterface($x);
- }
+ ($x->{TYPE} eq "INTERFACE") && EjsInterface($x, \%needed);
}
return $res;
}
+
+sub NeededFunction($$)
+{
+ my ($fn,$needed) = @_;
+ $needed->{"pull_$fn->{NAME}"} = 1;
+ $needed->{"push_$fn->{NAME}"} = 1;
+ foreach my $e (@{$fn->{ELEMENTS}}) {
+ if (grep (/in/, @{$e->{DIRECTION}})) {
+ $needed->{"pull_$e->{TYPE}"} = 1;
+ }
+ if (grep (/out/, @{$e->{DIRECTION}})) {
+ $needed->{"push_$e->{TYPE}"} = 1;
+ }
+ }
+}
+
+sub NeededTypedef($$)
+{
+ my ($t,$needed) = @_;
+ if (Parse::Pidl::Util::has_property($t, "public")) {
+ $needed->{"pull_$t->{NAME}"} = not Parse::Pidl::Util::has_property($t, "noejs");
+ $needed->{"push_$t->{NAME}"} = not Parse::Pidl::Util::has_property($t, "noejs");
+ }
+ if ($t->{DATA}->{TYPE} ne "STRUCT" &&
+ $t->{DATA}->{TYPE} ne "UNION") {
+ return;
+ }
+ for my $e (@{$t->{DATA}->{ELEMENTS}}) {
+ if ($needed->{"pull_$t->{NAME}"}) {
+ $needed->{"pull_$e->{TYPE}"} = 1;
+ }
+ if ($needed->{"push_$t->{NAME}"}) {
+ $needed->{"push_$e->{TYPE}"} = 1;
+ }
+ }
+}
+
+#####################################################################
+# work out what parse functions are needed
+sub NeededInterface($$)
+{
+ my ($interface,$needed) = @_;
+ foreach my $d (@{$interface->{FUNCTIONS}}) {
+ NeededFunction($d, $needed);
+ }
+ foreach my $d (reverse @{$interface->{TYPEDEFS}}) {
+ NeededTypedef($d, $needed);
+ }
+}
+
1;
diff --git a/source4/librpc/config.mk b/source4/librpc/config.mk
index 113456c074..665c0920d7 100644
--- a/source4/librpc/config.mk
+++ b/source4/librpc/config.mk
@@ -629,10 +629,22 @@ OBJ_FILES = librpc/gen_ndr/ndr_netlogon_ejs.o
REQUIRED_SUBSYSTEMS = RPC NDR_NETLOGON
NOPROTO = YES
+[SUBSYSTEM::RPC_EJS_SVCCTL]
+INIT_FUNCTION = ejs_init_svcctl
+OBJ_FILES = librpc/gen_ndr/ndr_svcctl_ejs.o
+REQUIRED_SUBSYSTEMS = RPC NDR_SVCCTL
+NOPROTO = YES
+
+[SUBSYSTEM::RPC_EJS_IRPC]
+INIT_FUNCTION = ejs_init_irpc
+OBJ_FILES = librpc/gen_ndr/ndr_irpc_ejs.o
+REQUIRED_SUBSYSTEMS = RPC NDR_IRPC
+NOPROTO = YES
+
################################################
# Start SUBSYSTEM RPC_EJS
[SUBSYSTEM::RPC_EJS]
REQUIRED_SUBSYSTEMS = RPC_EJS_ECHO RPC_EJS_MISC RPC_EJS_SAMR RPC_EJS_SECURITY \
- RPC_EJS_LSA
+ RPC_EJS_LSA RPC_EJS_SRVSVC RPC_EJS_SVCCTL RPC_EJS_IRPC
# End SUBSYSTEM RPC_EJS
################################################
diff --git a/source4/librpc/idl/irpc.idl b/source4/librpc/idl/irpc.idl
index c5977ba53e..0d4e305e98 100644
--- a/source4/librpc/idl/irpc.idl
+++ b/source4/librpc/idl/irpc.idl
@@ -13,7 +13,7 @@
IRPC_FLAG_REPLY = 0x0001
} irpc_flags;
- typedef [public] struct {
+ typedef [public,noejs] struct {
GUID uuid;
uint32 if_version;
uint32 callnum;