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/torture/local/messaging.c | 33 ++++++++------- source4/torture/local/socket.c | 85 ++++++++++++++++++++++++--------------- 2 files changed, 70 insertions(+), 48 deletions(-) (limited to 'source4/torture/local') diff --git a/source4/torture/local/messaging.c b/source4/torture/local/messaging.c index faba8304d7..0d4dfc49a8 100644 --- a/source4/torture/local/messaging.c +++ b/source4/torture/local/messaging.c @@ -56,8 +56,8 @@ static void exit_message(struct messaging_context *msg, void *private, static BOOL test_ping_speed(TALLOC_CTX *mem_ctx) { struct event_context *ev; - struct messaging_context *msg_ctx; - struct messaging_context *msg_ctx2; + struct messaging_context *msg_client_ctx; + struct messaging_context *msg_server_ctx; int ping_count = 0; int pong_count = 0; BOOL ret = True; @@ -68,23 +68,25 @@ static BOOL test_ping_speed(TALLOC_CTX *mem_ctx) ev = event_context_init(mem_ctx); - msg_ctx2 = messaging_init(mem_ctx, 1, ev); + msg_server_ctx = messaging_init(mem_ctx, 1, ev); - if (!msg_ctx2) { - exit(1); + if (!msg_server_ctx) { + printf("Failed to init ping messaging context\n"); + talloc_free(mem_ctx); + return False; } - messaging_register(msg_ctx2, NULL, MY_PING, ping_message); - messaging_register(msg_ctx2, mem_ctx, MY_EXIT, exit_message); + messaging_register(msg_server_ctx, NULL, MY_PING, ping_message); + messaging_register(msg_server_ctx, mem_ctx, MY_EXIT, exit_message); - msg_ctx = messaging_init(mem_ctx, 2, ev); + msg_client_ctx = messaging_init(mem_ctx, 2, ev); - if (!msg_ctx) { - printf("messaging_init() failed\n"); + if (!msg_client_ctx) { + printf("msg_client_ctx messaging_init() failed\n"); return False; } - messaging_register(msg_ctx, &pong_count, MY_PONG, pong_message); + messaging_register(msg_client_ctx, &pong_count, MY_PONG, pong_message); tv = timeval_current(); @@ -96,8 +98,8 @@ static BOOL test_ping_speed(TALLOC_CTX *mem_ctx) data.data = discard_const_p(uint8_t, "testing"); data.length = strlen((const char *)data.data); - status1 = messaging_send(msg_ctx, 1, MY_PING, &data); - status2 = messaging_send(msg_ctx, 1, MY_PING, NULL); + status1 = messaging_send(msg_client_ctx, 1, MY_PING, &data); + status2 = messaging_send(msg_client_ctx, 1, MY_PING, NULL); if (!NT_STATUS_IS_OK(status1)) { printf("msg1 failed - %s\n", nt_errstr(status1)); @@ -123,7 +125,7 @@ static BOOL test_ping_speed(TALLOC_CTX *mem_ctx) } printf("sending exit\n"); - messaging_send(msg_ctx, 1, MY_EXIT, NULL); + messaging_send(msg_client_ctx, 1, MY_EXIT, NULL); if (ping_count != pong_count) { printf("ping test failed! received %d, sent %d\n", @@ -134,7 +136,8 @@ static BOOL test_ping_speed(TALLOC_CTX *mem_ctx) printf("ping rate of %.0f messages/sec\n", (ping_count+pong_count)/timeval_elapsed(&tv)); - talloc_free(msg_ctx); + talloc_free(msg_client_ctx); + talloc_free(msg_server_ctx); talloc_free(ev); diff --git a/source4/torture/local/socket.c b/source4/torture/local/socket.c index 4a3a339333..195354611f 100644 --- a/source4/torture/local/socket.c +++ b/source4/torture/local/socket.c @@ -40,8 +40,7 @@ static BOOL test_udp(TALLOC_CTX *mem_ctx) { struct socket_context *sock1, *sock2; NTSTATUS status; - int srv_port, from_port; - const char *srv_addr, *from_addr; + struct socket_address *srv_addr, *from_addr, *localhost; size_t size = 100 + (random() % 100); DATA_BLOB blob, blob2; size_t sent, nread; @@ -57,33 +56,38 @@ static BOOL test_udp(TALLOC_CTX *mem_ctx) CHECK_STATUS(status, NT_STATUS_OK); talloc_steal(mem_ctx, sock2); - status = socket_listen(sock1, iface_best_ip("127.0.0.1"), 0, 0, 0); + localhost = socket_address_from_strings(sock1, sock1->backend_name, + iface_best_ip("127.0.0.1"), 0); + if (!localhost) { + return False; + } + + status = socket_listen(sock1, localhost, 0, 0); CHECK_STATUS(status, NT_STATUS_OK); srv_addr = socket_get_my_addr(sock1, mem_ctx); - if (srv_addr == NULL || strcmp(srv_addr, iface_best_ip("127.0.0.1")) != 0) { + if (srv_addr == NULL || strcmp(srv_addr->addr, iface_best_ip("127.0.0.1")) != 0) { printf("Expected server address of %s but got %s\n", - iface_best_ip("127.0.0.1"), srv_addr); + iface_best_ip("127.0.0.1"), srv_addr ? srv_addr->addr : NULL); return False; } - srv_port = socket_get_my_port(sock1); - printf("server port is %d\n", srv_port); + printf("server port is %d\n", srv_addr->port); blob = data_blob_talloc(mem_ctx, NULL, size); blob2 = data_blob_talloc(mem_ctx, NULL, size); generate_random_buffer(blob.data, blob.length); sent = size; - status = socket_sendto(sock2, &blob, &sent, 0, srv_addr, srv_port); + status = socket_sendto(sock2, &blob, &sent, 0, srv_addr); CHECK_STATUS(status, NT_STATUS_OK); status = socket_recvfrom(sock1, blob2.data, size, &nread, 0, - &from_addr, &from_port); + sock1, &from_addr); CHECK_STATUS(status, NT_STATUS_OK); - if (strcmp(from_addr, srv_addr) != 0) { - printf("Unexpected recvfrom addr %s\n", from_addr); + if (strcmp(from_addr->addr, srv_addr->addr) != 0) { + printf("Unexpected recvfrom addr %s\n", from_addr->addr); ret = False; } if (nread != size) { @@ -97,23 +101,23 @@ static BOOL test_udp(TALLOC_CTX *mem_ctx) } generate_random_buffer(blob.data, blob.length); - status = socket_sendto(sock1, &blob, &sent, 0, from_addr, from_port); + status = socket_sendto(sock1, &blob, &sent, 0, from_addr); CHECK_STATUS(status, NT_STATUS_OK); status = socket_recvfrom(sock2, blob2.data, size, &nread, 0, - &from_addr, &from_port); + sock2, &from_addr); CHECK_STATUS(status, NT_STATUS_OK); - if (strcmp(from_addr, srv_addr) != 0) { - printf("Unexpected recvfrom addr %s\n", from_addr); + if (strcmp(from_addr->addr, srv_addr->addr) != 0) { + printf("Unexpected recvfrom addr %s\n", from_addr->addr); ret = False; } if (nread != size) { printf("Unexpected recvfrom size %d should be %d\n", (int)nread, (int)size); ret = False; } - if (from_port != srv_port) { + if (from_addr->port != srv_addr->port) { printf("Unexpected recvfrom port %d should be %d\n", - from_port, srv_port); + from_addr->port, srv_addr->port); ret = False; } if (memcmp(blob2.data, blob.data, size) != 0) { @@ -135,8 +139,7 @@ static BOOL test_tcp(TALLOC_CTX *mem_ctx) { struct socket_context *sock1, *sock2, *sock3; NTSTATUS status; - int srv_port, from_port; - const char *srv_addr, *from_addr; + struct socket_address *srv_addr, *from_addr, *localhost; size_t size = 100 + (random() % 100); DATA_BLOB blob, blob2; size_t sent, nread; @@ -153,20 +156,30 @@ static BOOL test_tcp(TALLOC_CTX *mem_ctx) CHECK_STATUS(status, NT_STATUS_OK); talloc_steal(mem_ctx, sock2); - status = socket_listen(sock1, iface_best_ip("127.0.0.1"), 0, 0, 0); + localhost = socket_address_from_strings(sock1, sock1->backend_name, + iface_best_ip("127.0.0.1"), 0); + if (!localhost) { + return False; + } + + status = socket_listen(sock1, localhost, 0, 0); CHECK_STATUS(status, NT_STATUS_OK); srv_addr = socket_get_my_addr(sock1, mem_ctx); - if (srv_addr == NULL || strcmp(srv_addr, iface_best_ip("127.0.0.1")) != 0) { + if (srv_addr == NULL || !srv_addr->addr) { + printf("Unexpected socket_get_my_addr NULL\n"); + return False; + } + + if (strcmp(srv_addr->addr, iface_best_ip("127.0.0.1")) != 0) { printf("Expected server address of %s but got %s\n", - iface_best_ip("127.0.0.1"), srv_addr); + iface_best_ip("127.0.0.1"), srv_addr ? srv_addr->addr : NULL); return False; } - srv_port = socket_get_my_port(sock1); - printf("server port is %d\n", srv_port); + printf("server port is %d\n", srv_addr->port); - status = socket_connect_ev(sock2, NULL, 0, srv_addr, srv_port, 0, ev); + status = socket_connect_ev(sock2, NULL, srv_addr, 0, ev); CHECK_STATUS(status, NT_STATUS_OK); status = socket_accept(sock1, &sock3); @@ -186,10 +199,13 @@ static BOOL test_tcp(TALLOC_CTX *mem_ctx) CHECK_STATUS(status, NT_STATUS_OK); from_addr = socket_get_peer_addr(sock3, mem_ctx); - from_port = socket_get_peer_port(sock3); - if (strcmp(from_addr, srv_addr) != 0) { - printf("Unexpected recvfrom addr %s\n", from_addr); + if (!from_addr || !from_addr->addr) { + printf("Unexpected recvfrom addr NULL\n"); + return False; + } + if (strcmp(from_addr->addr, srv_addr->addr) != 0) { + printf("Unexpected recvfrom addr %s\n", from_addr ? from_addr->addr : NULL); ret = False; } if (nread != size) { @@ -210,19 +226,22 @@ static BOOL test_tcp(TALLOC_CTX *mem_ctx) CHECK_STATUS(status, NT_STATUS_OK); from_addr = socket_get_peer_addr(sock2, mem_ctx); - from_port = socket_get_peer_port(sock2); - if (strcmp(from_addr, srv_addr) != 0) { - printf("Unexpected recvfrom addr %s\n", from_addr); + if (!from_addr || !from_addr->addr) { + printf("Unexpected recvfrom addr NULL\n"); + return False; + } + if (strcmp(from_addr->addr, srv_addr->addr) != 0) { + printf("Unexpected recvfrom addr %s\n", from_addr ? from_addr->addr : NULL); ret = False; } if (nread != size) { printf("Unexpected recvfrom size %d should be %d\n", (int)nread, (int)size); ret = False; } - if (from_port != srv_port) { + if (from_addr->port != srv_addr->port) { printf("Unexpected recvfrom port %d should be %d\n", - from_port, srv_port); + from_addr->port, srv_addr->port); ret = False; } if (memcmp(blob2.data, blob.data, size) != 0) { -- cgit