summaryrefslogtreecommitdiffhomepage
path: root/src/socket/ntapi_sc_recv.c
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2016-03-25 04:53:13 -0400
committermidipix <writeonce@midipix.org>2016-03-27 10:54:31 -0400
commitf6c77ac338e5e7a913404658b765936782776869 (patch)
tree82a494545d0586ab3219a7ad656a3d3c40bac9fa /src/socket/ntapi_sc_recv.c
parenteb53e602bc5289b3702dd4a711ff1054da7b1086 (diff)
downloadntapi-f6c77ac338e5e7a913404658b765936782776869.tar.bz2
ntapi-f6c77ac338e5e7a913404658b765936782776869.tar.xz
socket interfaces: __ntapi_sc_recv(): added connectionless datagram support.
Diffstat (limited to 'src/socket/ntapi_sc_recv.c')
-rw-r--r--src/socket/ntapi_sc_recv.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/socket/ntapi_sc_recv.c b/src/socket/ntapi_sc_recv.c
index 2c969af..bdc6165 100644
--- a/src/socket/ntapi_sc_recv.c
+++ b/src/socket/ntapi_sc_recv.c
@@ -11,21 +11,36 @@
#include <ntapi/ntapi.h>
#include "ntapi_impl.h"
+typedef struct _nt_afd_recv_udp_info {
+ nt_afd_recv_info afd_recv;
+ nt_sockaddr * addr;
+ nt_sockaddr_reply * raddr;
+} nt_afd_recv_udp_info;
+
int32_t __cdecl __ntapi_sc_recv(
__in nt_socket * hssocket,
__in const void * buffer,
__in size_t len,
__out ssize_t * bytes_received __optional,
+ __in nt_sockaddr_reply * raddr __optional,
__in uintptr_t afdflags __optional,
__in uintptr_t tdiflags __optional,
__out nt_io_status_block * iosb __optional)
{
nt_afd_buffer afd_buffer;
- nt_afd_recv_info afd_recv;
+ nt_afd_recv_udp_info afd_recv;
nt_io_status_block siosb;
iosb = iosb ? iosb : &siosb;
+ /* conditional connect */
+ if (raddr && (hssocket->protocol == NT_IPPROTO_UDP)) {
+ afd_recv.raddr = raddr;
+ raddr->addrlen = sizeof(raddr->addr);
+ afd_recv.addr = &raddr->addr;
+ } else
+ raddr = 0;
+
/* tdiflags */
if (tdiflags == 0)
tdiflags = NT_TDI_RECEIVE_NORMAL;
@@ -34,12 +49,12 @@ int32_t __cdecl __ntapi_sc_recv(
afd_buffer.length = len;
afd_buffer.buffer = (char *)buffer;
- /* afd_recv */
- afd_recv.afd_buffer_array = &afd_buffer;
- afd_recv.buffer_count = 1;
+ /* afd_recv.afd_recv */
+ afd_recv.afd_recv.afd_buffer_array = &afd_buffer;
+ afd_recv.afd_recv.buffer_count = 1;
- afd_recv.afd_flags = (uint32_t)afdflags;
- afd_recv.tdi_flags = (uint32_t)tdiflags;
+ afd_recv.afd_recv.afd_flags = (uint32_t)afdflags;
+ afd_recv.afd_recv.tdi_flags = (uint32_t)tdiflags;
hssocket->iostatus = __ntapi->zw_device_io_control_file(
hssocket->hsocket,
@@ -47,9 +62,9 @@ int32_t __cdecl __ntapi_sc_recv(
0,
0,
iosb,
- NT_AFD_IOCTL_RECV,
+ raddr ? NT_AFD_IOCTL_UDP_RECV : NT_AFD_IOCTL_RECV,
&afd_recv,
- sizeof(afd_recv),
+ raddr ? sizeof(afd_recv) : sizeof(afd_recv.afd_recv),
0,
0);