$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)
}
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") {
package IdlParser;
use strict;
-use client;
-use proxy;
use needed;
# the list of needed functions
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")) {
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";
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";
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);
- }
}
}
use dump;
use header;
use server;
+use client;
+use proxy;
use stub;
use parser;
use eparser;
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;
--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
'server' => \$opt_server,
'template' => \$opt_template,
'parser' => \$opt_parser,
+ 'client' => \$opt_client,
'eparser' => \$opt_eparser,
'diff' => \$opt_diff,
'keep' => \$opt_keep,
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 = "";
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)
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;
dcerpc_mgmt_init \
dcerpc_protected_storage_init \
dcerpc_dcom_init \
+ dcom_dcom_init \
dcerpc_oxidresolver_init \
dcerpc_remact_init \
dcerpc_wzcsvc_init \
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
################################################
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;
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
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)
}
+/*
+ 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 *),
[ -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