added a socket_pending() call to abstract away the FIONREAD ioctl. It
authortridge <tridge@0c0555d6-39d7-0310-84fc-f1cc0bd64818>
Fri, 3 Jun 2005 13:20:08 +0000 (13:20 +0000)
committertridge <tridge@0c0555d6-39d7-0310-84fc-f1cc0bd64818>
Fri, 3 Jun 2005 13:20:08 +0000 (13:20 +0000)
will be interesting to see if this causes any portability problems, as
it is a less commonly used call.

git-svn-id: svn+ssh://svn.samba.org/data/svn/samba/branches/SAMBA_4_0@7227 0c0555d6-39d7-0310-84fc-f1cc0bd64818

source/lib/socket/socket.c
source/lib/socket/socket.h
source/lib/socket/socket_ipv4.c
source/lib/socket/socket_unix.c

index 13d1640f518363fb6378ee10736f7fe9a43c7bc3..dd3175468d50304942c6b050f3458c58cb519b35 100644 (file)
@@ -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) {
index bce64f9f6c9cb21776e21c0de995a112e25bc94a..e2879e52478dd2809f5e04121a95d0ad27b82d31 100644 (file)
@@ -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);
index 93ddf6804696ea37e479ef599d587f65e7c7a427..0fc65698c4cc1a6ca674916574312e36dc00326b 100644 (file)
@@ -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,
index 04ba89578f8d9138ff057a4600cda0aba6af5247..f27076b5d8a1bec1c71660916c7ca52e83006324 100644 (file)
@@ -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,