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
) {
40 * If no GUID is supplied, use the name to determine
43 if (GUID_all_zero(&table
->syntax_id
.uuid
)) {
44 if (strcmp(table
->name
,
45 l
->table
->name
) != 0) {
48 DBG_ERR("Attempt to register interface %s which has the "
49 "same name as already registered interface\n",
52 if (!GUID_equal(&table
->syntax_id
.uuid
,
53 &l
->table
->syntax_id
.uuid
)) {
56 DBG_ERR("Attempt to register interface %s which has the "
57 "same UUID as already registered interface %s\n",
58 table
->name
, l
->table
->name
);
60 return NT_STATUS_OBJECT_NAME_COLLISION
;
64 * This is a singleton instance guarenteed
65 * by the above check to be only added once
66 * into the list so we can allocate off the NULL
67 * context. We never want this to be freed
68 * until process shutdown. If needed we could
69 * add a deregister function that walks and
73 l
= talloc(NULL
, struct ndr_interface_list
);
76 DLIST_ADD(ndr_interfaces
, l
);
82 find the pipe name for a local IDL interface
84 const char *ndr_interface_name(const struct GUID
*uuid
, uint32_t if_version
)
86 const struct ndr_interface_list
*l
;
87 for (l
=ndr_table_list();l
;l
=l
->next
) {
88 if (GUID_equal(&l
->table
->syntax_id
.uuid
, uuid
) &&
89 l
->table
->syntax_id
.if_version
== if_version
) {
90 return l
->table
->name
;
97 find the number of calls defined by local IDL
99 int ndr_interface_num_calls(const struct GUID
*uuid
, uint32_t if_version
)
101 const struct ndr_interface_list
*l
;
102 for (l
=ndr_table_list();l
;l
=l
->next
){
103 if (GUID_equal(&l
->table
->syntax_id
.uuid
, uuid
) &&
104 l
->table
->syntax_id
.if_version
== if_version
) {
105 return l
->table
->num_calls
;
113 find a dcerpc interface by name
115 const struct ndr_interface_table
*ndr_table_by_name(const char *name
)
117 const struct ndr_interface_list
*l
;
118 for (l
=ndr_table_list();l
;l
=l
->next
) {
119 if (strcasecmp(l
->table
->name
, name
) == 0) {
127 find a dcerpc interface by syntax
129 const struct ndr_interface_table
*ndr_table_by_syntax(const struct ndr_syntax_id
*syntax
)
131 const struct ndr_interface_list
*l
;
132 if (GUID_all_zero(&syntax
->uuid
)) {
133 /* These are not unique */
136 for (l
=ndr_table_list();l
;l
=l
->next
) {
137 if (ndr_syntax_id_equal(&l
->table
->syntax_id
, syntax
)) {
145 find a dcerpc interface by uuid
147 const struct ndr_interface_table
*ndr_table_by_uuid(const struct GUID
*uuid
)
149 const struct ndr_interface_list
*l
;
150 if (GUID_all_zero(uuid
)) {
151 /* These are not unique */
154 for (l
=ndr_table_list();l
;l
=l
->next
) {
155 if (GUID_equal(&l
->table
->syntax_id
.uuid
, uuid
)) {
163 return the list of registered dcerpc_pipes
165 const struct ndr_interface_list
*ndr_table_list(void)
168 return ndr_interfaces
;
172 NTSTATUS
ndr_table_init(void)
174 static bool initialized
= false;
176 if (initialized
) return NT_STATUS_OK
;
179 ndr_table_register_builtin_tables();