// for Z_Malloc/Z_Free in quake
#ifndef STANDALONETEST
+#include "quakedef.h"
#include "zone.h"
+#include "sys.h"
+#include "netconn.h"
#else
#define Z_Malloc malloc
#define Z_Free free
int LHNETADDRESS_FromPort(lhnetaddress_t *address, int addresstype, int port)
{
+ if (!address)
+ return 0;
switch(addresstype)
{
case LHNETADDRESSTYPE_LOOP:
struct hostent *hostentry;
const char *colon;
char name[128];
+ if (!address || !string)
+ return 0;
memset(address, 0, sizeof(*address));
address->addresstype = LHNETADDRESSTYPE_NONE;
port = 0;
int LHNETADDRESS_ToString(const lhnetaddress_t *address, char *string, int stringbuffersize, int includeport)
{
*string = 0;
+ if (!address || !string || stringbuffersize < 1)
+ return 0;
switch(address->addresstype)
{
default:
int LHNETADDRESS_GetAddressType(const lhnetaddress_t *address)
{
- return address->addresstype;
+ if (address)
+ return address->addresstype;
+ else
+ return LHNETADDRESSTYPE_NONE;
}
int LHNETADDRESS_GetPort(const lhnetaddress_t *address)
{
+ if (!address)
+ return -1;
switch(address->addresstype)
{
case LHNETADDRESSTYPE_LOOP:
int LHNETADDRESS_SetPort(lhnetaddress_t *address, int port)
{
+ if (!address)
+ return 0;
switch(address->addresstype)
{
case LHNETADDRESSTYPE_LOOP:
int LHNETADDRESS_Compare(const lhnetaddress_t *address1, const lhnetaddress_t *address2)
{
+ if (!address1 || !address2)
+ return 1;
if (address1->addresstype != address2->addresstype)
return 1;
switch(address1->addresstype)
int sourceport;
int destinationport;
time_t timeout;
+#ifndef STANDALONETEST
+ double sentdoubletime;
+#endif
struct lhnetpacket_s *next, *prev;
}
lhnetpacket_t;
lhnetsocket_t *LHNET_OpenSocket_Connectionless(lhnetaddress_t *address)
{
lhnetsocket_t *lhnetsocket, *s;
+ if (!address)
+ return NULL;
lhnetsocket = Z_Malloc(sizeof(*lhnetsocket));
if (lhnetsocket)
{
lhnetaddress_t *LHNET_AddressFromSocket(lhnetsocket_t *sock)
{
- return &sock->address;
+ if (sock)
+ return &sock->address;
+ else
+ return NULL;
}
int LHNET_Read(lhnetsocket_t *lhnetsocket, void *content, int maxcontentlength, lhnetaddress_t *address)
{
int value = 0;
+ if (!lhnetsocket || !address || !content || maxcontentlength < 1)
+ return -1;
if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_LOOP)
{
time_t currenttime;
for (p = lhnet_packetlist.next;p != &lhnet_packetlist;p = pnext)
{
pnext = p->next;
+ if (p->timeout < currenttime)
+ {
+ // unlink and free
+ p->next->prev = p->prev;
+ p->prev->next = p->next;
+ Z_Free(p);
+ continue;
+ }
+#ifndef STANDALONETEST
+ if (p->sentdoubletime && Sys_DoubleTime() < p->sentdoubletime)
+ continue;
+#endif
if (value == 0 && p->destinationport == lhnetsocket->address.addressdata.loop.port)
{
if (p->length <= maxcontentlength)
p->prev->next = p->next;
Z_Free(p);
}
- else if (p->timeout < currenttime)
- {
- // unlink and free
- p->next->prev = p->prev;
- p->prev->next = p->next;
- Z_Free(p);
- }
}
}
else if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET4)
{
#ifdef WIN32
int e = WSAGetLastError();
- if (e == WSAEWOULDBLOCK || e == WSAECONNREFUSED)
+ if (e == WSAEWOULDBLOCK)
return 0;
+ switch (e)
+ {
+ case WSAECONNREFUSED:
+ Con_Printf("Connection refused\n");
+ return 0;
+ }
#else
- if (errno == EWOULDBLOCK || errno == ECONNREFUSED)
+ if (errno == EWOULDBLOCK)
return 0;
+ switch (errno)
+ {
+ case ECONNREFUSED:
+ Con_Printf("Connection refused\n");
+ return 0;
+ }
#endif
}
}
{
#ifdef WIN32
int e = WSAGetLastError();
- if (e == WSAEWOULDBLOCK || e == WSAECONNREFUSED)
+ if (e == WSAEWOULDBLOCK)
return 0;
+ switch (e)
+ {
+ case WSAECONNREFUSED:
+ Con_Printf("Connection refused\n");
+ return 0;
+ }
#else
- if (errno == EWOULDBLOCK || errno == ECONNREFUSED)
+ if (errno == EWOULDBLOCK)
return 0;
+ switch (errno)
+ {
+ case ECONNREFUSED:
+ Con_Printf("Connection refused\n");
+ return 0;
+ }
#endif
}
}
int LHNET_Write(lhnetsocket_t *lhnetsocket, const void *content, int contentlength, const lhnetaddress_t *address)
{
int value = -1;
+ if (!lhnetsocket || !address || !content || contentlength < 1)
+ return -1;
if (lhnetsocket->address.addresstype != address->addresstype)
return -1;
if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_LOOP)
p->prev = p->next->prev;
p->next->prev = p;
p->prev->next = p;
+#ifndef STANDALONETEST
+ if (cl_fakelocalping_min.integer || cl_fakelocalping_max.integer)
+ p->sentdoubletime = Sys_DoubleTime() + (cl_fakelocalping_min.integer + ((cl_fakelocalping_max.integer - cl_fakelocalping_min.integer) * (rand() & 255) / 256)) / 1000.0;
+#endif
value = contentlength;
}
else if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET4)