X-Git-Url: http://git.meshlink.io/?p=utcp;a=blobdiff_plain;f=utcp.c;h=7591e19554d10a0e076938ebd6db78d0e478e9ab;hp=7c4e5638ab0bbb04bf3e9e29898c5ac093b092a0;hb=1ed9c137140a4896cb0aa07f48dcb7182c8271d3;hpb=fad2787f2394bad3cf105ca5b4cf411db6d34aa6 diff --git a/utcp.c b/utcp.c index 7c4e563..7591e19 100644 --- a/utcp.c +++ b/utcp.c @@ -624,8 +624,9 @@ ssize_t utcp_send(struct utcp_connection *c, const void *data, size_t len) { // Don't send anything yet if the connection has not fully established yet - if (c->state == SYN_SENT || c->state == SYN_RECEIVED) + if(c->state == SYN_SENT || c->state == SYN_RECEIVED) { return len; + } ack(c, false); @@ -1356,12 +1357,14 @@ skip_ack: c->rcv.irs = hdr.seq; c->rcv.nxt = hdr.seq; + if(c->shut_wr) { c->snd.last++; set_state(c, FIN_WAIT_1); } else { set_state(c, ESTABLISHED); } + // TODO: notify application of this somehow. break; @@ -1550,8 +1553,9 @@ int utcp_shutdown(struct utcp_connection *c, int dir) { } // Only process shutting down writes once. - if (c->shut_wr) + if(c->shut_wr) { return 0; + } c->shut_wr = true; @@ -1594,18 +1598,29 @@ int utcp_shutdown(struct utcp_connection *c, int dir) { return 0; } -int utcp_close(struct utcp_connection *c) { - if(utcp_shutdown(c, SHUT_RDWR) && errno != ENOTCONN) { - return -1; +// Closes all the opened connections +void utcp_abort_all_connections(struct utcp *utcp) { + if(!utcp) { + return; } - c->recv = NULL; - c->poll = NULL; - c->reapable = true; - return 0; + for(int i = 0; i < utcp->nconnections; i++) { + struct utcp_connection *c = utcp->connections[i]; + + if(c->recv) { + errno = 0; + c->recv(c, NULL, 0); + } + + if(utcp_reset_connection(c) != -1) { + c->reapable = false; + } + } + + return; } -int utcp_abort(struct utcp_connection *c) { +int utcp_reset_connection(struct utcp_connection *c) { if(!c) { errno = EFAULT; return -1; @@ -1619,7 +1634,6 @@ int utcp_abort(struct utcp_connection *c) { c->recv = NULL; c->poll = NULL; - c->reapable = true; switch(c->state) { case CLOSED: @@ -1658,6 +1672,29 @@ int utcp_abort(struct utcp_connection *c) { return 0; } +int utcp_close(struct utcp_connection *c) { + if(utcp_shutdown(c, SHUT_RDWR) && errno != ENOTCONN) { + return -1; + } + + c->recv = NULL; + c->poll = NULL; + c->reapable = true; + return 0; +} + +int utcp_abort(struct utcp_connection *c) { + int utcp_reset_return; + + utcp_reset_return = utcp_reset_connection(c); + + if(utcp_reset_return != -1) { + c->reapable = true; + } + + return utcp_reset_return; +} + /* Handle timeouts. * One call to this function will loop through all connections, * checking if something needs to be resent or not. @@ -1839,8 +1876,9 @@ size_t utcp_get_sndbuf(struct utcp_connection *c) { } size_t utcp_get_sndbuf_free(struct utcp_connection *c) { - if (!c) + if(!c) { return 0; + } switch(c->state) { case SYN_SENT: