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_sendto(int socket
, const void *message
, size_t length
,
21 int flags
, const struct sockaddr
*dest_addr
, socklen_t dest_len
,
22 nwio_udpopt_t
*udpoptp
);
24 ssize_t
sendto(int socket
, const void *message
, size_t length
, int flags
,
25 const struct sockaddr
*dest_addr
, socklen_t dest_len
)
30 r
= ioctl(socket
, NWIOGUDPOPT
, &udpopt
);
31 if (r
!= -1 || (errno
!= ENOTTY
&& errno
!= EBADIOCTL
))
35 return _udp_sendto(socket
, message
, length
, flags
,
36 dest_addr
, dest_len
, &udpopt
);
40 fprintf(stderr
, "sendto: not implemented for fd %d\n", socket
);
46 static ssize_t
_udp_sendto(int socket
, const void *message
, size_t length
,
47 int flags
, const struct sockaddr
*dest_addr
, socklen_t dest_len
,
48 nwio_udpopt_t
*udpoptp
)
53 struct sockaddr_in
*sinp
;
54 udp_io_hdr_t
*io_hdrp
;
59 fprintf(stderr
, "sendto(udp): flags not implemented\n");
65 if (udpoptp
->nwuo_flags
& NWUO_RWDATONLY
)
66 return write(socket
, message
, length
);
68 if ((udpoptp
->nwuo_flags
& NWUO_RP_ANY
) ||
69 (udpoptp
->nwuo_flags
& NWUO_RA_ANY
))
77 /* Check destination address */
78 if (dest_len
< sizeof(*sinp
))
83 sinp
= (struct sockaddr_in
*)dest_addr
;
84 if (sinp
->sin_family
!= AF_INET
)
91 buflen
= sizeof(*io_hdrp
) + length
;
103 io_hdrp
->uih_src_addr
= 0; /* Unused */
104 io_hdrp
->uih_src_port
= 0; /* Will cause error if NWUO_LP_ANY */
105 if (udpoptp
->nwuo_flags
& NWUO_RA_ANY
)
106 io_hdrp
->uih_dst_addr
= sinp
->sin_addr
.s_addr
;
108 io_hdrp
->uih_dst_addr
= 0;
109 if (udpoptp
->nwuo_flags
& NWUO_RP_ANY
)
110 io_hdrp
->uih_dst_port
= sinp
->sin_port
;
112 io_hdrp
->uih_dst_port
= 0;
113 io_hdrp
->uih_ip_opt_len
= 0;
114 io_hdrp
->uih_data_len
= 0;
116 memcpy(&io_hdrp
[1], message
, length
);
117 r
= write(socket
, buf
, buflen
);