Allow data RX during TCP CLOSE_WAIT state.

Alter GopherDl to close TCP socket on success/failure.
Revert GopherOpen TCP timeout to default.
Change NetLog to no longer be self-focusable. (This way, window manager won't tile it like other windows.)
This commit is contained in:
TomAwezome 2021-11-14 16:33:28 -05:00
parent 8a4fb38873
commit ff564b4fe0
6 changed files with 13 additions and 15 deletions
src
Home/Net
Programs
Protocols/TCP
Utilities
System

View file

@ -37,7 +37,7 @@ I64 GopherOpen(U8 *host, U16 port, U8 *selector, U8 *query)
line = StrPrint(NULL, "%s\t%s\r\n", selector, query);
}
sock(CTCPSocket *)->timeout = TCP_TIMEOUT * 5;
sock(CTCPSocket *)->timeout = TCP_TIMEOUT;
// sendString(sock, line, 0);
TCPSocketSendString(sock, line);
@ -80,6 +80,7 @@ public I64 GopherDl(U8 *host, U16 port = 70, U8 *selector, U8 *query = NULL, U8
}
f->de.size = total_len;
FClose(f);
TCPSocketClose(sock);
return got;
}
data_len += got;
@ -95,6 +96,7 @@ public I64 GopherDl(U8 *host, U16 port = 70, U8 *selector, U8 *query = NULL, U8
}
}
TCPSocketClose(sock);
PrintErr("Write failed, %s may be corrupted\n", dest);
FClose(f);
return -1;

View file

@ -1236,25 +1236,18 @@ I64 TCPSocketReceive(CTCPSocket *tcp_socket, U8 *buffer, I64 length)
timeout = counts.jiffies + tcp_socket->timeout * JIFFY_FREQ / 1000;
while ((tcp_socket->state == TCP_STATE_ESTABLISHED || tcp_socket->state == TCP_STATE_FIN_WAIT1) &&
while ((tcp_socket->state == TCP_STATE_ESTABLISHED ||
tcp_socket->state == TCP_STATE_FIN_WAIT1 ||
tcp_socket->state == TCP_STATE_CLOSE_WAIT) && // allowing receive during closing state
tcp_socket->read_position == tcp_socket->write_position)
{
TCPCheckACKQueue(tcp_socket);
Sleep(1);
if (counts.jiffies > timeout)
{
// if (tcp_socket->timeout != 0) // Don't flood NetLog on non-blocking receives.
// NetErr("TCP SOCKET RECEIVE: Timed out.");
// return -1;
break;
}
}
// Shrine has TODO: Should still be able to receive in closing states ...
if ((tcp_socket->state != TCP_STATE_ESTABLISHED || tcp_socket->state == TCP_STATE_FIN_WAIT1) &&
tcp_socket->read_position == tcp_socket->write_position || length == 0)
return 0;
@ -1643,4 +1636,4 @@ U0 TCPRep()
}
TCPGlobalsInit;
TCPGlobalsInit;

View file

@ -14,6 +14,7 @@ Bool TCPHandleValidSEQ(CTCPSocket *tcp_socket, CTCPHeader *header, U32 segment_s
case TCP_STATE_ESTABLISHED:
case TCP_STATE_FIN_WAIT1:
case TCP_STATE_FIN_WAIT2: // FIN2 check is ommitted in Shrine, yet used in below logic. Adding.
case TCP_STATE_CLOSE_WAIT: // allowing data to be pushed to receive buffer during closing state
NetDebug("TCP HANDLE VALID SEQ: Updating data in receive buffer.");
@ -364,4 +365,4 @@ I64 TCPHandler(CIPV4Packet *packet)
NetDebug("TCP HANDLER: Running TCP HANDLE SOCKET");
TCPHandleSocket(tcp_socket, packet, header, data, length);
}
}

View file

@ -30,6 +30,8 @@ U0 NetLogInit()
WinFocus(net_log_task);
DocPrint(net_log_task->put_doc, "$$WW+H,1$$");
Bts(&net_log_task->win_inhibit, WIf_SELF_FOCUS);
}
U0 NetLog(U8 *format, ...)

View file

@ -16,7 +16,7 @@ U0 LoadDocDefines()
$TR,"LineRep"$
$ID,2$DefinePrint("DD_ZEALOS_LOC","95,264");
$ID,-2$
$ID,-2$
DefinePrint("DD_MP_VECT", "%08X", MP_VECT_ADDR);
DefinePrint("DD_MP_VECT_END", "%08X", MP_VECT_ADDR + COREAP_16BIT_INIT_END - COREAP_16BIT_INIT - 1);

View file

@ -413,7 +413,7 @@ U0 GrUpdateScreen()
GrUpdateTasks;
DCBlotColor8(gr.dc2, gr.dc);
dc=DCAlias(gr.dc2, Fs);
dc = DCAlias(gr.dc2, Fs);
dc->flags |= DCF_ON_TOP;
if (gr.fp_final_screen_update)
(*gr.fp_final_screen_update)(dc);