summaryrefslogtreecommitdiff
path: root/source4/librpc/rpc/dcerpc_connect.c
diff options
context:
space:
mode:
authorRafal Szczesniak <mimir@samba.org>2006-02-19 16:58:48 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:51:57 -0500
commit32a3aa932d2556baf7ee7d38bf694484bf9b04cb (patch)
tree15be47698628d07f22539eaad97f6beba4060066 /source4/librpc/rpc/dcerpc_connect.c
parentaa4a3449c2db76de808d0b43cdf463fa7a5203d6 (diff)
downloadsamba-32a3aa932d2556baf7ee7d38bf694484bf9b04cb.tar.gz
samba-32a3aa932d2556baf7ee7d38bf694484bf9b04cb.tar.bz2
samba-32a3aa932d2556baf7ee7d38bf694484bf9b04cb.zip
r13561: Turn all dcerpc connect and socket functions to async version.
Now, each rpc interface (named pipe, tcp/ip, lrpc and unix socket) works asynchronously. Comments to follow. rafal (This used to be commit 789f9d43db7ea59e79d5aa498e2e9fd077448825)
Diffstat (limited to 'source4/librpc/rpc/dcerpc_connect.c')
-rw-r--r--source4/librpc/rpc/dcerpc_connect.c243
1 files changed, 243 insertions, 0 deletions
diff --git a/source4/librpc/rpc/dcerpc_connect.c b/source4/librpc/rpc/dcerpc_connect.c
index 67dfda6d7a..fa02bca697 100644
--- a/source4/librpc/rpc/dcerpc_connect.c
+++ b/source4/librpc/rpc/dcerpc_connect.c
@@ -324,3 +324,246 @@ NTSTATUS dcerpc_pipe_connect_ncacn_np_smb2(TALLOC_CTX *mem_ctx,
c = dcerpc_pipe_connect_ncacn_np_smb2_send(mem_ctx, io);
return dcerpc_pipe_connect_ncacn_np_smb2_recv(c);
}
+
+
+struct pipe_ip_tcp_state {
+ struct dcerpc_pipe_connect io;
+ const char *host;
+ uint32_t port;
+};
+
+
+void continue_pipe_open_ncacn_ip_tcp(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_ip_tcp_state *s = talloc_get_type(c->private_data,
+ struct pipe_ip_tcp_state);
+
+ c->status = dcerpc_pipe_open_tcp_recv(ctx);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ DEBUG(0,("Failed to connect to %s:%d - %s\n", s->host, s->port,
+ nt_errstr(c->status)));
+ composite_error(c, c->status);
+ return;
+ }
+
+ composite_done(c);
+}
+
+
+struct composite_context* dcerpc_pipe_connect_ncacn_ip_tcp_send(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe_connect *io)
+{
+ struct composite_context *c;
+ struct pipe_ip_tcp_state *s;
+ struct composite_context *pipe_req;
+
+ /* composite context allocation and setup */
+ c = talloc_zero(mem_ctx, struct composite_context);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct pipe_ip_tcp_state);
+ if (s == NULL) {
+ composite_error(c, NT_STATUS_NO_MEMORY);
+ goto done;
+ }
+
+ c->state = COMPOSITE_STATE_IN_PROGRESS;
+ c->private_data = s;
+ c->event_ctx = io->pipe->conn->event_ctx;
+
+ s->io = *io;
+ s->host = talloc_strdup(c, io->binding->host);
+ s->port = atoi(io->binding->endpoint); /* port number is a binding endpoint here */
+
+ pipe_req = dcerpc_pipe_open_tcp_send(s->io.pipe->conn, s->host, s->port);
+ if (pipe_req == NULL) {
+ composite_error(c, NT_STATUS_NO_MEMORY);
+ goto done;
+ }
+
+ composite_continue(c, pipe_req, continue_pipe_open_ncacn_ip_tcp, c);
+done:
+ return c;
+}
+
+
+NTSTATUS dcerpc_pipe_connect_ncacn_ip_tcp_recv(struct composite_context *c)
+{
+ NTSTATUS status = composite_wait(c);
+
+ talloc_free(c);
+ return status;
+}
+
+
+NTSTATUS dcerpc_pipe_connect_ncacn_ip_tcp(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe_connect *io)
+{
+ struct composite_context *c;
+ c = dcerpc_pipe_connect_ncacn_ip_tcp_send(mem_ctx, io);
+ return dcerpc_pipe_connect_ncacn_ip_tcp_recv(c);
+}
+
+
+struct pipe_unix_state {
+ struct dcerpc_pipe_connect io;
+ const char *path;
+};
+
+
+void continue_pipe_open_ncacn_unix_stream(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_unix_state *s = talloc_get_type(c->private_data,
+ struct pipe_unix_state);
+
+ c->status = dcerpc_pipe_open_unix_stream_recv(ctx);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ DEBUG(0,("Failed to open unix socket %s - %s\n",
+ s->io.binding->endpoint, nt_errstr(c->status)));
+ composite_error(c, c->status);
+ return;
+ }
+
+ composite_done(c);
+}
+
+
+struct composite_context* dcerpc_pipe_connect_ncacn_unix_stream_send(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe_connect *io)
+{
+ struct composite_context *c;
+ struct pipe_unix_state *s;
+ struct composite_context *pipe_req;
+
+ /* composite context allocation and setup */
+ c = talloc_zero(mem_ctx, struct composite_context);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct pipe_unix_state);
+ if (s == NULL) {
+ composite_error(c, NT_STATUS_NO_MEMORY);
+ goto done;
+ }
+
+ c->state = COMPOSITE_STATE_IN_PROGRESS;
+ c->private_data = s;
+ c->event_ctx = io->pipe->conn->event_ctx;
+
+ s->io = *io;
+
+ if (!io->binding->endpoint) {
+ DEBUG(0, ("Path to unix socket not specified\n"));
+ composite_error(c, NT_STATUS_INVALID_PARAMETER);
+ goto done;
+ }
+
+ s->path = talloc_strdup(c, io->binding->endpoint); /* path is a binding endpoint here */
+
+ pipe_req = dcerpc_pipe_open_unix_stream_send(s->io.pipe->conn, s->path);
+ if (pipe_req == NULL) {
+ composite_error(c, NT_STATUS_NO_MEMORY);
+ goto done;
+ }
+
+ composite_continue(c, pipe_req, continue_pipe_open_ncacn_unix_stream, c);
+done:
+ return c;
+}
+
+
+NTSTATUS dcerpc_pipe_connect_ncacn_unix_stream_recv(struct composite_context *c)
+{
+ NTSTATUS status = composite_wait(c);
+
+ talloc_free(c);
+ return status;
+}
+
+
+NTSTATUS dcerpc_pipe_connect_ncacn_unix_stream(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe_connect *io)
+{
+ struct composite_context *c;
+ c = dcerpc_pipe_connect_ncacn_unix_stream_send(mem_ctx, io);
+ return dcerpc_pipe_connect_ncacn_unix_stream_recv(c);
+}
+
+
+struct pipe_ncalrpc_state {
+ struct dcerpc_pipe_connect io;
+};
+
+
+void continue_pipe_open_ncalrpc(struct composite_context *ctx)
+{
+ struct composite_context *c = talloc_get_type(ctx->async.private_data,
+ struct composite_context);
+ struct pipe_ncalrpc_state *s = talloc_get_type(c->private_data,
+ struct pipe_ncalrpc_state);
+
+ c->status = dcerpc_pipe_connect_ncalrpc_recv(ctx);
+ if (!NT_STATUS_IS_OK(c->status)) {
+ DEBUG(0,("Failed to open ncalrpc pipe '%s' - %s\n", s->io.binding->endpoint,
+ nt_errstr(c->status)));
+ composite_error(c, c->status);
+ return;
+ }
+
+ composite_done(c);
+}
+
+
+struct composite_context* dcerpc_pipe_connect_ncalrpc_send(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe_connect *io)
+{
+ struct composite_context *c;
+ struct pipe_ncalrpc_state *s;
+ struct composite_context *pipe_req;
+
+ /* composite context allocation and setup */
+ c = talloc_zero(mem_ctx, struct composite_context);
+ if (c == NULL) return NULL;
+
+ s = talloc_zero(c, struct pipe_ncalrpc_state);
+ if (s == NULL) {
+ composite_error(c, NT_STATUS_NO_MEMORY);
+ goto done;
+ }
+
+ c->state = COMPOSITE_STATE_IN_PROGRESS;
+ c->private_data = s;
+ c->event_ctx = io->pipe->conn->event_ctx;
+
+ s->io = *io;
+
+ pipe_req = dcerpc_pipe_open_pipe_send(s->io.pipe->conn, s->io.binding->endpoint);
+ if (pipe_req == NULL) {
+ composite_error(c, NT_STATUS_NO_MEMORY);
+ goto done;
+ }
+
+ composite_continue(c, pipe_req, continue_pipe_open_ncalrpc, c);
+done:
+ return c;
+}
+
+
+NTSTATUS dcerpc_pipe_connect_ncalrpc_recv(struct composite_context *c)
+{
+ NTSTATUS status = composite_wait(c);
+
+ talloc_free(c);
+ return status;
+}
+
+
+NTSTATUS dcerpc_pipe_connect_ncalrpc(TALLOC_CTX *mem_ctx,
+ struct dcerpc_pipe_connect *io)
+{
+ struct composite_context *c = dcerpc_pipe_connect_ncalrpc_send(mem_ctx, io);
+ return dcerpc_pipe_connect_ncalrpc_recv(c);
+}