summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/build/pidl/client.pm12
-rw-r--r--source4/build/pidl/header.pm2
-rw-r--r--source4/build/pidl/parser.pm19
-rwxr-xr-xsource4/build/pidl/pidl.pl29
-rw-r--r--source4/build/pidl/proxy.pm36
-rw-r--r--source4/librpc/config.mk45
-rw-r--r--source4/librpc/ndr/ndr_basic.c2
-rw-r--r--source4/librpc/rpc/dcerpc.c21
-rwxr-xr-xsource4/script/build_idl.sh2
9 files changed, 133 insertions, 35 deletions
diff --git a/source4/build/pidl/client.pm b/source4/build/pidl/client.pm
index 015ac05223..43808ce3fb 100644
--- a/source4/build/pidl/client.pm
+++ b/source4/build/pidl/client.pm
@@ -21,15 +21,11 @@ sub ParseFunction($$)
$res .= "
struct rpc_request *dcerpc_$name\_send(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r)
{
-
- if (p->flags & DCERPC_DEBUG_PRINT_IN) {
- NDR_PRINT_IN_DEBUG($name, r);
+ if (p->flags & DCERPC_DEBUG_PRINT_IN) {
+ NDR_PRINT_IN_DEBUG($name, r);
}
-
- return dcerpc_ndr_request_send(p, NULL, DCERPC_$uname, mem_ctx,
- (ndr_push_flags_fn_t) ndr_push_$name,
- (ndr_pull_flags_fn_t) ndr_pull_$name,
- r, sizeof(*r));
+
+ return dcerpc_ndr_request_table_send(p, NULL, &dcerpc_table_$interface->{NAME}, DCERPC_$uname, mem_ctx, r);
}
NTSTATUS dcerpc_$name(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r)
diff --git a/source4/build/pidl/header.pm b/source4/build/pidl/header.pm
index 188fdd4f72..5dda18d1b5 100644
--- a/source4/build/pidl/header.pm
+++ b/source4/build/pidl/header.pm
@@ -195,7 +195,7 @@ sub HeaderTypedefProto($)
}
if (needed::is_needed("ndr_size_$d->{NAME}")) {
- $res .= "size_t ndr_size_$d->{NAME}(int , struct $d->{NAME} *, int );\n";
+ $res .= "size_t ndr_size_$d->{NAME}(int , const struct $d->{NAME} *, int );\n";
}
}
if ($d->{DATA}{TYPE} eq "UNION") {
diff --git a/source4/build/pidl/parser.pm b/source4/build/pidl/parser.pm
index 5be538b2cf..cec983724d 100644
--- a/source4/build/pidl/parser.pm
+++ b/source4/build/pidl/parser.pm
@@ -8,8 +8,6 @@
package IdlParser;
use strict;
-use client;
-use proxy;
use needed;
# the list of needed functions
@@ -853,7 +851,7 @@ sub ParseStructNdrSize($)
my $static = fn_prefix($t);
my $sizevar;
- pidl $static . "size_t ndr_size_$t->{NAME}(int ret, struct $t->{NAME} *r, int flags)\n";
+ pidl $static . "size_t ndr_size_$t->{NAME}(int ret, const struct $t->{NAME} *r, int flags)\n";
pidl "{\n";
if (util::has_property($t->{DATA}, "flag")) {
@@ -1062,7 +1060,7 @@ sub ParseUnionNdrSize($)
my $t = shift;
my $static = fn_prefix($t);
- pidl $static . "size_t ndr_size_$t->{NAME}(int ret, union $t->{NAME} *data, uint16 level, int flags)\n";
+ pidl $static . "size_t ndr_size_$t->{NAME}(int ret, const union $t->{NAME} *data, uint16 level, int flags)\n";
pidl "{\n";
if (util::has_property($t->{DATA}, "flag")) {
pidl "\tflags = flags | " . $t->{DATA}->{PROPERTIES}->{flag} . ";\n";
@@ -1599,13 +1597,6 @@ sub RegistrationFunction($$)
pidl "\tif (NT_STATUS_IS_ERR(status)) {\n";
pidl "\t\treturn status;\n";
pidl "\t}\n\n";
-
- if (util::has_property($interface, "object")) {
- pidl "\tstatus = dcom_$interface->{NAME}_init();\n";
- pidl "\tif (NT_STATUS_IS_ERR(status)) {\n";
- pidl "\t\treturn status;\n";
- pidl "\t}\n\n";
- }
}
pidl "\treturn status;\n";
pidl "}\n\n";
@@ -1633,12 +1624,6 @@ sub Parse($$)
if ($x->{TYPE} eq "INTERFACE") {
needed::BuildNeeded($x);
ParseInterface($x);
-
- if (util::has_property($x, "object")) {
- pidl IdlProxy::ParseInterface($x);
- } else {
- pidl IdlClient::ParseInterface($x);
- }
}
}
diff --git a/source4/build/pidl/pidl.pl b/source4/build/pidl/pidl.pl
index bb7f1f8ed6..8388bcfd4c 100755
--- a/source4/build/pidl/pidl.pl
+++ b/source4/build/pidl/pidl.pl
@@ -17,6 +17,8 @@ use idl;
use dump;
use header;
use server;
+use client;
+use proxy;
use stub;
use parser;
use eparser;
@@ -31,6 +33,7 @@ my($opt_dump) = 0;
my($opt_diff) = 0;
my($opt_header) = 0;
my($opt_template) = 0;
+my($opt_client) = 0;
my($opt_server) = 0;
my($opt_parser) = 0;
my($opt_eparser) = 0;
@@ -68,6 +71,7 @@ sub ShowHelp()
--dump dump a pidl file back to idl
--header create a C header file
--parser create a C parser
+ --client create a C client
--server create server boilerplate
--template print a template for a pipe
--eparser create an ethereal parser
@@ -88,6 +92,7 @@ GetOptions (
'server' => \$opt_server,
'template' => \$opt_template,
'parser' => \$opt_parser,
+ 'client' => \$opt_client,
'eparser' => \$opt_eparser,
'diff' => \$opt_diff,
'keep' => \$opt_keep,
@@ -138,6 +143,30 @@ sub process_file($)
util::FileSave($header, IdlHeader::Parse($pidl));
}
+ if ($opt_client) {
+ my ($client) = util::ChangeExtension($output, "_c.c");
+ my $res = "";
+ my $h_filename = util::ChangeExtension($output, ".h");
+ my $need_dcom_register = 0;
+
+ $res .= "#include \"includes.h\"\n";
+ $res .= "#include \"$h_filename\"\n\n";
+
+ foreach my $x (@{$pidl}) {
+ if (util::has_property($x, "object")) {
+ $res .= IdlProxy::ParseInterface($x);
+ $need_dcom_register = 1;
+ } else {
+ $res .= IdlClient::ParseInterface($x);
+ }
+ }
+
+ if ($need_dcom_register) {
+ $res .= IdlProxy::RegistrationFunction($pidl, $basename);
+ }
+ util::FileSave($client, $res);
+ }
+
if ($opt_server) {
my($server) = util::ChangeExtension($output, "_s.c");
my $res = "";
diff --git a/source4/build/pidl/proxy.pm b/source4/build/pidl/proxy.pm
index f8991ce9fe..bf3990da47 100644
--- a/source4/build/pidl/proxy.pm
+++ b/source4/build/pidl/proxy.pm
@@ -105,10 +105,7 @@ static struct rpc_request *dcom_proxy_$interface->{NAME}_$name\_send(struct dcom
NDR_PRINT_IN_DEBUG($name, r);
}
- return dcerpc_ndr_request_send(p, &d->ipid, DCERPC_$uname, mem_ctx,
- (ndr_push_flags_fn_t) ndr_push_$name,
- (ndr_pull_flags_fn_t) ndr_pull_$name,
- r, sizeof(*r));
+ return dcerpc_ndr_request_table_send(p, &d->ipid, &dcerpc_table_$interface->{NAME}, DCERPC_$uname, mem_ctx, r);
}
static NTSTATUS dcom_proxy_$interface->{NAME}_$name(struct dcom_interface_p *d, TALLOC_CTX *mem_ctx, struct $name *r)
@@ -163,4 +160,35 @@ sub ParseInterface($)
ParseRegFunc($interface);
}
+sub RegistrationFunction($$)
+{
+ my $idl = shift;
+ my $basename = shift;
+
+ my $res = "NTSTATUS dcom_$basename\_init(void)\n";
+ $res .= "{\n";
+ $res .="\tNTSTATUS status = NT_STATUS_OK;\n";
+ foreach my $interface (@{$idl}) {
+ next if $interface->{TYPE} ne "INTERFACE";
+ next if not util::has_property($interface, "object");
+
+ my $data = $interface->{INHERITED_DATA};
+ my $count = 0;
+ foreach my $d (@{$data}) {
+ if ($d->{TYPE} eq "FUNCTION") { $count++; }
+ }
+
+ next if ($count == 0);
+
+ $res .= "\tstatus = dcom_$interface->{NAME}_init();\n";
+ $res .= "\tif (NT_STATUS_IS_ERR(status)) {\n";
+ $res .= "\t\treturn status;\n";
+ $res .= "\t}\n\n";
+ }
+ $res .= "\treturn status;\n";
+ $res .= "}\n\n";
+
+ return $res;
+}
+
1;
diff --git a/source4/librpc/config.mk b/source4/librpc/config.mk
index d527eabb2a..f720264046 100644
--- a/source4/librpc/config.mk
+++ b/source4/librpc/config.mk
@@ -60,6 +60,7 @@ INIT_FUNCTION = \
dcerpc_mgmt_init \
dcerpc_protected_storage_init \
dcerpc_dcom_init \
+ dcom_dcom_init \
dcerpc_oxidresolver_init \
dcerpc_remact_init \
dcerpc_wzcsvc_init \
@@ -116,7 +117,49 @@ ADD_OBJ_FILES = \
librpc/gen_ndr/ndr_keysvc.o \
librpc/gen_ndr/ndr_krb5pac.o \
librpc/gen_ndr/ndr_xattr.o \
- librpc/gen_ndr/ndr_schannel.o
+ librpc/gen_ndr/ndr_schannel.o \
+ librpc/gen_ndr/ndr_audiosrv_c.o \
+ librpc/gen_ndr/ndr_dcerpc_c.o \
+ librpc/gen_ndr/ndr_echo_c.o \
+ librpc/gen_ndr/ndr_exchange_c.o \
+ librpc/gen_ndr/ndr_dsbackup_c.o \
+ librpc/gen_ndr/ndr_efs_c.o \
+ librpc/gen_ndr/ndr_misc_c.o \
+ librpc/gen_ndr/ndr_lsa_c.o \
+ librpc/gen_ndr/ndr_lsads_c.o \
+ librpc/gen_ndr/ndr_dfs_c.o \
+ librpc/gen_ndr/ndr_drsuapi_c.o \
+ librpc/gen_ndr/ndr_policyagent_c.o \
+ librpc/gen_ndr/ndr_samr_c.o \
+ librpc/gen_ndr/ndr_spoolss_c.o \
+ librpc/gen_ndr/ndr_wkssvc_c.o \
+ librpc/gen_ndr/ndr_srvsvc_c.o \
+ librpc/gen_ndr/ndr_svcctl_c.o \
+ librpc/gen_ndr/ndr_atsvc_c.o \
+ librpc/gen_ndr/ndr_eventlog_c.o \
+ librpc/gen_ndr/ndr_epmapper_c.o \
+ librpc/gen_ndr/ndr_dbgidl_c.o \
+ librpc/gen_ndr/ndr_dssetup_c.o \
+ librpc/gen_ndr/ndr_msgsvc_c.o \
+ librpc/gen_ndr/ndr_wins_c.o \
+ librpc/gen_ndr/ndr_winreg_c.o \
+ librpc/gen_ndr/ndr_mgmt_c.o \
+ librpc/gen_ndr/ndr_protected_storage_c.o \
+ librpc/gen_ndr/ndr_dcom_c.o \
+ librpc/gen_ndr/ndr_oxidresolver_c.o \
+ librpc/gen_ndr/ndr_remact_c.o \
+ librpc/gen_ndr/ndr_wzcsvc_c.o \
+ librpc/gen_ndr/ndr_browser_c.o \
+ librpc/gen_ndr/ndr_w32time_c.o \
+ librpc/gen_ndr/ndr_scerpc_c.o \
+ librpc/gen_ndr/ndr_ntsvcs_c.o \
+ librpc/gen_ndr/ndr_netlogon_c.o \
+ librpc/gen_ndr/ndr_trkwks_c.o \
+ librpc/gen_ndr/ndr_keysvc_c.o \
+ librpc/gen_ndr/ndr_krb5pac_c.o \
+ librpc/gen_ndr/ndr_xattr_c.o \
+ librpc/gen_ndr/ndr_schannel_c.o
+
# End SUBSYSTEM LIBNDR_GEN
################################################
diff --git a/source4/librpc/ndr/ndr_basic.c b/source4/librpc/ndr/ndr_basic.c
index 9507f4d33b..057b162ca9 100644
--- a/source4/librpc/ndr/ndr_basic.c
+++ b/source4/librpc/ndr/ndr_basic.c
@@ -1304,7 +1304,7 @@ uint32 ndr_size_DATA_BLOB(int ret, const DATA_BLOB *data, int flags)
return ret + data->length;
}
-uint32 ndr_size_string(int ret, const char **string, int flags)
+uint32 ndr_size_string(int ret, const char * const* string, int flags)
{
/* FIXME: Is this correct for all strings ? */
if(!(*string)) return ret;
diff --git a/source4/librpc/rpc/dcerpc.c b/source4/librpc/rpc/dcerpc.c
index 2427a22e59..3526c0adf9 100644
--- a/source4/librpc/rpc/dcerpc.c
+++ b/source4/librpc/rpc/dcerpc.c
@@ -4,6 +4,7 @@
Copyright (C) Tim Potter 2003
Copyright (C) Andrew Tridgell 2003
+ Copyright (C) Jelmer Vernooij 2004
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -856,7 +857,7 @@ static int dcerpc_req_destructor(void *ptr)
perform the send size of a async dcerpc request
*/
struct rpc_request *dcerpc_request_send(struct dcerpc_pipe *p,
- struct GUID *object,
+ const struct GUID *object,
uint16_t opnum,
TALLOC_CTX *mem_ctx,
DATA_BLOB *stub_data)
@@ -1153,12 +1154,28 @@ static NTSTATUS dcerpc_ndr_validate_out(struct dcerpc_pipe *p,
/*
+ send a rpc request given a dcerpc_call structure
+ */
+struct rpc_request *dcerpc_ndr_request_table_send(struct dcerpc_pipe *p,
+ const struct GUID *object,
+ const struct dcerpc_interface_table *table,
+ uint32_t opnum,
+ TALLOC_CTX *mem_ctx,
+ void *r)
+{
+ const struct dcerpc_interface_call *call = &table->calls[opnum];
+
+ return dcerpc_ndr_request_send(p, object, opnum, mem_ctx, call->ndr_push, call->ndr_pull, r, call->struct_size);
+}
+
+
+/*
send a rpc request with a given set of ndr helper functions
call dcerpc_ndr_request_recv() to receive the answer
*/
struct rpc_request *dcerpc_ndr_request_send(struct dcerpc_pipe *p,
- struct GUID *object,
+ const struct GUID *object,
uint32_t opnum,
TALLOC_CTX *mem_ctx,
NTSTATUS (*ndr_push)(struct ndr_push *, int, void *),
diff --git a/source4/script/build_idl.sh b/source4/script/build_idl.sh
index 50b9d1f3f3..79f35b6d7d 100755
--- a/source4/script/build_idl.sh
+++ b/source4/script/build_idl.sh
@@ -4,7 +4,7 @@ FULLBUILD=$1
[ -d librpc/gen_ndr ] || mkdir -p librpc/gen_ndr || exit 1
-PIDL="$PERL ./build/pidl/pidl.pl --output librpc/gen_ndr/ndr_ --parse --header --parser --server"
+PIDL="$PERL ./build/pidl/pidl.pl --output librpc/gen_ndr/ndr_ --parse --header --parser --server --client"
EPARSERPIDL="$PERL ./build/pidl/pidl.pl --output $EPARSERPREFIX/ndr_ --parse --header --eparser"
if [ x$FULLBUILD = xFULL ]; then