summaryrefslogtreecommitdiff
path: root/source4/lib/socket
diff options
context:
space:
mode:
Diffstat (limited to 'source4/lib/socket')
-rw-r--r--source4/lib/socket/socket.c16
-rw-r--r--source4/lib/socket/socket.h2
-rw-r--r--source4/lib/socket/socket_ipv4.c11
-rw-r--r--source4/lib/socket/socket_unix.c11
4 files changed, 40 insertions, 0 deletions
diff --git a/source4/lib/socket/socket.c b/source4/lib/socket/socket.c
index 13d1640f51..dd3175468d 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 bce64f9f6c..e2879e5247 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 93ddf68046..0fc65698c4 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 04ba89578f..f27076b5d8 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,