summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/build/pidl/ejs.pm86
-rw-r--r--source4/build/pidl/ejs_header.pm75
-rwxr-xr-xsource4/build/pidl/pidl.pl5
-rw-r--r--source4/build/pidl/validator.pm1
-rw-r--r--source4/librpc/config.mk20
-rw-r--r--source4/librpc/idl/misc.idl2
-rw-r--r--source4/librpc/idl/security.idl2
-rw-r--r--source4/scripting/ejs/config.mk2
-rw-r--r--source4/scripting/ejs/ejsrpc.c108
-rw-r--r--source4/scripting/ejs/ejsrpc.h25
-rw-r--r--source4/scripting/ejs/smbcalls_rpc.c13
11 files changed, 314 insertions, 25 deletions
diff --git a/source4/build/pidl/ejs.pm b/source4/build/pidl/ejs.pm
index 24204b79b3..751f7f326e 100644
--- a/source4/build/pidl/ejs.pm
+++ b/source4/build/pidl/ejs.pm
@@ -88,6 +88,15 @@ sub get_value_of($)
}
}
+#####################################################################
+# work out is a parse function should be declared static or not
+sub fn_prefix($)
+{
+ my $fn = shift;
+
+ return "" if (util::has_property($fn, "public"));
+ return "static ";
+}
###########################
# pull a scalar element
@@ -95,6 +104,10 @@ sub EjsPullScalar($$$$$)
{
my ($e, $l, $var, $name, $env) = @_;
$var = get_pointer_to($var);
+ # have to handle strings specially :(
+ if ($e->{TYPE} eq "string") {
+ $var = get_pointer_to($var);
+ }
pidl "\tNDR_CHECK(ejs_pull_$e->{TYPE}(ejs, v, $name, $var));\n";
}
@@ -103,7 +116,7 @@ sub EjsPullScalar($$$$$)
sub EjsPullPointer($$$$$)
{
my ($e, $l, $var, $name, $env) = @_;
- pidl "EJS_ALLOC(ejs, $var);\n";
+ pidl "\tEJS_ALLOC(ejs, $var);\n";
$var = get_value_of($var);
EjsPullElement($e, Ndr::GetNextLevel($e, $l), $var, $name, $env);
}
@@ -124,10 +137,20 @@ sub EjsPullArray($$$$$)
{
my ($e, $l, $var, $name, $env) = @_;
my $length = util::ParseExpr($l->{LENGTH_IS}, $env);
- 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";
+ my $pl = Ndr::GetPrevLevel($e, $l);
+ if ($pl && $pl->{TYPE} eq "POINTER") {
+ $var = get_pointer_to($var);
+ }
+ my $avar = $var . "[i]";
+ pidl "\t{ uint32_t i;\n";
+ if (!$l->{IS_FIXED}) {
+ pidl "\tEJS_ALLOC_N(ejs, $var, $length);\n";
+ }
+ pidl "\tfor (i=0;i<$length;i++) {\n";
+ pidl "\tchar *id = talloc_asprintf(ejs, \"%s.%u\", $name, i);\n";
+ EjsPullElement($e, Ndr::GetNextLevel($e, $l), $avar, "id", $env);
+ pidl "\ttalloc_free(id);\n";
+ pidl "\t}\nejs_push_uint32(ejs, v, $name \".length\", &i); }\n";
}
###########################
@@ -179,7 +202,8 @@ sub EjsStructPull($$)
my $name = shift;
my $d = shift;
my $env = GenerateStructEnv($d);
- pidl "\nstatic NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, struct $name *r)\n{\n";
+ pidl fn_prefix($d);
+ pidl "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}}) {
EjsPullElementTop($e, $env);
@@ -196,7 +220,8 @@ sub EjsUnionPull($$)
my $d = shift;
my $have_default = 0;
my $env = GenerateStructEnv($d);
- pidl "\nstatic NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, union $name *r)\n{\n";
+ pidl fn_prefix($d);
+ pidl "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, union $name *r)\n{\n";
pidl "\tNDR_CHECK(ejs_pull_struct_start(ejs, &v, name));\n";
pidl "switch (ejs->switch_var) {\n";
foreach my $e (@{$d->{ELEMENTS}}) {
@@ -222,7 +247,8 @@ sub EjsEnumPull($$)
{
my $name = shift;
my $d = shift;
- pidl "\nstatic NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, enum $name *r)\n{\n";
+ pidl fn_prefix($d);
+ pidl "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, enum $name *r)\n{\n";
pidl "\tunsigned e;\n";
pidl "\tNDR_CHECK(ejs_pull_enum(ejs, v, name, &e));\n";
pidl "\t*r = e;\n";
@@ -234,7 +260,14 @@ sub EjsEnumPull($$)
# pull a bitmap
sub EjsBitmapPull($$)
{
-# ignored for now
+ my $name = shift;
+ my $d = shift;
+ my $type_fn = $d->{BASE_TYPE};
+ my($type_decl) = typelist::mapType($d->{BASE_TYPE});
+ pidl fn_prefix($d);
+ pidl "NTSTATUS ejs_pull_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, $type_decl *r)\n{\n";
+ pidl "return ejs_pull_$type_fn(ejs, v, name, r);\n";
+ pidl "}\n";
}
@@ -243,6 +276,7 @@ sub EjsBitmapPull($$)
sub EjsTypedefPull($)
{
my $d = shift;
+ return if (util::has_property($d, "noejs"));
if ($d->{DATA}->{TYPE} eq 'STRUCT') {
EjsStructPull($d->{NAME}, $d->{DATA});
} elsif ($d->{DATA}->{TYPE} eq 'UNION') {
@@ -322,9 +356,14 @@ sub EjsPushArray($$$$$)
{
my ($e, $l, $var, $name, $env) = @_;
my $length = util::ParseExpr($l->{LENGTH_IS}, $env);
+ my $pl = Ndr::GetPrevLevel($e, $l);
+ if ($pl && $pl->{TYPE} eq "POINTER") {
+ $var = get_pointer_to($var);
+ }
+ my $avar = $var . "[i]";
pidl "{ uint32_t i; for (i=0;i<$length;i++) {\n";
pidl "\tconst char *id = talloc_asprintf(ejs, \"%s.%u\", $name, i);\n";
- EjsPushElement($e, Ndr::GetNextLevel($e, $l), $var . "[i]", "id", $env);
+ EjsPushElement($e, Ndr::GetNextLevel($e, $l), $avar, "id", $env);
pidl "}\nejs_push_uint32(ejs, v, $name \".length\", &i); }\n";
}
@@ -367,7 +406,8 @@ sub EjsStructPush($$)
my $name = shift;
my $d = shift;
my $env = GenerateStructEnv($d);
- pidl "\nstatic NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const struct $name *r)\n{\n";
+ pidl fn_prefix($d);
+ pidl "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const struct $name *r)\n{\n";
pidl "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, name));\n";
foreach my $e (@{$d->{ELEMENTS}}) {
EjsPushElementTop($e, $env);
@@ -384,7 +424,8 @@ sub EjsUnionPush($$)
my $d = shift;
my $have_default = 0;
my $env = GenerateStructEnv($d);
- pidl "\nstatic NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const union $name *r)\n{\n";
+ pidl fn_prefix($d);
+ pidl "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const union $name *r)\n{\n";
pidl "\tNDR_CHECK(ejs_push_struct_start(ejs, &v, name));\n";
pidl "switch (ejs->switch_var) {\n";
foreach my $e (@{$d->{ELEMENTS}}) {
@@ -421,7 +462,8 @@ sub EjsEnumPush($$)
$constants{$e} = $v;
$v++;
}
- pidl "\nstatic NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const enum $name *r)\n{\n";
+ pidl fn_prefix($d);
+ pidl "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const enum $name *r)\n{\n";
pidl "\tunsigned e = *r;\n";
pidl "\tNDR_CHECK(ejs_push_enum(ejs, v, name, &e));\n";
pidl "\treturn NT_STATUS_OK;\n";
@@ -433,8 +475,13 @@ sub EjsEnumPush($$)
sub EjsBitmapPush($$)
{
my $name = shift;
- my $e = shift;
-# print util::MyDumper($e);
+ my $d = shift;
+ my $type_fn = $d->{BASE_TYPE};
+ my($type_decl) = typelist::mapType($d->{BASE_TYPE});
+ pidl fn_prefix($d);
+ pidl "NTSTATUS ejs_push_$name(struct ejs_rpc *ejs, struct MprVar *v, const char *name, const $type_decl *r)\n{\n";
+ pidl "return ejs_push_$type_fn(ejs, v, name, r);\n";
+ pidl "}\n";
}
@@ -443,6 +490,7 @@ sub EjsBitmapPush($$)
sub EjsTypedefPush($)
{
my $d = shift;
+ return if (util::has_property($d, "noejs"));
if ($d->{DATA}->{TYPE} eq 'STRUCT') {
EjsStructPush($d->{NAME}, $d->{DATA});
} elsif ($d->{DATA}->{TYPE} eq 'UNION') {
@@ -542,14 +590,18 @@ sub EjsInterface($)
sub Parse($$)
{
my($ndr,$hdr) = @_;
-
+
+ my $ejs_hdr = $hdr;
+ $ejs_hdr =~ s/.h$/_ejs.h/;
$res = "";
pidl "
/* EJS wrapper functions auto-generated by pidl */
#include \"includes.h\"
#include \"lib/ejs/ejs.h\"
-#include \"$hdr\"
#include \"scripting/ejs/ejsrpc.h\"
+#include \"librpc/gen_ndr/ndr_misc_ejs.h\"
+#include \"$hdr\"
+#include \"$ejs_hdr\"
";
foreach my $x (@{$ndr}) {
diff --git a/source4/build/pidl/ejs_header.pm b/source4/build/pidl/ejs_header.pm
new file mode 100644
index 0000000000..af6b4d426d
--- /dev/null
+++ b/source4/build/pidl/ejs_header.pm
@@ -0,0 +1,75 @@
+###################################################
+# create C header files for an EJS mapping functions
+# Copyright tridge@samba.org 2005
+# released under the GNU GPL
+
+package EjsHeader;
+
+use strict;
+use pidl::typelist;
+
+my($res);
+
+sub pidl ($)
+{
+ $res .= shift;
+}
+
+#####################################################################
+# prototype a typedef
+sub HeaderTypedefProto($)
+{
+ my $d = shift;
+ my $name = $d->{NAME};
+
+ return unless util::has_property($d, "public");
+
+ my $type_decl = typelist::mapType($name);
+
+ pidl "NTSTATUS ejs_push_$d->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, const $type_decl *);\n";
+ pidl "NTSTATUS ejs_pull_$d->{NAME}(struct ejs_rpc *, struct MprVar *, const char *, $type_decl *);\n";
+}
+
+#####################################################################
+# parse the interface definitions
+sub HeaderInterface($)
+{
+ my($interface) = shift;
+
+ my $count = 0;
+
+ pidl "#ifndef _HEADER_EJS_$interface->{NAME}\n";
+ pidl "#define _HEADER_EJS_$interface->{NAME}\n\n";
+
+ if (defined $interface->{PROPERTIES}->{depends}) {
+ my @d = split / /, $interface->{PROPERTIES}->{depends};
+ foreach my $i (@d) {
+ pidl "#include \"librpc/gen_ndr/ndr_$i\_ejs\.h\"\n";
+ }
+ }
+
+ pidl "\n";
+
+ foreach my $d (@{$interface->{TYPEDEFS}}) {
+ HeaderTypedefProto($d);
+ }
+
+ pidl "\n";
+ pidl "#endif /* _HEADER_EJS_$interface->{NAME} */\n";
+}
+
+#####################################################################
+# parse a parsed IDL into a C header
+sub Parse($)
+{
+ my($idl) = shift;
+
+ $res = "";
+ pidl "/* header auto-generated by pidl */\n\n";
+ foreach my $x (@{$idl}) {
+ ($x->{TYPE} eq "INTERFACE") && HeaderInterface($x);
+ }
+ return $res;
+}
+
+1;
diff --git a/source4/build/pidl/pidl.pl b/source4/build/pidl/pidl.pl
index daf404d38f..9f37f7e795 100755
--- a/source4/build/pidl/pidl.pl
+++ b/source4/build/pidl/pidl.pl
@@ -32,6 +32,7 @@ use pidl::template;
use pidl::swig;
use pidl::compat;
use pidl::ejs;
+use pidl::ejs_header;
my($opt_help) = 0;
my($opt_parse) = 0;
@@ -209,7 +210,6 @@ sub process_file($)
defined($opt_server) or defined($opt_parser) or
defined($opt_ejs)) {
$ndr = Ndr::Parse($pidl);
-# print util::MyDumper($ndr);
}
if (defined($opt_header)) {
@@ -242,6 +242,9 @@ sub process_file($)
if (defined($opt_ejs)) {
my $ejs = ($opt_ejs or util::ChangeExtension($output, "_ejs.c"));
util::FileSave($ejs, EjsClient::Parse($ndr, $h_filename));
+
+ $ejs = ($opt_ejs or util::ChangeExtension($output, "_ejs.h"));
+ util::FileSave($ejs, EjsHeader::Parse($ndr));
}
if (defined($opt_server)) {
diff --git a/source4/build/pidl/validator.pm b/source4/build/pidl/validator.pm
index fe4dc03c4d..37dc916ffd 100644
--- a/source4/build/pidl/validator.pm
+++ b/source4/build/pidl/validator.pm
@@ -98,6 +98,7 @@ my %property_list = (
"nopush" => ["FUNCTION", "TYPEDEF"],
"nopull" => ["FUNCTION", "TYPEDEF"],
"noprint" => ["FUNCTION", "TYPEDEF"],
+ "noejs" => ["FUNCTION", "TYPEDEF"],
# union
"switch_is" => ["ELEMENT"],
diff --git a/source4/librpc/config.mk b/source4/librpc/config.mk
index bd7b788178..c7d45bcf4b 100644
--- a/source4/librpc/config.mk
+++ b/source4/librpc/config.mk
@@ -555,3 +555,23 @@ REQUIRED_SUBSYSTEMS = NDR_RAW RPC_RAW LIBSMB NDR_MISC NDR_DCERPC NDR_SCHANNEL ND
OBJ_FILES = librpc/gen_ndr/ndr_echo_ejs.o
REQUIRED_SUBSYSTEMS = RPC NDR_ECHO
NOPROTO = YES
+
+[SUBSYSTEM::RPC_EJS_MISC]
+OBJ_FILES = librpc/gen_ndr/ndr_misc_ejs.o
+REQUIRED_SUBSYSTEMS = RPC NDR_MISC
+NOPROTO = YES
+
+[SUBSYSTEM::RPC_EJS_SAMR]
+OBJ_FILES = librpc/gen_ndr/ndr_samr_ejs.o
+REQUIRED_SUBSYSTEMS = RPC NDR_SAMR
+NOPROTO = YES
+
+[SUBSYSTEM::RPC_EJS_SECURITY]
+OBJ_FILES = librpc/gen_ndr/ndr_security_ejs.o
+REQUIRED_SUBSYSTEMS = RPC LIB_SECURITY_NDR
+NOPROTO = YES
+
+[SUBSYSTEM::RPC_EJS_LSA]
+OBJ_FILES = librpc/gen_ndr/ndr_lsa_ejs.o
+REQUIRED_SUBSYSTEMS = RPC NDR_LSA
+NOPROTO = YES
diff --git a/source4/librpc/idl/misc.idl b/source4/librpc/idl/misc.idl
index 45f4e25602..745a7652c2 100644
--- a/source4/librpc/idl/misc.idl
+++ b/source4/librpc/idl/misc.idl
@@ -10,7 +10,7 @@
]
interface misc
{
- typedef [public,noprint,gensize] struct {
+ typedef [public,noprint,gensize,noejs] struct {
uint32 time_low;
uint16 time_mid;
uint16 time_hi_and_version;
diff --git a/source4/librpc/idl/security.idl b/source4/librpc/idl/security.idl
index 9a18189993..c183f88724 100644
--- a/source4/librpc/idl/security.idl
+++ b/source4/librpc/idl/security.idl
@@ -184,7 +184,7 @@ interface security
/* a domain SID. Note that unlike Samba3 this contains a pointer,
so you can't copy them using assignment */
- typedef [public,noprint] struct {
+ typedef [public,noprint,noejs] struct {
uint8 sid_rev_num; /**< SID revision number */
[range(0,15)] int8 num_auths; /**< Number of sub-authorities */
uint8 id_auth[6]; /**< Identifier Authority */
diff --git a/source4/scripting/ejs/config.mk b/source4/scripting/ejs/config.mk
index 0c0caa9ef0..f56b75e537 100644
--- a/source4/scripting/ejs/config.mk
+++ b/source4/scripting/ejs/config.mk
@@ -3,7 +3,7 @@
[SUBSYSTEM::EJSRPC]
OBJ_FILES = \
scripting/ejs/ejsrpc.o
-REQUIRED_SUBSYSTEMS = RPC_EJS_ECHO
+REQUIRED_SUBSYSTEMS = RPC_EJS_ECHO RPC_EJS_SAMR RPC_EJS_MISC RPC_EJS_SECURITY RPC_EJS_LSA
NOPROTO = YES
# End SUBSYSTEM EJSRPC
#######################
diff --git a/source4/scripting/ejs/ejsrpc.c b/source4/scripting/ejs/ejsrpc.c
index 6536b94ca4..ab0f64d5aa 100644
--- a/source4/scripting/ejs/ejsrpc.c
+++ b/source4/scripting/ejs/ejsrpc.c
@@ -23,6 +23,7 @@
#include "includes.h"
#include "lib/ejs/ejs.h"
#include "scripting/ejs/ejsrpc.h"
+#include "librpc/gen_ndr/ndr_security.h"
NTSTATUS ejs_pull_rpc(int eid, const char *callname,
struct MprVar *v, void *ptr, ejs_pull_function_t ejs_pull)
@@ -235,6 +236,63 @@ NTSTATUS ejs_push_hyper(struct ejs_rpc *ejs,
return mprSetVar(v, name, mprCreateIntegerVar(*r));
}
+NTSTATUS ejs_pull_dlong(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, uint64_t *r)
+{
+ struct MprVar *var;
+ var = mprGetVar(v, name);
+ if (var == NULL) {
+ DEBUG(1,("ejs_pull_dlong: unable to find '%s'\n", name));
+ return NT_STATUS_INVALID_PARAMETER_MIX;
+ }
+ *r = mprVarToInteger(var);
+ return NT_STATUS_OK;
+}
+
+NTSTATUS ejs_push_dlong(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, const uint64_t *r)
+{
+ return mprSetVar(v, name, mprCreateIntegerVar(*r));
+}
+
+NTSTATUS ejs_pull_udlong(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, uint64_t *r)
+{
+ struct MprVar *var;
+ var = mprGetVar(v, name);
+ if (var == NULL) {
+ DEBUG(1,("ejs_pull_udlong: unable to find '%s'\n", name));
+ return NT_STATUS_INVALID_PARAMETER_MIX;
+ }
+ *r = mprVarToInteger(var);
+ return NT_STATUS_OK;
+}
+
+NTSTATUS ejs_push_udlong(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, const uint64_t *r)
+{
+ return mprSetVar(v, name, mprCreateIntegerVar(*r));
+}
+
+NTSTATUS ejs_pull_NTTIME(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, uint64_t *r)
+{
+ struct MprVar *var;
+ var = mprGetVar(v, name);
+ if (var == NULL) {
+ DEBUG(1,("ejs_pull_NTTIME: unable to find '%s'\n", name));
+ return NT_STATUS_INVALID_PARAMETER_MIX;
+ }
+ *r = mprVarToInteger(var);
+ return NT_STATUS_OK;
+}
+
+NTSTATUS ejs_push_NTTIME(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, const uint64_t *r)
+{
+ return mprSetVar(v, name, mprCreateIntegerVar(*r));
+}
+
/*
pull a enum from a mpr variable to a C element
@@ -265,7 +323,7 @@ NTSTATUS ejs_push_enum(struct ejs_rpc *ejs,
pull a string
*/
NTSTATUS ejs_pull_string(struct ejs_rpc *ejs,
- struct MprVar *v, const char *name, char **s)
+ struct MprVar *v, const char *name, const char **s)
{
struct MprVar *var;
var = mprGetVar(v, name);
@@ -273,8 +331,7 @@ NTSTATUS ejs_pull_string(struct ejs_rpc *ejs,
DEBUG(1,("ejs_pull_string: unable to find '%s'\n", name));
return NT_STATUS_INVALID_PARAMETER_MIX;
}
- *s = talloc_strdup(ejs, mprToString(var));
- NT_STATUS_HAVE_NO_MEMORY(*s);
+ *s = mprToString(var);
return NT_STATUS_OK;
}
@@ -304,3 +361,48 @@ void ejs_set_constant_string(int eid, const char *name, const char *value)
struct MprVar *v = ejsGetGlobalObject(eid);
mprSetVar(v, name, mprCreateStringVar(value, False));
}
+
+
+NTSTATUS ejs_pull_dom_sid(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, struct dom_sid *r)
+{
+ struct MprVar *var;
+ struct dom_sid *sid;
+ var = mprGetVar(v, name);
+ if (var == NULL) {
+ DEBUG(1,("ejs_pull_dom_sid: unable to find '%s'\n", name));
+ return NT_STATUS_INVALID_PARAMETER_MIX;
+ }
+ sid = dom_sid_parse_talloc(ejs, mprToString(var));
+ NT_STATUS_HAVE_NO_MEMORY(sid);
+ *r = *sid;
+ return NT_STATUS_OK;
+}
+
+NTSTATUS ejs_push_dom_sid(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, const struct dom_sid *r)
+{
+ char *sidstr = dom_sid_string(ejs, r);
+ NT_STATUS_HAVE_NO_MEMORY(sidstr);
+ return mprSetVar(v, name, mprCreateStringVar(sidstr, True));
+}
+
+NTSTATUS ejs_pull_GUID(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, struct GUID *r)
+{
+ struct MprVar *var;
+ var = mprGetVar(v, name);
+ if (var == NULL) {
+ DEBUG(1,("ejs_pull_GUID: unable to find '%s'\n", name));
+ return NT_STATUS_INVALID_PARAMETER_MIX;
+ }
+ return GUID_from_string(mprToString(var), r);
+}
+
+NTSTATUS ejs_push_GUID(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, const struct GUID *r)
+{
+ char *guid = GUID_string(ejs, r);
+ NT_STATUS_HAVE_NO_MEMORY(guid);
+ return mprSetVar(v, name, mprCreateStringVar(guid, True));
+}
diff --git a/source4/scripting/ejs/ejsrpc.h b/source4/scripting/ejs/ejsrpc.h
index 0435b52365..624a5fad3d 100644
--- a/source4/scripting/ejs/ejsrpc.h
+++ b/source4/scripting/ejs/ejsrpc.h
@@ -60,17 +60,34 @@ NTSTATUS ejs_pull_hyper(struct ejs_rpc *ejs,
struct MprVar *v, const char *name, uint64_t *r);
NTSTATUS ejs_push_hyper(struct ejs_rpc *ejs,
struct MprVar *v, const char *name, const uint64_t *r);
+NTSTATUS ejs_pull_dlong(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, uint64_t *r);
+NTSTATUS ejs_push_dlong(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, const uint64_t *r);
+NTSTATUS ejs_pull_udlong(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, uint64_t *r);
+NTSTATUS ejs_push_udlong(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, const uint64_t *r);
+NTSTATUS ejs_pull_NTTIME(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, uint64_t *r);
+NTSTATUS ejs_push_NTTIME(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, const uint64_t *r);
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_string(struct ejs_rpc *ejs,
- struct MprVar *v, const char *name, char **s);
+ struct MprVar *v, const char *name, const char **s);
NTSTATUS ejs_push_string(struct ejs_rpc *ejs,
struct MprVar *v, const char *name, const char *s);
void ejs_set_constant_int(int eid, const char *name, int value);
void ejs_set_constant_string(int eid, const char *name, const char *value);
+NTSTATUS ejs_pull_dom_sid(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, struct dom_sid *r);
+NTSTATUS ejs_push_dom_sid(struct ejs_rpc *ejs,
+ struct MprVar *v, const char *name, const struct dom_sid *r);
+
#define EJS_ALLOC_SIZE(ejs, s, size) do { \
(s) = talloc_size(ejs, size); \
if (!(s)) return ejs_panic(ejs, "out of memory"); \
@@ -84,3 +101,9 @@ void ejs_set_constant_string(int eid, const char *name, const char *value);
} while (0)
#define EJS_ALLOC_N(ejs, s, n) EJS_ALLOC_N_SIZE(ejs, s, n, sizeof(*(s)))
+
+/* some types are equivalent for ejs */
+#define ejs_pull_dom_sid2 ejs_pull_dom_sid
+#define ejs_push_dom_sid2 ejs_push_dom_sid
+#define ejs_pull_NTTIME_hyper ejs_pull_NTTIME
+#define ejs_push_NTTIME_hyper ejs_push_NTTIME
diff --git a/source4/scripting/ejs/smbcalls_rpc.c b/source4/scripting/ejs/smbcalls_rpc.c
index f8ea37b754..17f1716b2e 100644
--- a/source4/scripting/ejs/smbcalls_rpc.c
+++ b/source4/scripting/ejs/smbcalls_rpc.c
@@ -170,8 +170,12 @@ done:
void smb_setup_ejs_rpc(void)
{
void setup_ejs_rpcecho(void);
+ void setup_ejs_samr(void);
+ void setup_ejs_misc(void);
ejsDefineCFunction(-1, "rpc_connect", ejs_rpc_connect, NULL, MPR_VAR_SCRIPT_HANDLE);
setup_ejs_rpcecho();
+ setup_ejs_samr();
+ setup_ejs_misc();
}
/*
@@ -179,6 +183,15 @@ void smb_setup_ejs_rpc(void)
*/
void smb_setup_ejs_rpc_constants(int eid)
{
+ struct MprVar v;
+
void setup_ejs_constants_rpcecho(int);
+ void setup_ejs_constants_samr(int);
+ void setup_ejs_constants_misc(int);
setup_ejs_constants_rpcecho(eid);
+ setup_ejs_constants_samr(eid);
+ setup_ejs_constants_misc(eid);
+
+ v = mprCreatePtrVar(NULL, "NULL");
+ mprSetProperty(ejsGetGlobalObject(eid), "NULL", &v);
}