From f55ea8bb3dca868e21663cd90eaea7a35cd7886c Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 9 Jan 2006 22:12:53 +0000 Subject: r12804: This patch reworks the Samba4 sockets layer to use a socket_address structure that is more generic than just 'IP/port'. It now passes make test, and has been reviewed and updated by metze. (Thankyou *very* much). This passes 'make test' as well as kerberos use (not currently in the testsuite). The original purpose of this patch was to have Samba able to pass a socket address stucture from the BSD layer into the kerberos routines and back again. It also removes nbt_peer_addr, which was being used for a similar purpose. It is a large change, but worthwhile I feel. Andrew Bartlett (This used to be commit 88198c4881d8620a37086f80e4da5a5b71c5bbb2) --- source4/lib/socket/connect.c | 58 +++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 30 deletions(-) (limited to 'source4/lib/socket/connect.c') diff --git a/source4/lib/socket/connect.c b/source4/lib/socket/connect.c index dd3a6047a6..dc64198caa 100644 --- a/source4/lib/socket/connect.c +++ b/source4/lib/socket/connect.c @@ -30,10 +30,8 @@ struct connect_state { struct socket_context *sock; - const char *my_address; - int my_port; - const char *server_address; - int server_port; + const struct socket_address *my_address; + const struct socket_address *server_address; uint32_t flags; }; @@ -62,9 +60,7 @@ static void socket_send_connect(struct composite_context *result) result->status = socket_connect(state->sock, state->my_address, - state->my_port, state->server_address, - state->server_port, state->flags); if (NT_STATUS_IS_ERR(result->status) && !NT_STATUS_EQUAL(result->status, @@ -85,10 +81,8 @@ static void socket_send_connect(struct composite_context *result) send a socket connect, potentially doing some name resolution first */ struct composite_context *socket_connect_send(struct socket_context *sock, - const char *my_address, - int my_port, - const char *server_address, - int server_port, + struct socket_address *my_address, + struct socket_address *server_address, uint32_t flags, struct event_context *event_ctx) { @@ -101,33 +95,39 @@ struct composite_context *socket_connect_send(struct socket_context *sock, result->event_ctx = event_ctx; state = talloc_zero(result, struct connect_state); - if (composite_nomem(state, result)) goto failed; + if (composite_nomem(state, result)) return result; result->private_data = state; state->sock = talloc_reference(state, sock); - if (composite_nomem(state->sock, result)) goto failed; + if (composite_nomem(state->sock, result)) return result; if (my_address) { - state->my_address = talloc_strdup(state, my_address); - if (composite_nomem(state->my_address, result)) goto failed; + void *ref = talloc_reference(state, my_address); + if (composite_nomem(ref, result)) { + return result; + } + state->my_address = my_address; } - state->my_port = my_port; - state->server_address = talloc_strdup(state, server_address); - if (composite_nomem(state->server_address, result)) goto failed; + { + void *ref = talloc_reference(state, server_address); + if (composite_nomem(ref, result)) { + return result; + } + state->server_address = server_address; + } - state->server_port = server_port; state->flags = flags; set_blocking(socket_get_fd(sock), False); - if (strcmp(sock->backend_name, "ipv4") == 0) { + if (server_address->addr && strcmp(sock->backend_name, "ipv4") == 0) { struct nbt_name name; struct composite_context *creq; - make_nbt_name_client(&name, server_address); + make_nbt_name_client(&name, server_address->addr); creq = resolve_name_send(&name, result->event_ctx, lp_name_resolve_order()); - if (composite_nomem(creq, result)) goto failed; + if (composite_nomem(creq, result)) return result; composite_continue(result, creq, continue_resolve_name, result); return result; } @@ -135,10 +135,6 @@ struct composite_context *socket_connect_send(struct socket_context *sock, socket_send_connect(result); return result; - -failed: - composite_error(result, result->status); - return result; } /* @@ -172,7 +168,9 @@ static void continue_resolve_name(struct composite_context *creq) result->status = resolve_name_recv(creq, state, &addr); if (!composite_is_ok(result)) return; - state->server_address = addr; + state->server_address = socket_address_from_strings(state, state->sock->backend_name, + addr, state->server_address->port); + if (composite_nomem(state->server_address, result)) return; socket_send_connect(result); } @@ -205,12 +203,12 @@ NTSTATUS socket_connect_recv(struct composite_context *result) like socket_connect() but takes an event context, doing a semi-async connect */ NTSTATUS socket_connect_ev(struct socket_context *sock, - const char *my_address, int my_port, - const char *server_address, int server_port, + struct socket_address *my_address, + struct socket_address *server_address, uint32_t flags, struct event_context *ev) { struct composite_context *ctx; - ctx = socket_connect_send(sock, my_address, my_port, - server_address, server_port, flags, ev); + ctx = socket_connect_send(sock, my_address, + server_address, flags, ev); return socket_connect_recv(ctx); } -- cgit