r3689: Large number of COM updates:
[samba.git] / source4 / lib / dcom / common / tables.c
1 /*
2    Unix SMB/CIFS implementation.
3    DCOM interface and class tables
4    Copyright (C) 2004 Jelmer Vernooij <jelmer@samba.org>
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2 of the License, or
9    (at your option) any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21 #include "includes.h"
22 #include "dlinklist.h"
23
24 static struct class_list {
25         struct class_list *prev, *next;
26         struct dcom_class class;
27 } *classes = NULL;
28
29 static struct interface_list {
30         struct interface_list *prev, *next;
31         struct dcom_interface interface;
32 } *interfaces = NULL;
33
34 const struct dcom_interface *dcom_interface_by_iid(const struct GUID *iid)
35 {
36         struct interface_list *l = interfaces;
37
38         while(l) {
39                 
40                 if (uuid_equal(iid, &l->interface.iid)) 
41                         return &l->interface;
42                 
43                 l = l->next;
44         }
45         
46         return NULL;
47 }
48
49 const void *dcom_vtable_by_clsid(const struct GUID *clsid)
50 {
51         struct class_list *c = classes;
52
53         while(c) {
54
55                 if (uuid_equal(clsid, &c->class.clsid))
56                         return &c->class;
57
58                 c = c->next;
59         }
60         
61         return NULL;
62 }
63
64 const void *dcom_proxy_vtable_by_iid(const struct GUID *iid)
65 {
66         const struct dcom_interface *iface = dcom_interface_by_iid(iid);
67
68         if (!iface) { 
69                 return NULL;
70         }
71
72         return iface->proxy_vtable;
73 }
74
75 static NTSTATUS dcom_register_interface(const void *_iface)
76 {
77         const struct dcom_interface *iface = _iface;
78         struct interface_list *l = talloc_zero_p(interfaces, struct interface_list);
79
80         l->interface = *iface;
81         
82         DLIST_ADD(interfaces, l);
83         
84         return NT_STATUS_OK;
85 }
86
87 static NTSTATUS dcom_register_class(const void *_class)
88 {
89         const struct dcom_class *class = _class;
90         struct class_list *l = talloc_zero_p(classes, struct class_list);
91
92         l->class = *class;
93         
94         DLIST_ADD(classes, l);
95         
96         return NT_STATUS_OK;
97 }
98
99 NTSTATUS libdcom_init(void)
100 {
101         NTSTATUS status;
102
103         status = register_subsystem("dcom_interface", dcom_register_interface);
104         if (NT_STATUS_IS_ERR(status)) {
105                 return status;
106         }
107
108         register_subsystem("dcom_class", dcom_register_class);
109         if (NT_STATUS_IS_ERR(status)) {
110                 return status;
111         }
112
113         return status;
114 }