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)));