# HG changeset patch # User Mike Pavone # Date 1291590294 18000 # Node ID e9a8269384bbcf817b068b044f8449b2ccb71061 # Parent b75ec364ceccc75a1592d12d86d71cd392c92d2c Add support for opening a new TCP connection and fix bug in Read Delim diff -r b75ec364cecc -r e9a8269384bb net.rhope --- a/net.rhope Sun Dec 05 18:04:19 2010 -0500 +++ b/net.rhope Sun Dec 05 18:04:54 2010 -0500 @@ -18,6 +18,7 @@ { _internal_bindnewsocket[port(Int32,Naked),setreuse(Int32,Naked):socket(Int32,Naked)] _internal_accept[sockfd(Int32,Naked),addrbuf(Array,Raw Pointer,Mutable),buflen(Int32,Naked):consock(Int32,Naked),addrbuf] + _internal_connectnewsocket[addr(Array,Raw Pointer),port(Int32,Naked):sockfd(Int32,Naked)] } Blueprint epoll_event @@ -256,6 +257,17 @@ ]Read Buffer <<[Array[]] } +TCP Connect[address,port:out,err] +{ + addrbuf <- [[Flatten[address]]Buffer >>]Append[0u8] + fd <- _internal_connectnewsocket[addrbuf, port] + err <- If[[fd]=[-1]] {} + { + fcntl[fd, 4i32, 2048i64] + out <- TCP Connection[fd] + } +} + _Write@TCP Connection[con,buffer,wrote:out,err] { @@ -483,7 +495,6 @@ ]Length <<[rbufferlen] ] }{ - If[[[con]Read Buffer >>]Length] { nbuflist <- [buflist]Append[[con]Read Buffer >>] @@ -492,6 +503,7 @@ } ncon <- [con]Read Buffer <<[outbuf] }{ + npoffset <- -1 If[[[con]Read Buffer >>]Length] { nbuflist <- [[buflist]Append[[con]Read Buffer >>]]Append[outbuf] @@ -540,10 +552,26 @@ out <- close[[con]Filedes >>] } +Globals Forever +{ + Wait <- No +} + +_Wait Forever[context:out] uses Forever +{ + Forever::Wait <- context + out <- Yes +} + //This effectively leaks a context and thus any data on the stack of that context //Need either handle cleanup of contexts or find a better way to accomplish this Wait Forever[] { - Pause[Val[?]] + Pause[_Wait Forever[?]] } +Stop Waiting[] uses Forever +{ + Resume[Forever::Wait, Yes] +} + diff -r b75ec364cecc -r e9a8269384bb runtime/net.c --- a/runtime/net.c Sun Dec 05 18:04:19 2010 -0500 +++ b/runtime/net.c Sun Dec 05 18:04:54 2010 -0500 @@ -37,7 +37,7 @@ int sockfd,flag=1; struct addrinfo hints, *localaddr; - snprintf(portstr, 6, "%d", port & 0XFFFF); + snprintf(portstr, 6, "%d", port & 0xFFFF); memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; @@ -63,3 +63,28 @@ return sockfd; } +int _internal_connectnewsocket(char * addr, int32_t port) +{ + char portstr[6]; + struct addrinfo hints, *res; + int sock; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + snprintf(portstr, 6, "%d", port & 0xFFFF); + if(getaddrinfo(addr, portstr, &hints, &res)) + return -1; + if(-1 == (sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol))) + return -1; + + if(connect(sock, res->ai_addr, res->ai_addrlen)) + { + close(sock); + sock = -1; + } + freeaddrinfo(res); + return sock; +} +