rktio: move udp over to rktio
Still doesn't work...
This commit is contained in:
parent
2b439fc554
commit
93834adc99
|
@ -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
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/*========================================================================*/
|
||||
|
|
Loading…
Reference in New Issue
Block a user