Author: tridge Date: 2004-10-17 13:21:24 +0000 (Sun, 17 Oct 2004) New Revision: 3020
WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_4_0/source/lib/socket&rev=3020&nolog=1 Log: better error handling in socket_unix Modified: branches/SAMBA_4_0/source/lib/socket/socket_unix.c Changeset: Modified: branches/SAMBA_4_0/source/lib/socket/socket_unix.c =================================================================== --- branches/SAMBA_4_0/source/lib/socket/socket_unix.c 2004-10-17 12:41:31 UTC (rev 3019) +++ branches/SAMBA_4_0/source/lib/socket/socket_unix.c 2004-10-17 13:21:24 UTC (rev 3020) @@ -23,6 +23,40 @@ #include "includes.h" + + +/* + approximate errno mapping +*/ +static NTSTATUS unixdom_error(int ernum) +{ + switch (ernum) { + case EBADF: + case ENOTCONN: + case ENOTSOCK: + case EFAULT: + case EINVAL: + return NT_STATUS_INVALID_PARAMETER; + case EAGAIN: + case EINTR: + return STATUS_MORE_ENTRIES; + case ECONNREFUSED: + return NT_STATUS_CONNECTION_REFUSED; + case ENOBUFS: + case ENOMEM: + return NT_STATUS_NO_MEMORY; + case ENFILE: + case EMFILE: + return NT_STATUS_INSUFFICIENT_RESOURCES; + case EPIPE: + return NT_STATUS_CONNECTION_DISCONNECTED; + case EMSGSIZE: + return NT_STATUS_INVALID_BUFFER_SIZE; + } + + return NT_STATUS_UNSUCCESSFUL; +} + static NTSTATUS unixdom_init(struct socket_context *sock) { sock->fd = socket(PF_UNIX, SOCK_STREAM, 0); @@ -69,7 +103,7 @@ ret = connect(sock->fd, (const struct sockaddr *)&srv_addr, sizeof(srv_addr)); if (ret == -1) { - return NT_STATUS_CONNECTION_REFUSED; + return unixdom_error(errno); } sock->state = SOCKET_STATE_CLIENT_CONNECTED; @@ -97,18 +131,18 @@ ret = bind(sock->fd, (struct sockaddr *)&my_addr, sizeof(my_addr)); if (ret == -1) { - return NT_STATUS_UNSUCCESSFUL; + return unixdom_error(errno); } ret = listen(sock->fd, queue_size); if (ret == -1) { - return NT_STATUS_INSUFFICIENT_RESOURCES; + return unixdom_error(errno); } if (!(flags & SOCKET_FLAG_BLOCK)) { ret = set_blocking(sock->fd, False); if (ret == -1) { - return NT_STATUS_INVALID_PARAMETER; + return unixdom_error(errno); } } @@ -128,7 +162,7 @@ new_fd = accept(sock->fd, (struct sockaddr *)&cli_addr, &cli_addr_len); if (new_fd == -1) { - return NT_STATUS_INSUFFICIENT_RESOURCES; + return unixdom_error(errno); } (*new_sock) = talloc_p(NULL, struct socket_context); @@ -180,23 +214,7 @@ talloc_free(buf); return NT_STATUS_END_OF_FILE; } else if (gotlen == -1) { - NTSTATUS status = NT_STATUS_UNSUCCESSFUL; - switch (errno) { - case EBADF: - case ENOTCONN: - case ENOTSOCK: - case EFAULT: - case EINVAL: - status = NT_STATUS_INVALID_PARAMETER; - break; - case EAGAIN: - case EINTR: - status = STATUS_MORE_ENTRIES; - break; - case ECONNREFUSED: - status = NT_STATUS_CONNECTION_REFUSED; - break; - } + NTSTATUS status = unixdom_error(errno); talloc_free(buf); return status; } @@ -216,6 +234,8 @@ ssize_t len; int flgs = 0; + *sendlen = 0; + /* TODO: we need to map all flags here */ if (!(flags & SOCKET_FLAG_BLOCK)) { flgs |= MSG_DONTWAIT; @@ -223,34 +243,7 @@ len = send(sock->fd, blob->data, blob->length, flgs); if (len == -1) { - NTSTATUS status = NT_STATUS_UNSUCCESSFUL; - switch (errno) { - case EBADF: - case ENOTSOCK: - case EFAULT: - case EINVAL: - status = NT_STATUS_INVALID_PARAMETER; - break; - case EMSGSIZE: - status = NT_STATUS_INVALID_BUFFER_SIZE; - break; - case EAGAIN: - /*case EWOULDBLOCK: this is an alis of EAGAIN --metze */ - case EINTR: - *sendlen = 0; - status = STATUS_MORE_ENTRIES; - break; - case ENOBUFS: - status = NT_STATUS_FOOBAR; - break; - case ENOMEM: - status = NT_STATUS_NO_MEMORY; - break; - case EPIPE: - status = NT_STATUS_CONNECTION_DISCONNECTED; - break; - } - return status; + return unixdom_error(errno); } *sendlen = len;