summaryrefslogtreecommitdiff
path: root/source4/rpc_server/dcerpc_server.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2003-12-13 10:58:48 +0000
committerAndrew Tridgell <tridge@samba.org>2003-12-13 10:58:48 +0000
commitd4705378ce88d1bb2f787338c531998d37d078ef (patch)
tree5c69c190347bd71067203aa89f0e99db4bc50a38 /source4/rpc_server/dcerpc_server.c
parent8faa77f177833eeee245391840d06771f46e0136 (diff)
downloadsamba-d4705378ce88d1bb2f787338c531998d37d078ef.tar.gz
samba-d4705378ce88d1bb2f787338c531998d37d078ef.tar.bz2
samba-d4705378ce88d1bb2f787338c531998d37d078ef.zip
dcerpc over tcp in the samba4 server now works to some extent. It
needs quite a bit more work to get it finished. The biggest missing feature is the lack of NTLMSSP which is needed for basic authentication over tcp (This used to be commit 9fb0f0369356909c99389e2cbc525be27c08793c)
Diffstat (limited to 'source4/rpc_server/dcerpc_server.c')
-rw-r--r--source4/rpc_server/dcerpc_server.c70
1 files changed, 45 insertions, 25 deletions
diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c
index 67b36cdc48..81c9d4cb8f 100644
--- a/source4/rpc_server/dcerpc_server.c
+++ b/source4/rpc_server/dcerpc_server.c
@@ -25,11 +25,11 @@
/*
find the set of endpoint operations for an endpoint server
*/
-static const struct dcesrv_endpoint_ops *find_endpoint(struct server_context *smb,
+static const struct dcesrv_endpoint_ops *find_endpoint(struct dcesrv_context *dce,
const struct dcesrv_endpoint *endpoint)
{
struct dce_endpoint *ep;
- for (ep=smb->dcesrv.endpoint_list; ep; ep=ep->next) {
+ for (ep=dce->endpoint_list; ep; ep=ep->next) {
if (ep->endpoint_ops->query_endpoint(endpoint)) {
return ep->endpoint_ops;
}
@@ -54,7 +54,7 @@ static struct dcesrv_call_state *dcesrv_find_call(struct dcesrv_state *dce, uint
/*
register an endpoint server
*/
-BOOL dcesrv_endpoint_register(struct server_context *smb,
+BOOL dcesrv_endpoint_register(struct dcesrv_context *dce,
const struct dcesrv_endpoint_ops *ops)
{
struct dce_endpoint *ep;
@@ -63,26 +63,20 @@ BOOL dcesrv_endpoint_register(struct server_context *smb,
return False;
}
ep->endpoint_ops = ops;
- DLIST_ADD(smb->dcesrv.endpoint_list, ep);
+ DLIST_ADD(dce->endpoint_list, ep);
return True;
}
/*
connect to a dcerpc endpoint
*/
-NTSTATUS dcesrv_endpoint_connect(struct server_context *smb,
- const struct dcesrv_endpoint *endpoint,
- struct dcesrv_state **p)
+NTSTATUS dcesrv_endpoint_connect_ops(struct dcesrv_context *dce,
+ const struct dcesrv_endpoint *endpoint,
+ const struct dcesrv_endpoint_ops *ops,
+ struct dcesrv_state **p)
{
TALLOC_CTX *mem_ctx;
NTSTATUS status;
- const struct dcesrv_endpoint_ops *ops;
-
- /* make sure this endpoint exists */
- ops = find_endpoint(smb, endpoint);
- if (!ops) {
- return NT_STATUS_OBJECT_NAME_NOT_FOUND;
- }
mem_ctx = talloc_init("dcesrv_endpoint_connect");
if (!mem_ctx) {
@@ -95,7 +89,7 @@ NTSTATUS dcesrv_endpoint_connect(struct server_context *smb,
return NT_STATUS_NO_MEMORY;
}
- (*p)->smb = smb;
+ (*p)->dce = dce;
(*p)->mem_ctx = mem_ctx;
(*p)->endpoint = *endpoint;
(*p)->ops = ops;
@@ -117,6 +111,24 @@ NTSTATUS dcesrv_endpoint_connect(struct server_context *smb,
return NT_STATUS_OK;
}
+/*
+ connect to a dcerpc endpoint
+*/
+NTSTATUS dcesrv_endpoint_connect(struct dcesrv_context *dce,
+ const struct dcesrv_endpoint *endpoint,
+ struct dcesrv_state **p)
+{
+ const struct dcesrv_endpoint_ops *ops;
+
+ /* make sure this endpoint exists */
+ ops = find_endpoint(dce, endpoint);
+ if (!ops) {
+ return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+ }
+
+ return dcesrv_endpoint_connect_ops(dce, endpoint, ops, p);
+}
+
/*
disconnect a link to an endpoint
@@ -646,27 +658,35 @@ int dcesrv_lookup_endpoints(const struct dcerpc_interface_table *table,
TALLOC_CTX *mem_ctx,
struct dcesrv_ep_iface **e)
{
- *e = talloc_p(mem_ctx, struct dcesrv_ep_iface);
+ int i;
+ *e = talloc_array_p(mem_ctx, struct dcesrv_ep_iface, table->endpoints->count);
if (! *e) {
return -1;
}
- (*e)->name = table->name;
- (*e)->uuid = table->uuid;
- (*e)->if_version = table->if_version;
- (*e)->endpoint.type = ENDPOINT_SMB;
- (*e)->endpoint.info.smb_pipe = table->endpoints->names[0];
+ for (i=0;i<table->endpoints->count;i++) {
+ (*e)[i].name = table->name;
+ (*e)[i].uuid = table->uuid;
+ (*e)[i].if_version = table->if_version;
+ if (strncmp(table->endpoints->names[i], "TCP-", 4) == 0) {
+ (*e)[i].endpoint.type = ENDPOINT_TCP;
+ (*e)[i].endpoint.info.tcp_port = atoi(table->endpoints->names[i]+4);
+ } else {
+ (*e)[i].endpoint.type = ENDPOINT_SMB;
+ (*e)[i].endpoint.info.smb_pipe = table->endpoints->names[i];
+ }
+ }
- return 1;
+ return i;
}
/*
initialise the dcerpc server subsystem
*/
-BOOL dcesrv_init(struct server_context *smb)
+BOOL dcesrv_init(struct dcesrv_context *dce)
{
- rpc_echo_init(smb);
- rpc_epmapper_init(smb);
+ rpc_echo_init(dce);
+ rpc_epmapper_init(dce);
return True;
}