r3861: - Put ndr and rpc client code in seperate files
authorJelmer Vernooij <jelmer@samba.org>
Thu, 18 Nov 2004 20:53:23 +0000 (20:53 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:05:58 +0000 (13:05 -0500)
- Add some const
(This used to be commit a00bda88e1b6abdc36e5aa8c2a35f64855f67c96)

source4/build/pidl/client.pm
source4/build/pidl/header.pm
source4/build/pidl/parser.pm
source4/build/pidl/pidl.pl
source4/build/pidl/proxy.pm
source4/librpc/config.mk
source4/librpc/ndr/ndr_basic.c
source4/librpc/rpc/dcerpc.c
source4/script/build_idl.sh

index 015ac05223b1b2090165738f028099fd9c5b3be6..43808ce3fbaa86b157a768b99aa42cafa6667cdd 100644 (file)
@@ -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)
index 188fdd4f72285cf28ababe1ca15f3aee4bc80b22..5dda18d1b540356ed5d7b41a3a906a627f51d62c 100644 (file)
@@ -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") {
index 5be538b2cf3dbd9f22dcc86ca9c162f360978427..cec983724deba276b924f5fbb1d17ee893367976 100644 (file)
@@ -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);
-                       }
                }
        }
 
index bb7f1f8ed61ef5c4b258d6169a518efc6ccf6bcf..8388bcfd4c7a995f9deb05e535f7eaa14643b862 100755 (executable)
@@ -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 = "";
index f8991ce9fea8b36bda0f8e492f5e1dedc1c47b25..bf3990da4746d227f3e2e26b245542604d7a6075 100644 (file)
@@ -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;
index d527eabb2a2cfecf595c4d1e3ae6f5b9c47225c4..f720264046d3f4f7867628ec7457d774be23425e 100644 (file)
@@ -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
 ################################################
 
index 9507f4d33bc0c416d39aab149d75b19c6d94b718..057b162ca97f31fa6c8d368703dc02dc7c748f44 100644 (file)
@@ -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;
index 2427a22e59064d491b26dbe5270a950de7fe4030..3526c0adf991480fbaf5d644f4d108a73b2fa89a 100644 (file)
@@ -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)
@@ -1152,13 +1153,29 @@ 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 *),
index 50b9d1f3f34f3fb55e530975e8907d5260cf8ba7..79f35b6d7d53c53d5d7b9378364465d7c040fb70 100755 (executable)
@@ -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