diff options
Diffstat (limited to 'source4/lib/com/dcom')
-rw-r--r-- | source4/lib/com/dcom/dcom.h | 15 | ||||
-rw-r--r-- | source4/lib/com/dcom/main.c | 18 |
2 files changed, 27 insertions, 6 deletions
diff --git a/source4/lib/com/dcom/dcom.h b/source4/lib/com/dcom/dcom.h index b3f42bc562..69bb7183b2 100644 --- a/source4/lib/com/dcom/dcom.h +++ b/source4/lib/com/dcom/dcom.h @@ -28,10 +28,16 @@ struct dcerpc_pipe; #include "librpc/gen_ndr/orpc.h" struct dcom_client_context { - struct cli_credentials *credentials; + struct dcom_server_credentials { + const char *server; + struct cli_credentials *credentials; + struct dcom_server_credentials *prev, *next; + } *credentials; struct dcom_object_exporter { - uint64_t oxid; - struct DUALSTRINGARRAY bindings; + uint64_t oxid; + char *host; + struct IRemUnknown *rem_unknown; + struct DUALSTRINGARRAY *bindings; struct dcerpc_pipe *pipe; struct dcom_object_exporter *prev, *next; } *object_exporters; @@ -50,7 +56,7 @@ NTSTATUS dcom_get_pipe(struct IUnknown *iface, struct dcerpc_pipe **pp); NTSTATUS dcom_OBJREF_from_IUnknown(struct OBJREF *o, struct IUnknown *p); NTSTATUS dcom_IUnknown_from_OBJREF(struct com_context *ctx, struct IUnknown **_p, struct OBJREF *o); uint64_t dcom_get_current_oxid(void); -void dcom_set_server_credentials(struct com_context *ctx, const char *server, struct cli_credentials *credentials); +void dcom_add_server_credentials(struct com_context *ctx, const char *server, struct cli_credentials *credentials); WERROR dcom_query_interface(struct IUnknown *d, uint32_t cRefs, uint16_t cIids, struct GUID *iids, struct IUnknown **ip, WERROR *results); #include "librpc/gen_ndr/com_dcom.h" @@ -61,5 +67,6 @@ NTSTATUS dcom_register_marshal(struct GUID *clsid, marshal_fn marshal, unmarshal #include "libcli/composite/composite.h" void dcom_release_continue(struct composite_context *cr); +#define IUnknown_ipid(d) ((d)->obj.u_objref.u_standard.std.ipid) #endif /* _DCOM_H */ diff --git a/source4/lib/com/dcom/main.c b/source4/lib/com/dcom/main.c index 01efb68c05..f3eb2ab608 100644 --- a/source4/lib/com/dcom/main.c +++ b/source4/lib/com/dcom/main.c @@ -84,12 +84,23 @@ struct cli_credentials *dcom_get_server_credentials(struct com_context *ctx, con return d; } -void dcom_set_server_credentials(struct com_context *ctx, const char *server, struct cli_credentials *credentials) +/** + * Register credentials for a specific server. + * + * @param ctx COM context + * @param server Name of server, can be NULL + * @param credentials Credentials object + */ +void dcom_add_server_credentials(struct com_context *ctx, const char *server, + struct cli_credentials *credentials) { struct dcom_server_credentials *c; + /* FIXME: Don't use talloc_find_parent_bytype */ for (c = ctx->dcom->credentials; c; c = c->next) { - if ((server == NULL && c->server == NULL) ||(server && c->server && !strcmp(c->server, server))) { + if ((server == NULL && c->server == NULL) || + (server != NULL && c->server != NULL && + !strcmp(c->server, server))) { if (c->credentials && c->credentials != credentials) { talloc_unlink(c, c->credentials); c->credentials = credentials; @@ -98,9 +109,11 @@ void dcom_set_server_credentials(struct com_context *ctx, const char *server, st else talloc_steal(c, c->credentials); } + return; } } + c = talloc(ctx->event_ctx, struct dcom_server_credentials); c->server = talloc_strdup(c, server); c->credentials = credentials; @@ -108,6 +121,7 @@ void dcom_set_server_credentials(struct com_context *ctx, const char *server, st (void)talloc_reference(c, c->credentials); else talloc_steal(c, c->credentials); + DLIST_ADD(ctx->dcom->credentials, c); } |