svn commit: samba r3314 - in branches/SAMBA_4_0/source: lib/messaging lib/socket smbd

tridge at samba.org tridge at samba.org
Thu Oct 28 07:55:33 GMT 2004


Author: tridge
Date: 2004-10-28 07:55:33 +0000 (Thu, 28 Oct 2004)
New Revision: 3314

WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_4_0/source&rev=3314&nolog=1

Log:
added a option "socket:testnonblock" to the generic socket code. If
you set this option (either on the command line using --option or in
smb.conf) then every socket recv or send will return short by random
amounts. This allows you to test that the non-blocking socket logic in
your code works correctly.

I also removed the flags argument to socket_accept(), and instead made
the new socket inherit the flags of the old socket, which makes more
sense to me.


Modified:
   branches/SAMBA_4_0/source/lib/messaging/messaging.c
   branches/SAMBA_4_0/source/lib/socket/socket.c
   branches/SAMBA_4_0/source/lib/socket/socket.h
   branches/SAMBA_4_0/source/lib/socket/socket_ipv4.c
   branches/SAMBA_4_0/source/lib/socket/socket_unix.c
   branches/SAMBA_4_0/source/smbd/process_single.c
   branches/SAMBA_4_0/source/smbd/process_standard.c
   branches/SAMBA_4_0/source/smbd/process_thread.c


Changeset:
Modified: branches/SAMBA_4_0/source/lib/messaging/messaging.c
===================================================================
--- branches/SAMBA_4_0/source/lib/messaging/messaging.c	2004-10-28 07:34:11 UTC (rev 3313)
+++ branches/SAMBA_4_0/source/lib/messaging/messaging.c	2004-10-28 07:55:33 UTC (rev 3314)
@@ -208,7 +208,7 @@
 		smb_panic("Unable to allocate messaging_rec");
 	}
 
-	status = socket_accept(msg->sock, &rec->sock, 0);
+	status = socket_accept(msg->sock, &rec->sock);
 	if (!NT_STATUS_IS_OK(status)) {
 		smb_panic("Unable to accept messaging_rec");
 	}

Modified: branches/SAMBA_4_0/source/lib/socket/socket.c
===================================================================
--- branches/SAMBA_4_0/source/lib/socket/socket.c	2004-10-28 07:34:11 UTC (rev 3313)
+++ branches/SAMBA_4_0/source/lib/socket/socket.c	2004-10-28 07:55:33 UTC (rev 3314)
@@ -60,6 +60,14 @@
 		return status;
 	}
 
+	/* by enabling "testnonblock" mode, all socket receive and
+	   send calls on non-blocking sockets will randomly recv/send
+	   less data than requested */
+	if (!(flags & SOCKET_FLAG_BLOCK) &&
+	    lp_parm_bool(-1, "socket", "testnonblock", False)) {
+		(*new_sock)->flags |= SOCKET_FLAG_TESTNONBLOCK;
+	}
+
 	talloc_set_destructor(*new_sock, socket_destructor);
 
 	return NT_STATUS_OK;
@@ -108,7 +116,7 @@
 	return sock->ops->listen(sock, my_address, port, queue_size, flags);
 }
 
-NTSTATUS socket_accept(struct socket_context *sock, struct socket_context **new_sock, uint32_t flags)
+NTSTATUS socket_accept(struct socket_context *sock, struct socket_context **new_sock)
 {
 	NTSTATUS status;
 
@@ -124,7 +132,7 @@
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	status = sock->ops->accept(sock, new_sock, flags);
+	status = sock->ops->accept(sock, new_sock);
 
 	if (NT_STATUS_IS_OK(status)) {
 		talloc_set_destructor(*new_sock, socket_destructor);
@@ -149,6 +157,10 @@
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
+	if ((sock->flags & SOCKET_FLAG_TESTNONBLOCK) && wantlen > 1) {
+		return sock->ops->recv(sock, buf, 1+(random() % (wantlen-1)), nread, flags);
+	}
+
 	return sock->ops->recv(sock, buf, wantlen, nread, flags);
 }
 
@@ -168,6 +180,12 @@
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
+	if ((sock->flags & SOCKET_FLAG_TESTNONBLOCK) && blob->length > 1) {
+		DATA_BLOB blob2 = *blob;
+		blob2.length = 1+(random() % (blob2.length-1));
+		return sock->ops->send(sock, &blob2, sendlen, flags);
+	}
+
 	return sock->ops->send(sock, blob, sendlen, flags);
 }
 

Modified: branches/SAMBA_4_0/source/lib/socket/socket.h
===================================================================
--- branches/SAMBA_4_0/source/lib/socket/socket.h	2004-10-28 07:34:11 UTC (rev 3313)
+++ branches/SAMBA_4_0/source/lib/socket/socket.h	2004-10-28 07:55:33 UTC (rev 3314)
@@ -42,8 +42,7 @@
 	/* server ops */
 	NTSTATUS (*listen)(struct socket_context *sock,
 				const char *my_address, int port, int queue_size, uint32_t flags);
-	NTSTATUS (*accept)(struct socket_context *sock,
-				struct socket_context **new_sock, uint32_t flags);
+	NTSTATUS (*accept)(struct socket_context *sock,	struct socket_context **new_sock);
 
 	/* general ops */
 	NTSTATUS (*recv)(struct socket_context *sock, void *buf,
@@ -78,8 +77,9 @@
 	SOCKET_STATE_SERVER_ERROR
 };
 
-#define SOCKET_FLAG_BLOCK 0x00000001
-#define SOCKET_FLAG_PEEK  0x00000002
+#define SOCKET_FLAG_BLOCK        0x00000001
+#define SOCKET_FLAG_PEEK         0x00000002
+#define SOCKET_FLAG_TESTNONBLOCK 0x00000004
 
 struct socket_context {
 	enum socket_type type;

Modified: branches/SAMBA_4_0/source/lib/socket/socket_ipv4.c
===================================================================
--- branches/SAMBA_4_0/source/lib/socket/socket_ipv4.c	2004-10-28 07:34:11 UTC (rev 3313)
+++ branches/SAMBA_4_0/source/lib/socket/socket_ipv4.c	2004-10-28 07:55:33 UTC (rev 3314)
@@ -130,7 +130,7 @@
 	return NT_STATUS_OK;
 }
 
-static NTSTATUS ipv4_tcp_accept(struct socket_context *sock, struct socket_context **new_sock, uint32_t flags)
+static NTSTATUS ipv4_tcp_accept(struct socket_context *sock, struct socket_context **new_sock)
 {
 	struct sockaddr_in cli_addr;
 	socklen_t cli_addr_len = sizeof(cli_addr);
@@ -141,7 +141,7 @@
 		return map_nt_error_from_unix(errno);
 	}
 
-	if (!(flags & SOCKET_FLAG_BLOCK)) {
+	if (!(sock->flags & SOCKET_FLAG_BLOCK)) {
 		int ret = set_blocking(new_fd, False);
 		if (ret == -1) {
 			close(new_fd);
@@ -164,7 +164,7 @@
 	/* copy the socket_context */
 	(*new_sock)->type		= sock->type;
 	(*new_sock)->state		= SOCKET_STATE_SERVER_CONNECTED;
-	(*new_sock)->flags		= flags;
+	(*new_sock)->flags		= sock->flags;
 
 	(*new_sock)->fd			= new_fd;
 

Modified: branches/SAMBA_4_0/source/lib/socket/socket_unix.c
===================================================================
--- branches/SAMBA_4_0/source/lib/socket/socket_unix.c	2004-10-28 07:34:11 UTC (rev 3313)
+++ branches/SAMBA_4_0/source/lib/socket/socket_unix.c	2004-10-28 07:55:33 UTC (rev 3314)
@@ -124,8 +124,7 @@
 }
 
 static NTSTATUS unixdom_accept(struct socket_context *sock, 
-			       struct socket_context **new_sock, 
-			       uint32_t flags)
+			       struct socket_context **new_sock)
 {
 	struct sockaddr_un cli_addr;
 	socklen_t cli_addr_len = sizeof(cli_addr);
@@ -136,7 +135,7 @@
 		return unixdom_error(errno);
 	}
 
-	if (!(flags & SOCKET_FLAG_BLOCK)) {
+	if (!(sock->flags & SOCKET_FLAG_BLOCK)) {
 		int ret = set_blocking(new_fd, False);
 		if (ret == -1) {
 			close(new_fd);
@@ -153,7 +152,7 @@
 	/* copy the socket_context */
 	(*new_sock)->type		= sock->type;
 	(*new_sock)->state		= SOCKET_STATE_SERVER_CONNECTED;
-	(*new_sock)->flags		= flags;
+	(*new_sock)->flags		= sock->flags;
 
 	(*new_sock)->fd			= new_fd;
 

Modified: branches/SAMBA_4_0/source/smbd/process_single.c
===================================================================
--- branches/SAMBA_4_0/source/smbd/process_single.c	2004-10-28 07:34:11 UTC (rev 3313)
+++ branches/SAMBA_4_0/source/smbd/process_single.c	2004-10-28 07:55:33 UTC (rev 3314)
@@ -42,7 +42,7 @@
 	struct server_connection *conn;
 
 	/* accept an incoming connection. */
-	status = socket_accept(server_socket->socket, &sock, 0);
+	status = socket_accept(server_socket->socket, &sock);
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(0,("accept_connection_single: accept: %s\n",
 			 nt_errstr(status)));

Modified: branches/SAMBA_4_0/source/smbd/process_standard.c
===================================================================
--- branches/SAMBA_4_0/source/smbd/process_standard.c	2004-10-28 07:34:11 UTC (rev 3313)
+++ branches/SAMBA_4_0/source/smbd/process_standard.c	2004-10-28 07:55:33 UTC (rev 3314)
@@ -43,7 +43,7 @@
 	pid_t pid;
 
 	/* accept an incoming connection. */
-	status = socket_accept(server_socket->socket, &sock, 0);
+	status = socket_accept(server_socket->socket, &sock);
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(0,("standard_accept_connection: accept: %s\n",
 			 nt_errstr(status)));

Modified: branches/SAMBA_4_0/source/smbd/process_thread.c
===================================================================
--- branches/SAMBA_4_0/source/smbd/process_thread.c	2004-10-28 07:34:11 UTC (rev 3313)
+++ branches/SAMBA_4_0/source/smbd/process_thread.c	2004-10-28 07:55:33 UTC (rev 3314)
@@ -58,7 +58,7 @@
 	struct server_connection *conn;
 
 	/* accept an incoming connection. */
-	status = socket_accept(server_socket->socket, &sock, 0);
+	status = socket_accept(server_socket->socket, &sock);
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(0,("accept_connection_single: accept: %s\n",
 			 nt_errstr(status)));



More information about the samba-cvs mailing list