From: Andrew Tridgell Date: Fri, 3 Jun 2005 13:20:08 +0000 (+0000) Subject: r7227: added a socket_pending() call to abstract away the FIONREAD ioctl. It X-Git-Tag: samba-4.0.0alpha6~801^3~10734 X-Git-Url: http://git.samba.org/samba.git/?p=bbaumbach%2Fsamba-autobuild%2F.git;a=commitdiff_plain;h=1692bbf2e267eabd7099f0b6153da0c7cf209d1d r7227: added a socket_pending() call to abstract away the FIONREAD ioctl. It will be interesting to see if this causes any portability problems, as it is a less commonly used call. (This used to be commit f6993db31d93059c70b44a23005ba444e205870f) --- diff --git a/source4/lib/socket/socket.c b/source4/lib/socket/socket.c index 13d1640f518..dd3175468d5 100644 --- a/source4/lib/socket/socket.c +++ b/source4/lib/socket/socket.c @@ -235,6 +235,22 @@ NTSTATUS socket_sendto(struct socket_context *sock, return sock->ops->fn_sendto(sock, blob, sendlen, flags, dest_addr, dest_port); } + +/* + ask for the number of bytes in a pending incoming datagram +*/ +NTSTATUS socket_pending(struct socket_context *sock, size_t *npending) +{ + if (sock->type != SOCKET_TYPE_DGRAM) { + return NT_STATUS_INVALID_PARAMETER; + } + if (!sock->ops->fn_pending) { + return NT_STATUS_NOT_IMPLEMENTED; + } + return sock->ops->fn_pending(sock, npending); +} + + NTSTATUS socket_set_option(struct socket_context *sock, const char *option, const char *val) { if (!sock->ops->fn_set_option) { diff --git a/source4/lib/socket/socket.h b/source4/lib/socket/socket.h index bce64f9f6c9..e2879e52478 100644 --- a/source4/lib/socket/socket.h +++ b/source4/lib/socket/socket.h @@ -60,6 +60,7 @@ struct socket_ops { NTSTATUS (*fn_recvfrom)(struct socket_context *sock, void *buf, size_t wantlen, size_t *nread, uint32_t flags, const char **src_addr, int *src_port); + NTSTATUS (*fn_pending)(struct socket_context *sock, size_t *npending); void (*fn_close)(struct socket_context *sock); @@ -124,6 +125,7 @@ NTSTATUS socket_send(struct socket_context *sock, NTSTATUS socket_sendto(struct socket_context *sock, const DATA_BLOB *blob, size_t *sendlen, uint32_t flags, const char *dest_addr, int dest_port); +NTSTATUS socket_pending(struct socket_context *sock, size_t *npending); NTSTATUS socket_set_option(struct socket_context *sock, const char *option, const char *val); char *socket_get_peer_name(struct socket_context *sock, TALLOC_CTX *mem_ctx); char *socket_get_peer_addr(struct socket_context *sock, TALLOC_CTX *mem_ctx); diff --git a/source4/lib/socket/socket_ipv4.c b/source4/lib/socket/socket_ipv4.c index 93ddf680469..0fc65698c4c 100644 --- a/source4/lib/socket/socket_ipv4.c +++ b/source4/lib/socket/socket_ipv4.c @@ -435,6 +435,16 @@ static int ipv4_get_fd(struct socket_context *sock) return sock->fd; } +static NTSTATUS ipv4_pending(struct socket_context *sock, size_t *npending) +{ + int value = 0; + if (ioctl(sock->fd, FIONREAD, &value) == 0) { + *npending = value; + return NT_STATUS_OK; + } + return map_nt_error_from_unix(errno); +} + static const struct socket_ops ipv4_ops = { .name = "ipv4", .fn_init = ipv4_init, @@ -446,6 +456,7 @@ static const struct socket_ops ipv4_ops = { .fn_recvfrom = ipv4_recvfrom, .fn_send = ipv4_send, .fn_sendto = ipv4_sendto, + .fn_pending = ipv4_pending, .fn_close = ipv4_close, .fn_set_option = ipv4_set_option, diff --git a/source4/lib/socket/socket_unix.c b/source4/lib/socket/socket_unix.c index 04ba89578f8..f27076b5d8a 100644 --- a/source4/lib/socket/socket_unix.c +++ b/source4/lib/socket/socket_unix.c @@ -316,6 +316,16 @@ static int unixdom_get_fd(struct socket_context *sock) return sock->fd; } +static NTSTATUS unixdom_pending(struct socket_context *sock, size_t *npending) +{ + int value = 0; + if (ioctl(sock->fd, FIONREAD, &value) == 0) { + *npending = value; + return NT_STATUS_OK; + } + return map_nt_error_from_unix(errno); +} + static const struct socket_ops unixdom_ops = { .name = "unix", .fn_init = unixdom_init, @@ -327,6 +337,7 @@ static const struct socket_ops unixdom_ops = { .fn_send = unixdom_send, .fn_sendto = unixdom_sendto, .fn_close = unixdom_close, + .fn_pending = unixdom_pending, .fn_set_option = unixdom_set_option,