rktio: move udp over to rktio

Still doesn't work...
This commit is contained in:
Matthew Flatt 2017-06-15 17:49:02 -06:00
parent 2b439fc554
commit 93834adc99
6 changed files with 483 additions and 1393 deletions

View File

@ -1892,8 +1892,6 @@ mark_udp_evt {
gcMARK2(uw->udp, gc);
gcMARK2(uw->str, gc);
gcMARK2(uw->dest_addrs, gc);
gcMARK2(uw->dest_addr_lens, gc);
size:
gcBYTES_TO_WORDS(sizeof(Scheme_UDP_Evt));

File diff suppressed because it is too large Load Diff

View File

@ -242,7 +242,9 @@ static void check_read_write_pair(rktio_t *rktio, rktio_fd_t *fd, rktio_fd_t *fd
&& (rktio_get_last_error(rktio) == RKTIO_ERROR_INFO_TRY_AGAIN));
check_valid(r);
amt = r->len;
free(r->addr);
free(r->address[0]);
free(r->address[1]);
free(r->address);
free(r);
} else
amt = rktio_read(rktio, fd, buffer, sizeof(buffer));
@ -727,15 +729,15 @@ int main(int argc, char **argv)
intf_addr = lookup_loop(rktio, "localhost", 0, -1, 1, 0);
check_valid(intf_addr);
fd = rktio_udp_open(rktio, intf_addr);
fd = rktio_udp_open(rktio, intf_addr, RKTIO_FAMILY_ANY);
check_valid(fd);
addr = lookup_loop(rktio, NULL, 4536, -1, 1, 0);
check_valid(addr);
check_valid(rktio_udp_bind(rktio, fd, addr));
check_valid(rktio_udp_bind(rktio, fd, addr, 1));
rktio_addrinfo_free(rktio, addr);
fd2 = rktio_udp_open(rktio, intf_addr);
fd2 = rktio_udp_open(rktio, intf_addr, RKTIO_FAMILY_ANY);
check_valid(fd2);
addr = lookup_loop(rktio, "localhost", 4536, -1, 0, 0);
@ -747,13 +749,13 @@ int main(int argc, char **argv)
/* Again, this time to fill & drain: */
fd = rktio_udp_open(rktio, intf_addr);
fd = rktio_udp_open(rktio, intf_addr, RKTIO_FAMILY_ANY);
fd2 = rktio_udp_open(rktio, intf_addr);
fd2 = rktio_udp_open(rktio, intf_addr, RKTIO_FAMILY_ANY);
check_valid(fd2);
addr = lookup_loop(rktio, NULL, 4536, -1, 1, 0);
check_valid(addr);
check_valid(rktio_udp_bind(rktio, fd, addr));
check_valid(rktio_udp_bind(rktio, fd, addr, 1));
rktio_addrinfo_free(rktio, addr);
addr = lookup_loop(rktio, "localhost", 4536, -1, 0, 0);

View File

@ -251,26 +251,37 @@ RKTIO_EXTERN int rktio_socket_shutdown(rktio_t *rktio, rktio_fd_t *rfd, int mode
#define RKTIO_SHUTDOWN_READ 0
#define RKTIO_SHUTDOWN_WRITE 1
RKTIO_EXTERN rktio_fd_t *rktio_udp_open(rktio_t *rktio, rktio_addrinfo_t *addr);
RKTIO_EXTERN int rktio_udp_disconnect(rktio_t *rktio, rktio_fd_t *rfd);
RKTIO_EXTERN int rktio_udp_bind(rktio_t *rktio, rktio_fd_t *rfd, rktio_addrinfo_t *addr);
RKTIO_EXTERN int rktio_udp_connect(rktio_t *rktio, rktio_fd_t *rfd, rktio_addrinfo_t *addr);
RKTIO_EXTERN rktio_fd_t *rktio_udp_open(rktio_t *rktio, rktio_addrinfo_t *addr, int family);
/* The `addr` argument can be NULL to create a socket without
specifying an interface, and `family` is used only if `addr` is not
specified. */
RKTIO_EXTERN rktio_ok_t rktio_udp_disconnect(rktio_t *rktio, rktio_fd_t *rfd);
RKTIO_EXTERN rktio_ok_t rktio_udp_bind(rktio_t *rktio, rktio_fd_t *rfd, rktio_addrinfo_t *addr,
rktio_bool_t reuse);
RKTIO_EXTERN rktio_ok_t rktio_udp_connect(rktio_t *rktio, rktio_fd_t *rfd, rktio_addrinfo_t *addr);
RKTIO_EXTERN intptr_t rktio_udp_sendto(rktio_t *rktio, rktio_fd_t *rfd, rktio_addrinfo_t *addr,
char *buffer, intptr_t len);
/* Extends `rktio_write` to accept a destination `addr`, and binds `rfd` if it
is not bound aready. The `addr` can be NULL if the socket is connected. */
typedef struct rktio_length_and_addrinfo_t {
intptr_t len;
rktio_addrinfo_t *addr;
char **address; /* like the result of `rktio_socket_address` */
} rktio_length_and_addrinfo_t;
RKTIO_EXTERN rktio_length_and_addrinfo_t *rktio_udp_recvfrom(rktio_t *rktio, rktio_fd_t *rfd, char *buffer, intptr_t len);
RKTIO_EXTERN rktio_length_and_addrinfo_t *rktio_udp_recvfrom(rktio_t *rktio, rktio_fd_t *rfd,
char *buffer, intptr_t len);
/* Extend `rktio_read` to report the sender. If the reported error can
be `RKTIO_ERROR_TRY_AGAIN` or `RKTIO_ERROR_INFO_TRY_AGAIN`, where
the latter can happen if the sock claims to be ready to read. */
/* The following accessors return `RKTIO_PROP_ERROR` on failure */
RKTIO_EXTERN int rktio_udp_get_multicast_loopback(rktio_t *rktio, rktio_fd_t *rfd);
RKTIO_EXTERN int rktio_udp_set_multicast_loopback(rktio_t *rktio, rktio_fd_t *rfd, int on);
RKTIO_EXTERN int rktio_udp_get_multicast_ttl(rktio_t *rktio, rktio_fd_t *rfd);
RKTIO_EXTERN int rktio_udp_set_multicast_ttl(rktio_t *rktio, rktio_fd_t *rfd, int ttl_val);
RKTIO_EXTERN rktio_tri_t rktio_udp_get_multicast_loopback(rktio_t *rktio, rktio_fd_t *rfd);
RKTIO_EXTERN rktio_ok_t rktio_udp_set_multicast_loopback(rktio_t *rktio, rktio_fd_t *rfd, rktio_bool_t on);
RKTIO_EXTERN rktio_tri_t rktio_udp_get_multicast_ttl(rktio_t *rktio, rktio_fd_t *rfd);
RKTIO_EXTERN rktio_ok_t rktio_udp_set_multicast_ttl(rktio_t *rktio, rktio_fd_t *rfd, int ttl_val);
#define RKTIO_PROP_ERROR (-2)
@ -278,15 +289,15 @@ RKTIO_EXTERN char **rktio_socket_address(rktio_t *rktio, rktio_fd_t *rfd);
RKTIO_EXTERN char **rktio_socket_peer_address(rktio_t *rktio, rktio_fd_t *rfd);
RKTIO_EXTERN char **rktio_listener_address(rktio_t *rktio, rktio_listener_t *lnr);
/* These return two strings in an array (where the array itself should
be deallocated), address and service. */
be deallocated): address and service. */
RKTIO_EXTERN char *rktio_udp_multicast_interface(rktio_t *rktio, rktio_fd_t *rfd);
RKTIO_EXTERN int rktio_udp_set_multicast_interface(rktio_t *rktio, rktio_fd_t *rfd, rktio_addrinfo_t *addr);
RKTIO_EXTERN rktio_ok_t rktio_udp_set_multicast_interface(rktio_t *rktio, rktio_fd_t *rfd, rktio_addrinfo_t *addr);
RKTIO_EXTERN int rktio_udp_change_multicast_group(rktio_t *rktio, rktio_fd_t *rfd,
rktio_addrinfo_t *group_addr,
rktio_addrinfo_t *intf_addr,
int action);
RKTIO_EXTERN rktio_ok_t rktio_udp_change_multicast_group(rktio_t *rktio, rktio_fd_t *rfd,
rktio_addrinfo_t *group_addr,
rktio_addrinfo_t *intf_addr,
int action);
/* `action` values: */
enum {
RKTIO_ADD_MEMBERSHIP,

View File

@ -1051,7 +1051,7 @@ static intptr_t do_socket_write(rktio_t *rktio, rktio_fd_t *rfd, char *buffer, i
while (1) {
if (addr) {
/* Use first address that isn't a bad address: */
/* Use first address that dosn't result in a bad-address error: */
for (; addr; addr = (rktio_addrinfo_t *)RKTIO_AS_ADDRINFO(addr)->ai_next) {
do {
sent = sendto(s, buffer, len, 0,
@ -1668,7 +1668,7 @@ char **rktio_listener_address(rktio_t *rktio, rktio_listener_t *lnr)
/* UDP */
/*========================================================================*/
rktio_fd_t *rktio_udp_open(rktio_t *rktio, rktio_addrinfo_t *addr)
rktio_fd_t *rktio_udp_open(rktio_t *rktio, rktio_addrinfo_t *addr, int family)
{
rktio_socket_t s;
@ -1676,9 +1676,8 @@ rktio_fd_t *rktio_udp_open(rktio_t *rktio, rktio_addrinfo_t *addr)
s = socket(RKTIO_AS_ADDRINFO(addr)->ai_family,
RKTIO_AS_ADDRINFO(addr)->ai_socktype,
RKTIO_AS_ADDRINFO(addr)->ai_protocol);
else
s = socket(RKTIO_PF_INET, SOCK_DGRAM, 0);
s = socket(family, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET) {
get_socket_error();
@ -1741,11 +1740,19 @@ int rktio_udp_disconnect(rktio_t *rktio, rktio_fd_t *rfd)
return 1;
}
int rktio_udp_bind(rktio_t *rktio, rktio_fd_t *rfd, rktio_addrinfo_t *addr)
int rktio_udp_bind(rktio_t *rktio, rktio_fd_t *rfd, rktio_addrinfo_t *addr, rktio_bool_t reuse)
{
rktio_socket_t s = rktio_fd_system_fd(rktio, rfd);
int err;
if (reuse) {
int one = 1;
if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *) &one, sizeof(one))) {
get_socket_error();
return 0;
}
}
/* bind using first address that works: */
for (; addr; addr = (rktio_addrinfo_t *)RKTIO_AS_ADDRINFO(addr)->ai_next) {
err = bind(s, RKTIO_AS_ADDRINFO(addr)->ai_addr, RKTIO_AS_ADDRINFO(addr)->ai_addrlen);
@ -1826,9 +1833,7 @@ rktio_length_and_addrinfo_t *rktio_udp_recvfrom(rktio_t *rktio, rktio_fd_t *rfd,
r = malloc(sizeof(rktio_length_and_addrinfo_t));
r->len = rn;
r->addr = malloc(asize);
memcpy(r->addr, src_addr, asize);
r->address = get_numeric_strings(rktio, src_addr, asize);
return r;
}

View File

@ -1231,8 +1231,9 @@ int rktio_process_allowed_flags(rktio_t *rktio)
| RKTIO_PROCESS_STDOUT_AS_STDERR);
#ifdef RKTIO_SYSTEM_WINDOWS
flags |= (RKTIO_PROCESS_WINDOWS_EXACT_CMDLINE
| RKTIO_PROCESS_WINDOWS_CHAIN_TERMINATION)
| RKTIO_PROCESS_WINDOWS_CHAIN_TERMINATION);
#endif
return flags;
}
/*========================================================================*/