]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - net_wins.c
renamed all net_wins.c functions to UDP instead of WINS, this allows use of net_bsd...
[xonotic/darkplaces.git] / net_wins.c
index 0d5265ed4657df7b6f5a4d26aca726e11bb25e67..0468e384dccb21648446a2306da0b275b7f4a2b4 100644 (file)
@@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
 See the GNU General Public License for more details.
 
@@ -22,8 +22,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #include "quakedef.h"
 #include "winquake.h"
 
-extern cvar_t hostname;
-
 #define MAXHOSTNAMELEN         256
 
 static int net_acceptsocket = -1;              // socket for fielding new connections
@@ -33,62 +31,40 @@ static struct qsockaddr broadcastaddr;
 
 static unsigned long myAddr;
 
-qboolean       winsock_lib_initialized;
-
-int (PASCAL FAR *pWSAStartup)(WORD wVersionRequired, LPWSADATA lpWSAData);
-int (PASCAL FAR *pWSACleanup)(void);
-int (PASCAL FAR *pWSAGetLastError)(void);
-SOCKET (PASCAL FAR *psocket)(int af, int type, int protocol);
-int (PASCAL FAR *pioctlsocket)(SOCKET s, long cmd, u_long FAR *argp);
-int (PASCAL FAR *psetsockopt)(SOCKET s, int level, int optname,
-                                                         const char FAR * optval, int optlen);
-int (PASCAL FAR *precvfrom)(SOCKET s, char FAR * buf, int len, int flags,
-                                                       struct sockaddr FAR *from, int FAR * fromlen);
-int (PASCAL FAR *psendto)(SOCKET s, const char FAR * buf, int len, int flags,
-                                                 const struct sockaddr FAR *to, int tolen);
-int (PASCAL FAR *pclosesocket)(SOCKET s);
-int (PASCAL FAR *pgethostname)(char FAR * name, int namelen);
-struct hostent FAR * (PASCAL FAR *pgethostbyname)(const char FAR * name);
-struct hostent FAR * (PASCAL FAR *pgethostbyaddr)(const char FAR * addr,
-                                                                                                 int len, int type);
-int (PASCAL FAR *pgetsockname)(SOCKET s, struct sockaddr FAR *name,
-                                                          int FAR * namelen);
-
-#include "net_wins.h"
-
-int winsock_initialized = 0;
+#include "net_udp.h"
+
 WSADATA                winsockdata;
 
 //=============================================================================
 
 static double  blocktime;
 
-BOOL PASCAL FAR BlockingHook(void)  
-{ 
-    MSG                msg;
-    BOOL       ret;
-       if ((Sys_FloatTime() - blocktime) > 2.0)
+BOOL PASCAL FAR BlockingHook(void)
+{
+       MSG             msg;
+       BOOL    ret;
+
+       if ((Sys_DoubleTime() - blocktime) > 2.0)
        {
                WSACancelBlockingCall();
-               return FALSE;
+               return false;
        }
 
-    /* get the next message, if any */ 
-    ret = (BOOL) PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); 
-    /* if we got one, process it */ 
-    if (ret) { 
-        TranslateMessage(&msg); 
-        DispatchMessage(&msg); 
-    } 
-    /* TRUE if we got a message */ 
-    return ret; 
-} 
-
-
-void WINS_GetLocalAddress()
+       /* get the next message, if any */
+       ret = (BOOL) PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
+
+       /* if we got one, process it */
+       if (ret) {
+               TranslateMessage(&msg);
+               DispatchMessage(&msg);
+       }
+
+       /* true if we got a message */
+       return ret;
+}
+
+
+void UDP_GetLocalAddress(void)
 {
        struct hostent  *local = NULL;
        char                    buff[MAXHOSTNAMELEN];
@@ -97,12 +73,12 @@ void WINS_GetLocalAddress()
        if (myAddr != INADDR_ANY)
                return;
 
-       if (pgethostname(buff, MAXHOSTNAMELEN) == SOCKET_ERROR)
+       if (gethostname(buff, MAXHOSTNAMELEN) == SOCKET_ERROR)
                return;
 
-       blocktime = Sys_FloatTime();
+       blocktime = Sys_DoubleTime();
        WSASetBlockingHook(BlockingHook);
-       local = pgethostbyname(buff);
+       local = gethostbyname(buff);
        WSAUnhookBlockingHook();
        if (local == NULL)
                return;
@@ -110,79 +86,32 @@ void WINS_GetLocalAddress()
        myAddr = *(int *)local->h_addr_list[0];
 
        addr = ntohl(myAddr);
-       sprintf(my_tcpip_address, "%d.%d.%d.%d", (addr >> 24) & 0xff, (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff);
+       sprintf(my_tcpip_address, "%d.%d.%d.%d", (int) ((addr >> 24) & 0xff), (int) ((addr >> 16) & 0xff), (int) ((addr >> 8) & 0xff), (int) (addr & 0xff));
 }
 
 
-int WINS_Init (void)
+int UDP_Init (void)
 {
        int             i;
        char    buff[MAXHOSTNAMELEN];
        char    *p;
        int             r;
-       WORD    wVersionRequested;
-       HINSTANCE hInst;
-
-// initialize the Winsock function vectors (we do this instead of statically linking
-// so we can run on Win 3.1, where there isn't necessarily Winsock)
-    hInst = LoadLibrary("wsock32.dll");
-       
-       if (hInst == NULL)
-       {
-               Con_SafePrintf ("Failed to load wsock32.dll\n");
-               winsock_lib_initialized = false;
-               return -1;
-       }
-
-       winsock_lib_initialized = true;
-
-    pWSAStartup = (void *)GetProcAddress(hInst, "WSAStartup");
-    pWSACleanup = (void *)GetProcAddress(hInst, "WSACleanup");
-    pWSAGetLastError = (void *)GetProcAddress(hInst, "WSAGetLastError");
-    psocket = (void *)GetProcAddress(hInst, "socket");
-    pioctlsocket = (void *)GetProcAddress(hInst, "ioctlsocket");
-    psetsockopt = (void *)GetProcAddress(hInst, "setsockopt");
-    precvfrom = (void *)GetProcAddress(hInst, "recvfrom");
-    psendto = (void *)GetProcAddress(hInst, "sendto");
-    pclosesocket = (void *)GetProcAddress(hInst, "closesocket");
-    pgethostname = (void *)GetProcAddress(hInst, "gethostname");
-    pgethostbyname = (void *)GetProcAddress(hInst, "gethostbyname");
-    pgethostbyaddr = (void *)GetProcAddress(hInst, "gethostbyaddr");
-    pgetsockname = (void *)GetProcAddress(hInst, "getsockname");
-
-    if (!pWSAStartup || !pWSACleanup || !pWSAGetLastError ||
-               !psocket || !pioctlsocket || !psetsockopt ||
-               !precvfrom || !psendto || !pclosesocket ||
-               !pgethostname || !pgethostbyname || !pgethostbyaddr ||
-               !pgetsockname)
-       {
-               Con_SafePrintf ("Couldn't GetProcAddress from wsock32.dll\n");
-               return -1;
-       }
 
        if (COM_CheckParm ("-noudp"))
                return -1;
 
-       if (winsock_initialized == 0)
+       r = WSAStartup (MAKEWORD(1, 1), &winsockdata);
+       if (r)
        {
-               wVersionRequested = MAKEWORD(1, 1); 
-
-               r = pWSAStartup (MAKEWORD(1, 1), &winsockdata);
-
-               if (r)
-               {
-                       Con_SafePrintf ("Winsock initialization failed.\n");
-                       return -1;
-               }
+               Con_SafePrintf ("Winsock initialization failed.\n");
+               return -1;
        }
-       winsock_initialized++;
 
        // determine my name
-       if (pgethostname(buff, MAXHOSTNAMELEN) == SOCKET_ERROR)
+       if (gethostname(buff, MAXHOSTNAMELEN) == SOCKET_ERROR)
        {
                Con_DPrintf ("Winsock TCP/IP Initialization failed.\n");
-               if (--winsock_initialized == 0)
-                       pWSACleanup ();
+               WSACleanup ();
                return -1;
        }
 
@@ -226,11 +155,10 @@ int WINS_Init (void)
                strcpy(my_tcpip_address, "INADDR_ANY");
        }
 
-       if ((net_controlsocket = WINS_OpenSocket (0)) == -1)
+       if ((net_controlsocket = UDP_OpenSocket (0)) == -1)
        {
-               Con_Printf("WINS_Init: Unable to open control socket\n");
-               if (--winsock_initialized == 0)
-                       pWSACleanup ();
+               Con_Printf("UDP_Init: Unable to open control socket\n");
+               WSACleanup ();
                return -1;
        }
 
@@ -246,48 +174,47 @@ int WINS_Init (void)
 
 //=============================================================================
 
-void WINS_Shutdown (void)
+void UDP_Shutdown (void)
 {
-       WINS_Listen (false);
-       WINS_CloseSocket (net_controlsocket);
-       if (--winsock_initialized == 0)
-               pWSACleanup ();
+       UDP_Listen (false);
+       UDP_CloseSocket (net_controlsocket);
+       WSACleanup ();
 }
 
 //=============================================================================
 
-void WINS_Listen (qboolean state)
+void UDP_Listen (qboolean state)
 {
        // enable listening
        if (state)
        {
                if (net_acceptsocket != -1)
                        return;
-               WINS_GetLocalAddress();
-               if ((net_acceptsocket = WINS_OpenSocket (net_hostport)) == -1)
-                       Sys_Error ("WINS_Listen: Unable to open accept socket\n");
+               UDP_GetLocalAddress();
+               if ((net_acceptsocket = UDP_OpenSocket (net_hostport)) == -1)
+                       Sys_Error ("UDP_Listen: Unable to open accept socket\n");
                return;
        }
 
        // disable listening
        if (net_acceptsocket == -1)
                return;
-       WINS_CloseSocket (net_acceptsocket);
+       UDP_CloseSocket (net_acceptsocket);
        net_acceptsocket = -1;
 }
 
 //=============================================================================
 
-int WINS_OpenSocket (int port)
+int UDP_OpenSocket (int port)
 {
        int newsocket;
        struct sockaddr_in address;
        u_long _true = 1;
 
-       if ((newsocket = psocket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
+       if ((newsocket = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
                return -1;
 
-       if (pioctlsocket (newsocket, FIONBIO, &_true) == -1)
+       if (ioctlsocket (newsocket, FIONBIO, &_true) == -1)
                goto ErrorReturn;
 
        address.sin_family = AF_INET;
@@ -296,19 +223,19 @@ int WINS_OpenSocket (int port)
        if( bind (newsocket, (void *)&address, sizeof(address)) == 0)
                return newsocket;
 
-       Sys_Error ("Unable to bind to %s", WINS_AddrToString((struct qsockaddr *)&address));
+       Sys_Error ("Unable to bind to %s", UDP_AddrToString((struct qsockaddr *)&address));
 ErrorReturn:
-       pclosesocket (newsocket);
+       closesocket (newsocket);
        return -1;
 }
 
 //=============================================================================
 
-int WINS_CloseSocket (int socket)
+int UDP_CloseSocket (int socket)
 {
        if (socket == net_broadcastsocket)
                net_broadcastsocket = 0;
-       return pclosesocket (socket);
+       return closesocket (socket);
 }
 
 
@@ -321,7 +248,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;
@@ -330,7 +257,7 @@ static int PartialIPAddress (char *in, struct qsockaddr *hostaddr)
        int mask;
        int run;
        int port;
-       
+
        buff[0] = '.';
        b = buff;
        strcpy(buff+1, in);
@@ -348,7 +275,7 @@ static int PartialIPAddress (char *in, struct qsockaddr *hostaddr)
                {
                  num = num*10 + *b++ - '0';
                  if (++run > 3)
-                       return -1;
+                       return -1;
                }
                if ((*b < '0' || *b > '9') && *b != '.' && *b != ':' && *b != 0)
                        return -1;
@@ -357,53 +284,65 @@ static int PartialIPAddress (char *in, struct qsockaddr *hostaddr)
                mask<<=8;
                addr = (addr<<8) + num;
        }
-       
+
        if (*b++ == ':')
                port = atoi(b);
        else
                port = net_hostport;
 
        hostaddr->sa_family = AF_INET;
-       ((struct sockaddr_in *)hostaddr)->sin_port = htons((short)port);        
+       ((struct sockaddr_in *)hostaddr)->sin_port = htons((short)port);
        ((struct sockaddr_in *)hostaddr)->sin_addr.s_addr = (myAddr & htonl(mask)) | htonl(addr);
-       
+
        return 0;
 }
 //=============================================================================
 
-int WINS_Connect (int socket, struct qsockaddr *addr)
+int UDP_Connect (int socket, struct qsockaddr *addr)
 {
        return 0;
 }
 
 //=============================================================================
 
-int WINS_CheckNewConnections (void)
+int UDP_CheckNewConnections (void)
 {
        char buf[4096];
 
        if (net_acceptsocket == -1)
                return -1;
 
-       if (precvfrom (net_acceptsocket, buf, sizeof(buf), MSG_PEEK, NULL, NULL) > 0)
-       {
+       if (recvfrom (net_acceptsocket, buf, sizeof(buf), MSG_PEEK, NULL, NULL) >= 0)
                return net_acceptsocket;
-       }
        return -1;
 }
 
 //=============================================================================
 
-int WINS_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;
        int errno;
 
-       ret = precvfrom (socket, buf, len, 0, (struct sockaddr *)addr, &addrlen);
+       ret = recvfrom (socket, buf, len, 0, (struct sockaddr *)addr, &addrlen);
        if (ret == -1)
        {
-                errno = pWSAGetLastError();
+               errno = WSAGetLastError();
 
                if (errno == WSAEWOULDBLOCK || errno == WSAECONNREFUSED)
                        return 0;
@@ -414,12 +353,12 @@ int WINS_Read (int socket, byte *buf, int len, struct qsockaddr *addr)
 
 //=============================================================================
 
-int WINS_MakeSocketBroadcastCapable (int socket)
+int UDP_MakeSocketBroadcastCapable (int socket)
 {
        int     i = 1;
 
        // make this socket broadcast capable
-       if (psetsockopt(socket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) < 0)
+       if (setsockopt(socket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) < 0)
                return -1;
        net_broadcastsocket = socket;
 
@@ -428,7 +367,7 @@ int WINS_MakeSocketBroadcastCapable (int socket)
 
 //=============================================================================
 
-int WINS_Broadcast (int socket, byte *buf, int len)
+int UDP_Broadcast (int socket, qbyte *buf, int len)
 {
        int ret;
 
@@ -436,8 +375,8 @@ int WINS_Broadcast (int socket, byte *buf, int len)
        {
                if (net_broadcastsocket != 0)
                        Sys_Error("Attempted to use multiple broadcasts sockets\n");
-               WINS_GetLocalAddress();
-               ret = WINS_MakeSocketBroadcastCapable (socket);
+               UDP_GetLocalAddress();
+               ret = UDP_MakeSocketBroadcastCapable (socket);
                if (ret == -1)
                {
                        Con_Printf("Unable to make socket broadcast capable\n");
@@ -445,18 +384,18 @@ int WINS_Broadcast (int socket, byte *buf, int len)
                }
        }
 
-       return WINS_Write (socket, buf, len, &broadcastaddr);
+       return UDP_Write (socket, buf, len, &broadcastaddr);
 }
 
 //=============================================================================
 
-int WINS_Write (int socket, byte *buf, int len, struct qsockaddr *addr)
+int UDP_Write (int socket, qbyte *buf, int len, struct qsockaddr *addr)
 {
        int ret;
 
-       ret = psendto (socket, buf, len, 0, (struct sockaddr *)addr, sizeof(struct qsockaddr));
+       ret = sendto (socket, buf, len, 0, (struct sockaddr *)addr, sizeof(struct qsockaddr));
        if (ret == -1)
-               if (pWSAGetLastError() == WSAEWOULDBLOCK)
+               if (WSAGetLastError() == WSAEWOULDBLOCK)
                        return 0;
 
        return ret;
@@ -464,7 +403,7 @@ int WINS_Write (int socket, byte *buf, int len, struct qsockaddr *addr)
 
 //=============================================================================
 
-char *WINS_AddrToString (struct qsockaddr *addr)
+char *UDP_AddrToString (const struct qsockaddr *addr)
 {
        static char buffer[22];
        int haddr;
@@ -476,7 +415,7 @@ char *WINS_AddrToString (struct qsockaddr *addr)
 
 //=============================================================================
 
-int WINS_StringToAddr (char *string, struct qsockaddr *addr)
+int UDP_StringToAddr (const char *string, struct qsockaddr *addr)
 {
        int ha1, ha2, ha3, ha4, hp;
        int ipaddr;
@@ -492,13 +431,13 @@ int WINS_StringToAddr (char *string, struct qsockaddr *addr)
 
 //=============================================================================
 
-int WINS_GetSocketAddr (int socket, struct qsockaddr *addr)
+int UDP_GetSocketAddr (int socket, struct qsockaddr *addr)
 {
        int addrlen = sizeof(struct qsockaddr);
        unsigned int a;
 
        memset(addr, 0, sizeof(struct qsockaddr));
-       pgetsockname(socket, (struct sockaddr *)addr, &addrlen);
+       getsockname(socket, (struct sockaddr *)addr, &addrlen);
        a = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
        if (a == 0 || a == inet_addr("127.0.0.1"))
                ((struct sockaddr_in *)addr)->sin_addr.s_addr = myAddr;
@@ -508,36 +447,36 @@ int WINS_GetSocketAddr (int socket, struct qsockaddr *addr)
 
 //=============================================================================
 
-int WINS_GetNameFromAddr (struct qsockaddr *addr, char *name)
+int UDP_GetNameFromAddr (const struct qsockaddr *addr, char *name)
 {
        struct hostent *hostentry;
 
-       hostentry = pgethostbyaddr ((char *)&((struct sockaddr_in *)addr)->sin_addr, sizeof(struct in_addr), AF_INET);
+       hostentry = gethostbyaddr ((char *)&((struct sockaddr_in *)addr)->sin_addr, sizeof(struct in_addr), AF_INET);
        if (hostentry)
        {
                strncpy (name, (char *)hostentry->h_name, NET_NAMELEN - 1);
                return 0;
        }
 
-       strcpy (name, WINS_AddrToString (addr));
+       strcpy (name, UDP_AddrToString (addr));
        return 0;
 }
 
 //=============================================================================
 
-int WINS_GetAddrFromName(char *name, struct qsockaddr *addr)
+int UDP_GetAddrFromName(const char *name, struct qsockaddr *addr)
 {
        struct hostent *hostentry;
 
        if (name[0] >= '0' && name[0] <= '9')
                return PartialIPAddress (name, addr);
-       
-       hostentry = pgethostbyname (name);
+
+       hostentry = gethostbyname (name);
        if (!hostentry)
                return -1;
 
        addr->sa_family = AF_INET;
-       ((struct sockaddr_in *)addr)->sin_port = htons((unsigned short)net_hostport);   
+       ((struct sockaddr_in *)addr)->sin_port = htons((unsigned short)net_hostport);
        ((struct sockaddr_in *)addr)->sin_addr.s_addr = *(int *)hostentry->h_addr_list[0];
 
        return 0;
@@ -545,7 +484,7 @@ int WINS_GetAddrFromName(char *name, struct qsockaddr *addr)
 
 //=============================================================================
 
-int WINS_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;
@@ -561,16 +500,15 @@ int WINS_AddrCompare (struct qsockaddr *addr1, struct qsockaddr *addr2)
 
 //=============================================================================
 
-int WINS_GetSocketPort (struct qsockaddr *addr)
+int UDP_GetSocketPort (struct qsockaddr *addr)
 {
        return ntohs(((struct sockaddr_in *)addr)->sin_port);
 }
 
 
-int WINS_SetSocketPort (struct qsockaddr *addr, int port)
+int UDP_SetSocketPort (struct qsockaddr *addr, int port)
 {
        ((struct sockaddr_in *)addr)->sin_port = htons((unsigned short)port);
        return 0;
 }
 
-//=============================================================================