mirror of
https://github.com/samba-team/samba.git
synced 2025-02-28 01:58:17 +03:00
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)
This commit is contained in:
parent
ff27722fea
commit
1692bbf2e2
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user