]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - net_udp.c
Some stupid Linux machines (i.e. Mandrake) seem to ignore their own network propertie...
[xonotic/darkplaces.git] / net_udp.c
index ae384e1775056b029af412da6f193b970d3263fc..bd4a5de68e6f4dea1943ec8a3869890319859d27 100644 (file)
--- a/net_udp.c
+++ b/net_udp.c
@@ -40,8 +40,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 extern int gethostname (char *, int);
 extern int close (int);
 
-extern cvar_t hostname;
-
 static int net_acceptsocket = -1;              // socket for fielding new connections
 static int net_controlsocket;
 static int net_broadcastsocket = 0;
@@ -66,7 +64,10 @@ int UDP_Init (void)
        // determine my name & address
        gethostname(buff, MAXHOSTNAMELEN);
        local = gethostbyname(buff);
-       myAddr = *(int *)local->h_addr_list[0];
+       if (!local)
+               myAddr = htonl(INADDR_LOOPBACK);  // default to the loopback address
+       else
+               myAddr = *(int *)local->h_addr_list[0];
 
        // if the quake hostname isn't set, set it to the machine name
        if (strcmp(hostname.string, "UNNAMED") == 0)
@@ -79,7 +80,7 @@ int UDP_Init (void)
                Sys_Error("UDP_Init: Unable to open control socket\n");
 
        ((struct sockaddr_in *)&broadcastaddr)->sin_family = AF_INET;
-       ((struct sockaddr_in *)&broadcastaddr)->sin_addr.s_addr = INADDR_BROADCAST;
+       ((struct sockaddr_in *)&broadcastaddr)->sin_addr.s_addr = htonl(INADDR_BROADCAST);
        ((struct sockaddr_in *)&broadcastaddr)->sin_port = htons(net_hostport);
 
        UDP_GetSocketAddr (net_controlsocket, &addr);
@@ -169,7 +170,7 @@ this lets you type only as much of the net address as required, using
 the local network components to fill in the rest
 ============
 */
-static int PartialIPAddress (char *in, struct qsockaddr *hostaddr)
+static int PartialIPAddress (const char *in, struct qsockaddr *hostaddr)
 {
        char buff[256];
        char *b;
@@ -229,6 +230,9 @@ int UDP_Connect (int socket, struct qsockaddr *addr)
 int UDP_CheckNewConnections (void)
 {
        unsigned long   available;
+       struct sockaddr_in      from;
+       socklen_t                       fromlen;
+       char buff[1];
 
        if (net_acceptsocket == -1)
                return -1;
@@ -237,12 +241,27 @@ int UDP_CheckNewConnections (void)
                Sys_Error ("UDP: ioctlsocket (FIONREAD) failed\n");
        if (available)
                return net_acceptsocket;
+       recvfrom (net_acceptsocket, buff, 0, 0, (struct sockaddr *) &from, &fromlen);
        return -1;
 }
 
 //=============================================================================
 
-int UDP_Read (int socket, byte *buf, int len, struct qsockaddr *addr)
+int UDP_Recv (qbyte *buf, int len, struct qsockaddr *addr)
+{
+       return UDP_Read (net_acceptsocket, buf, len, addr);
+}
+
+//=============================================================================
+
+int UDP_Send (qbyte *buf, int len, struct qsockaddr *addr)
+{
+       return UDP_Write (net_acceptsocket, buf, len, addr);
+}
+
+//=============================================================================
+
+int UDP_Read (int socket, qbyte *buf, int len, struct qsockaddr *addr)
 {
        int addrlen = sizeof (struct qsockaddr);
        int ret;
@@ -269,7 +288,7 @@ int UDP_MakeSocketBroadcastCapable (int socket)
 
 //=============================================================================
 
-int UDP_Broadcast (int socket, byte *buf, int len)
+int UDP_Broadcast (int socket, qbyte *buf, int len)
 {
        int ret;
 
@@ -290,7 +309,7 @@ int UDP_Broadcast (int socket, byte *buf, int len)
 
 //=============================================================================
 
-int UDP_Write (int socket, byte *buf, int len, struct qsockaddr *addr)
+int UDP_Write (int socket, qbyte *buf, int len, struct qsockaddr *addr)
 {
        int ret;
 
@@ -302,7 +321,7 @@ int UDP_Write (int socket, byte *buf, int len, struct qsockaddr *addr)
 
 //=============================================================================
 
-char *UDP_AddrToString (struct qsockaddr *addr)
+char *UDP_AddrToString (const struct qsockaddr *addr)
 {
        static char buffer[22];
        int haddr;
@@ -314,7 +333,7 @@ char *UDP_AddrToString (struct qsockaddr *addr)
 
 //=============================================================================
 
-int UDP_StringToAddr (char *string, struct qsockaddr *addr)
+int UDP_StringToAddr (const char *string, struct qsockaddr *addr)
 {
        int ha1, ha2, ha3, ha4, hp;
        int ipaddr;
@@ -347,7 +366,7 @@ int UDP_GetSocketAddr (int socket, struct qsockaddr *addr)
 
 //=============================================================================
 
-int UDP_GetNameFromAddr (struct qsockaddr *addr, char *name)
+int UDP_GetNameFromAddr (const struct qsockaddr *addr, char *name)
 {
        struct hostent *hostentry;
 
@@ -364,7 +383,7 @@ int UDP_GetNameFromAddr (struct qsockaddr *addr, char *name)
 
 //=============================================================================
 
-int UDP_GetAddrFromName(char *name, struct qsockaddr *addr)
+int UDP_GetAddrFromName(const char *name, struct qsockaddr *addr)
 {
        struct hostent *hostentry;
 
@@ -384,7 +403,7 @@ int UDP_GetAddrFromName(char *name, struct qsockaddr *addr)
 
 //=============================================================================
 
-int UDP_AddrCompare (struct qsockaddr *addr1, struct qsockaddr *addr2)
+int UDP_AddrCompare (const struct qsockaddr *addr1, const struct qsockaddr *addr2)
 {
        if (addr1->sa_family != addr2->sa_family)
                return -1;
@@ -412,4 +431,3 @@ int UDP_SetSocketPort (struct qsockaddr *addr, int port)
        return 0;
 }
 
-//=============================================================================