10 #include <sys/socket.h>
11 #include <netinet/in.h>
13 #include <net/gen/in.h>
14 #include <net/gen/udp.h>
15 #include <net/gen/udp_hdr.h>
16 #include <net/gen/udp_io.h>
20 static ssize_t
_udp_recvfrom(int socket
, void *_RESTRICT buffer
, size_t length
,
21 int flags
, struct sockaddr
*_RESTRICT address
,
22 socklen_t
*_RESTRICT address_len
, nwio_udpopt_t
*udpoptp
);
24 ssize_t
recvfrom(int socket
, void *_RESTRICT buffer
, size_t length
,
25 int flags
, struct sockaddr
*_RESTRICT address
,
26 socklen_t
*_RESTRICT address_len
)
31 fprintf(stderr
, "recvfrom: for fd %d\n", socket
);
33 r
= ioctl(socket
, NWIOGUDPOPT
, &udpopt
);
34 if (r
!= -1 || (errno
!= ENOTTY
&& errno
!= EBADIOCTL
))
38 return _udp_recvfrom(socket
, buffer
, length
, flags
,
39 address
, address_len
, &udpopt
);
43 fprintf(stderr
, "recvfrom: not implemented for fd %d\n", socket
);
50 static ssize_t
_udp_recvfrom(int socket
, void *_RESTRICT buffer
, size_t length
,
51 int flags
, struct sockaddr
*_RESTRICT address
,
52 socklen_t
*_RESTRICT address_len
, nwio_udpopt_t
*udpoptp
)
57 struct sockaddr_in
*sinp
;
58 udp_io_hdr_t
*io_hdrp
;
59 struct sockaddr_in sin
;
64 fprintf(stderr
, "recvfrom(udp): flags not implemented\n");
70 if (udpoptp
->nwuo_flags
& NWUO_RWDATONLY
)
74 "recvfrom(udp): NWUO_RWDATONLY not implemented\n");
80 buflen
= sizeof(*io_hdrp
) + length
;
91 r
= read(socket
, buf
, buflen
);
96 fprintf(stderr
, "recvfrom(udp): read failed: %s\n",
98 fprintf(stderr
, "udp opt flags = 0x%x\n", udpoptp
->nwuo_flags
);
105 assert(r
>= sizeof(*io_hdrp
));
106 length
= r
-sizeof(*io_hdrp
);
109 memcpy(buffer
, &io_hdrp
[1], length
);
113 sin
.sin_family
= AF_INET
;
114 sin
.sin_addr
.s_addr
= io_hdrp
->uih_src_addr
;
115 sin
.sin_port
= io_hdrp
->uih_src_port
;
117 if (len
> sizeof(sin
))
119 memcpy(address
, &sin
, len
);
120 *address_len
= sizeof(sin
);