cvs
Slava Pestov 2004-08-19 23:06:43 +00:00
parent 00c2d5f058
commit ad479d18e9
6 changed files with 41 additions and 21 deletions

View File

@ -1,8 +1,6 @@
- non-blocking client socket
- input style after clicking link
- fedit broken with listener
- maple-like: press enter at old commands to evaluate there
- sending ^C on socket
- read#
- enforce bottom-up in native bootstrap
- fix up native file/line info

View File

@ -88,7 +88,8 @@ USE: unparser
<fd-stream> [ ":" swap unparse cat3 "client" set ] extend ;
: <client> ( host port -- stream )
2dup client-socket <client-stream> ;
#! fflush yields until connection is established.
2dup client-socket <client-stream> dup fflush ;
: accept ( server -- client )
#! Accept a connection from a server socket.

View File

@ -26,11 +26,25 @@ void primitive_can_read_line(void)
/* Return true if something was read */
bool read_step(PORT* port)
{
FIXNUM amount = read(port->fd,
FIXNUM amount = 0;
if(port->type == PORT_RECV)
{
/* try reading OOB data. */
amount = recv(port->fd,
port->buffer + 1,
port->buffer->capacity * 2,
MSG_OOB);
}
if(amount <= 0)
{
amount = read(port->fd,
port->buffer + 1,
port->buffer->capacity * 2);
}
if(amount == -1)
if(amount < 0)
{
if(errno != EAGAIN)
io_error(__FUNCTION__);

View File

@ -231,9 +231,13 @@ CELL next_io_task(void)
if(!reading && !writing)
critical_error("next_io_task() called with no IO tasks",0);
select(read_fd_count > write_fd_count ? read_fd_count : write_fd_count,
&read_fd_set,&write_fd_set,NULL,NULL);
set_up_fd_set(&except_fd_set,
read_fd_count,read_io_tasks);
select(read_fd_count > write_fd_count ? read_fd_count : write_fd_count,
&read_fd_set,&write_fd_set,&except_fd_set,NULL);
for(i = 0; i < read_fd_count; i++) if(FD_ISSET(i,&except_fd_set)) exit(1);/* write(3,"FUBAR\n",6); */
callback = perform_io_tasks(&read_fd_set,read_fd_count,read_io_tasks);
if(callback != F)
return callback;

View File

@ -1,24 +1,27 @@
typedef enum { PORT_READ, PORT_WRITE, PORT_SPECIAL } PORT_MODE;
typedef enum { PORT_READ, PORT_RECV, PORT_WRITE, PORT_SPECIAL } PORT_MODE;
typedef struct {
CELL header;
/* one of PORT_READ or PORT_WRITE */
/* one of PORT_READ, PORT_RECV, PORT_WRITE or PORT_SPECIAL */
PORT_MODE type;
FIXNUM fd;
STRING* buffer;
/* top of buffer */
CELL buf_fill;
/* current read/write position */
CELL buf_pos;
/* tagged partial line used by read_line_fd */
CELL line;
/* is it ready to be returned? */
bool line_ready;
/* tagged client info used by accept_fd */
CELL client_host;
CELL client_port;
/* untagged fd of accepted connection */
CELL client_socket;
/* top of buffer */
CELL buf_fill;
/* current read/write position */
CELL buf_pos;
} PORT;
PORT* untag_port(CELL tagged);

View File

@ -25,8 +25,8 @@ int make_client_socket(const char* hostname, uint16_t port)
if(sock < 0)
io_error(__FUNCTION__);
/* if(fcntl(sock,F_SETFL,O_NONBLOCK,1) == -1)
io_error(__FUNCTION__); */
if(fcntl(sock,F_SETFL,O_NONBLOCK,1) == -1)
io_error(__FUNCTION__);
/* Connect to the server. */
init_sockaddr(&servername,hostname,port);
@ -47,7 +47,7 @@ void primitive_client_socket(void)
uint16_t p = (uint16_t)to_fixnum(dpop());
char* host = to_c_string(untag_string(dpop()));
int sock = make_client_socket(host,p);
dpush(tag_object(port(PORT_READ,sock)));
dpush(tag_object(port(PORT_RECV,sock)));
dpush(tag_object(port(PORT_WRITE,sock)));
}
@ -99,7 +99,7 @@ CELL accept_connection(PORT* p)
struct sockaddr_in clientname;
size_t size = sizeof(clientname);
int oobinline = 1;
/* int oobinline = 1; */
int new = accept(p->fd,(struct sockaddr *)&clientname,&size);
if(new < 0)
@ -110,8 +110,8 @@ CELL accept_connection(PORT* p)
io_error(__FUNCTION__);
}
if(setsockopt(new,SOL_SOCKET,SO_OOBINLINE,&oobinline,sizeof(int)) < 0)
io_error(__FUNCTION__);
/* if(setsockopt(new,SOL_SOCKET,SO_OOBINLINE,&oobinline,sizeof(int)) < 0)
io_error(__FUNCTION__); */
p->client_host = tag_object(from_c_string(inet_ntoa(
clientname.sin_addr)));
@ -126,6 +126,6 @@ void primitive_accept_fd(void)
PORT* p = untag_port(dpop());
dpush(p->client_host);
dpush(p->client_port);
dpush(tag_object(port(PORT_READ,p->client_socket)));
dpush(tag_object(port(PORT_RECV,p->client_socket)));
dpush(tag_object(port(PORT_WRITE,p->client_socket)));
}