diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2008-10-20 13:19:39 +0200 |
---|---|---|
committer | Jelmer Vernooij <jelmer@samba.org> | 2008-10-20 13:19:39 +0200 |
commit | e0905c30908b4d621030689d33de28a13c04a690 (patch) | |
tree | fe4a2e8ab06ab5dfbcb40e32df385dcdd6767d46 /librpc | |
parent | 29838debb3d350aaee0bf9744f1a7371b8b06736 (diff) | |
download | samba-e0905c30908b4d621030689d33de28a13c04a690.tar.gz samba-e0905c30908b4d621030689d33de28a13c04a690.tar.bz2 samba-e0905c30908b4d621030689d33de28a13c04a690.zip |
Use tables in Samba 3 ndrdump.
Diffstat (limited to 'librpc')
-rw-r--r-- | librpc/ndr/ndr_table.c | 135 | ||||
-rw-r--r-- | librpc/ndr/ndr_table.h | 13 | ||||
-rw-r--r-- | librpc/tables.pl | 89 | ||||
-rw-r--r-- | librpc/tools/ndrdump.c | 20 |
4 files changed, 240 insertions, 17 deletions
diff --git a/librpc/ndr/ndr_table.c b/librpc/ndr/ndr_table.c new file mode 100644 index 0000000000..f7c381f22e --- /dev/null +++ b/librpc/ndr/ndr_table.c @@ -0,0 +1,135 @@ +/* + Unix SMB/CIFS implementation. + + dcerpc utility functions + + 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 + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "includes.h" +#include "../lib/util/dlinklist.h" +#include "librpc/ndr/libndr.h" +#include "librpc/ndr/ndr_table.h" +#undef strcasecmp + +static struct ndr_interface_list *ndr_interfaces; + +/* + register a ndr interface table +*/ +NTSTATUS ndr_table_register(const struct ndr_interface_table *table) +{ + struct ndr_interface_list *l; + + for (l = ndr_interfaces; l; l = l->next) { + if (GUID_equal(&table->syntax_id.uuid, &l->table->syntax_id.uuid)) { + DEBUG(0, ("Attempt to register interface %s which has the " + "same UUID as already registered interface %s\n", + table->name, l->table->name)); + return NT_STATUS_OBJECT_NAME_COLLISION; + } + } + + l = talloc(talloc_autofree_context(), struct ndr_interface_list); + l->table = table; + + DLIST_ADD(ndr_interfaces, l); + + return NT_STATUS_OK; +} + +/* + find the pipe name for a local IDL interface +*/ +const char *ndr_interface_name(const struct GUID *uuid, uint32_t if_version) +{ + const struct ndr_interface_list *l; + for (l=ndr_table_list();l;l=l->next) { + if (GUID_equal(&l->table->syntax_id.uuid, uuid) && + l->table->syntax_id.if_version == if_version) { + return l->table->name; + } + } + return "UNKNOWN"; +} + +/* + find the number of calls defined by local IDL +*/ +int ndr_interface_num_calls(const struct GUID *uuid, uint32_t if_version) +{ + const struct ndr_interface_list *l; + for (l=ndr_interfaces;l;l=l->next){ + if (GUID_equal(&l->table->syntax_id.uuid, uuid) && + l->table->syntax_id.if_version == if_version) { + return l->table->num_calls; + } + } + return -1; +} + + +/* + find a dcerpc interface by name +*/ +const struct ndr_interface_table *ndr_table_by_name(const char *name) +{ + const struct ndr_interface_list *l; + for (l=ndr_interfaces;l;l=l->next) { + if (strcasecmp(l->table->name, name) == 0) { + return l->table; + } + } + return NULL; +} + +/* + find a dcerpc interface by uuid +*/ +const struct ndr_interface_table *ndr_table_by_uuid(const struct GUID *uuid) +{ + const struct ndr_interface_list *l; + for (l=ndr_interfaces;l;l=l->next) { + if (GUID_equal(&l->table->syntax_id.uuid, uuid)) { + return l->table; + } + } + return NULL; +} + +/* + return the list of registered dcerpc_pipes +*/ +const struct ndr_interface_list *ndr_table_list(void) +{ + return ndr_interfaces; +} + + +NTSTATUS ndr_table_register_builtin_tables(void); + +NTSTATUS ndr_table_init(void) +{ + static bool initialized = false; + + if (initialized) return NT_STATUS_OK; + initialized = true; + + ndr_table_register_builtin_tables(); + + return NT_STATUS_OK; +} diff --git a/librpc/ndr/ndr_table.h b/librpc/ndr/ndr_table.h new file mode 100644 index 0000000000..905c2e5e43 --- /dev/null +++ b/librpc/ndr/ndr_table.h @@ -0,0 +1,13 @@ +#ifndef _NDR_TABLE_PROTO_H_ +#define _NDR_TABLE_PROTO_H_ + +NTSTATUS ndr_table_register(const struct ndr_interface_table *table); +const char *ndr_interface_name(const struct GUID *uuid, uint32_t if_version); +int ndr_interface_num_calls(const struct GUID *uuid, uint32_t if_version); +const struct ndr_interface_table *ndr_table_by_name(const char *name); +const struct ndr_interface_table *ndr_table_by_uuid(const struct GUID *uuid); +const struct ndr_interface_list *ndr_table_list(void); +NTSTATUS ndr_table_init(void); + +#endif /* _NDR_TABLE_PROTO_H_ */ + diff --git a/librpc/tables.pl b/librpc/tables.pl new file mode 100644 index 0000000000..04764f5fa0 --- /dev/null +++ b/librpc/tables.pl @@ -0,0 +1,89 @@ +#!/usr/bin/perl -w + +################################################### +# package to produce a table of all idl parsers +# Copyright tridge@samba.org 2003 +# Copyright jelmer@samba.org 2005 +# released under the GNU GPL + +use strict; + +use Getopt::Long; +use File::Basename; + +my $opt_output = 'librpc/gen_ndr/tables.c'; +my $opt_help = 0; + + +######################################### +# display help text +sub ShowHelp() +{ + print " + perl NDR interface table generator + Copyright (C) tridge\@samba.org + + Usage: tables.pl [options] <idlfile> + + \n"; + exit(0); +} + +# main program +GetOptions ( + 'help|h|?' => \$opt_help, + 'output=s' => \$opt_output, + ); + +if ($opt_help) { + ShowHelp(); + exit(0); +} + +my $init_fns = ""; + +################################### +# extract table entries from 1 file +sub process_file($) +{ + my $filename = shift; + open(FILE, $filename) || die "unable to open $filename\n"; + my $found = 0; + + while (my $line = <FILE>) { + if ($line =~ /extern const struct ndr_interface_table (\w+);/) { + $found = 1; + $init_fns.="\tstatus = ndr_table_register(&$1);\n"; + $init_fns.="\tif (NT_STATUS_IS_ERR(status)) return status;\n\n"; + } + } + + if ($found) { + print "#include \"$filename\"\n"; + } + + close(FILE); +} + +print <<EOF; + +/* Automatically generated by tables.pl. DO NOT EDIT */ + +#include "includes.h" +#include "librpc/ndr/libndr.h" +#include "librpc/ndr/ndr_table.h" +EOF + +process_file($_) foreach (@ARGV); + +print <<EOF; + +NTSTATUS ndr_table_register_builtin_tables(void) +{ + NTSTATUS status; + +$init_fns + + return NT_STATUS_OK; +} +EOF diff --git a/librpc/tools/ndrdump.c b/librpc/tools/ndrdump.c index b24868eace..3d7c644902 100644 --- a/librpc/tools/ndrdump.c +++ b/librpc/tools/ndrdump.c @@ -19,12 +19,12 @@ */ #include "includes.h" -#if (_SAMBA_BUILD_ >= 4) -#include "lib/cmdline/popt_common.h" #include "system/filesys.h" #include "system/locale.h" #include "librpc/ndr/libndr.h" #include "librpc/ndr/ndr_table.h" +#if (_SAMBA_BUILD_ >= 4) +#include "lib/cmdline/popt_common.h" #include "param/param.h" #endif @@ -49,8 +49,6 @@ static const struct ndr_interface_call *find_function( return &p->calls[i]; } -#if (_SAMBA_BUILD_ >= 4) - _NORETURN_ static void show_pipes(void) { const struct ndr_interface_list *l; @@ -66,8 +64,6 @@ _NORETURN_ static void show_pipes(void) exit(1); } -#endif - _NORETURN_ static void show_functions(const struct ndr_interface_table *p) { int i; @@ -174,9 +170,8 @@ static void ndrdump_data(uint8_t *d, uint32_t l, bool force) { NULL } }; -#if (_SAMBA_BUILD_ >= 4) ndr_table_init(); -#else +#if (_SAMBA_BUILD_ >= 3) /* Initialise samba stuff */ load_case_tables(); @@ -213,21 +208,13 @@ static void ndrdump_data(uint8_t *d, uint32_t l, bool force) if (!pipe_name) { poptPrintUsage(pc, stderr, 0); -#if (_SAMBA_BUILD_ >= 4) show_pipes(); -#endif exit(1); } if (plugin != NULL) { p = load_iface_from_plugin(plugin, pipe_name); } -#if (_SAMBA_BUILD_ <= 3) - else { - fprintf(stderr, "Only loading from DSO's supported in Samba 3\n"); - exit(1); - } -#else if (!p) { p = ndr_table_by_name(pipe_name); } @@ -241,7 +228,6 @@ static void ndrdump_data(uint8_t *d, uint32_t l, bool force) p = ndr_table_by_uuid(&uuid); } } -#endif if (!p) { printf("Unknown pipe or UUID '%s'\n", pipe_name); |