rktio: repairs
Compiles ons MacOS, but doesn't quite link.
This commit is contained in:
parent
93834adc99
commit
f0a644990c
|
@ -307,7 +307,7 @@ typedef struct Thread_Local_Variables {
|
|||
int special_is_ok_;
|
||||
int scheme_force_port_closed_;
|
||||
int fd_reserved_;
|
||||
int the_fd_;
|
||||
struct rktio_fd_t *the_fd_;
|
||||
int scheme_num_read_syntax_objects_;
|
||||
struct Scheme_Load_Delay *clear_bytes_chain_;
|
||||
const char *failure_msg_for_read_;
|
||||
|
|
|
@ -381,10 +381,10 @@ list.@LTO@: $(COMMON_HEADERS) \
|
|||
marshal.@LTO@: $(COMMON_HEADERS) \
|
||||
$(srcdir)/stypes.h
|
||||
module.@LTO@: $(COMMON_HEADERS) \
|
||||
$(srcdir)/stypes.h $(srcdir)/schfd.h
|
||||
$(srcdir)/stypes.h
|
||||
mzrt.@LTO@: $(COMMON_HEADERS)
|
||||
network.@LTO@: $(COMMON_HEADERS) \
|
||||
$(srcdir)/stypes.h $(srcdir)/schfd.h $(srcdir)/mzmark_network.inc
|
||||
network.@LTO@: $(COMMON_HEADERS) $(RKTIO_HEADERS) \
|
||||
$(srcdir)/stypes.h $(srcdir)/mzmark_network.inc
|
||||
numarith.@LTO@: $(COMMON_HEADERS) \
|
||||
$(srcdir)/stypes.h $(srcdir)/nummacs.h
|
||||
number.@LTO@: $(COMMON_HEADERS) \
|
||||
|
@ -397,17 +397,16 @@ numstr.@LTO@: $(COMMON_HEADERS) \
|
|||
optimize.@LTO@: $(COMMON_HEADERS) \
|
||||
$(srcdir)/stypes.h $(srcdir)/mzmark_optimize.inc
|
||||
place.@LTO@: $(COMMON_HEADERS) \
|
||||
$(srcdir)/stypes.h $(srcdir)/schfd.h $(srcdir)/mzmark_place.inc
|
||||
$(srcdir)/stypes.h $(srcdir)/mzmark_place.inc
|
||||
port.@LTO@: $(COMMON_HEADERS) $(RKTIO_HEADERS) \
|
||||
$(srcdir)/stypes.h $(srcdir)/schfd.h $(srcdir)/mzmark_port.inc \
|
||||
$(srcdir)/inotify.inc
|
||||
$(srcdir)/stypes.h $(srcdir)/mzmark_port.inc
|
||||
portfun.@LTO@: $(COMMON_HEADERS) $(srcdir)/schvers.h \
|
||||
$(srcdir)/stypes.h $(srcdir)/schfd.h $(srcdir)/mzmark_portfun.inc
|
||||
$(srcdir)/stypes.h $(srcdir)/mzmark_portfun.inc
|
||||
print.@LTO@: $(COMMON_HEADERS) $(srcdir)/stypes.h $(srcdir)/schcpt.h \
|
||||
$(srcdir)/schvers.h $(SCONFIG) $(srcdir)/mzmark_print.inc \
|
||||
$(srcdir)/print_vector.inc
|
||||
thread.@LTO@: $(COMMON_HEADERS) \
|
||||
$(srcdir)/stypes.h $(srcdir)/schfd.h $(srcdir)/mzmark_thread.inc
|
||||
thread.@LTO@: $(COMMON_HEADERS) $(RKTIO_HEADERS) \
|
||||
$(srcdir)/stypes.h $(srcdir)/mzmark_thread.inc
|
||||
rational.@LTO@: $(COMMON_HEADERS) \
|
||||
$(srcdir)/stypes.h
|
||||
read.@LTO@: $(COMMON_HEADERS) \
|
||||
|
@ -428,7 +427,7 @@ string.@LTO@: $(COMMON_HEADERS) $(RKTIO_HEADERS) \
|
|||
struct.@LTO@: $(COMMON_HEADERS) \
|
||||
$(srcdir)/stypes.h $(srcdir)/mzmark_struct.inc
|
||||
syntax.@LTO@: $(COMMON_HEADERS) \
|
||||
$(srcdir)/stypes.h $(srcdir)/schfd.h $(srcdir)/mzmark_syntax.inc
|
||||
$(srcdir)/stypes.h $(srcdir)/mzmark_syntax.inc
|
||||
symbol.@LTO@: $(COMMON_HEADERS) \
|
||||
$(srcdir)/stypes.h
|
||||
sema.@LTO@: $(COMMON_HEADERS) \
|
||||
|
|
|
@ -29,9 +29,6 @@
|
|||
#include "schrktio.h"
|
||||
#include <ctype.h>
|
||||
|
||||
#ifndef NO_TCP_SUPPORT
|
||||
#ifdef USE_TCP
|
||||
|
||||
#define TCP_BUFFER_SIZE 4096
|
||||
|
||||
typedef struct {
|
||||
|
@ -179,7 +176,11 @@ void scheme_init_network(Scheme_Env *env)
|
|||
scheme_finish_primitive_module(netenv);
|
||||
}
|
||||
|
||||
static int check_fd_sema(rktio_fd_t s, int mode, Scheme_Schedule_Info *sinfo, Scheme_Object *orig)
|
||||
static int check_fd_sema(rktio_fd_t *s, int mode, Scheme_Schedule_Info *sinfo, Scheme_Object *orig)
|
||||
/* Tries to convert a file descriptor to a semaphore, and redirects
|
||||
the sync to the semaphore if that works, which avoids a poll spin
|
||||
on the file descriptor. The result is 0 if the shortcut determines
|
||||
that the file descriptor is not ready. */
|
||||
{
|
||||
Scheme_Object *sema;
|
||||
|
||||
|
@ -215,7 +216,6 @@ static int check_fd_sema(rktio_fd_t s, int mode, Scheme_Schedule_Info *sinfo, Sc
|
|||
static int tcp_check_accept(Scheme_Object *_listener, Scheme_Schedule_Info *sinfo)
|
||||
{
|
||||
listener_t *listener = (listener_t *)_listener;
|
||||
int sr, i;
|
||||
|
||||
if (!sinfo || !sinfo->is_poll) {
|
||||
/* If listeners supported semaphores, we could have a check here
|
||||
|
@ -229,14 +229,8 @@ static int tcp_check_accept(Scheme_Object *_listener, Scheme_Schedule_Info *sinf
|
|||
if (rktio_poll_accept_ready(scheme_rktio, listener->lnr))
|
||||
return 1;
|
||||
|
||||
if (sinfo && !sinfo->no_redirect) {
|
||||
Scheme_Object *evt;
|
||||
evt = listener_to_evt(listener);
|
||||
if (evt)
|
||||
scheme_set_sync_target(sinfo, evt, _listener, NULL, 0, 1, NULL);
|
||||
} else {
|
||||
/* CREATE_LISTEN_SEMA: This is where we'd create a semaphore for the listener, if that were possible */
|
||||
}
|
||||
/* CREATE_LISTEN_SEMA: This is where we'd create a semaphore for the
|
||||
listener, if that were possible */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -291,7 +285,7 @@ static int tcp_check_write(Scheme_Object *port, Scheme_Schedule_Info *sinfo)
|
|||
|
||||
static void tcp_write_needs_wakeup(Scheme_Object *port, void *fds)
|
||||
{
|
||||
rktio_fd_t s = ((Scheme_Tcp *)((Scheme_Output_Port *)port)->port_data)->tcp;
|
||||
rktio_fd_t *s = ((Scheme_Tcp *)((Scheme_Output_Port *)port)->port_data)->tcp;
|
||||
|
||||
rktio_poll_add(scheme_rktio, s, fds, RKTIO_POLL_WRITE);
|
||||
}
|
||||
|
@ -353,7 +347,6 @@ static intptr_t tcp_get_string(Scheme_Input_Port *port,
|
|||
int nonblock,
|
||||
Scheme_Object *unless)
|
||||
{
|
||||
int errid;
|
||||
int read_amt;
|
||||
Scheme_Tcp *data;
|
||||
Scheme_Object *sema;
|
||||
|
@ -395,7 +388,7 @@ static intptr_t tcp_get_string(Scheme_Input_Port *port,
|
|||
|
||||
{
|
||||
int rn;
|
||||
rn = rktio_read(scheme_rktio, data->tcp, data->b.buffer, read_amt, 0);
|
||||
rn = rktio_read(scheme_rktio, data->tcp, data->b.buffer, read_amt);
|
||||
data->b.bufmax = rn; /* could be count, error, or EOF */
|
||||
}
|
||||
|
||||
|
@ -408,7 +401,7 @@ static intptr_t tcp_get_string(Scheme_Input_Port *port,
|
|||
return 0;
|
||||
|
||||
/* block until data is (probably) available */
|
||||
sema = scheme_rktio_fd_to_semaphore(data->tcp, MZFD_CREATE_READ, 1);
|
||||
sema = scheme_rktio_fd_to_semaphore(data->tcp, MZFD_CREATE_READ);
|
||||
if (sema)
|
||||
scheme_wait_sema(sema, nonblock ? -1 : 0);
|
||||
else
|
||||
|
@ -428,8 +421,7 @@ static intptr_t tcp_get_string(Scheme_Input_Port *port,
|
|||
data->b.bufmax = 0;
|
||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||
"tcp-read: error reading\n"
|
||||
" system error: %R",
|
||||
errid);
|
||||
" system error: %R");
|
||||
return 0;
|
||||
} else if (data->b.bufmax == RKTIO_READ_ERROR) {
|
||||
data->b.bufmax = 0;
|
||||
|
@ -468,9 +460,9 @@ static void tcp_close_input(Scheme_Input_Port *port)
|
|||
if (--data->b.refcount)
|
||||
return;
|
||||
|
||||
(void)scheme_rktio_fd_to_semaphore(data->tcp, MZFD_REMOVE, 1);
|
||||
(void)scheme_rktio_fd_to_semaphore(data->tcp, MZFD_REMOVE);
|
||||
|
||||
rktio_close(data->tcp);
|
||||
rktio_close(scheme_rktio, data->tcp);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -499,7 +491,7 @@ static intptr_t tcp_do_write_string(Scheme_Output_Port *port,
|
|||
can be flushed immediately, never ever blocking. */
|
||||
|
||||
Scheme_Tcp *data;
|
||||
int errid, would_block = 0;
|
||||
int would_block = 0;
|
||||
intptr_t sent;
|
||||
|
||||
data = (Scheme_Tcp *)port->port_data;
|
||||
|
@ -525,7 +517,7 @@ static intptr_t tcp_do_write_string(Scheme_Output_Port *port,
|
|||
/* Block for writing: */
|
||||
{
|
||||
Scheme_Object *sema;
|
||||
sema = scheme_rktio_fd_to_semaphore(data->tcp, MZFD_CREATE_WRITE, 1);
|
||||
sema = scheme_rktio_fd_to_semaphore(data->tcp, MZFD_CREATE_WRITE);
|
||||
if (sema)
|
||||
scheme_wait_sema(sema, enable_break ? -1 : 0);
|
||||
else
|
||||
|
@ -641,9 +633,9 @@ static void tcp_close_output(Scheme_Output_Port *port)
|
|||
if (--data->b.refcount)
|
||||
return;
|
||||
|
||||
(void)scheme_rktio_fd_to_semaphore(data->tcp, MZFD_REMOVE, 1);
|
||||
(void)scheme_rktio_fd_to_semaphore(data->tcp, MZFD_REMOVE);
|
||||
|
||||
rktio_close(data->tcp);
|
||||
rktio_close(scheme_rktio, data->tcp);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -732,20 +724,23 @@ make_tcp_output_port(void *data, const char *name, Scheme_Object *cust)
|
|||
|
||||
/* Various things to free if we ever give up on a connect: */
|
||||
typedef struct Connect_Progress_Data {
|
||||
rktio_lookup_t *lookup;
|
||||
rktio_addrinfo_lookup_t *lookup;
|
||||
rktio_connect_t *connect;
|
||||
rktio_addrinfo_t *dest_addr;
|
||||
rktio_addrinfo_t *src_addr;
|
||||
rktio_fd_t *trying_s;
|
||||
rktio_fd_t *s;
|
||||
} Connect_Progress_Data;
|
||||
|
||||
static Connect_Progress_Data *make_conect_progress_data()
|
||||
static Connect_Progress_Data *make_connect_progress_data()
|
||||
{
|
||||
Connect_Progress_Data *pd;
|
||||
|
||||
MALLOC_ONE_ATOMIC(Connect_Progress_Data);
|
||||
pd = MALLOC_ONE_ATOMIC(Connect_Progress_Data);
|
||||
pd->lookup = NULL;
|
||||
pd->connect = NULL;
|
||||
pd->dest_addr = NULL;
|
||||
pd->src_addr = NULL;
|
||||
pd->s = NULL;
|
||||
|
||||
return pd;
|
||||
|
@ -758,7 +753,7 @@ static void connect_cleanup(Connect_Progress_Data *pd)
|
|||
pd->lookup = NULL;
|
||||
}
|
||||
if (pd->connect) {
|
||||
rktio_connect_stop(rktio, pd->connect);
|
||||
rktio_connect_stop(scheme_rktio, pd->connect);
|
||||
pd->connect = NULL;
|
||||
}
|
||||
if (pd->dest_addr) {
|
||||
|
@ -769,9 +764,13 @@ static void connect_cleanup(Connect_Progress_Data *pd)
|
|||
rktio_addrinfo_free(scheme_rktio, pd->src_addr);
|
||||
pd->src_addr = NULL;
|
||||
}
|
||||
if (pd->trying_s) {
|
||||
(void)scheme_rktio_fd_to_semaphore(pd->trying_s, MZFD_REMOVE);
|
||||
pd->trying_s = NULL;
|
||||
}
|
||||
if (pd->s) {
|
||||
(void)scheme_rktio_fd_to_semaphore(s, MZFD_REMOVE, 1);
|
||||
rktio_close(s);
|
||||
(void)scheme_rktio_fd_to_semaphore(pd->s, MZFD_REMOVE);
|
||||
rktio_close(scheme_rktio, pd->s);
|
||||
pd->s = NULL;
|
||||
}
|
||||
}
|
||||
|
@ -784,14 +783,15 @@ static int check_lookup(Connect_Progress_Data *pd, Scheme_Schedule_Info *sinfo)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void lookup_needs_wakeup(Connect_Progress_Data *pd, void *fds)
|
||||
static void lookup_needs_wakeup(Scheme_Object *_pd, void *fds)
|
||||
{
|
||||
Connect_Progress_Data *pd = (Connect_Progress_Data *)_pd;
|
||||
rktio_poll_add_addrinfo_lookup(scheme_rktio, pd->lookup, fds);
|
||||
}
|
||||
|
||||
static void wait_until_lookup(Connect_Progress_Data *pd)
|
||||
{
|
||||
while (!rktio_poll_addrinfo_lookup_ready(scheme_rktio, lookup)) {
|
||||
while (!rktio_poll_addrinfo_lookup_ready(scheme_rktio, pd->lookup)) {
|
||||
BEGIN_ESCAPEABLE(connect_cleanup, pd);
|
||||
scheme_block_until((Scheme_Ready_Fun)check_lookup,
|
||||
lookup_needs_wakeup,
|
||||
|
@ -804,7 +804,7 @@ static void wait_until_lookup(Connect_Progress_Data *pd)
|
|||
static rktio_addrinfo_t *do_resolve_address(const char *who, char *address, int id, int family, int show_id_on_error)
|
||||
{
|
||||
Connect_Progress_Data *pd;
|
||||
rktio_lookup_t *loopkup;
|
||||
rktio_addrinfo_lookup_t *lookup;
|
||||
rktio_addrinfo_t *addr;
|
||||
|
||||
pd = make_connect_progress_data();
|
||||
|
@ -855,7 +855,7 @@ const char *scheme_hostname_error(int err)
|
|||
/* TCP Racket interface */
|
||||
/*========================================================================*/
|
||||
|
||||
static void connect_failed(Connect_Progress_Data *pd, const char *why, char *address, int id)
|
||||
static void connect_failed(Connect_Progress_Data *pd, const char *why, const char *address, int id)
|
||||
{
|
||||
if (pd) connect_cleanup(pd);
|
||||
|
||||
|
@ -871,37 +871,42 @@ static void connect_failed(Connect_Progress_Data *pd, const char *why, char *add
|
|||
|
||||
static int tcp_check_connect(Connect_Progress_Data *pd, Scheme_Schedule_Info *sinfo)
|
||||
{
|
||||
|
||||
rktio_fd_t *s = (rktio_fd_t *)connector_p;
|
||||
|
||||
if (!pd->trying_s) {
|
||||
rktio_fd_t *s;
|
||||
s = rktio_connect_trying(scheme_rktio, pd->connect);
|
||||
pd->trying_s = s;
|
||||
}
|
||||
|
||||
if (!sinfo || !sinfo->is_poll) {
|
||||
if (!check_fd_sema(s, MZFD_CHECK_WRITE, sinfo, NULL))
|
||||
return 0;
|
||||
if (pd->trying_s)
|
||||
if (!check_fd_sema(pd->trying_s, MZFD_CHECK_WRITE, sinfo, NULL))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (rktio_poll_connect_ready(scheme->rktio, s))
|
||||
if (rktio_poll_connect_ready(scheme_rktio, pd->connect))
|
||||
return 1;
|
||||
|
||||
check_fd_sema(s, MZFD_CREATE_WRITE, sinfo, NULL);
|
||||
if (pd->trying_s)
|
||||
check_fd_sema(pd->trying_s, MZFD_CREATE_WRITE, sinfo, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tcp_connect_needs_wakeup(Scheme_Object *connector_p, void *fds)
|
||||
static void tcp_connect_needs_wakeup(Scheme_Object *_pd, void *fds)
|
||||
{
|
||||
rktio_fd_t *s = (rktio_fd_t *)connector_p;
|
||||
rktio_poll_add_connect(scheme_rktio, s, fds);
|
||||
Connect_Progress_Data *pd = (Connect_Progress_Data *)_pd;
|
||||
rktio_poll_add_connect(scheme_rktio, pd->connect, fds);
|
||||
}
|
||||
|
||||
static Scheme_Object *tcp_connect(int argc, Scheme_Object *argv[])
|
||||
{
|
||||
Connect_Progress_Data *pd;
|
||||
char *address = "", *src_address, *errmsg = NULL;
|
||||
char *address = "", *src_address;
|
||||
unsigned short id, src_id;
|
||||
int no_local_spec;
|
||||
Scheme_Object *bs, *src_bs;
|
||||
rktio_addrinfo_t *tcp_address_dest, *tcp_address_src;
|
||||
rktio_lookup_t *lookup;
|
||||
rktio_addrinfo_t *tcp_connect_dest, *tcp_connect_src;
|
||||
rktio_addrinfo_lookup_t *lookup;
|
||||
rktio_connect_t *connect;
|
||||
rktio_fd_t *s;
|
||||
|
||||
|
@ -948,7 +953,7 @@ static Scheme_Object *tcp_connect(int argc, Scheme_Object *argv[])
|
|||
|
||||
pd = make_connect_progress_data();
|
||||
|
||||
lookup = rktio_start_addrinfo_lookup(scheme_rktio, address, id, RKTIO_FAMILTY_ANY, 0, 1);
|
||||
lookup = rktio_start_addrinfo_lookup(scheme_rktio, address, id, RKTIO_FAMILY_ANY, 0, 1);
|
||||
if (!lookup)
|
||||
connect_failed(pd, "host not found", address, id);
|
||||
|
||||
|
@ -963,7 +968,7 @@ static Scheme_Object *tcp_connect(int argc, Scheme_Object *argv[])
|
|||
pd->dest_addr = tcp_connect_dest;
|
||||
|
||||
if (!no_local_spec) {
|
||||
lookup = rktio_start_addrinfo_lookup(scheme_rktio, src_address, src_id, RKTIO_FAMILTY_ANY, 1, 1);
|
||||
lookup = rktio_start_addrinfo_lookup(scheme_rktio, src_address, src_id, RKTIO_FAMILY_ANY, 1, 1);
|
||||
if (!lookup)
|
||||
connect_failed(pd, "local host not found", src_address, src_id);
|
||||
|
||||
|
@ -971,22 +976,15 @@ static Scheme_Object *tcp_connect(int argc, Scheme_Object *argv[])
|
|||
wait_until_lookup(pd);
|
||||
pd->lookup = NULL;
|
||||
|
||||
tcp_connect_dest = rktio_addrinfo_lookup_get(scheme_rktio, lookup);
|
||||
if (!tcp_connect_dest)
|
||||
connect_failed(pd, "local host not found", src_address, src_id);
|
||||
|
||||
pd->lookup = lookup;
|
||||
wait_until_lookup(pd);
|
||||
pd->lookup = NULL;
|
||||
|
||||
tcp_connect_src = rktio_addrinfo_lookup_get(scheme_rktio, lookup);
|
||||
if (!tcp_connect_src)
|
||||
connect_failed(pd, "local host not found", src_address, src_id);
|
||||
}
|
||||
} else
|
||||
tcp_connect_src = NULL;
|
||||
|
||||
pd->src_addr = tcp_connect_src;
|
||||
|
||||
connect = rktio_start_connect(racket_rktio, tcp_connect_dest, tcp_connect_src);
|
||||
connect = rktio_start_connect(scheme_rktio, tcp_connect_dest, tcp_connect_src);
|
||||
if (!connect)
|
||||
connect_failed(pd, NULL, address, id);
|
||||
|
||||
|
@ -1002,7 +1000,10 @@ static Scheme_Object *tcp_connect(int argc, Scheme_Object *argv[])
|
|||
END_ESCAPEABLE();
|
||||
}
|
||||
|
||||
s = rktio_connect_finish(rktio_rktio, connect);
|
||||
if (pd->trying_s)
|
||||
(void)scheme_rktio_fd_to_semaphore(pd->trying_s, MZFD_REMOVE);
|
||||
|
||||
s = rktio_connect_finish(scheme_rktio, connect);
|
||||
|
||||
if (!s && scheme_last_error_is_racket(RKTIO_ERROR_CONNECT_TRYING_NEXT)) {
|
||||
/* try again */
|
||||
|
@ -1013,7 +1014,7 @@ static Scheme_Object *tcp_connect(int argc, Scheme_Object *argv[])
|
|||
pd->connect = NULL;
|
||||
|
||||
if (!s)
|
||||
connect_failed(s, NULL, address, id);
|
||||
connect_failed(pd, NULL, address, id);
|
||||
|
||||
connect_cleanup(pd);
|
||||
|
||||
|
@ -1022,7 +1023,7 @@ static Scheme_Object *tcp_connect(int argc, Scheme_Object *argv[])
|
|||
Scheme_Tcp *tcp;
|
||||
|
||||
if (tcp_connect_src)
|
||||
rktio_addrinfo_free(tcp_connect_src);
|
||||
rktio_addrinfo_free(scheme_rktio, tcp_connect_src);
|
||||
|
||||
tcp = make_tcp_port_data(s, 2);
|
||||
|
||||
|
@ -1039,7 +1040,7 @@ tcp_connect_break(int argc, Scheme_Object *argv[])
|
|||
return scheme_call_enable_break(tcp_connect, argc, argv);
|
||||
}
|
||||
|
||||
static void listen_failed(Connect_Progress_Data *pd, const char *why, char *address, int id)
|
||||
static void listen_failed(Connect_Progress_Data *pd, const char *why, const char *address, int id)
|
||||
{
|
||||
if (pd) connect_cleanup(pd);
|
||||
|
||||
|
@ -1060,11 +1061,11 @@ static Scheme_Object *
|
|||
tcp_listen(int argc, Scheme_Object *argv[])
|
||||
{
|
||||
unsigned short id;
|
||||
int backlog, errid;
|
||||
int backlog;
|
||||
int reuse = 0, no_ipv6 = 0;
|
||||
const char *address;
|
||||
Connect_Progress_Data *pd;
|
||||
rktio_lookup_t *lookup;
|
||||
rktio_addrinfo_lookup_t *lookup;
|
||||
rktio_addrinfo_t *tcp_src;
|
||||
rktio_listener_t *lnr;
|
||||
listener_t *l;
|
||||
|
@ -1098,7 +1099,7 @@ tcp_listen(int argc, Scheme_Object *argv[])
|
|||
} else
|
||||
address = NULL;
|
||||
|
||||
scheme_security_check_network("tcp-listen", address, origid, 0);
|
||||
scheme_security_check_network("tcp-listen", address, id, 0);
|
||||
scheme_custodian_check_available(NULL, "tcp-listen", "network");
|
||||
|
||||
pd = make_connect_progress_data();
|
||||
|
@ -1109,7 +1110,7 @@ tcp_listen(int argc, Scheme_Object *argv[])
|
|||
if (no_ipv6)
|
||||
family = rktio_get_ipv4_family(scheme_rktio);
|
||||
else
|
||||
family = RKTIO_FAMILTY_ANY;
|
||||
family = RKTIO_FAMILY_ANY;
|
||||
|
||||
lookup = rktio_start_addrinfo_lookup(scheme_rktio, address, id, family, 1, 1);
|
||||
if (!lookup)
|
||||
|
@ -1121,10 +1122,10 @@ tcp_listen(int argc, Scheme_Object *argv[])
|
|||
|
||||
tcp_src = rktio_addrinfo_lookup_get(scheme_rktio, lookup);
|
||||
if (!tcp_src)
|
||||
connect_failed(pd, "address-resolution error", address, id);
|
||||
listen_failed(pd, "address-resolution error", address, id);
|
||||
|
||||
pd->src_addr = tcp_src;
|
||||
lnr = rktio_listen(rktio, tcp_src, backlog, reuse);
|
||||
lnr = rktio_listen(scheme_rktio, tcp_src, backlog, reuse);
|
||||
|
||||
pd->src_addr = NULL;
|
||||
rktio_addrinfo_free(scheme_rktio, tcp_src);
|
||||
|
@ -1166,8 +1167,6 @@ tcp_stop(int argc, Scheme_Object *argv[])
|
|||
if (!SAME_TYPE(SCHEME_TYPE(argv[0]), scheme_listener_type))
|
||||
scheme_wrong_contract("tcp-close", "tcp-listener?", 0, argc, argv);
|
||||
|
||||
TCP_INIT("tcp-close");
|
||||
|
||||
was_closed = stop_listener(argv[0]);
|
||||
|
||||
if (was_closed) {
|
||||
|
@ -1187,8 +1186,6 @@ tcp_accept_ready(int argc, Scheme_Object *argv[])
|
|||
if (!SAME_TYPE(SCHEME_TYPE(argv[0]), scheme_listener_type))
|
||||
scheme_wrong_contract("tcp-accept-ready?", "tcp-listener?", 0, argc, argv);
|
||||
|
||||
TCP_INIT("tcp-accept-ready?");
|
||||
|
||||
if (LISTENER_WAS_CLOSED(argv[0])) {
|
||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||
"tcp-accept-ready?: listener is closed");
|
||||
|
@ -1205,11 +1202,9 @@ do_tcp_accept(int argc, Scheme_Object *argv[], Scheme_Object *cust, char **_fail
|
|||
/* If _fail_reason is not NULL, never raise an exception. */
|
||||
{
|
||||
#ifdef USE_TCP
|
||||
int was_closed = 0, errid, ready_pos;
|
||||
int was_closed = 0, ready_pos;
|
||||
Scheme_Object *listener;
|
||||
rktio_fd_t *s;
|
||||
unsigned int l;
|
||||
GC_CAN_IGNORE char tcp_accept_addr[MZ_SOCK_NAME_MAX_LEN];
|
||||
|
||||
if (!SAME_TYPE(SCHEME_TYPE(argv[0]), scheme_listener_type))
|
||||
scheme_wrong_contract("tcp-accept", "tcp-listener?", 0, argc, argv);
|
||||
|
@ -1221,15 +1216,10 @@ do_tcp_accept(int argc, Scheme_Object *argv[], Scheme_Object *cust, char **_fail
|
|||
if (!was_closed) {
|
||||
ready_pos = tcp_check_accept(listener, NULL);
|
||||
if (!ready_pos) {
|
||||
Scheme_Object *evt;
|
||||
evt = listener_to_evt((listener_t *)listener);
|
||||
if (evt)
|
||||
scheme_sync(1, &evt);
|
||||
else
|
||||
scheme_block_until((Scheme_Ready_Fun)tcp_check_accept,
|
||||
tcp_accept_needs_wakeup,
|
||||
listener,
|
||||
0.0);
|
||||
scheme_block_until((Scheme_Ready_Fun)tcp_check_accept,
|
||||
tcp_accept_needs_wakeup,
|
||||
listener,
|
||||
0.0);
|
||||
ready_pos = tcp_check_accept(listener, NULL);
|
||||
}
|
||||
was_closed = LISTENER_WAS_CLOSED(listener);
|
||||
|
@ -1292,13 +1282,9 @@ tcp_accept_break(int argc, Scheme_Object *argv[])
|
|||
|
||||
void scheme_register_network_evts()
|
||||
{
|
||||
#ifdef USE_TCP
|
||||
scheme_add_evt(scheme_listener_type, (Scheme_Ready_Fun)tcp_check_accept, tcp_accept_needs_wakeup, NULL, 0);
|
||||
scheme_add_evt(scheme_tcp_accept_evt_type, (Scheme_Ready_Fun)tcp_check_accept_evt, tcp_accept_evt_needs_wakeup, NULL, 0);
|
||||
# ifdef UDP_IS_SUPPORTED
|
||||
scheme_add_evt(scheme_udp_evt_type, (Scheme_Ready_Fun)udp_evt_check_ready, udp_evt_needs_wakeup, NULL, 0);
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
||||
static Scheme_Object *tcp_listener_p(int argc, Scheme_Object *argv[])
|
||||
|
@ -1322,13 +1308,14 @@ static int extract_svc_value(char *svc_buf)
|
|||
|
||||
static Scheme_Object *tcp_addresses(int argc, Scheme_Object *argv[])
|
||||
{
|
||||
#ifdef USE_TCP
|
||||
rktio_fd_t *socket = NULL;
|
||||
rktio_listener_t *lnr = NULL;
|
||||
Scheme_Tcp *tcp = NULL;
|
||||
int closed = 0, require_peer = 0;
|
||||
Scheme_Object *result[4];
|
||||
int with_ports = 0;
|
||||
intptr_t l;
|
||||
char **local_names, **peer_names;
|
||||
|
||||
if (SCHEME_OUTPUT_PORTP(argv[0])) {
|
||||
Scheme_Output_Port *op;
|
||||
|
@ -1355,14 +1342,12 @@ static Scheme_Object *tcp_addresses(int argc, Scheme_Object *argv[])
|
|||
require_peer = 1;
|
||||
} else {
|
||||
if (SCHEME_LISTEN_PORTP(argv[0])) {
|
||||
listener = 1;
|
||||
if (LISTENER_WAS_CLOSED(argv[0])) {
|
||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||
"tcp-addresses: listener is closed");
|
||||
} else
|
||||
lnr = ((listener_t *)argv[0])->lnr;
|
||||
} else if (SCHEME_UDP_PORTP(argv[0])) {
|
||||
udp = 1;
|
||||
socket = ((Scheme_UDP *)argv[0])->s;
|
||||
if (!socket)
|
||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||
|
@ -1373,9 +1358,9 @@ static Scheme_Object *tcp_addresses(int argc, Scheme_Object *argv[])
|
|||
}
|
||||
|
||||
if (socket)
|
||||
local_names = rktio_socket_address(socket);
|
||||
local_names = rktio_socket_address(scheme_rktio, socket);
|
||||
else
|
||||
local_names = rktio_listener_address(lnr);
|
||||
local_names = rktio_listener_address(scheme_rktio, lnr);
|
||||
|
||||
if (!local_names)
|
||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||
|
@ -1383,7 +1368,7 @@ static Scheme_Object *tcp_addresses(int argc, Scheme_Object *argv[])
|
|||
" system error: %R");
|
||||
|
||||
if (socket)
|
||||
peer_names = rktio_socket_address(socket);
|
||||
peer_names = rktio_socket_address(scheme_rktio, socket);
|
||||
else
|
||||
peer_names = NULL;
|
||||
|
||||
|
@ -1406,9 +1391,9 @@ static Scheme_Object *tcp_addresses(int argc, Scheme_Object *argv[])
|
|||
result[with_ports ? 2 : 1] = scheme_make_utf8_string("0.0.0.0");
|
||||
result[3] = scheme_make_integer(0);
|
||||
} else {
|
||||
result[with_ports ? 2 : 1] = scheme_make_utf8_string(host_buf);
|
||||
result[with_ports ? 2 : 1] = scheme_make_utf8_string(peer_names[0]);
|
||||
if (with_ports) {
|
||||
l = extract_svc_value(svc_buf);
|
||||
l = extract_svc_value(peer_names[1]);
|
||||
result[3] = scheme_make_integer(l);
|
||||
}
|
||||
}
|
||||
|
@ -1419,7 +1404,7 @@ static Scheme_Object *tcp_addresses(int argc, Scheme_Object *argv[])
|
|||
if (peer_names) {
|
||||
free(peer_names[0]);
|
||||
free(peer_names[1]);
|
||||
free(perr_names);
|
||||
free(peer_names);
|
||||
}
|
||||
|
||||
return scheme_values(with_ports ? 4 : 2, result);
|
||||
|
@ -1559,7 +1544,7 @@ int scheme_get_port_socket(Scheme_Object *p, intptr_t *_s)
|
|||
|
||||
if (s_ok) {
|
||||
intptr_t sv;
|
||||
sv = rktio_fd_system_fd(s);
|
||||
sv = rktio_fd_system_fd(scheme_rktio, s);
|
||||
*_s = sv;
|
||||
return 1;
|
||||
} else
|
||||
|
@ -1573,7 +1558,7 @@ void scheme_socket_to_ports(intptr_t s, const char *name, int takeover,
|
|||
Scheme_Object *v;
|
||||
rktio_fd_t *rfd;
|
||||
|
||||
rfd = rktio_open(s, RKTIO_OPEN_READ | RKTIO_OPEN_WRITE | RKTIO_OPEN_SOCKET | RKTIO_OPEN_OWN);
|
||||
rfd = rktio_system_fd(scheme_rktio, s, RKTIO_OPEN_READ | RKTIO_OPEN_WRITE | RKTIO_OPEN_SOCKET | RKTIO_OPEN_OWN);
|
||||
|
||||
tcp = make_tcp_port_data(rfd, takeover ? 2 : 3);
|
||||
|
||||
|
@ -1586,74 +1571,59 @@ void scheme_socket_to_ports(intptr_t s, const char *name, int takeover,
|
|||
void scheme_socket_to_input_port(intptr_t s, Scheme_Object *name, int takeover,
|
||||
Scheme_Object **_inp)
|
||||
{
|
||||
#ifdef USE_TCP
|
||||
Scheme_Tcp *tcp;
|
||||
Scheme_Object *v;
|
||||
rktio_fd_t *fd;
|
||||
|
||||
tcp = make_tcp_port_data(s, takeover ? 1 : 2);
|
||||
fd = rktio_system_fd(scheme_rktio, s, (RKTIO_OPEN_READ | RKTIO_OPEN_SOCKET
|
||||
| RKTIO_OPEN_INIT
|
||||
| (takeover ? RKTIO_OPEN_OWN : 0)));
|
||||
|
||||
tcp = make_tcp_port_data(fd, takeover ? 1 : 2);
|
||||
|
||||
v = make_tcp_input_port_symbol_name(tcp, name, NULL);
|
||||
*_inp = v;
|
||||
|
||||
if (takeover) {
|
||||
REGISTER_SOCKET(s);
|
||||
}
|
||||
#else
|
||||
*_inp = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
void scheme_socket_to_output_port(intptr_t s, Scheme_Object *name, int takeover,
|
||||
Scheme_Object **_outp)
|
||||
{
|
||||
#ifdef USE_TCP
|
||||
Scheme_Tcp *tcp;
|
||||
Scheme_Object *v;
|
||||
|
||||
tcp = make_tcp_port_data(s, takeover ? 1 : 2);
|
||||
rktio_fd_t *fd;
|
||||
|
||||
fd = rktio_system_fd(scheme_rktio, s, (RKTIO_OPEN_WRITE | RKTIO_OPEN_SOCKET
|
||||
| RKTIO_OPEN_INIT
|
||||
| (takeover ? RKTIO_OPEN_OWN : 0)));
|
||||
|
||||
tcp = make_tcp_port_data(fd, takeover ? 1 : 2);
|
||||
|
||||
v = make_tcp_output_port_symbol_name(tcp, name, NULL);
|
||||
*_outp = v;
|
||||
|
||||
if (takeover) {
|
||||
REGISTER_SOCKET(s);
|
||||
}
|
||||
#else
|
||||
*_outp = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
intptr_t scheme_dup_socket(intptr_t fd) {
|
||||
#ifdef USE_TCP
|
||||
# ifdef USE_WINSOCK_TCP
|
||||
intptr_t nsocket;
|
||||
intptr_t rc;
|
||||
WSAPROTOCOL_INFO protocolInfo;
|
||||
rc = WSADuplicateSocket(fd, GetCurrentProcessId(), &protocolInfo);
|
||||
if (rc)
|
||||
return rc;
|
||||
nsocket = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, &protocolInfo, 0, WSA_FLAG_OVERLAPPED);
|
||||
REGISTER_SOCKET(nsocket);
|
||||
return nsocket;
|
||||
# else
|
||||
intptr_t nfd;
|
||||
do {
|
||||
nfd = dup(fd);
|
||||
} while (nfd == -1 && errno == EINTR);
|
||||
return nfd;
|
||||
# endif
|
||||
#else
|
||||
return -1;
|
||||
#endif
|
||||
rktio_fd_t *rfd, *rfd2;
|
||||
intptr_t s;
|
||||
|
||||
rfd = rktio_system_fd(scheme_rktio, fd, (RKTIO_OPEN_READ | RKTIO_OPEN_WRITE | RKTIO_OPEN_SOCKET));
|
||||
rfd2 = rktio_dup(scheme_rktio, rfd);
|
||||
|
||||
s = rktio_fd_system_fd(scheme_rktio, rfd2);
|
||||
|
||||
rktio_forget(scheme_rktio, rfd);
|
||||
rktio_forget(scheme_rktio, rfd2);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
void scheme_close_socket_fd(intptr_t fd)
|
||||
{
|
||||
#ifdef USE_TCP
|
||||
UNREGISTER_SOCKET(fd);
|
||||
closesocket(fd);
|
||||
(void)scheme_fd_to_semaphore(fd, MZFD_REMOVE, 1);
|
||||
#endif
|
||||
rktio_fd_t *rfd;
|
||||
|
||||
rfd = rktio_system_fd(scheme_rktio, fd, RKTIO_OPEN_SOCKET | RKTIO_OPEN_OWN);
|
||||
(void)scheme_rktio_fd_to_semaphore(rfd, MZFD_REMOVE);
|
||||
rktio_close(scheme_rktio, rfd);
|
||||
}
|
||||
|
||||
/*========================================================================*/
|
||||
|
@ -1671,8 +1641,14 @@ typedef struct Scheme_UDP_Evt {
|
|||
rktio_addrinfo_t *dest_addr;
|
||||
} Scheme_UDP_Evt;
|
||||
|
||||
static void free_dest_addr(void *udp_evt, void *ignored)
|
||||
{
|
||||
Scheme_UDP_Evt *evt = (Scheme_UDP_Evt *)udp_evt;
|
||||
rktio_addrinfo_free(scheme_rktio, evt->dest_addr);
|
||||
}
|
||||
|
||||
static int udp_default_family() {
|
||||
return rktio_get_ipv4_family();
|
||||
return rktio_get_ipv4_family(scheme_rktio);
|
||||
}
|
||||
|
||||
static int udp_close_it(Scheme_Object *_udp)
|
||||
|
@ -1680,8 +1656,8 @@ static int udp_close_it(Scheme_Object *_udp)
|
|||
Scheme_UDP *udp = (Scheme_UDP *)_udp;
|
||||
|
||||
if (udp->s) {
|
||||
(void)scheme_fd_to_semaphore(udp->s, MZFD_REMOVE, 1);
|
||||
rktio_close(udp->s);
|
||||
(void)scheme_rktio_fd_to_semaphore(udp->s, MZFD_REMOVE);
|
||||
rktio_close(scheme_rktio, udp->s);
|
||||
udp->s = NULL;
|
||||
|
||||
scheme_remove_managed(udp->mref, (Scheme_Object *)udp);
|
||||
|
@ -1700,8 +1676,6 @@ static Scheme_Object *make_udp(int argc, Scheme_Object *argv[])
|
|||
unsigned short id;
|
||||
rktio_addrinfo_t *addr;
|
||||
|
||||
TCP_INIT("udp-open-socket");
|
||||
|
||||
if ((argc > 0) && !SCHEME_FALSEP(argv[0]) && !SCHEME_CHAR_STRINGP(argv[0]))
|
||||
scheme_wrong_contract("udp-open-socket", "(or/c string? #f)", 0, argc, argv);
|
||||
if ((argc > 1) && !SCHEME_FALSEP(argv[1]) && !CHECK_PORT_ID(argv[1]))
|
||||
|
@ -1718,7 +1692,7 @@ static Scheme_Object *make_udp(int argc, Scheme_Object *argv[])
|
|||
else
|
||||
id = 0;
|
||||
|
||||
scheme_security_check_network("udp-open-socket", address, origid, 0);
|
||||
scheme_security_check_network("udp-open-socket", address, id, 0);
|
||||
scheme_custodian_check_available(NULL, "udp-open-socket", "network");
|
||||
|
||||
if (address || id) {
|
||||
|
@ -1727,7 +1701,7 @@ static Scheme_Object *make_udp(int argc, Scheme_Object *argv[])
|
|||
if (!id)
|
||||
id = 1025;
|
||||
|
||||
addr = do_resolve_address("upd-open-socket", address, id, RKTIO_FAMILTY_ANY, show_id_on_error);
|
||||
addr = do_resolve_address("upd-open-socket", address, id, RKTIO_FAMILY_ANY, show_id_on_error);
|
||||
} else
|
||||
addr = NULL;
|
||||
|
||||
|
@ -1866,7 +1840,7 @@ static Scheme_Object *udp_bind_or_connect(const char *name, int argc, Scheme_Obj
|
|||
return scheme_void;
|
||||
}
|
||||
|
||||
addr = do_resolve_address(name, address, port, RKTIO_FAMILTY_ANY, 1);
|
||||
addr = do_resolve_address(name, address, port, RKTIO_FAMILY_ANY, 1);
|
||||
|
||||
if (!do_bind) {
|
||||
/* CONNECT CASE */
|
||||
|
@ -1927,7 +1901,7 @@ static int udp_check_send(Scheme_Object *_udp, Scheme_Schedule_Info *sinfo)
|
|||
{
|
||||
Scheme_UDP *udp = (Scheme_UDP *)_udp;
|
||||
|
||||
if (udp->s == INVALID_SOCKET)
|
||||
if (!udp->s)
|
||||
return 1;
|
||||
|
||||
if (!sinfo || !sinfo->is_poll) {
|
||||
|
@ -1957,9 +1931,9 @@ static Scheme_Object *do_udp_send_it(const char *name, Scheme_UDP *udp,
|
|||
intptr_t x;
|
||||
|
||||
while (1) {
|
||||
if (udp->s!) {
|
||||
if (!udp->s) {
|
||||
/* socket was closed, maybe while we slept */
|
||||
if (free_addr) rktio_addrinfo_free(dest_addr);
|
||||
if (free_addr) rktio_addrinfo_free(scheme_rktio, dest_addr);
|
||||
if (can_error)
|
||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||
"%s: udp socket is closed\n"
|
||||
|
@ -1970,7 +1944,7 @@ static Scheme_Object *do_udp_send_it(const char *name, Scheme_UDP *udp,
|
|||
if ((!dest_addr && !udp->connected)
|
||||
|| (dest_addr && udp->connected)) {
|
||||
/* socket is unconnected, maybe disconnected while we slept */
|
||||
if (free_addr) rktio_addrinfo_free(dest_addr);
|
||||
if (free_addr) rktio_addrinfo_free(scheme_rktio, dest_addr);
|
||||
if (can_error)
|
||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||
"%s: udp socket is%s connected\n"
|
||||
|
@ -1983,19 +1957,16 @@ static Scheme_Object *do_udp_send_it(const char *name, Scheme_UDP *udp,
|
|||
|
||||
udp->bound = 1; /* in case it's not bound already, send[to] binds it */
|
||||
|
||||
x = rktio_udp_sendto(scheme_rktio, udp->s, addr,
|
||||
x = rktio_udp_sendto(scheme_rktio, udp->s, dest_addr,
|
||||
bstr XFORM_OK_PLUS start, end - start);
|
||||
|
||||
if (x == RKTIO_WRITE_ERROR) {
|
||||
if (ignore_addr_failure && scheme_last_error_is_racket(RKTIO_ERROR_ADDRESS_FAILURE)) {
|
||||
return NULL;
|
||||
} else
|
||||
break;
|
||||
break;
|
||||
} else if (!x) {
|
||||
if (can_block) {
|
||||
/* Block and eventually try again. */
|
||||
Scheme_Object *sema;
|
||||
sema = scheme_fd_to_semaphore(udp->s, MZFD_CREATE_WRITE, 1);
|
||||
sema = scheme_rktio_fd_to_semaphore(udp->s, MZFD_CREATE_WRITE);
|
||||
if (sema)
|
||||
scheme_wait_sema(sema, 0);
|
||||
else
|
||||
|
@ -2003,11 +1974,13 @@ static Scheme_Object *do_udp_send_it(const char *name, Scheme_UDP *udp,
|
|||
udp_send_needs_wakeup,
|
||||
(Scheme_Object *)udp,
|
||||
0);
|
||||
} else
|
||||
} else {
|
||||
if (free_addr) rktio_addrinfo_free(scheme_rktio, dest_addr);
|
||||
return scheme_false;
|
||||
}
|
||||
} else if (x != (end - start)) {
|
||||
/* this isn't supposed to happen: */
|
||||
if (free_addr) rktio_addrinfo_free(dest_addr);
|
||||
if (free_addr) rktio_addrinfo_free(scheme_rktio, dest_addr);
|
||||
if (can_error)
|
||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||
"%s: didn't send enough (%d != %d)",
|
||||
|
@ -2017,11 +1990,12 @@ static Scheme_Object *do_udp_send_it(const char *name, Scheme_UDP *udp,
|
|||
} else
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (free_addr) rktio_addrinfo_free(scheme_rktio, dest_addr);
|
||||
|
||||
if (x != RKTIO_WRITE_ERROR) {
|
||||
return (can_block ? scheme_void : scheme_true);
|
||||
} else {
|
||||
if (free_addr) rktio_addrinfo_free(dest_addr);
|
||||
if (can_error)
|
||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||
"%s: send failed\n"
|
||||
|
@ -2037,9 +2011,9 @@ static Scheme_Object *udp_send_it(const char *name, int argc, Scheme_Object *arg
|
|||
Scheme_UDP *udp;
|
||||
char *address = "";
|
||||
intptr_t start, end;
|
||||
int delta, err;
|
||||
int delta;
|
||||
unsigned short id;
|
||||
rktio_addr_info *dest_addr;
|
||||
rktio_addrinfo_t *dest_addr;
|
||||
|
||||
udp = (Scheme_UDP *)argv[0];
|
||||
|
||||
|
@ -2070,14 +2044,13 @@ static Scheme_Object *udp_send_it(const char *name, int argc, Scheme_Object *arg
|
|||
|
||||
scheme_security_check_network(name, address, id, 1);
|
||||
|
||||
dest_addr = do_resolve_address(name, address, id, RKTIO_FAMILTY_ANY, 1);
|
||||
dest_addr = do_resolve_address(name, address, id, RKTIO_FAMILY_ANY, 1);
|
||||
} else {
|
||||
dest_addr = NULL;
|
||||
}
|
||||
|
||||
|
||||
if (fill_evt) {
|
||||
char *s;
|
||||
fill_evt->str = SCHEME_BYTE_STR_VAL(argv[3+delta]);
|
||||
fill_evt->offset = start;
|
||||
fill_evt->len = end - start;
|
||||
|
@ -2151,10 +2124,7 @@ static void udp_recv_needs_wakeup(Scheme_Object *_udp, void *fds)
|
|||
static int do_udp_recv(const char *name, Scheme_UDP *udp, char *bstr, intptr_t start, intptr_t end,
|
||||
int can_block, int can_error, Scheme_Object **v)
|
||||
{
|
||||
intptr_t x;
|
||||
int errid = 0;
|
||||
char src_addr[MZ_SOCK_NAME_MAX_LEN];
|
||||
unsigned int asize = sizeof(src_addr);
|
||||
rktio_length_and_addrinfo_t *result;
|
||||
|
||||
if (!udp->bound) {
|
||||
if (can_error)
|
||||
|
@ -2167,8 +2137,6 @@ static int do_udp_recv(const char *name, Scheme_UDP *udp, char *bstr, intptr_t s
|
|||
}
|
||||
|
||||
while (1) {
|
||||
rktio_length_and_addrinfo_t *result;
|
||||
|
||||
if (!udp->s) {
|
||||
/* socket was closed, maybe while we slept */
|
||||
if (can_error)
|
||||
|
@ -2179,7 +2147,7 @@ static int do_udp_recv(const char *name, Scheme_UDP *udp, char *bstr, intptr_t s
|
|||
return -1;
|
||||
}
|
||||
|
||||
result = rktio_udp_recvfrom(scheme_rktio, udp->s, buf, end - start);
|
||||
result = rktio_udp_recvfrom(scheme_rktio, udp->s, bstr XFORM_OK_PLUS start, end - start);
|
||||
|
||||
if (!result) {
|
||||
if (scheme_last_error_is_racket(RKTIO_ERROR_TRY_AGAIN)
|
||||
|
@ -2193,7 +2161,7 @@ static int do_udp_recv(const char *name, Scheme_UDP *udp, char *bstr, intptr_t s
|
|||
/* Block and eventually try again. */
|
||||
{
|
||||
Scheme_Object *sema;
|
||||
sema = scheme_fd_to_semaphore(udp->s, MZFD_CREATE_READ, 1);
|
||||
sema = scheme_rktio_fd_to_semaphore(udp->s, MZFD_CREATE_READ);
|
||||
if (sema)
|
||||
scheme_wait_sema(sema, 0);
|
||||
else
|
||||
|
@ -2213,12 +2181,14 @@ static int do_udp_recv(const char *name, Scheme_UDP *udp, char *bstr, intptr_t s
|
|||
} else {
|
||||
/* Data received */
|
||||
char prev_buf[64];
|
||||
int id;
|
||||
|
||||
v[0] = scheme_make_integer(result->len);
|
||||
|
||||
if (udp->previous_from_addr) {
|
||||
/* See if we can use this cached string */
|
||||
mzchar *s;
|
||||
int j;
|
||||
s = SCHEME_CHAR_STR_VAL(udp->previous_from_addr);
|
||||
for (j = 0; s[j]; j++) {
|
||||
prev_buf[j] = (char)s[j];
|
||||
|
@ -2239,6 +2209,11 @@ static int do_udp_recv(const char *name, Scheme_UDP *udp, char *bstr, intptr_t s
|
|||
|
||||
v[2] = scheme_make_integer(id);
|
||||
|
||||
free(result->address[0]);
|
||||
free(result->address[1]);
|
||||
free(result->address);
|
||||
free(result);
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@ -2267,8 +2242,8 @@ static Scheme_Object *udp_recv(const char *name, int argc, Scheme_Object *argv[]
|
|||
fill_evt->len = end - start;
|
||||
return scheme_void;
|
||||
} else {
|
||||
do_udp_recv(name, udp, SCHEME_BYTE_STR_VAL(argv[1]), start, end, can_block, v, 1);
|
||||
|
||||
do_udp_recv(name, udp, SCHEME_BYTE_STR_VAL(argv[1]), start, end, can_block, 1, v);
|
||||
|
||||
return scheme_values(3,v);
|
||||
}
|
||||
}
|
||||
|
@ -2355,7 +2330,7 @@ static int udp_evt_check_ready(Scheme_Object *_uw, Scheme_Schedule_Info *sinfo)
|
|||
|
||||
r = do_udp_recv("udp-receive!-evt", uw->udp,
|
||||
uw->str, uw->offset, uw->offset + uw->len,
|
||||
0, v, !sinfo->false_pos_ok);
|
||||
0, !sinfo->false_positive_ok, v);
|
||||
if (r) {
|
||||
if (r != -1)
|
||||
scheme_set_sync_target(sinfo, scheme_build_list(3, v), NULL, NULL, 0, 0, NULL);
|
||||
|
@ -2371,7 +2346,7 @@ static int udp_evt_check_ready(Scheme_Object *_uw, Scheme_Schedule_Info *sinfo)
|
|||
r = do_udp_send_it("udp-send-evt", uw->udp,
|
||||
uw->str, uw->offset, uw->offset + uw->len,
|
||||
uw->dest_addr, 0,
|
||||
0, !sinfo->false_pos_ok);
|
||||
0, !sinfo->false_positive_ok);
|
||||
if (!r || SCHEME_TRUEP(r)) {
|
||||
scheme_set_sync_target(sinfo, scheme_void, NULL, NULL, 0, 0, NULL);
|
||||
return 1;
|
||||
|
@ -2399,7 +2374,7 @@ static void udp_check_open(char const *name, int argc, Scheme_Object *argv[])
|
|||
if (!SCHEME_UDPP(argv[0]))
|
||||
scheme_wrong_contract(name, "udp?", 0, argc, argv);
|
||||
|
||||
if (udp->s == INVALID_SOCKET) {
|
||||
if (!udp->s) {
|
||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||
"%s: udp socket was already closed\n"
|
||||
" socket: %V",
|
||||
|
@ -2504,7 +2479,8 @@ static Scheme_Object *
|
|||
udp_multicast_set_interface(int argc, Scheme_Object *argv[])
|
||||
{
|
||||
Scheme_UDP *udp = (Scheme_UDP *)argv[0];
|
||||
rktio_addr_info_t *addr;
|
||||
rktio_addrinfo_t *addr;
|
||||
Scheme_Object *bs;
|
||||
int r;
|
||||
|
||||
if (!SCHEME_UDPP(argv[0]))
|
||||
|
@ -2517,10 +2493,15 @@ udp_multicast_set_interface(int argc, Scheme_Object *argv[])
|
|||
|
||||
udp_check_open("udp-multicast-set-interface!", argc, argv);
|
||||
|
||||
addr = do_resolve_address("udp-multicast-set-interface!", SCHEME_BYTE_STR_VAL(bs), -1, udp_default_family(), 0);
|
||||
if (SCHEME_CHAR_STRINGP(argv[1])) {
|
||||
bs = scheme_char_string_to_byte_string(argv[1]);
|
||||
addr = do_resolve_address("udp-multicast-set-interface!", SCHEME_BYTE_STR_VAL(bs), -1, udp_default_family(), 0);
|
||||
} else
|
||||
addr = NULL;
|
||||
|
||||
r = rktio_udp_set_multicast_interface(scheme_rktio, scheme_rktio, addr);
|
||||
rktio_addrinfo_free(addr);
|
||||
r = rktio_udp_set_multicast_interface(scheme_rktio, udp->s, addr);
|
||||
|
||||
if (addr) rktio_addrinfo_free(scheme_rktio, addr);
|
||||
|
||||
if (!r)
|
||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||
|
@ -2529,7 +2510,6 @@ udp_multicast_set_interface(int argc, Scheme_Object *argv[])
|
|||
|
||||
return scheme_void;
|
||||
}
|
||||
}
|
||||
|
||||
static Scheme_Object *
|
||||
do_udp_multicast_join_or_leave_group(char const *name, int optname, Scheme_UDP *udp,
|
||||
|
@ -2539,6 +2519,8 @@ do_udp_multicast_join_or_leave_group(char const *name, int optname, Scheme_UDP *
|
|||
Scheme_Object *bs;
|
||||
rktio_addrinfo_t *multi_addr, *intf_addr;
|
||||
char *address;
|
||||
rktio_addrinfo_lookup_t *lookup;
|
||||
int r;
|
||||
|
||||
pd = make_connect_progress_data();
|
||||
|
||||
|
@ -2566,10 +2548,10 @@ do_udp_multicast_join_or_leave_group(char const *name, int optname, Scheme_UDP *
|
|||
|
||||
pd->dest_addr = multi_addr;
|
||||
|
||||
if (SCHEME_FALSEP(intfaddrname)) {
|
||||
if (SCHEME_FALSEP(ifaddrname)) {
|
||||
intf_addr = NULL;
|
||||
} else {
|
||||
bs = scheme_char_string_to_byte_string(intfaddrname);
|
||||
bs = scheme_char_string_to_byte_string(ifaddrname);
|
||||
address = SCHEME_BYTE_STR_VAL(bs);
|
||||
|
||||
lookup = rktio_start_addrinfo_lookup(scheme_rktio, address, -1, udp_default_family(), 0, 0);
|
||||
|
@ -2583,7 +2565,7 @@ do_udp_multicast_join_or_leave_group(char const *name, int optname, Scheme_UDP *
|
|||
intf_addr = NULL;
|
||||
|
||||
if (!intf_addr) {
|
||||
rktio_addrinfo_free(multi_addr);
|
||||
rktio_addrinfo_free(scheme_rktio, multi_addr);
|
||||
scheme_raise_exn(MZEXN_FAIL_NETWORK,
|
||||
"%s: can't resolve interface address\n"
|
||||
" address: %s\n"
|
||||
|
@ -2598,8 +2580,8 @@ do_udp_multicast_join_or_leave_group(char const *name, int optname, Scheme_UDP *
|
|||
intf_addr,
|
||||
optname);
|
||||
|
||||
rktio_addrinfo_free(multi_addr);
|
||||
if (intf_addr) rktio_addrinfo_free(intf_addr);
|
||||
rktio_addrinfo_free(scheme_rktio, multi_addr);
|
||||
if (intf_addr) rktio_addrinfo_free(scheme_rktio, intf_addr);
|
||||
|
||||
|
||||
if (!r)
|
||||
|
@ -2678,5 +2660,3 @@ static void register_traversers(void)
|
|||
END_XFORM_SKIP;
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* !NO_TCP_SUPPORT */
|
||||
|
|
|
@ -31,6 +31,8 @@
|
|||
|
||||
#include "schpriv.h"
|
||||
#include "schmach.h"
|
||||
#include "schrktio.h"
|
||||
#include <errno.h>
|
||||
|
||||
#define mzAssert(x) /* if (!(x)) abort() */
|
||||
|
||||
|
@ -51,6 +53,7 @@ typedef struct {
|
|||
typedef struct Scheme_Subprocess {
|
||||
Scheme_Object so;
|
||||
rktio_process_t *proc;
|
||||
Scheme_Custodian_Reference *mref;
|
||||
} Scheme_Subprocess;
|
||||
|
||||
/******************** refcounts ********************/
|
||||
|
@ -108,13 +111,15 @@ static int adj_refcount(int *refcount, int amt)
|
|||
|
||||
static int *stdin_refcount, *stdout_refcount, *stderr_refcount;
|
||||
|
||||
# define MZPORT_FD_BUFFSIZE 4096
|
||||
# define MZPORT_FD_DIRECT_THRESHOLD MZPORT_FD_BUFFSIZE
|
||||
|
||||
/* The Scheme_FD type is used for both input and output */
|
||||
typedef struct Scheme_FD {
|
||||
MZTAG_IF_REQUIRED
|
||||
rktio_fd_t fd;
|
||||
rktio_fd_t *fd;
|
||||
intptr_t bufcount, buffpos;
|
||||
char flushing, flush;
|
||||
unsigned char *buffer;
|
||||
char *buffer;
|
||||
int *refcount;
|
||||
Scheme_Object *flush_handle; /* output port: registration with plumber */
|
||||
|
@ -139,8 +144,8 @@ int scheme_get_serialized_fd_flags(Scheme_Object* p, Scheme_Serialized_File_FD *
|
|||
fds = (Scheme_FD *) ((Scheme_Output_Port *)p)->port_data;
|
||||
so->name = ((Scheme_Output_Port *)p)->name;
|
||||
}
|
||||
so->regfile = rktio_fd_is_regular_file(fds->fd);
|
||||
so->textmode = (fds->textmode ? 1 : 0);
|
||||
so->regfile = rktio_fd_is_regular_file(scheme_rktio, fds->fd);
|
||||
so->textmode = rktio_fd_is_text_converted(scheme_rktio, fds->fd);
|
||||
so->flush_mode = fds->flush;
|
||||
return 1;
|
||||
}
|
||||
|
@ -186,10 +191,8 @@ THREAD_LOCAL_DECL(static int the_fd);
|
|||
READ_ONLY static Scheme_Object *fd_input_port_type;
|
||||
READ_ONLY static Scheme_Object *file_input_port_type;
|
||||
READ_ONLY Scheme_Object *scheme_string_input_port_type;
|
||||
#ifdef USE_TCP
|
||||
READ_ONLY Scheme_Object *scheme_tcp_input_port_type;
|
||||
READ_ONLY Scheme_Object *scheme_tcp_output_port_type;
|
||||
#endif
|
||||
READ_ONLY static Scheme_Object *fd_output_port_type;
|
||||
READ_ONLY static Scheme_Object *file_output_port_type;
|
||||
READ_ONLY Scheme_Object *scheme_string_output_port_type;
|
||||
|
@ -214,12 +217,10 @@ THREAD_LOCAL_DECL(static int put_external_event_fd);
|
|||
|
||||
static void register_port_wait();
|
||||
|
||||
#ifdef MZ_FDS
|
||||
static intptr_t flush_fd(Scheme_Output_Port *op,
|
||||
const char * volatile bufstr, volatile uintptr_t buflen,
|
||||
volatile uintptr_t offset, int immediate_only, int enable_break);
|
||||
static void flush_if_output_fds(Scheme_Object *o, Scheme_Close_Custodian_Client *f, void *data);
|
||||
#endif
|
||||
|
||||
static Scheme_Object *subprocess(int c, Scheme_Object *args[]);
|
||||
static Scheme_Object *subprocess_status(int c, Scheme_Object *args[]);
|
||||
|
@ -232,6 +233,8 @@ static Scheme_Object *current_subproc_cust_mode (int, Scheme_Object *[]);
|
|||
static Scheme_Object *subproc_group_on (int, Scheme_Object *[]);
|
||||
static void register_subprocess_wait();
|
||||
|
||||
static void unix_turn_off_timer(void);
|
||||
|
||||
typedef struct Scheme_Read_Write_Evt {
|
||||
Scheme_Object so;
|
||||
Scheme_Object *port;
|
||||
|
@ -247,12 +250,7 @@ static int progress_evt_ready(Scheme_Object *rww, Scheme_Schedule_Info *sinfo);
|
|||
static int closed_evt_ready(Scheme_Object *rww, Scheme_Schedule_Info *sinfo);
|
||||
static int filesystem_change_evt_ready(Scheme_Object *evt, Scheme_Schedule_Info *sinfo);
|
||||
|
||||
#if defined(DOS_FILE_SYSTEM) || defined(HAVE_INOTIFY_SYSCALL)
|
||||
static void filesystem_change_evt_need_wakeup (Scheme_Object *port, void *fds);
|
||||
#else
|
||||
# define filesystem_change_evt_need_wakeup NULL
|
||||
#endif
|
||||
|
||||
|
||||
static Scheme_Object *
|
||||
_scheme_make_named_file_input_port(FILE *fp, Scheme_Object *name, int regfile);
|
||||
|
@ -344,10 +342,8 @@ scheme_init_port (Scheme_Env *env)
|
|||
REGISTER_SO(fd_output_port_type);
|
||||
REGISTER_SO(file_input_port_type);
|
||||
REGISTER_SO(scheme_string_input_port_type);
|
||||
#ifdef USE_TCP
|
||||
REGISTER_SO(scheme_tcp_input_port_type);
|
||||
REGISTER_SO(scheme_tcp_output_port_type);
|
||||
#endif
|
||||
REGISTER_SO(file_output_port_type);
|
||||
REGISTER_SO(scheme_string_output_port_type);
|
||||
REGISTER_SO(scheme_user_input_port_type);
|
||||
|
@ -357,10 +353,6 @@ scheme_init_port (Scheme_Env *env)
|
|||
REGISTER_SO(scheme_null_output_port_type);
|
||||
REGISTER_SO(scheme_redirect_output_port_type);
|
||||
|
||||
#if defined(UNIX_PROCESSES) && !defined(MZ_PLACES_WAITPID)
|
||||
REGISTER_SO(scheme_system_children);
|
||||
#endif
|
||||
|
||||
#ifndef DONT_IGNORE_PIPE_SIGNAL
|
||||
START_XFORM_SKIP;
|
||||
MZ_SIGSET(SIGPIPE, SIG_IGN);
|
||||
|
@ -387,10 +379,8 @@ scheme_init_port (Scheme_Env *env)
|
|||
scheme_pipe_read_port_type = scheme_make_port_type("<pipe-input-port>");
|
||||
scheme_pipe_write_port_type = scheme_make_port_type("<pipe-output-port>");
|
||||
|
||||
#ifdef USE_TCP
|
||||
scheme_tcp_input_port_type = scheme_make_port_type("<tcp-input-port>");
|
||||
scheme_tcp_output_port_type = scheme_make_port_type("<tcp-output-port>");
|
||||
#endif
|
||||
|
||||
scheme_null_output_port_type = scheme_make_port_type("<null-output-port>");
|
||||
scheme_redirect_output_port_type = scheme_make_port_type("<redirect-output-port>");
|
||||
|
@ -423,7 +413,6 @@ void scheme_init_port_wait()
|
|||
void scheme_init_port_places(void)
|
||||
{
|
||||
|
||||
#ifdef MZ_FDS
|
||||
scheme_add_atexit_closer(flush_if_output_fds);
|
||||
/* Note: other threads might continue to write even after
|
||||
the flush completes, but that's the threads' problem.
|
||||
|
@ -438,7 +427,6 @@ void scheme_init_port_places(void)
|
|||
stdout_refcount = malloc_refcount(1, 0);
|
||||
stderr_refcount = malloc_refcount(1, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
REGISTER_SO(read_string_byte_buffer);
|
||||
REGISTER_SO(scheme_orig_stdout_port);
|
||||
|
@ -446,26 +434,24 @@ void scheme_init_port_places(void)
|
|||
REGISTER_SO(scheme_orig_stdin_port);
|
||||
scheme_orig_stdin_port = (scheme_make_stdin
|
||||
? scheme_make_stdin()
|
||||
: make_fd_input_port(rktio_std_fd(RKTIO_STDIN), scheme_intern_symbol("stdin"), 0,
|
||||
: make_fd_input_port(rktio_std_fd(scheme_rktio, RKTIO_STDIN), scheme_intern_symbol("stdin"),
|
||||
stdin_refcount, 0));
|
||||
|
||||
scheme_orig_stdout_port = (scheme_make_stdout
|
||||
? scheme_make_stdout()
|
||||
: make_fd_output_port(rktio_std_fd(RKTIO_STDOUT), scheme_intern_symbol("stdout"), 0, 0,
|
||||
: make_fd_output_port(rktio_std_fd(scheme_rktio, RKTIO_STDOUT), scheme_intern_symbol("stdout"), 0,
|
||||
-1, stdout_refcount));
|
||||
|
||||
scheme_orig_stderr_port = (scheme_make_stderr
|
||||
? scheme_make_stderr()
|
||||
: make_fd_output_port(rktio_std_fd(RKTIO_STDERR), scheme_intern_symbol("stderr"), 0, 0,
|
||||
: make_fd_output_port(rktio_std_fd(scheme_rktio, RKTIO_STDERR), scheme_intern_symbol("stderr"), 0,
|
||||
MZ_FLUSH_ALWAYS, stderr_refcount));
|
||||
|
||||
#ifdef MZ_FDS
|
||||
if (!scheme_current_place_id) {
|
||||
adj_refcount(stdin_refcount, -1);
|
||||
adj_refcount(stdout_refcount, -1);
|
||||
adj_refcount(stderr_refcount, -1);
|
||||
}
|
||||
#endif
|
||||
|
||||
flush_out = SCHEME_TRUEP(scheme_terminal_port_p(1, &scheme_orig_stdout_port));
|
||||
flush_err = SCHEME_TRUEP(scheme_terminal_port_p(1, &scheme_orig_stderr_port));
|
||||
|
@ -517,7 +503,7 @@ void scheme_add_fd_handle(void *h, void *fds, int repost)
|
|||
|
||||
void scheme_add_fd_nosleep(void *fds)
|
||||
{
|
||||
rktio_poll_set_nosleep(scheme_rktio, fds);
|
||||
rktio_poll_set_add_nosleep(scheme_rktio, fds);
|
||||
}
|
||||
|
||||
void scheme_add_fd_eventmask(void *fds, int mask)
|
||||
|
@ -3288,10 +3274,8 @@ scheme_file_stream_port_p (int argc, Scheme_Object *argv[])
|
|||
|
||||
if (SAME_OBJ(ip->sub_type, file_input_port_type))
|
||||
return scheme_true;
|
||||
#ifdef MZ_FDS
|
||||
else if (SAME_OBJ(ip->sub_type, fd_input_port_type))
|
||||
return scheme_true;
|
||||
#endif
|
||||
} else if (SCHEME_OUTPUT_PORTP(p)) {
|
||||
Scheme_Output_Port *op;
|
||||
|
||||
|
@ -3299,10 +3283,8 @@ scheme_file_stream_port_p (int argc, Scheme_Object *argv[])
|
|||
|
||||
if (SAME_OBJ(op->sub_type, file_output_port_type))
|
||||
return scheme_true;
|
||||
#ifdef MZ_FDS
|
||||
else if (SAME_OBJ(op->sub_type, fd_output_port_type))
|
||||
return scheme_true;
|
||||
#endif
|
||||
} else {
|
||||
scheme_wrong_contract("file-stream-port?", "port?", 0, argc, argv);
|
||||
}
|
||||
|
@ -3352,7 +3334,7 @@ int scheme_get_port_file_descriptor(Scheme_Object *p, intptr_t *_fd)
|
|||
return 1;
|
||||
}
|
||||
|
||||
int scheme_get_port_rktio_file_descriptor(Scheme_Object *p, rktio_fd_t *_fd)
|
||||
int scheme_get_port_rktio_file_descriptor(Scheme_Object *p, rktio_fd_t **_fd)
|
||||
{
|
||||
if (SCHEME_INPUT_PORTP(p)) {
|
||||
Scheme_Input_Port *ip;
|
||||
|
@ -3430,9 +3412,9 @@ static int is_fd_terminal(intptr_t fd)
|
|||
rktio_fd_t *rfd;
|
||||
int is_term;
|
||||
|
||||
rfd = rktio_system_fd(fd, RKTIO_OPEN_NOT_REGFILE);
|
||||
rfd = rktio_system_fd(scheme_rktio, fd, RKTIO_OPEN_NOT_REGFILE);
|
||||
is_term = rktio_fd_is_terminal(scheme_rktio, rfd);
|
||||
rktio_fd_forget(rfd);
|
||||
rktio_forget(scheme_rktio, rfd);
|
||||
|
||||
return is_term;
|
||||
}
|
||||
|
@ -3457,12 +3439,10 @@ Scheme_Object *scheme_terminal_port_p(int argc, Scheme_Object *argv[])
|
|||
fd = MSC_IZE(fileno)((FILE *)((Scheme_Input_File *)ip->port_data)->f);
|
||||
fd_ok = 1;
|
||||
}
|
||||
#ifdef MZ_FDS
|
||||
else if (SAME_OBJ(ip->sub_type, fd_input_port_type)) {
|
||||
fd = rktio_fd_to_system_fd(((Scheme_FD *)ip->port_data)->fd);
|
||||
fd = rktio_fd_system_fd(scheme_rktio, ((Scheme_FD *)ip->port_data)->fd);
|
||||
fd_ok = 1;
|
||||
}
|
||||
#endif
|
||||
} else if (SCHEME_OUTPUT_PORTP(p)) {
|
||||
Scheme_Output_Port *op;
|
||||
|
||||
|
@ -3475,12 +3455,10 @@ Scheme_Object *scheme_terminal_port_p(int argc, Scheme_Object *argv[])
|
|||
fd = MSC_IZE (fileno)((FILE *)((Scheme_Output_File *)op->port_data)->f);
|
||||
fd_ok = 1;
|
||||
}
|
||||
#ifdef MZ_FDS
|
||||
else if (SAME_OBJ(op->sub_type, fd_output_port_type)) {
|
||||
fd = rktio_fd_to_system_fd(((Scheme_FD *)op->port_data)->fd);
|
||||
fd = rktio_fd_system_fd(scheme_rktio, ((Scheme_FD *)op->port_data)->fd);
|
||||
fd_ok = 1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (!fd_ok)
|
||||
|
@ -3513,7 +3491,7 @@ static void filename_exn(char *name, char *msg, char *filename, int maybe_module
|
|||
rel = dir ? dir : (drive ? drive : "");
|
||||
post = dir ? "" : "";
|
||||
|
||||
if (maybe_module_errno && (err == maybe_module_errno)) {
|
||||
if (maybe_module_errno && scheme_last_error_is_racket(maybe_module_errno)) {
|
||||
mod_path = scheme_get_param(scheme_current_config(), MZCONFIG_CURRENT_MODULE_LOAD_PATH);
|
||||
if (SCHEME_TRUEP(mod_path)) {
|
||||
if (SCHEME_STXP(mod_path)) {
|
||||
|
@ -3561,7 +3539,7 @@ scheme_do_open_input_file(char *name, int offset, int argc, Scheme_Object *argv[
|
|||
int internal, int for_module)
|
||||
{
|
||||
char *filename;
|
||||
int regfile, i;
|
||||
int i;
|
||||
int m_set = 0, mm_set = 0, text_mode = 0;
|
||||
rktio_fd_t *fd;
|
||||
|
||||
|
@ -3616,8 +3594,8 @@ scheme_do_open_input_file(char *name, int offset, int argc, Scheme_Object *argv[
|
|||
if (!internal)
|
||||
scheme_custodian_check_available(NULL, name, "file-stream");
|
||||
|
||||
fd = rktio_open(filename, (RKTIO_OPEN_READ
|
||||
| (text_mode ? RKTIO_OPEN_TEXT : 0)));
|
||||
fd = rktio_open(scheme_rktio, filename, (RKTIO_OPEN_READ
|
||||
| (text_mode ? RKTIO_OPEN_TEXT : 0)));
|
||||
|
||||
if (!fd) {
|
||||
filename_exn(name, "cannot open input file", filename, RKTIO_ERROR_DOES_NOT_EXIST);
|
||||
|
@ -3636,6 +3614,7 @@ scheme_do_open_output_file(char *name, int offset, int argc, Scheme_Object *argv
|
|||
char *filename;
|
||||
char mode[4];
|
||||
int typepos;
|
||||
rktio_fd_t *fd;
|
||||
|
||||
mode[0] = 'w';
|
||||
mode[1] = 'b';
|
||||
|
@ -3738,9 +3717,9 @@ scheme_do_open_output_file(char *name, int offset, int argc, Scheme_Object *argv
|
|||
|
||||
scheme_custodian_check_available(NULL, name, "file-stream");
|
||||
|
||||
fd = rktio_open(filename, (RKTIO_OPEN_WRITE
|
||||
| (and_read ? RKTIO_OPEN_READ : 0)
|
||||
| ((mode[1] == 't') ? RKTIO_OPEN_TEXT : 0)));
|
||||
fd = rktio_open(scheme_rktio, filename, (RKTIO_OPEN_WRITE
|
||||
| (and_read ? RKTIO_OPEN_READ : 0)
|
||||
| ((mode[1] == 't') ? RKTIO_OPEN_TEXT : 0)));
|
||||
|
||||
if (!fd) {
|
||||
if (scheme_last_error_is_racket(RKTIO_ERROR_EXISTS)) {
|
||||
|
@ -3943,9 +3922,6 @@ do_file_position(const char *who, int argc, Scheme_Object *argv[], int can_false
|
|||
errno);
|
||||
}
|
||||
} else if (fd) {
|
||||
intptr_t lv;
|
||||
int errid = 0;
|
||||
|
||||
if (!SCHEME_INPUT_PORTP(argv[0])) {
|
||||
flush_fd(scheme_output_port_record(argv[0]), NULL, 0, 0, 0, 0);
|
||||
}
|
||||
|
@ -3953,7 +3929,7 @@ do_file_position(const char *who, int argc, Scheme_Object *argv[], int can_false
|
|||
if (!rktio_set_file_position(scheme_rktio, fd, nll,
|
||||
((whence == SEEK_SET)
|
||||
? RKTIO_POSITION_FROM_START
|
||||
: RKTIO_POSITION_FROM__END))) {
|
||||
: RKTIO_POSITION_FROM_END))) {
|
||||
scheme_raise_exn(MZEXN_FAIL_FILESYSTEM,
|
||||
"file-position: position change failed on stream\n"
|
||||
" system error: %R");
|
||||
|
@ -4049,12 +4025,12 @@ do_file_position(const char *who, int argc, Scheme_Object *argv[], int can_false
|
|||
Scheme_Input_Port *ip;
|
||||
ip = scheme_input_port_record(argv[0]);
|
||||
pll -= ((Scheme_FD *)ip->port_data)->bufcount;
|
||||
if (rktio_fd_is_text_converted(fd)) {
|
||||
if (rktio_fd_is_text_converted(scheme_rktio, fd)) {
|
||||
/* Correct for CRLF->LF conversion of buffer content */
|
||||
int bp, bd;
|
||||
bd = ((Scheme_FD *)ip->port_data)->buffpos;
|
||||
for (bp = ((Scheme_FD *)ip->port_data)->bufcount; bp--; ) {
|
||||
if (ip->bufwidths[bp + bd]) {
|
||||
if (((Scheme_FD *)ip->port_data)->bufwidths[bp + bd]) {
|
||||
/* this is a LF converted from CRLF */
|
||||
pll--;
|
||||
}
|
||||
|
@ -4106,7 +4082,7 @@ Scheme_Object *scheme_file_truncate(int argc, Scheme_Object *argv[])
|
|||
mzlonglong nll;
|
||||
Scheme_Output_Port *op;
|
||||
rktio_fd_t *fd;
|
||||
int errid;
|
||||
int free_fd = 0, ok;
|
||||
|
||||
if (!SCHEME_OUTPUT_PORTP(argv[0])
|
||||
|| SCHEME_FALSEP(scheme_file_stream_port_p(1, argv)))
|
||||
|
@ -4125,22 +4101,28 @@ Scheme_Object *scheme_file_truncate(int argc, Scheme_Object *argv[])
|
|||
op = scheme_output_port_record(argv[0]);
|
||||
|
||||
if (SAME_OBJ(op->sub_type, file_output_port_type)) {
|
||||
fd = MSC_IZE (fileno)((FILE *)((Scheme_Output_File *)op->port_data)->f);
|
||||
intptr_t sfd;
|
||||
sfd = MSC_IZE (fileno)((FILE *)((Scheme_Output_File *)op->port_data)->f);
|
||||
fd = rktio_system_fd(scheme_rktio, sfd, RKTIO_OPEN_NOT_REGFILE);
|
||||
free_fd = 1;
|
||||
} else if (SAME_OBJ(op->sub_type, fd_output_port_type)) {
|
||||
fd = ((Scheme_FD *)op->port_data)->fd;
|
||||
} else
|
||||
return scheme_void;
|
||||
|
||||
errid = -1;
|
||||
flush_fd(scheme_output_port_record(argv[0]), NULL, 0, 0, 0, 0);
|
||||
|
||||
ok = rktio_set_file_size(scheme_rktio, fd, nll);
|
||||
|
||||
if (free_fd) rktio_forget(scheme_rktio, fd);
|
||||
|
||||
if (!rktio_set_file_size(scheme_rktio, fd, nll)) {
|
||||
if (!ok) {
|
||||
scheme_raise_exn(MZEXN_FAIL_FILESYSTEM,
|
||||
"file-truncate: size change failed\n"
|
||||
" system error: %R");
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return scheme_void;
|
||||
}
|
||||
|
||||
intptr_t scheme_set_file_position(Scheme_Object *port, intptr_t pos)
|
||||
|
@ -4275,11 +4257,11 @@ Scheme_Object *scheme_file_try_lock(int argc, Scheme_Object **argv)
|
|||
check_already_closed("port-try-file-lock?", argv[0]);
|
||||
|
||||
if (!rfd) {
|
||||
rfd = scheme_system_fd(scheme_rktio, fd, RKTIO_OPEN_READ | RKTIO_OPEN_WRITE);
|
||||
r = rktio_file_lock_try(scheme_rktio, rfd, write);
|
||||
rfd = rktio_system_fd(scheme_rktio, fd, RKTIO_OPEN_READ | RKTIO_OPEN_WRITE | RKTIO_OPEN_NOT_REGFILE);
|
||||
r = rktio_file_lock_try(scheme_rktio, rfd, writer);
|
||||
rktio_forget(scheme_rktio, rfd);
|
||||
} else
|
||||
r = rktio_file_lock_try(scheme_rktio, rfd, write);
|
||||
r = rktio_file_lock_try(scheme_rktio, rfd, writer);
|
||||
|
||||
if (r == RKTIO_LOCK_ACQUIRED)
|
||||
return scheme_true;
|
||||
|
@ -4307,11 +4289,11 @@ Scheme_Object *scheme_file_unlock(int argc, Scheme_Object **argv)
|
|||
check_already_closed("port-file-unlock", argv[0]);
|
||||
|
||||
if (!rfd) {
|
||||
rfd = scheme_system_fd(scheme_rktio, fd, RKTIO_OPEN_READ | RKTIO_OPEN_WRITE);
|
||||
r = rktio_file_unlock(scheme_rktio, rfd, write);
|
||||
rfd = rktio_system_fd(scheme_rktio, fd, RKTIO_OPEN_READ | RKTIO_OPEN_WRITE | RKTIO_OPEN_NOT_REGFILE);
|
||||
r = rktio_file_unlock(scheme_rktio, rfd);
|
||||
rktio_forget(scheme_rktio, rfd);
|
||||
} else
|
||||
r = rktio_file_unlock(rktio, fd);
|
||||
r = rktio_file_unlock(scheme_rktio, rfd);
|
||||
|
||||
if (!r) {
|
||||
scheme_raise_exn(MZEXN_FAIL_FILESYSTEM,
|
||||
|
@ -4329,15 +4311,12 @@ Scheme_Object *scheme_file_unlock(int argc, Scheme_Object **argv)
|
|||
Scheme_Object *scheme_filesystem_change_evt(Scheme_Object *path, int flags, int signal_errs)
|
||||
{
|
||||
char *filename;
|
||||
int ok = 0;
|
||||
rktio_fs_change_t *rfc;
|
||||
|
||||
filename = scheme_expand_string_filename(path,
|
||||
"filesystem-change-evt",
|
||||
NULL,
|
||||
SCHEME_GUARD_FILE_EXISTS);
|
||||
fd = 0;
|
||||
|
||||
rfc = rktio_fs_change(scheme_rktio, filename);
|
||||
|
||||
if (!rfc) {
|
||||
|
@ -4383,8 +4362,8 @@ void scheme_filesystem_change_evt_cancel(Scheme_Object *evt, void *ignored_data)
|
|||
static int filesystem_change_evt_ready(Scheme_Object *evt, Scheme_Schedule_Info *sinfo)
|
||||
{
|
||||
Scheme_Filesystem_Change_Evt *fc = (Scheme_Filesystem_Change_Evt *)evt;
|
||||
|
||||
if (!fc->rfd)
|
||||
|
||||
if (!fc->rfc)
|
||||
return 1;
|
||||
|
||||
if (rktio_poll_fs_change_ready(scheme_rktio, fc->rfc))
|
||||
|
@ -4393,7 +4372,7 @@ static int filesystem_change_evt_ready(Scheme_Object *evt, Scheme_Schedule_Info
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void filesystem_change_evt_need_wakeup (Scheme_Object *evt, void *fds)
|
||||
static void filesystem_change_evt_need_wakeup(Scheme_Object *evt, void *fds)
|
||||
{
|
||||
Scheme_Filesystem_Change_Evt *fc = (Scheme_Filesystem_Change_Evt *)evt;
|
||||
|
||||
|
@ -4558,7 +4537,7 @@ fd_byte_ready (Scheme_Input_Port *port)
|
|||
{
|
||||
Scheme_FD *fip = (Scheme_FD *)port->port_data;
|
||||
|
||||
if (fip->regfile || port->closed)
|
||||
if (port->closed || rktio_fd_is_regular_file(scheme_rktio, fip->fd))
|
||||
return 1;
|
||||
|
||||
if (fip->bufcount)
|
||||
|
@ -4606,7 +4585,7 @@ static intptr_t fd_get_string_slow(Scheme_Input_Port *port,
|
|||
if (nonblock > 0)
|
||||
return 0;
|
||||
|
||||
sema = scheme_fd_to_semaphore(fip->fd, MZFD_CREATE_READ, 0);
|
||||
sema = scheme_rktio_fd_to_semaphore(fip->fd, MZFD_CREATE_READ);
|
||||
|
||||
if (sema)
|
||||
scheme_wait_sema(sema, nonblock ? -1 : 0);
|
||||
|
@ -4762,9 +4741,9 @@ fd_close_input(Scheme_Input_Port *port)
|
|||
|
||||
rc = adj_refcount(fip->refcount, -1);
|
||||
if (!rc) {
|
||||
rktio_close(fip->fd);
|
||||
rktio_close(scheme_rktio, fip->fd);
|
||||
} else {
|
||||
rktio_forget(fip->fd);
|
||||
rktio_forget(scheme_rktio, fip->fd);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4794,7 +4773,7 @@ make_fd_input_port(rktio_fd_t *fd, Scheme_Object *name, int *refcount, int inter
|
|||
{
|
||||
Scheme_Input_Port *ip;
|
||||
Scheme_FD *fip;
|
||||
unsigned char *bfr;
|
||||
char *bfr;
|
||||
int start_closed = 0;
|
||||
|
||||
fip = MALLOC_ONE_RT(Scheme_FD);
|
||||
|
@ -4802,7 +4781,7 @@ make_fd_input_port(rktio_fd_t *fd, Scheme_Object *name, int *refcount, int inter
|
|||
fip->type = scheme_rt_input_fd;
|
||||
#endif
|
||||
|
||||
bfr = (unsigned char *)scheme_malloc_atomic(MZPORT_FD_BUFFSIZE);
|
||||
bfr = (char *)scheme_malloc_atomic(MZPORT_FD_BUFFSIZE);
|
||||
fip->buffer = bfr;
|
||||
if (rktio_fd_is_text_converted(scheme_rktio, fd)) {
|
||||
char *bws;
|
||||
|
@ -4818,7 +4797,7 @@ make_fd_input_port(rktio_fd_t *fd, Scheme_Object *name, int *refcount, int inter
|
|||
if (!adj_refcount(refcount, 1)) {
|
||||
/* fd is already closed! */
|
||||
start_closed = 1;
|
||||
rktio_fd_forget(fd);
|
||||
rktio_forget(scheme_rktio, fd);
|
||||
fip->fd = NULL;
|
||||
}
|
||||
}
|
||||
|
@ -4859,7 +4838,7 @@ scheme_make_fd_input_port(int fd, Scheme_Object *name, int regfile, int textmode
|
|||
| (regfile
|
||||
? RKTIO_OPEN_REGFILE
|
||||
: RKTIO_OPEN_NOT_REGFILE)
|
||||
| (textmode ? RKTIO_OPEN_TEXT)));
|
||||
| (textmode ? RKTIO_OPEN_TEXT : 0)));
|
||||
|
||||
return make_fd_input_port(rfd, name, NULL, 0);
|
||||
}
|
||||
|
@ -5000,7 +4979,7 @@ fd_write_ready (Scheme_Object *port)
|
|||
if (op->closed)
|
||||
return 1;
|
||||
|
||||
if (rktio_poll_write_ready(scheme_rktio, fop->fd);
|
||||
return rktio_poll_write_ready(scheme_rktio, fop->fd);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -5009,7 +4988,10 @@ fd_write_need_wakeup(Scheme_Object *port, void *fds)
|
|||
Scheme_Output_Port *op;
|
||||
Scheme_FD *fop;
|
||||
|
||||
rktio_poll_add(scheme_rktio, fds, fop->fd, RKTIO_POLL_WRITE);
|
||||
op = scheme_output_port_record(port);
|
||||
fop = (Scheme_FD *)op->port_data;
|
||||
|
||||
rktio_poll_add(scheme_rktio, fop->fd, fds, RKTIO_POLL_WRITE);
|
||||
}
|
||||
|
||||
static void release_flushing_lock(void *_fop)
|
||||
|
@ -5060,9 +5042,8 @@ static intptr_t flush_fd(Scheme_Output_Port *op,
|
|||
|
||||
while (1) {
|
||||
intptr_t len;
|
||||
int errsaved, full_write_buffer;
|
||||
|
||||
len = rktio_write(scheme_rktio, fop->fd, bufstr + offset, amt);
|
||||
len = rktio_write(scheme_rktio, fop->fd, bufstr + offset, buflen - offset);
|
||||
|
||||
if (!len) {
|
||||
/* Need to block; remember that we're holding a lock. */
|
||||
|
@ -5073,7 +5054,7 @@ static intptr_t flush_fd(Scheme_Output_Port *op,
|
|||
return wrote;
|
||||
}
|
||||
|
||||
sema = scheme_fd_to_semaphore(fop->fd, MZFD_CREATE_WRITE, 0);
|
||||
sema = scheme_rktio_fd_to_semaphore(fop->fd, MZFD_CREATE_WRITE);
|
||||
|
||||
BEGIN_ESCAPEABLE(release_flushing_lock, fop);
|
||||
if (sema)
|
||||
|
@ -5088,12 +5069,11 @@ static intptr_t flush_fd(Scheme_Output_Port *op,
|
|||
if (scheme_force_port_closed) {
|
||||
/* Don't signal exn or wait. Just give up. */
|
||||
return wrote;
|
||||
} else else {
|
||||
} else {
|
||||
fop->flushing = 0;
|
||||
scheme_raise_exn(MZEXN_FAIL_FILESYSTEM,
|
||||
"error writing to stream port\n"
|
||||
" system error: %R",
|
||||
errsaved);
|
||||
" system error: %R");
|
||||
return 0; /* doesn't get here */
|
||||
}
|
||||
} else if ((len + offset == buflen) || immediate_only) {
|
||||
|
@ -5215,7 +5195,7 @@ static int end_fd_flush_done(Scheme_Object *fop)
|
|||
|
||||
static void end_fd_flush_needs_wakeup(Scheme_Object *fop, void *fds)
|
||||
{
|
||||
rktio_poll_add(scheme_rktio, fds, ((Scheme_FD *)fop)->fd, RKTIO_POLL_FLUSH);
|
||||
rktio_poll_add(scheme_rktio, ((Scheme_FD *)fop)->fd, fds, RKTIO_POLL_FLUSH);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -5247,9 +5227,9 @@ fd_close_output(Scheme_Output_Port *port)
|
|||
rc = adj_refcount(fop->refcount, -1);
|
||||
if (fop->fd) {
|
||||
if (!rc)
|
||||
rktio_close(scheme_rktio, (HANDLE)fop->fd);
|
||||
rktio_close(scheme_rktio, fop->fd);
|
||||
else
|
||||
rktio_fd_forget(scheme_rktio, (HANDLE)fop->fd);
|
||||
rktio_forget(scheme_rktio, fop->fd);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5282,7 +5262,7 @@ static Scheme_Object *
|
|||
make_fd_output_port(rktio_fd_t *fd, Scheme_Object *name, int and_read, int flush_mode, int *refcount)
|
||||
{
|
||||
Scheme_FD *fop;
|
||||
unsigned char *bfr;
|
||||
char *bfr;
|
||||
Scheme_Object *the_port, *fh;
|
||||
int start_closed = 0;
|
||||
|
||||
|
@ -5291,7 +5271,7 @@ make_fd_output_port(rktio_fd_t *fd, Scheme_Object *name, int and_read, int flush
|
|||
fop->type = scheme_rt_input_fd;
|
||||
#endif
|
||||
|
||||
bfr = (unsigned char *)scheme_malloc_atomic(MZPORT_FD_BUFFSIZE);
|
||||
bfr = (char *)scheme_malloc_atomic(MZPORT_FD_BUFFSIZE);
|
||||
fop->buffer = bfr;
|
||||
|
||||
fop->fd = fd;
|
||||
|
@ -5299,7 +5279,7 @@ make_fd_output_port(rktio_fd_t *fd, Scheme_Object *name, int and_read, int flush
|
|||
|
||||
if (flush_mode > -1) {
|
||||
fop->flush = flush_mode;
|
||||
} else if (is_fd_terminal(fd)) {
|
||||
} else if (rktio_fd_is_terminal(scheme_rktio, fd)) {
|
||||
/* Line-buffering for terminal: */
|
||||
fop->flush = MZ_FLUSH_BY_LINE;
|
||||
} else {
|
||||
|
@ -5342,7 +5322,7 @@ make_fd_output_port(rktio_fd_t *fd, Scheme_Object *name, int and_read, int flush
|
|||
rc = malloc_refcount(1, 1);
|
||||
fop->refcount = rc;
|
||||
a[1] = the_port;
|
||||
a[0] = make_fd_input_port(fd, name, regfile, win_textmode, rc, 0);
|
||||
a[0] = make_fd_input_port(fd, name, rc, 0);
|
||||
return scheme_values(2, a);
|
||||
} else
|
||||
return the_port;
|
||||
|
@ -5371,7 +5351,7 @@ scheme_make_fd_output_port(int fd, Scheme_Object *name, int regfile, int textmod
|
|||
rfd = rktio_system_fd(scheme_rktio,
|
||||
fd,
|
||||
(RKTIO_OPEN_WRITE
|
||||
| (regefile ? RKTIO_OPEN_REGFILE : RKTIO_OPEN_NOT_REGFILE)
|
||||
| (regfile ? RKTIO_OPEN_REGFILE : RKTIO_OPEN_NOT_REGFILE)
|
||||
| (read_too ? RKTIO_OPEN_READ : 0)
|
||||
| (textmode ? RKTIO_OPEN_TEXT : 0)));
|
||||
|
||||
|
@ -5737,7 +5717,7 @@ static void subp_needs_wakeup(Scheme_Object *so, void *fds)
|
|||
Scheme_Subprocess *sp = (Scheme_Subprocess*)so;
|
||||
|
||||
if (sp->proc)
|
||||
rktio_poll_add_process(rktio_t *rktio, sp->proc, fds);
|
||||
rktio_poll_add_process(scheme_rktio, sp->proc, fds);
|
||||
}
|
||||
|
||||
static Scheme_Object *subprocess_status(int argc, Scheme_Object **argv)
|
||||
|
@ -5760,7 +5740,7 @@ static Scheme_Object *subprocess_status(int argc, Scheme_Object **argv)
|
|||
free(st);
|
||||
return scheme_intern_symbol("running");
|
||||
} else {
|
||||
int status = st->status;
|
||||
int status = st->result;
|
||||
free(st);
|
||||
child_mref_done(sp);
|
||||
return scheme_make_integer_value(status);
|
||||
|
@ -5791,6 +5771,7 @@ static Scheme_Object *subprocess_wait(int argc, Scheme_Object **argv)
|
|||
static Scheme_Object *do_subprocess_kill(Scheme_Object *_sp, Scheme_Object *killp, int can_error)
|
||||
{
|
||||
Scheme_Subprocess *sp = (Scheme_Subprocess *)_sp;
|
||||
int ok;
|
||||
|
||||
if (!sp->proc)
|
||||
return scheme_void;
|
||||
|
@ -5830,6 +5811,8 @@ static Scheme_Object *subprocess_kill(int argc, Scheme_Object **argv)
|
|||
|
||||
static Scheme_Object *subprocess_pid(int argc, Scheme_Object **argv)
|
||||
{
|
||||
intptr_t pid;
|
||||
|
||||
if (!SAME_TYPE(SCHEME_TYPE(argv[0]), scheme_subprocess_type))
|
||||
scheme_wrong_contract("subprocess-pid", "subprocess?", 0, argc, argv);
|
||||
|
||||
|
@ -5881,14 +5864,17 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
|||
Scheme_Object *errport;
|
||||
Scheme_Object *a[4];
|
||||
Scheme_Subprocess *subproc;
|
||||
Scheme_Object *cust_mode;
|
||||
Scheme_Object *cust_mode, *current_dir;
|
||||
int flags = 0;
|
||||
rktio_fd_t *stdout_fd = NULL;
|
||||
rktio_fd_t *stdin_fd = NULL;
|
||||
rktio_fd_t *stderr_fd = NULL;
|
||||
int need_forget_out = 0, need_forget_in = 0, need_forget_err = 0;
|
||||
int need_forget_out = 0, need_forget_in = 0, need_forget_err = 0, new_process_group = 0;
|
||||
rktio_envvars_t *envvars;
|
||||
rktio_process_result_t *result;
|
||||
Scheme_Config *config;
|
||||
int argc;
|
||||
char **argv, *command;
|
||||
|
||||
/*--------------------------------------------*/
|
||||
/* Sort out ports (create later if necessary) */
|
||||
|
@ -5904,7 +5890,7 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
|||
if (SAME_OBJ(op->sub_type, file_output_port_type)) {
|
||||
int tmp;
|
||||
tmp = MSC_IZE(fileno)(((Scheme_Output_File *)op->port_data)->f);
|
||||
stdout_fd = rktio_system_fd(tmp, RKTIO_OPEN_WRITE | RKTIO_NOT_REGFILE);
|
||||
stdout_fd = rktio_system_fd(scheme_rktio, tmp, RKTIO_OPEN_WRITE | RKTIO_OPEN_NOT_REGFILE);
|
||||
need_forget_out = 1;
|
||||
} else if (SAME_OBJ(op->sub_type, fd_output_port_type))
|
||||
stdout_fd = ((Scheme_FD *)op->port_data)->fd;
|
||||
|
@ -5922,7 +5908,7 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
|||
if (SAME_OBJ(ip->sub_type, file_input_port_type)) {
|
||||
int tmp;
|
||||
tmp = MSC_IZE(fileno)(((Scheme_Input_File *)ip->port_data)->f);
|
||||
stdin_fd = rktio_system_fd(tmp, RKTIO_OPEN_READ | RKTIO_NOT_REGFILE);
|
||||
stdin_fd = rktio_system_fd(scheme_rktio, tmp, RKTIO_OPEN_READ | RKTIO_OPEN_NOT_REGFILE);
|
||||
need_forget_in = 1;
|
||||
} else if (SAME_OBJ(ip->sub_type, fd_input_port_type))
|
||||
stdin_fd = ((Scheme_FD *)ip->port_data)->fd;
|
||||
|
@ -5943,7 +5929,7 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
|||
if (SAME_OBJ(op->sub_type, file_output_port_type)) {
|
||||
int tmp;
|
||||
tmp = MSC_IZE(fileno)(((Scheme_Output_File *)op->port_data)->f);
|
||||
stderr_fd = rktio_system_fd(tmp, RKTIO_OPEN_WRITE | RKTIO_NOT_REGFILE);
|
||||
stderr_fd = rktio_system_fd(scheme_rktio, tmp, RKTIO_OPEN_WRITE | RKTIO_OPEN_NOT_REGFILE);
|
||||
need_forget_err = 1;
|
||||
} else if (SAME_OBJ(op->sub_type, fd_output_port_type))
|
||||
stderr_fd = ((Scheme_FD *)op->port_data)->fd;
|
||||
|
@ -5958,7 +5944,8 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
|||
/* Sort out arguments */
|
||||
/*--------------------------------------*/
|
||||
|
||||
argv = MALLOC_N(char *, c - 3 + 1);
|
||||
argc = c - 3;
|
||||
argv = MALLOC_N(char *, argc);
|
||||
{
|
||||
char *ef;
|
||||
ef = scheme_expand_string_filename(args[3],
|
||||
|
@ -5994,6 +5981,7 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
|||
"exact command", 1, args[5],
|
||||
NULL);
|
||||
} else {
|
||||
int i;
|
||||
for (i = 4; i < c; i++) {
|
||||
if (((!SCHEME_CHAR_STRINGP(args[i]) && !SCHEME_BYTE_STRINGP(args[i]))
|
||||
|| scheme_any_string_has_null(args[i]))
|
||||
|
@ -6009,7 +5997,6 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
|||
argv[i - 3] = SCHEME_BYTE_STR_VAL(bs);
|
||||
}
|
||||
}
|
||||
argv[c - 3] = NULL;
|
||||
}
|
||||
|
||||
command = argv[0];
|
||||
|
@ -6021,9 +6008,11 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
|||
/* Create subprocess */
|
||||
/*--------------------------------------*/
|
||||
|
||||
cust_mode = scheme_get_param(scheme_current_config(), MZCONFIG_SUBPROC_GROUP_ENABLED);
|
||||
config = scheme_current_config();
|
||||
|
||||
cust_mode = scheme_get_param(config, MZCONFIG_SUBPROC_GROUP_ENABLED);
|
||||
new_process_group = SCHEME_TRUEP(cust_mode);
|
||||
cust_mode = scheme_get_param(scheme_current_config(), MZCONFIG_SUBPROC_CUSTODIAN_MODE);
|
||||
cust_mode = scheme_get_param(config, MZCONFIG_SUBPROC_CUSTODIAN_MODE);
|
||||
|
||||
if (SCHEME_SYMBOLP(cust_mode)
|
||||
&& !strcmp(SCHEME_SYM_VAL(cust_mode), "kill")
|
||||
|
@ -6032,7 +6021,7 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
|||
|
||||
current_dir = scheme_get_param(config, MZCONFIG_CURRENT_DIRECTORY);
|
||||
|
||||
envvars = environment_variables_to_envvars(scheme_get_param(config, MZCONFIG_CURRENT_ENV_VARS));
|
||||
envvars = scheme_environment_variables_to_envvars(scheme_get_param(config, MZCONFIG_CURRENT_ENV_VARS));
|
||||
|
||||
result = rktio_process(scheme_rktio,
|
||||
command, argc, argv,
|
||||
|
@ -6042,7 +6031,7 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
|||
unix_turn_off_timer);
|
||||
|
||||
if (envvars)
|
||||
rktio_envvars_free(envvars);
|
||||
rktio_envvars_free(scheme_rktio, envvars);
|
||||
|
||||
if (!result) {
|
||||
scheme_raise_exn(MZEXN_FAIL,
|
||||
|
@ -6059,7 +6048,7 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
|||
if (result->stdout_fd)
|
||||
in = make_fd_input_port(result->stdout_fd, scheme_intern_symbol("subprocess-stdout"), NULL, 0);
|
||||
if (result->stdin_fd)
|
||||
out = make_fd_output_port(result_stdin_fd, scheme_intern_symbol("subprocess-stdin"), 0, -1, NULL);
|
||||
out = make_fd_output_port(result->stdin_fd, scheme_intern_symbol("subprocess-stdin"), 0, -1, NULL);
|
||||
if (result->stderr_fd)
|
||||
err = (err ? err : make_fd_input_port(result->stderr_fd, scheme_intern_symbol("subprocess-stderr"), NULL, 0));
|
||||
|
||||
|
@ -6069,7 +6058,7 @@ static Scheme_Object *subprocess(int c, Scheme_Object *args[])
|
|||
|
||||
subproc = MALLOC_ONE_TAGGED(Scheme_Subprocess);
|
||||
subproc->so.type = scheme_subprocess_type;
|
||||
subproc->proc = result->proc;
|
||||
subproc->proc = result->process;
|
||||
scheme_add_finalizer(subproc, close_subprocess_handle, NULL);
|
||||
|
||||
if (SCHEME_TRUEP(cust_mode)) {
|
||||
|
@ -6215,10 +6204,10 @@ static Scheme_Object *sch_shell_execute(int c, Scheme_Object *argv[])
|
|||
|
||||
void scheme_reserve_file_descriptor(void)
|
||||
{
|
||||
#ifdef USE_FD_PORTS
|
||||
#ifndef DOS_FILE_SYSTEM
|
||||
if (!fd_reserved) {
|
||||
the_fd = open("/dev/null", O_RDONLY);
|
||||
if (the_fd != -1)
|
||||
the_fd = rktio_open(scheme_rktio, "/dev/null", RKTIO_OPEN_READ);
|
||||
if (the_fd)
|
||||
fd_reserved = 1;
|
||||
}
|
||||
#endif
|
||||
|
@ -6226,9 +6215,9 @@ void scheme_reserve_file_descriptor(void)
|
|||
|
||||
void scheme_release_file_descriptor(void)
|
||||
{
|
||||
#ifdef USE_FD_PORTS
|
||||
#ifndef DOS_FILE_SYSTEM
|
||||
if (fd_reserved) {
|
||||
close(the_fd);
|
||||
rktio_close(scheme_rktio, the_fd);
|
||||
fd_reserved = 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -6238,6 +6227,11 @@ void scheme_release_file_descriptor(void)
|
|||
/* sleeping */
|
||||
/*========================================================================*/
|
||||
|
||||
static void default_sleep(float v, void *fds)
|
||||
{
|
||||
rktio_sleep(scheme_rktio, v, fds, scheme_semaphore_fd_set);
|
||||
}
|
||||
|
||||
void scheme_signal_received_at(void *h)
|
||||
XFORM_SKIP_PROC
|
||||
/* Ensure that Racket wakes up if asleep. */
|
||||
|
@ -6248,7 +6242,7 @@ void scheme_signal_received_at(void *h)
|
|||
void *scheme_get_signal_handle()
|
||||
XFORM_SKIP_PROC
|
||||
{
|
||||
return (void *)rktio_signal_received(scheme_rktio);
|
||||
return (void *)rktio_get_signal_handle(scheme_rktio);
|
||||
}
|
||||
|
||||
void scheme_signal_received(void)
|
||||
|
@ -6352,6 +6346,7 @@ static void scheme_stop_itimer_thread()
|
|||
#ifdef USE_PTHREAD_THREAD_TIMER
|
||||
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
typedef struct ITimer_Data {
|
||||
int itimer;
|
||||
int state;
|
||||
|
@ -6493,6 +6488,37 @@ static void kickoff_itimer(intptr_t usec)
|
|||
setitimer(ITIMER_PROF, &t, &old);
|
||||
}
|
||||
|
||||
static void unix_turn_off_timer(void)
|
||||
XFORM_SKIP_PROC
|
||||
{
|
||||
/* Turn off the timer. */
|
||||
struct itimerval t, old;
|
||||
sigset_t sigs;
|
||||
|
||||
t.it_value.tv_sec = 0;
|
||||
t.it_value.tv_usec = 0;
|
||||
t.it_interval.tv_sec = 0;
|
||||
t.it_interval.tv_usec = 0;
|
||||
|
||||
setitimer(ITIMER_PROF, &t, &old);
|
||||
|
||||
/* Clear already-queued PROF signal, if any: */
|
||||
sigemptyset(&sigs);
|
||||
while (!sigpending(&sigs)) {
|
||||
if (sigismember(&sigs, SIGPROF)) {
|
||||
sigprocmask(SIG_SETMASK, NULL, &sigs);
|
||||
sigdelset(&sigs, SIGPROF);
|
||||
sigsuspend(&sigs);
|
||||
sigemptyset(&sigs);
|
||||
} else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void unix_turn_off_timer(void) { }
|
||||
|
||||
#endif
|
||||
|
||||
void scheme_kickoff_green_thread_time_slice_timer(intptr_t usec) {
|
||||
|
@ -6512,16 +6538,6 @@ void scheme_kill_green_thread_timer()
|
|||
#elif defined(USE_WIN32_THREAD_TIMER)
|
||||
scheme_stop_itimer_thread();
|
||||
#endif
|
||||
|
||||
#if defined(FILES_HAVE_FDS)
|
||||
# ifndef USE_OSKIT_CONSOLE
|
||||
close(external_event_fd);
|
||||
close(put_external_event_fd);
|
||||
# endif
|
||||
#endif
|
||||
#ifdef WIN32_FD_HANDLES
|
||||
CloseHandle((HANDLE)scheme_break_semaphore);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef OS_X
|
||||
|
@ -6613,10 +6629,7 @@ void scheme_end_sleeper_thread()
|
|||
pt_sema_wait(&done_sema);
|
||||
|
||||
/* Clear external event flag */
|
||||
if (external_event_fd) {
|
||||
char buf[10];
|
||||
read(external_event_fd, buf, 10);
|
||||
}
|
||||
rktio_flush_signals_received(scheme_rktio);
|
||||
}
|
||||
|
||||
#ifdef MZ_PRECISE_GC
|
||||
|
@ -6775,13 +6788,7 @@ static void register_traversers(void)
|
|||
GC_REG_TRAV(scheme_rt_input_file, mark_input_file);
|
||||
GC_REG_TRAV(scheme_rt_output_file, mark_output_file);
|
||||
|
||||
#ifdef MZ_FDS
|
||||
GC_REG_TRAV(scheme_rt_input_fd, mark_input_fd);
|
||||
#endif
|
||||
|
||||
#if defined(UNIX_PROCESSES) && !defined(MZ_PLACES_WAITPID)
|
||||
GC_REG_TRAV(scheme_rt_system_child, mark_system_child);
|
||||
#endif
|
||||
|
||||
GC_REG_TRAV(scheme_subprocess_type, mark_subprocess);
|
||||
GC_REG_TRAV(scheme_write_evt_type, mark_read_write_evt);
|
||||
|
|
|
@ -6154,7 +6154,7 @@ Scheme_Object *scheme_load_delayed_code(int _which, Scheme_Load_Delay *_delay_in
|
|||
scheme_release_file_descriptor();
|
||||
|
||||
a[0] = delay_info->path;
|
||||
port = scheme_do_open_input_file("on-demand-loader", 0, 1, a, 1, NULL, NULL, 0);
|
||||
port = scheme_do_open_input_file("on-demand-loader", 0, 1, a, 1, 0);
|
||||
|
||||
savebuf = scheme_current_thread->error_buf;
|
||||
scheme_current_thread->error_buf = &newbuf;
|
||||
|
|
|
@ -4354,7 +4354,7 @@ Scheme_Object *scheme_terminal_port_p(int, Scheme_Object *[]);
|
|||
Scheme_Object *scheme_do_open_input_file(char *name, int offset, int argc, Scheme_Object *argv[],
|
||||
int internal, int for_module);
|
||||
Scheme_Object *scheme_do_open_output_file(char *name, int offset, int argc, Scheme_Object *argv[], int and_read,
|
||||
int internal, char **err, int *eerrno);
|
||||
int internal);
|
||||
Scheme_Object *scheme_file_position(int argc, Scheme_Object *argv[]);
|
||||
Scheme_Object *scheme_file_position_star(int argc, Scheme_Object *argv[]);
|
||||
Scheme_Object *scheme_file_truncate(int argc, Scheme_Object *argv[]);
|
||||
|
@ -4366,7 +4366,8 @@ Scheme_Object *scheme_file_unlock(int argc, Scheme_Object **argv);
|
|||
void scheme_reserve_file_descriptor(void);
|
||||
void scheme_release_file_descriptor(void);
|
||||
|
||||
int scheme_get_port_rktio_file_descriptor(Scheme_Object *p, struct rktio_fd_t *_fd);
|
||||
struct rktio_fd_t;
|
||||
int scheme_get_port_rktio_file_descriptor(Scheme_Object *p, struct rktio_fd_t **_fd);
|
||||
|
||||
void scheme_fs_change_properties(int *_supported, int *_scalable, int *_low_latency, int *_file_level);
|
||||
|
||||
|
@ -4433,7 +4434,8 @@ void scheme_release_fd_semaphores(void);
|
|||
void scheme_check_fd_semaphores(void);
|
||||
Scheme_Object *scheme_rktio_fd_to_semaphore(struct rktio_fd_t *fd, int mode);
|
||||
|
||||
rktio_envvars_t *scheme_environment_variables_to_envvars(Scheme_Object *ev);
|
||||
struct rktio_envvars_t;
|
||||
struct rktio_envvars_t *scheme_environment_variables_to_envvars(Scheme_Object *ev);
|
||||
|
||||
/*========================================================================*/
|
||||
/* memory debugging */
|
||||
|
|
|
@ -2490,6 +2490,7 @@ rktio_envvars_t *scheme_environment_variables_to_envvars(Scheme_Object *ev)
|
|||
Scheme_Hash_Tree *ht = SCHEME_ENVVARS_TABLE(ev);
|
||||
rktio_envvars_t *envvars;
|
||||
mzlonglong i;
|
||||
Scheme_Object *key, *val;
|
||||
|
||||
if (!ht)
|
||||
return NULL;
|
||||
|
|
|
@ -3814,9 +3814,11 @@ static Scheme_Object *call_as_nested_thread(int argc, Scheme_Object *argv[])
|
|||
/* thread scheduling and termination */
|
||||
/*========================================================================*/
|
||||
|
||||
static int check_fd_semaphores();
|
||||
|
||||
void scheme_init_fd_semaphores(void)
|
||||
{
|
||||
scheme_semaphore_fd_set = rktio_open_ltps(scheme_rktio);
|
||||
scheme_semaphore_fd_set = rktio_ltps_open(scheme_rktio);
|
||||
}
|
||||
|
||||
void scheme_release_fd_semaphores(void)
|
||||
|
@ -3824,7 +3826,7 @@ void scheme_release_fd_semaphores(void)
|
|||
if (scheme_semaphore_fd_set) {
|
||||
rktio_ltps_remove_all(scheme_rktio, scheme_semaphore_fd_set);
|
||||
(void)check_fd_semaphores();
|
||||
rktio_ltps_close(scheme_semaphore_fd_set);
|
||||
rktio_ltps_close(scheme_rktio, scheme_semaphore_fd_set);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3837,32 +3839,32 @@ static void log_fd_semaphore_error()
|
|||
"error for long-term poll set: %R");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Scheme_Object *scheme_fd_to_semaphore(intptr_t fd, int mode, int is_socket)
|
||||
{
|
||||
rktio_fd_t *rfd;
|
||||
Scheme_Object *sema;
|
||||
|
||||
if (!scheme_semaphore_fd_mapping)
|
||||
if (!scheme_semaphore_fd_set)
|
||||
return NULL;
|
||||
|
||||
rfd = rktio_system_fd(fd, (RKTIO_OPEN_READ
|
||||
| RKTIO_OPEN_WRITE
|
||||
| (is_socket ? RKTIO_OPEN_SOCKET : 0)));
|
||||
rfd = rktio_system_fd(scheme_rktio, fd, (RKTIO_OPEN_READ
|
||||
| RKTIO_OPEN_WRITE
|
||||
| (is_socket ? RKTIO_OPEN_SOCKET : 0)));
|
||||
|
||||
sema = scheme_rktio_fd_to_semaphore(rfd, mode);
|
||||
|
||||
rktio_forget(rfd);
|
||||
rktio_forget(scheme_rktio, rfd);
|
||||
|
||||
return sema;
|
||||
}
|
||||
|
||||
Scheme_Object *scheme_rktio_fd_to_semaphore(rktio_fd_t *fd, int mode)
|
||||
{
|
||||
rktio_handle_t *h;
|
||||
rktio_ltps_handle_t *h;
|
||||
void **ib;
|
||||
|
||||
if (!scheme_semaphore_fd_mapping)
|
||||
if (!scheme_semaphore_fd_set)
|
||||
return NULL;
|
||||
|
||||
switch(mode) {
|
||||
|
@ -3883,7 +3885,7 @@ Scheme_Object *scheme_rktio_fd_to_semaphore(rktio_fd_t *fd, int mode)
|
|||
break;
|
||||
}
|
||||
|
||||
h = rktio_ltps_add(scheme_rktio, scheme_semaphore_fd_mapping, fd, mode);
|
||||
h = rktio_ltps_add(scheme_rktio, scheme_semaphore_fd_set, fd, mode);
|
||||
|
||||
if (!h) {
|
||||
if (scheme_last_error_is_racket(RKTIO_ERROR_LTPS_REMOVED)
|
||||
|
@ -3898,16 +3900,18 @@ Scheme_Object *scheme_rktio_fd_to_semaphore(rktio_fd_t *fd, int mode)
|
|||
ib = rktio_ltps_handle_get_data(scheme_rktio, h);
|
||||
if (!ib) {
|
||||
ib = scheme_malloc_immobile_box(scheme_make_sema(0));
|
||||
rktio_ltps_handle_set_data(scheme_rktio, ib);
|
||||
rktio_ltps_handle_set_data(scheme_rktio, h, ib);
|
||||
}
|
||||
|
||||
return *(Scheme_Object **)p;
|
||||
return *(Scheme_Object **)ib;
|
||||
}
|
||||
|
||||
static int check_fd_semaphores()
|
||||
{
|
||||
rktio_ltps_handle_t *h;
|
||||
int did = 0;
|
||||
void *p;
|
||||
Scheme_Object *sema;
|
||||
|
||||
if (!scheme_semaphore_fd_set)
|
||||
return 0;
|
||||
|
@ -3915,7 +3919,6 @@ static int check_fd_semaphores()
|
|||
while (1) {
|
||||
h = rktio_ltps_get_signaled_handle(scheme_rktio, scheme_semaphore_fd_set);
|
||||
if (h) {
|
||||
void *p;
|
||||
p = rktio_ltps_handle_get_data(scheme_rktio, h);
|
||||
free(h);
|
||||
|
||||
|
@ -3997,10 +4000,6 @@ static int check_sleep(int need_activity, int sleep_now)
|
|||
{
|
||||
Scheme_Thread *p, *p2;
|
||||
int end_with_act;
|
||||
#if defined(USING_FDS)
|
||||
DECL_FDSET(set, 3);
|
||||
fd_set *set1, *set2;
|
||||
#endif
|
||||
void *fds;
|
||||
|
||||
if (scheme_no_stack_overflow)
|
||||
|
@ -4099,12 +4098,12 @@ static int check_sleep(int need_activity, int sleep_now)
|
|||
}
|
||||
|
||||
if (needs_sleep_cancelled) {
|
||||
rktio_poll_set_close(scheme_rktio, fds);
|
||||
rktio_poll_set_forget(scheme_rktio, fds);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (post_system_idle()) {
|
||||
rktio_poll_set_close(scheme_rktio, fds);
|
||||
rktio_poll_set_forget(scheme_rktio, fds);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -9045,9 +9044,6 @@ static void get_ready_for_GC()
|
|||
#ifdef WINDOWS_PROCESSES
|
||||
scheme_suspend_remembered_threads();
|
||||
#endif
|
||||
#if defined(UNIX_PROCESSES) && !defined(MZ_PLACES_WAITPID)
|
||||
scheme_block_child_signals(1);
|
||||
#endif
|
||||
|
||||
{
|
||||
GC_CAN_IGNORE void *data;
|
||||
|
@ -9082,9 +9078,6 @@ static void done_with_GC()
|
|||
#ifdef WINDOWS_PROCESSES
|
||||
scheme_resume_remembered_threads();
|
||||
#endif
|
||||
#if defined(UNIX_PROCESSES) && !defined(MZ_PLACES_WAITPID)
|
||||
scheme_block_child_signals(0);
|
||||
#endif
|
||||
|
||||
end_this_gc_time = scheme_get_process_milliseconds();
|
||||
end_this_gc_real_time = scheme_get_inexact_milliseconds();
|
||||
|
|
|
@ -86,7 +86,7 @@ RKTIO_EXTERN rktio_bool_t rktio_fd_is_text_converted(rktio_t *rktio, rktio_fd_t
|
|||
RKTIO_EXTERN int rktio_fd_modes(rktio_t *rktio, rktio_fd_t *rfd);
|
||||
/* Returns all of the recorded mode flags. */
|
||||
|
||||
RKTIO_EXTERN rktio_fd_t *rktio_open(rktio_t *rktio, char *src, int modes);
|
||||
RKTIO_EXTERN rktio_fd_t *rktio_open(rktio_t *rktio, const char *src, int modes);
|
||||
/* Can report `RKTIO_ERROR_DOES_NOT_EXIST` in place of system error,
|
||||
and can report `RKTIO_ERROR_UNSUPPORTED_TEXT_MODE` on Windows:=. */
|
||||
|
||||
|
@ -121,7 +121,7 @@ RKTIO_EXTERN intptr_t rktio_read(rktio_t *rktio, rktio_fd_t *fd, char *buffer, i
|
|||
#define RKTIO_READ_EOF (-1)
|
||||
#define RKTIO_READ_ERROR (-2)
|
||||
|
||||
RKTIO_EXTERN intptr_t rktio_write(rktio_t *rktio, rktio_fd_t *fd, char *buffer, intptr_t len);
|
||||
RKTIO_EXTERN intptr_t rktio_write(rktio_t *rktio, rktio_fd_t *fd, const char *buffer, intptr_t len);
|
||||
/* Returns the number of bytes written, possibly 0, in non-blocking
|
||||
mode. Alternatively, the result can be `RKTIO_WRITE_ERROR` for an
|
||||
error. Although rktio_write() is intended to write only bytes that
|
||||
|
@ -244,6 +244,14 @@ RKTIO_EXTERN void rktio_connect_stop(rktio_t *rktio, rktio_connect_t *conn);
|
|||
RKTIO_EXTERN rktio_tri_t rktio_poll_connect_ready(rktio_t *rktio, rktio_connect_t *conn);
|
||||
/* Returns one of `RKTIO_POLL_READY`, etc. */
|
||||
|
||||
RKTIO_EXTERN rktio_fd_t *rktio_connect_trying(rktio_t *rktio, rktio_connect_t *conn);
|
||||
/* Returns a file descriptor that `conn` is currently trying, or
|
||||
returns NULL without setting any error. The result file descriptor
|
||||
should not be closed, and may be closed by a `rktio_connect_finish`
|
||||
or `rktio_connect_stop` call (so if you register it in an long-term
|
||||
poll set, unregister it before trying to finish or stop the
|
||||
connection). */
|
||||
|
||||
RKTIO_EXTERN int rktio_socket_shutdown(rktio_t *rktio, rktio_fd_t *rfd, int mode);
|
||||
/* Useful for TCP to report an EOF to the other end. Does not close the socket,
|
||||
but may make it ineligible for forther use.
|
||||
|
@ -262,7 +270,7 @@ RKTIO_EXTERN rktio_ok_t rktio_udp_bind(rktio_t *rktio, rktio_fd_t *rfd, rktio_ad
|
|||
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);
|
||||
const 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. */
|
||||
|
||||
|
@ -293,6 +301,7 @@ RKTIO_EXTERN char **rktio_listener_address(rktio_t *rktio, rktio_listener_t *lnr
|
|||
|
||||
RKTIO_EXTERN char *rktio_udp_multicast_interface(rktio_t *rktio, rktio_fd_t *rfd);
|
||||
RKTIO_EXTERN rktio_ok_t rktio_udp_set_multicast_interface(rktio_t *rktio, rktio_fd_t *rfd, rktio_addrinfo_t *addr);
|
||||
/* The `addr` argument can be NULL to auto-select the interface. */
|
||||
|
||||
RKTIO_EXTERN rktio_ok_t rktio_udp_change_multicast_group(rktio_t *rktio, rktio_fd_t *rfd,
|
||||
rktio_addrinfo_t *group_addr,
|
||||
|
@ -338,8 +347,8 @@ RKTIO_EXTERN rktio_envvars_t *rktio_envvars_copy(rktio_t *rktio, rktio_envvars_t
|
|||
RKTIO_EXTERN void rktio_envvars_free(rktio_t *rktio, rktio_envvars_t *envvars);
|
||||
/* Deallocates an environment-variables record: */
|
||||
|
||||
RKTIO_EXTERN char *rktio_envvars_get(rktio_t *rktio, rktio_envvars_t *envvars, char *name);
|
||||
RKTIO_EXTERN void rktio_envvars_set(rktio_t *rktio, rktio_envvars_t *envvars, char *name, char *value);
|
||||
RKTIO_EXTERN char *rktio_envvars_get(rktio_t *rktio, rktio_envvars_t *envvars, const char *name);
|
||||
RKTIO_EXTERN void rktio_envvars_set(rktio_t *rktio, rktio_envvars_t *envvars, const char *name, const char *value);
|
||||
/* Access/update environment-variables record by name. */
|
||||
|
||||
RKTIO_EXTERN intptr_t rktio_envvars_count(rktio_t *rktio, rktio_envvars_t *envvars);
|
||||
|
@ -413,7 +422,7 @@ RKTIO_EXTERN int rktio_fs_change_properties(rktio_t *rktio);
|
|||
|
||||
typedef struct rktio_fs_change_t rktio_fs_change_t;
|
||||
|
||||
RKTIO_EXTERN rktio_fs_change_t *rktio_fs_change(rktio_t *rktio, char *path);
|
||||
RKTIO_EXTERN rktio_fs_change_t *rktio_fs_change(rktio_t *rktio, const char *path);
|
||||
|
||||
RKTIO_EXTERN void rktio_fs_change_forget(rktio_t *rktio, rktio_fs_change_t *fc);
|
||||
|
||||
|
@ -470,7 +479,7 @@ RKTIO_EXTERN void rktio_poll_set_add_eventmask(rktio_t *rktio, rktio_poll_set_t
|
|||
typedef struct rktio_ltps_t rktio_ltps_t;
|
||||
typedef struct rktio_ltps_handle_t rktio_ltps_handle_t;
|
||||
|
||||
RKTIO_EXTERN rktio_ltps_t *rktio_open_ltps(rktio_t *rktio);
|
||||
RKTIO_EXTERN rktio_ltps_t *rktio_ltps_open(rktio_t *rktio);
|
||||
|
||||
RKTIO_EXTERN int rktio_ltps_close(rktio_t *rktio, rktio_ltps_t *lt);
|
||||
/* Closing will signal all remianing handles and free all signaled
|
||||
|
@ -518,33 +527,33 @@ RKTIO_EXTERN void rktio_sleep(rktio_t *rktio, float nsecs, rktio_poll_set_t *fds
|
|||
/*************************************************/
|
||||
/* Files, directories, and links */
|
||||
|
||||
RKTIO_EXTERN int rktio_file_exists(rktio_t *rktio, char *filename);
|
||||
RKTIO_EXTERN int rktio_directory_exists(rktio_t *rktio, char *dirname);
|
||||
RKTIO_EXTERN int rktio_link_exists(rktio_t *rktio, char *filename);
|
||||
RKTIO_EXTERN int rktio_is_regular_file(rktio_t *rktio, char *filename);
|
||||
RKTIO_EXTERN int rktio_file_exists(rktio_t *rktio, const char *filename);
|
||||
RKTIO_EXTERN int rktio_directory_exists(rktio_t *rktio, const char *dirname);
|
||||
RKTIO_EXTERN int rktio_link_exists(rktio_t *rktio, const char *filename);
|
||||
RKTIO_EXTERN int rktio_is_regular_file(rktio_t *rktio, const char *filename);
|
||||
|
||||
RKTIO_EXTERN rktio_ok_t rktio_delete_file(rktio_t *rktio, char *fn, int enable_write_on_fail);
|
||||
RKTIO_EXTERN rktio_ok_t rktio_delete_file(rktio_t *rktio, const char *fn, int enable_write_on_fail);
|
||||
|
||||
RKTIO_EXTERN rktio_ok_t rktio_rename_file(rktio_t *rktio, char *dest, char *src, int exists_ok);
|
||||
RKTIO_EXTERN rktio_ok_t rktio_rename_file(rktio_t *rktio, const char *dest, const char *src, int exists_ok);
|
||||
/* Can report `RKTIO_ERROR_EXISTS`. */
|
||||
|
||||
RKTIO_EXTERN char *rktio_get_current_directory(rktio_t *rktio);
|
||||
RKTIO_EXTERN rktio_ok_t rktio_set_current_directory(rktio_t *rktio, const char *path);
|
||||
|
||||
RKTIO_EXTERN rktio_ok_t rktio_make_directory(rktio_t *rktio, char *filename);
|
||||
RKTIO_EXTERN rktio_ok_t rktio_make_directory(rktio_t *rktio, const char *filename);
|
||||
/* Can report `RKTIO_ERROR_EXISTS`. */
|
||||
|
||||
RKTIO_EXTERN rktio_ok_t rktio_delete_directory(rktio_t *rktio, char *filename, char *current_directory,
|
||||
RKTIO_EXTERN rktio_ok_t rktio_delete_directory(rktio_t *rktio, const char *filename, const char *current_directory,
|
||||
int enable_write_on_fail);
|
||||
/* The `current_directory` argument is used on Windows to avoid being
|
||||
in `filename` (instead) as a directory while trying to delete it.
|
||||
The `enable_write_on_fail` argument also applied to Windows. */
|
||||
|
||||
RKTIO_EXTERN char *rktio_readlink(rktio_t *rktio, char *fullfilename);
|
||||
RKTIO_EXTERN char *rktio_readlink(rktio_t *rktio, const char *fullfilename);
|
||||
/* Argument should not have a trailing separator. Can report
|
||||
`RKTIO_ERROR_NOT_A_LINK`. */
|
||||
|
||||
RKTIO_EXTERN rktio_ok_t rktio_make_link(rktio_t *rktio, char *src, char *dest,
|
||||
RKTIO_EXTERN rktio_ok_t rktio_make_link(rktio_t *rktio, const char *src, const char *dest,
|
||||
int dest_is_directory);
|
||||
/* The `dest_is_directory` argument is used only
|
||||
on Windows. Can report `RKTIO_ERROR_EXISTS`. */
|
||||
|
@ -554,10 +563,10 @@ RKTIO_EXTERN rktio_ok_t rktio_make_link(rktio_t *rktio, char *src, char *dest,
|
|||
|
||||
typedef intptr_t rktio_timestamp_t;
|
||||
|
||||
RKTIO_EXTERN rktio_filesize_t *rktio_file_size(rktio_t *rktio, char *filename);
|
||||
RKTIO_EXTERN rktio_filesize_t *rktio_file_size(rktio_t *rktio, const char *filename);
|
||||
|
||||
RKTIO_EXTERN rktio_timestamp_t *rktio_get_file_modify_seconds(rktio_t *rktio, char *file);
|
||||
RKTIO_EXTERN rktio_ok_t rktio_set_file_modify_seconds(rktio_t *rktio, char *file, rktio_timestamp_t secs);
|
||||
RKTIO_EXTERN rktio_timestamp_t *rktio_get_file_modify_seconds(rktio_t *rktio, const char *file);
|
||||
RKTIO_EXTERN rktio_ok_t rktio_set_file_modify_seconds(rktio_t *rktio, const char *file, rktio_timestamp_t secs);
|
||||
|
||||
typedef struct {
|
||||
uintptr_t a, b, c;
|
||||
|
@ -565,7 +574,7 @@ typedef struct {
|
|||
} rktio_identity_t;
|
||||
|
||||
RKTIO_EXTERN rktio_identity_t *rktio_fd_identity(rktio_t *rktio, rktio_fd_t *fd);
|
||||
RKTIO_EXTERN rktio_identity_t *rktio_path_identity(rktio_t *rktio, char *path, int follow_links);
|
||||
RKTIO_EXTERN rktio_identity_t *rktio_path_identity(rktio_t *rktio, const char *path, int follow_links);
|
||||
|
||||
/*************************************************/
|
||||
/* Permissions */
|
||||
|
@ -577,11 +586,11 @@ RKTIO_EXTERN rktio_identity_t *rktio_path_identity(rktio_t *rktio, char *path, i
|
|||
|
||||
#define RKTIO_PERMISSION_ERROR (-1)
|
||||
|
||||
RKTIO_EXTERN int rktio_get_file_or_directory_permissions(rktio_t *rktio, char *filename, int all_bits);
|
||||
RKTIO_EXTERN int rktio_get_file_or_directory_permissions(rktio_t *rktio, const char *filename, int all_bits);
|
||||
/* Result is `RKTIO_PERMISSION_ERROR` for error, otherwise a combination of
|
||||
bits. If not `all_bits`, then use constants above. */
|
||||
|
||||
RKTIO_EXTERN rktio_ok_t rktio_set_file_or_directory_permissions(rktio_t *rktio, char *filename, int new_bits);
|
||||
RKTIO_EXTERN rktio_ok_t rktio_set_file_or_directory_permissions(rktio_t *rktio, const char *filename, int new_bits);
|
||||
/* The `new_bits` format corresponds to `all_bits` for getting permissions.
|
||||
Can report `RKTIO_ERROR_BAD_PERMISSION` for bits that make no sense. */
|
||||
|
||||
|
@ -590,8 +599,8 @@ RKTIO_EXTERN rktio_ok_t rktio_set_file_or_directory_permissions(rktio_t *rktio,
|
|||
|
||||
typedef struct rktio_directory_list_t rktio_directory_list_t;
|
||||
|
||||
RKTIO_EXTERN rktio_directory_list_t *rktio_directory_list_start(rktio_t *rktio, char *filename);
|
||||
/* On Windows, the given `filename` must be normalized and not have
|
||||
RKTIO_EXTERN rktio_directory_list_t *rktio_directory_list_start(rktio_t *rktio, const char *dirname);
|
||||
/* On Windows, the given `dirname` must be normalized and not have
|
||||
`.` or `..`: */
|
||||
|
||||
RKTIO_EXTERN char *rktio_directory_list_step(rktio_t *rktio, rktio_directory_list_t *dl);
|
||||
|
@ -612,7 +621,7 @@ RKTIO_EXTERN char **rktio_filesystem_root_list(rktio_t *rktio);
|
|||
|
||||
typedef struct rktio_file_copy_t rktio_file_copy_t;
|
||||
|
||||
RKTIO_EXTERN rktio_file_copy_t *rktio_copy_file_start(rktio_t *rktio, char *dest, char *src,
|
||||
RKTIO_EXTERN rktio_file_copy_t *rktio_copy_file_start(rktio_t *rktio, const char *dest, const char *src,
|
||||
rktio_bool_t exists_ok);
|
||||
/* Can report `RKTIO_ERROR_EXISTS`. */
|
||||
|
||||
|
@ -638,7 +647,7 @@ enum {
|
|||
RKTIO_PATH_INIT_FILE
|
||||
};
|
||||
|
||||
RKTIO_EXTERN char *rktio_expand_user_tilde(rktio_t *rktio, char *filename);
|
||||
RKTIO_EXTERN char *rktio_expand_user_tilde(rktio_t *rktio, const char *filename);
|
||||
/* Path must start with tilde, otherwise `RKTIO_ERROR_NO_TILDE`.
|
||||
Other possible errors are `RKTIO_ERROR_ILL_FORMED_USER` and
|
||||
`RKTIO_ERROR_UNKNOWN_USER`. */
|
||||
|
@ -653,6 +662,7 @@ RKTIO_EXTERN void rktio_signal_received_at(rktio_signal_handle_t *h);
|
|||
RKTIO_EXTERN void rktio_signal_received(rktio_t *rktio);
|
||||
|
||||
RKTIO_EXTERN void rktio_wait_until_signal_received(rktio_t *rktio);
|
||||
RKTIO_EXTERN void rktio_flush_signals_received(rktio_t *rktio);
|
||||
|
||||
#ifdef RKTIO_SYSTEM_UNIX
|
||||
RKTIO_EXTERN int rktio_signal_handle_to_fd();
|
||||
|
|
|
@ -278,7 +278,7 @@ char *rktio_envvars_value_ref(rktio_t *rktio, rktio_envvars_t *envvars, intptr_t
|
|||
return MSC_IZE(strdup)(envvars->vals[i]);
|
||||
}
|
||||
|
||||
char *rktio_envvars_get(rktio_t *rktio, rktio_envvars_t *envvars, char *name)
|
||||
char *rktio_envvars_get(rktio_t *rktio, rktio_envvars_t *envvars, const char *name)
|
||||
{
|
||||
intptr_t i;
|
||||
|
||||
|
@ -290,7 +290,7 @@ char *rktio_envvars_get(rktio_t *rktio, rktio_envvars_t *envvars, char *name)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void rktio_envvars_set(rktio_t *rktio, rktio_envvars_t *envvars, char *name, char *value)
|
||||
void rktio_envvars_set(rktio_t *rktio, rktio_envvars_t *envvars, const char *name, const char *value)
|
||||
{
|
||||
intptr_t i, j;
|
||||
|
||||
|
|
|
@ -938,7 +938,7 @@ static void WindowsFDICleanup(Win_FD_Input_Thread *th)
|
|||
/* writing */
|
||||
/*========================================================================*/
|
||||
|
||||
intptr_t rktio_write(rktio_t *rktio, rktio_fd_t *rfd, char *buffer, intptr_t len)
|
||||
intptr_t rktio_write(rktio_t *rktio, rktio_fd_t *rfd, const char *buffer, intptr_t len)
|
||||
{
|
||||
#ifdef RKTIO_SYSTEM_UNIX
|
||||
int flags, errsaved;
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
/* Opening a file */
|
||||
/*========================================================================*/
|
||||
|
||||
static rktio_fd_t *open_read(rktio_t *rktio, char *filename)
|
||||
static rktio_fd_t *open_read(rktio_t *rktio, const char *filename)
|
||||
{
|
||||
#ifdef RKTIO_SYSTEM_UNIX
|
||||
int fd;
|
||||
|
@ -95,7 +95,7 @@ static rktio_fd_t *open_read(rktio_t *rktio, char *filename)
|
|||
#endif
|
||||
}
|
||||
|
||||
static rktio_fd_t *open_write(rktio_t *rktio, char *filename, int modes)
|
||||
static rktio_fd_t *open_write(rktio_t *rktio, const char *filename, int modes)
|
||||
{
|
||||
#ifdef RKTIO_SYSTEM_UNIX
|
||||
int fd;
|
||||
|
@ -255,7 +255,7 @@ static rktio_fd_t *open_write(rktio_t *rktio, char *filename, int modes)
|
|||
#endif
|
||||
}
|
||||
|
||||
rktio_fd_t *rktio_open(rktio_t *rktio, char *filename, int modes)
|
||||
rktio_fd_t *rktio_open(rktio_t *rktio, const char *filename, int modes)
|
||||
{
|
||||
if (modes & RKTIO_OPEN_WRITE)
|
||||
return open_write(rktio, filename, modes);
|
||||
|
|
|
@ -498,7 +498,7 @@ static int UNC_stat(rktio_t *rktio, const char *dirname, int *flags, int *isdir,
|
|||
}
|
||||
#endif
|
||||
|
||||
int rktio_file_exists(rktio_t *rktio, char *filename)
|
||||
int rktio_file_exists(rktio_t *rktio, const char *filename)
|
||||
/* Windows: check for special filenames before calling */
|
||||
{
|
||||
# ifdef NO_STAT_PROC
|
||||
|
@ -530,7 +530,7 @@ int rktio_file_exists(rktio_t *rktio, char *filename)
|
|||
# endif
|
||||
}
|
||||
|
||||
int rktio_directory_exists(rktio_t *rktio, char *dirname)
|
||||
int rktio_directory_exists(rktio_t *rktio, const char *dirname)
|
||||
{
|
||||
# ifdef NO_STAT_PROC
|
||||
return 0;
|
||||
|
@ -555,7 +555,7 @@ int rktio_directory_exists(rktio_t *rktio, char *dirname)
|
|||
# endif
|
||||
}
|
||||
|
||||
int rktio_is_regular_file(rktio_t *rktio, char *filename)
|
||||
int rktio_is_regular_file(rktio_t *rktio, const char *filename)
|
||||
/* Windows: check for special filenames before calling */
|
||||
{
|
||||
# ifdef NO_STAT_PROC
|
||||
|
@ -574,7 +574,7 @@ int rktio_is_regular_file(rktio_t *rktio, char *filename)
|
|||
# endif
|
||||
}
|
||||
|
||||
int rktio_link_exists(rktio_t *rktio, char *filename)
|
||||
int rktio_link_exists(rktio_t *rktio, const char *filename)
|
||||
{
|
||||
#ifdef RKTIO_SYSTEM_WINDOWS
|
||||
{
|
||||
|
@ -666,7 +666,7 @@ int rktio_set_current_directory(rktio_t *rktio, const char *path)
|
|||
return !err;
|
||||
}
|
||||
|
||||
static rktio_identity_t *get_identity(rktio_t *rktio, rktio_fd_t *fd, char *path, int follow_links)
|
||||
static rktio_identity_t *get_identity(rktio_t *rktio, rktio_fd_t *fd, const char *path, int follow_links)
|
||||
{
|
||||
uintptr_t devi = 0, inoi = 0, inoi2 = 0;
|
||||
uintptr_t devi_bits = 0, inoi_bits = 0, inoi2_bits = 0;
|
||||
|
@ -761,7 +761,7 @@ rktio_identity_t *rktio_fd_identity(rktio_t *rktio, rktio_fd_t *fd)
|
|||
return get_identity(rktio, fd, NULL, 0);
|
||||
}
|
||||
|
||||
rktio_identity_t *rktio_path_identity(rktio_t *rktio, char *path, int follow_links)
|
||||
rktio_identity_t *rktio_path_identity(rktio_t *rktio, const char *path, int follow_links)
|
||||
{
|
||||
return get_identity(rktio, NULL, path, follow_links);
|
||||
}
|
||||
|
@ -775,7 +775,7 @@ static int enable_write_permission(rktio_t *rktio, const char *fn)
|
|||
}
|
||||
#endif
|
||||
|
||||
int rktio_delete_file(rktio_t *rktio, char *fn, int enable_write_on_fail)
|
||||
int rktio_delete_file(rktio_t *rktio, const char *fn, int enable_write_on_fail)
|
||||
{
|
||||
#ifdef RKTIO_SYSTEM_WINDOWS
|
||||
int errid;
|
||||
|
@ -806,7 +806,7 @@ int rktio_delete_file(rktio_t *rktio, char *fn, int enable_write_on_fail)
|
|||
#endif
|
||||
}
|
||||
|
||||
int rktio_rename_file(rktio_t *rktio, char *dest, char *src, int exists_ok)
|
||||
int rktio_rename_file(rktio_t *rktio, const char *dest, const char *src, int exists_ok)
|
||||
{
|
||||
#ifdef RKTIO_SYSTEM_WINDOWS
|
||||
int errid;
|
||||
|
@ -856,7 +856,7 @@ int rktio_rename_file(rktio_t *rktio, char *dest, char *src, int exists_ok)
|
|||
#endif
|
||||
}
|
||||
|
||||
char *rktio_readlink(rktio_t *rktio, char *fullfilename)
|
||||
char *rktio_readlink(rktio_t *rktio, const char *fullfilename)
|
||||
/* fullfilename must not have a trailing separator */
|
||||
{
|
||||
#ifdef RKTIO_SYSTEM_WINDOWS
|
||||
|
@ -895,22 +895,21 @@ char *rktio_readlink(rktio_t *rktio, char *fullfilename)
|
|||
#endif
|
||||
}
|
||||
|
||||
int rktio_make_directory(rktio_t *rktio, char *filename)
|
||||
int rktio_make_directory(rktio_t *rktio, const char *filename)
|
||||
{
|
||||
#ifdef NO_MKDIR
|
||||
set_racket_error(RKTIO_ERROR_UNSUPPORTED);
|
||||
return 0;
|
||||
#else
|
||||
int len, copied = 0;
|
||||
int len;
|
||||
char *copied = NULL;
|
||||
|
||||
/* Make sure path doesn't have trailing separator: */
|
||||
len = strlen(filename);
|
||||
while (len && IS_A_SEP(filename[len - 1])) {
|
||||
if (!copied) {
|
||||
filename = MSC_IZE(strdup)(filename);
|
||||
copied = 1;
|
||||
}
|
||||
filename[--len] = 0;
|
||||
copied = MSC_IZE(strdup)(filename);
|
||||
copied[--len] = 0;
|
||||
filename = copied;
|
||||
}
|
||||
|
||||
while (1) {
|
||||
|
@ -919,7 +918,7 @@ int rktio_make_directory(rktio_t *rktio, char *filename)
|
|||
, 0777
|
||||
# endif
|
||||
)) {
|
||||
if (copied) free(filename);
|
||||
if (copied) free(copied);
|
||||
return 1;
|
||||
} else if (errno != EINTR)
|
||||
break;
|
||||
|
@ -930,12 +929,12 @@ int rktio_make_directory(rktio_t *rktio, char *filename)
|
|||
else
|
||||
get_posix_error();
|
||||
|
||||
if (copied) free(filename);
|
||||
if (copied) free(copied);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rktio_delete_directory(rktio_t *rktio, char *filename, char *current_directory, int enable_write_on_fail)
|
||||
int rktio_delete_directory(rktio_t *rktio, const char *filename, const char *current_directory, int enable_write_on_fail)
|
||||
{
|
||||
#ifdef RKTIO_SYSTEM_WINDOWS
|
||||
int tried_cwd = 0, tried_perm = 0;
|
||||
|
@ -964,7 +963,7 @@ int rktio_delete_directory(rktio_t *rktio, char *filename, char *current_directo
|
|||
#endif
|
||||
}
|
||||
|
||||
int rktio_make_link(rktio_t *rktio, char *src, char *dest, int dest_is_directory)
|
||||
int rktio_make_link(rktio_t *rktio, const char *src, const char *dest, int dest_is_directory)
|
||||
/* `src` is the file that is written, and `dest` is written to that
|
||||
file */
|
||||
{
|
||||
|
@ -1002,7 +1001,7 @@ int rktio_make_link(rktio_t *rktio, char *src, char *dest, int dest_is_directory
|
|||
#endif
|
||||
}
|
||||
|
||||
rktio_timestamp_t *rktio_get_file_modify_seconds(rktio_t *rktio, char *file)
|
||||
rktio_timestamp_t *rktio_get_file_modify_seconds(rktio_t *rktio, const char *file)
|
||||
{
|
||||
#ifdef RKTIO_SYSTEM_WINDOWS
|
||||
rktio_timestamp_t *secs;
|
||||
|
@ -1028,7 +1027,7 @@ rktio_timestamp_t *rktio_get_file_modify_seconds(rktio_t *rktio, char *file)
|
|||
#endif
|
||||
}
|
||||
|
||||
int rktio_set_file_modify_seconds(rktio_t *rktio, char *file, rktio_timestamp_t secs)
|
||||
int rktio_set_file_modify_seconds(rktio_t *rktio, const char *file, rktio_timestamp_t secs)
|
||||
{
|
||||
while (1) {
|
||||
struct MSC_IZE(utimbuf) ut;
|
||||
|
@ -1091,7 +1090,7 @@ static int user_in_group(rktio_t *rktio, uid_t uid, gid_t gid)
|
|||
}
|
||||
#endif
|
||||
|
||||
int rktio_get_file_or_directory_permissions(rktio_t *rktio, char *filename, int all_bits)
|
||||
int rktio_get_file_or_directory_permissions(rktio_t *rktio, const char *filename, int all_bits)
|
||||
/* -1 result indicates an error */
|
||||
{
|
||||
# ifdef NO_STAT_PROC
|
||||
|
@ -1226,7 +1225,7 @@ int rktio_get_file_or_directory_permissions(rktio_t *rktio, char *filename, int
|
|||
# endif
|
||||
}
|
||||
|
||||
int rktio_set_file_or_directory_permissions(rktio_t *rktio, char *filename, int new_bits)
|
||||
int rktio_set_file_or_directory_permissions(rktio_t *rktio, const char *filename, int new_bits)
|
||||
{
|
||||
# ifdef NO_STAT_PROC
|
||||
set_racket_error(RKTIO_ERROR_UNSUPPORTED);
|
||||
|
@ -1268,7 +1267,7 @@ int rktio_set_file_or_directory_permissions(rktio_t *rktio, char *filename, int
|
|||
# endif
|
||||
}
|
||||
|
||||
rktio_filesize_t *rktio_file_size(rktio_t *rktio, char *filename)
|
||||
rktio_filesize_t *rktio_file_size(rktio_t *rktio, const char *filename)
|
||||
{
|
||||
rktio_filesize_t *sz = NULL;
|
||||
#ifdef RKTIO_SYSTEM_WINDOWS
|
||||
|
@ -1319,7 +1318,7 @@ struct rktio_directory_list_t {
|
|||
FF_TYPE info;
|
||||
};
|
||||
|
||||
rktio_directory_list_t *rktio_directory_list_start(rktio_t *rktio, char *filename)
|
||||
rktio_directory_list_t *rktio_directory_list_start(rktio_t *rktio, const char *filename)
|
||||
/* path must be normalized */
|
||||
{
|
||||
char *pattern;
|
||||
|
@ -1426,7 +1425,7 @@ struct rktio_directory_list_t {
|
|||
DIR *dir;
|
||||
};
|
||||
|
||||
rktio_directory_list_t *rktio_directory_list_start(rktio_t *rktio, char *filename)
|
||||
rktio_directory_list_t *rktio_directory_list_start(rktio_t *rktio, const char *filename)
|
||||
{
|
||||
rktio_directory_list_t *dl;
|
||||
DIR *dir;
|
||||
|
@ -1509,7 +1508,7 @@ struct rktio_file_copy_t {
|
|||
rktio_fd_t *src_fd, *dest_fd;
|
||||
};
|
||||
|
||||
rktio_file_copy_t *rktio_copy_file_start(rktio_t *rktio, char *dest, char *src, int exists_ok)
|
||||
rktio_file_copy_t *rktio_copy_file_start(rktio_t *rktio, const char *dest, const char *src, int exists_ok)
|
||||
{
|
||||
#ifdef RKTIO_SYSTEM_UNIX
|
||||
{
|
||||
|
@ -1694,7 +1693,7 @@ char **rktio_filesystem_root_list(rktio_t *rktio)
|
|||
/* expand user tilde & system paths */
|
||||
/*========================================================================*/
|
||||
|
||||
char *rktio_expand_user_tilde(rktio_t *rktio, char *filename) {
|
||||
char *rktio_expand_user_tilde(rktio_t *rktio, const char *filename) {
|
||||
#ifdef RKTIO_SYSTEM_WINDOWS
|
||||
set_racket_error(RKTIO_ERROR_UNSUPPORTED);
|
||||
return NULL;
|
||||
|
@ -1760,9 +1759,7 @@ char *rktio_expand_user_tilde(rktio_t *rktio, char *filename) {
|
|||
|
||||
free(home);
|
||||
|
||||
filename = naya;
|
||||
|
||||
return filename;
|
||||
return naya;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ int rktio_fs_change_properties(rktio_t *rktio)
|
|||
return flags;
|
||||
}
|
||||
|
||||
rktio_fs_change_t *rktio_fs_change(rktio_t *rktio, char *path)
|
||||
rktio_fs_change_t *rktio_fs_change(rktio_t *rktio, const char *path)
|
||||
{
|
||||
int ok = 0;
|
||||
#ifndef NO_FILESYSTEM_CHANGE_EVTS
|
||||
|
@ -93,7 +93,7 @@ rktio_fs_change_t *rktio_fs_change(rktio_t *rktio, char *path)
|
|||
else {
|
||||
rktio_fd_t *rfd;
|
||||
rfd = rktio_system_fd(rktio, fd, 0);
|
||||
lt = rktio_open_ltps(rktio);
|
||||
lt = rktio_ltps_open(rktio);
|
||||
if (lt)
|
||||
lth = rktio_ltps_add(rktio, lt, rfd, RKTIO_LTPS_CREATE_VNODE);
|
||||
if (!lt || !lth) {
|
||||
|
|
|
@ -94,7 +94,7 @@ void *rktio_ltps_handle_get_data(rktio_t *rktio, rktio_ltps_handle_t *s)
|
|||
|
||||
/*========================================================================*/
|
||||
|
||||
rktio_ltps_t *rktio_open_ltps(rktio_t *rktio)
|
||||
rktio_ltps_t *rktio_ltps_open(rktio_t *rktio)
|
||||
{
|
||||
rktio_ltps_t *lt;
|
||||
|
||||
|
|
|
@ -915,6 +915,18 @@ void rktio_socket_forget_owned(rktio_t *rktio, rktio_fd_t *rfd)
|
|||
#endif
|
||||
}
|
||||
|
||||
int rktio_socket_shutdown(rktio_t *rktio, rktio_fd_t *rfd, int mode)
|
||||
{
|
||||
rktio_socket_t s = rktio_fd_system_fd(rktio, rfd);
|
||||
|
||||
if (!shutdown(s, ((mode == RKTIO_SHUTDOWN_READ) ? SHUT_RD : SHUT_RDWR))) {
|
||||
get_socket_error();
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int rktio_socket_poll_write_ready(rktio_t *rktio, rktio_fd_t *rfd)
|
||||
{
|
||||
#ifdef RKTIO_SYSTEM_UNIX
|
||||
|
@ -1031,7 +1043,7 @@ intptr_t rktio_socket_read(rktio_t *rktio, rktio_fd_t *rfd, char *buffer, intptr
|
|||
}
|
||||
}
|
||||
|
||||
static intptr_t do_socket_write(rktio_t *rktio, rktio_fd_t *rfd, char *buffer, intptr_t len,
|
||||
static intptr_t do_socket_write(rktio_t *rktio, rktio_fd_t *rfd, const char *buffer, intptr_t len,
|
||||
/* for UDP sendto: */
|
||||
rktio_addrinfo_t *addr)
|
||||
{
|
||||
|
@ -1087,7 +1099,7 @@ static intptr_t do_socket_write(rktio_t *rktio, rktio_fd_t *rfd, char *buffer, i
|
|||
}
|
||||
}
|
||||
|
||||
intptr_t rktio_socket_write(rktio_t *rktio, rktio_fd_t *rfd, char *buffer, intptr_t len)
|
||||
intptr_t rktio_socket_write(rktio_t *rktio, rktio_fd_t *rfd, const char *buffer, intptr_t len)
|
||||
{
|
||||
return do_socket_write(rktio, rfd, buffer, len, NULL);
|
||||
}
|
||||
|
@ -1244,6 +1256,11 @@ void rktio_connect_stop(rktio_t *rktio, rktio_connect_t *conn)
|
|||
conn_free(conn);
|
||||
}
|
||||
|
||||
rktio_fd_t *rktio_connect_trying(rktio_t *rktio, rktio_connect_t *conn)
|
||||
{
|
||||
return conn->trying_fd;
|
||||
}
|
||||
|
||||
/*========================================================================*/
|
||||
/* TCP listener and accept */
|
||||
/*========================================================================*/
|
||||
|
@ -1782,7 +1799,7 @@ int rktio_udp_connect(rktio_t *rktio, rktio_fd_t *rfd, rktio_addrinfo_t *addr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
intptr_t rktio_udp_sendto(rktio_t *rktio, rktio_fd_t *rfd, rktio_addrinfo_t *addr, char *buffer, intptr_t len)
|
||||
intptr_t rktio_udp_sendto(rktio_t *rktio, rktio_fd_t *rfd, rktio_addrinfo_t *addr, const char *buffer, intptr_t len)
|
||||
{
|
||||
return do_socket_write(rktio, rfd, buffer, len, addr);
|
||||
}
|
||||
|
|
|
@ -967,7 +967,7 @@ void rktio_signal_received_at(rktio_signal_handle_t *h)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void clear_signal(rktio_t *rktio)
|
||||
void rktio_flush_signals_received(rktio_t *rktio)
|
||||
{
|
||||
#ifdef RKTIO_SYSTEM_UNIX
|
||||
/* Clear external event flag */
|
||||
|
@ -1008,8 +1008,8 @@ void rktio_wait_until_signal_received(rktio_t *rktio)
|
|||
#ifdef RKTIO_SYSTEM_WINDOWS
|
||||
WaitForSingleObject(rktio->break_semaphore, INFINITE);
|
||||
#endif
|
||||
|
||||
clear_signal(rktio);
|
||||
|
||||
rktio_flush_signals_received(rktio);
|
||||
}
|
||||
|
||||
/****************** Windows cleanup *****************/
|
||||
|
@ -1276,5 +1276,5 @@ void rktio_sleep(rktio_t *rktio, float nsecs, rktio_poll_set_t *fds, rktio_ltps_
|
|||
#endif
|
||||
}
|
||||
|
||||
clear_signal(rktio);
|
||||
rktio_flush_signals_received(rktio);
|
||||
}
|
||||
|
|
|
@ -185,7 +185,7 @@ rktio_fd_t *rktio_socket_dup(rktio_t *rktio, rktio_fd_t *rfd);
|
|||
int rktio_socket_poll_write_ready(rktio_t *rktio, rktio_fd_t *rfd);
|
||||
int rktio_socket_poll_read_ready(rktio_t *rktio, rktio_fd_t *rfd);
|
||||
|
||||
intptr_t rktio_socket_write(rktio_t *rktio, rktio_fd_t *rfd, char *buffer, intptr_t len);
|
||||
intptr_t rktio_socket_write(rktio_t *rktio, rktio_fd_t *rfd, const char *buffer, intptr_t len);
|
||||
intptr_t rktio_socket_read(rktio_t *rktio, rktio_fd_t *rfd, char *buffer, intptr_t len);
|
||||
|
||||
void rktio_free_ghbn(rktio_t *rktio);
|
||||
|
|
Loading…
Reference in New Issue
Block a user