Try to avoid sigpipe errors from tcp connections.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@6337 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2023-01-09 05:14:49 +00:00
parent 62622491f0
commit b2df9b2b30

View file

@ -9415,7 +9415,7 @@ void NET_Shutdown (void)
#ifdef HAVE_EPOLL
#include <poll.h>
#endif
static qboolean VFSTCP_IsStillConnecting(SOCKET sock)
static int VFSTCP_IsStillConnecting(SOCKET sock)
{
#ifdef HAVE_EPOLL
//poll has no arbitrary fd limit. use it instead of select where possible.
@ -9424,7 +9424,13 @@ static qboolean VFSTCP_IsStillConnecting(SOCKET sock)
ourfd[0].events = POLLOUT;
ourfd[0].revents = 0;
if (!poll(ourfd, countof(ourfd), 0))
{
if (ourfd[0].revents & POLLERR)
return VFS_ERROR_UNSPECIFIED;
if (ourfd[0].revents & POLLHUP)
return VFS_ERROR_REFUSED;
return true; //no events yet.
}
#else
//okay on windows where sock+1 is ignored, has issues when lots of other fds are already open (for any reason).
fd_set fdw, fdx;
@ -9468,7 +9474,10 @@ int QDECL VFSTCP_ReadBytes (struct vfsfile_s *file, void *buffer, int bytestorea
if (tf->conpending)
{
if (VFSTCP_IsStillConnecting(tf->sock))
trying = VFSTCP_IsStillConnecting(tf->sock);
if (trying < 0)
tf->readaborted = trying;
else if (trying)
return 0;
tf->conpending = false;
}
@ -9556,7 +9565,14 @@ int QDECL VFSTCP_WriteBytes (struct vfsfile_s *file, const void *buffer, int byt
if (tf->conpending)
{
if (VFSTCP_IsStillConnecting(tf->sock))
len = VFSTCP_IsStillConnecting(tf->sock);
if (len < 0)
{
tf->writeaborted = true;
tf->conpending = false;
return len;
}
if (len)
return 0;
tf->conpending = false;
}