2 Unix SMB/CIFS implementation.
4 dcerpc utility functions
6 Copyright (C) Andrew Tridgell 2003
7 Copyright (C) Jelmer Vernooij 2004
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>.
24 #include "../lib/util/dlinklist.h"
25 #include "librpc/ndr/libndr.h"
26 #include "librpc/ndr/ndr_table.h"
29 static struct ndr_interface_list
*ndr_interfaces
;
32 register a ndr interface table
34 NTSTATUS
ndr_table_register(const struct ndr_interface_table
*table
)
36 struct ndr_interface_list
*l
;
38 for (l
= ndr_interfaces
; l
; l
= l
->next
) {
39 if (GUID_equal(&table
->syntax_id
.uuid
, &l
->table
->syntax_id
.uuid
)) {
40 DEBUG(0, ("Attempt to register interface %s which has the "
41 "same UUID as already registered interface %s\n",
42 table
->name
, l
->table
->name
));
43 return NT_STATUS_OBJECT_NAME_COLLISION
;
47 l
= talloc(talloc_autofree_context(), struct ndr_interface_list
);
50 DLIST_ADD(ndr_interfaces
, l
);
56 find the pipe name for a local IDL interface
58 const char *ndr_interface_name(const struct GUID
*uuid
, uint32_t if_version
)
60 const struct ndr_interface_list
*l
;
61 for (l
=ndr_table_list();l
;l
=l
->next
) {
62 if (GUID_equal(&l
->table
->syntax_id
.uuid
, uuid
) &&
63 l
->table
->syntax_id
.if_version
== if_version
) {
64 return l
->table
->name
;
71 find the number of calls defined by local IDL
73 int ndr_interface_num_calls(const struct GUID
*uuid
, uint32_t if_version
)
75 const struct ndr_interface_list
*l
;
76 for (l
=ndr_table_list();l
;l
=l
->next
){
77 if (GUID_equal(&l
->table
->syntax_id
.uuid
, uuid
) &&
78 l
->table
->syntax_id
.if_version
== if_version
) {
79 return l
->table
->num_calls
;
87 find a dcerpc interface by name
89 const struct ndr_interface_table
*ndr_table_by_name(const char *name
)
91 const struct ndr_interface_list
*l
;
92 for (l
=ndr_table_list();l
;l
=l
->next
) {
93 if (strcasecmp(l
->table
->name
, name
) == 0) {
101 find a dcerpc interface by syntax
103 const struct ndr_interface_table
*ndr_table_by_syntax(const struct ndr_syntax_id
*syntax
)
105 const struct ndr_interface_list
*l
;
106 for (l
=ndr_table_list();l
;l
=l
->next
) {
107 if (ndr_syntax_id_equal(&l
->table
->syntax_id
, syntax
)) {
115 find a dcerpc interface by uuid
117 const struct ndr_interface_table
*ndr_table_by_uuid(const struct GUID
*uuid
)
119 const struct ndr_interface_list
*l
;
120 for (l
=ndr_table_list();l
;l
=l
->next
) {
121 if (GUID_equal(&l
->table
->syntax_id
.uuid
, uuid
)) {
129 return the list of registered dcerpc_pipes
131 const struct ndr_interface_list
*ndr_table_list(void)
134 return ndr_interfaces
;
138 NTSTATUS
ndr_table_init(void)
140 static bool initialized
= false;
142 if (initialized
) return NT_STATUS_OK
;
145 ndr_table_register_builtin_tables();