From 0023db327bc1db00068284b70e1db45857aeee35 Mon Sep 17 00:00:00 2001 From: Travis Bradshaw Date: Tue, 31 Jan 2012 14:32:09 -0600 Subject: The Quake sources as originally release under the GPL license on December 21, 1999 --- QW/qwfwd/misc.c | 452 +++++++++++++++++++++++++++++++++++++++++++++++++++++ QW/qwfwd/qwfwd.001 | 89 +++++++++++ QW/qwfwd/qwfwd.c | 269 +++++++++++++++++++++++++++++++ QW/qwfwd/qwfwd.dsp | 90 +++++++++++ QW/qwfwd/qwfwd.dsw | 29 ++++ QW/qwfwd/qwfwd.plg | 32 ++++ 6 files changed, 961 insertions(+) create mode 100644 QW/qwfwd/misc.c create mode 100644 QW/qwfwd/qwfwd.001 create mode 100644 QW/qwfwd/qwfwd.c create mode 100644 QW/qwfwd/qwfwd.dsp create mode 100644 QW/qwfwd/qwfwd.dsw create mode 100644 QW/qwfwd/qwfwd.plg (limited to 'QW/qwfwd') diff --git a/QW/qwfwd/misc.c b/QW/qwfwd/misc.c new file mode 100644 index 0000000..0359a39 --- /dev/null +++ b/QW/qwfwd/misc.c @@ -0,0 +1,452 @@ +#include "master.h" + +int com_argc; +char **com_argv; + +/* +================ +COM_CheckParm + +Returns the position (1 to argc-1) in the program's argument list +where the given parameter apears, or 0 if not present +================ +*/ +int COM_CheckParm (char *parm) +{ + int i; + + for (i=1 ; i32); + + com_token[len] = 0; + return data; +} + +/* +============ +Cmd_Argc +============ +*/ +int Cmd_Argc (void) +{ + return cmd_argc; +} + +/* +============ +Cmd_Argv +============ +*/ +char *Cmd_Argv (int arg) +{ + if ( (unsigned)arg >= cmd_argc ) + return ""; + return cmd_argv[arg]; +} + +/* +============ +Cmd_TokenizeString + +Parses the given string into command line tokens. +============ +*/ +void Cmd_TokenizeString (char *text) +{ + cmd_argc = 0; + + while (1) + { +// skip whitespace up to a /n + while (*text && *text <= ' ') + { + text++; + } + + if (!*text) + return; + + text = COM_Parse (text); + if (!text) + return; + + if (cmd_argc < MAX_ARGS) + { + strcpy (cmd_argv[cmd_argc], com_token); + cmd_argc++; + } + } + +} + + +/* +===================================================================== + + INFO STRINGS + +===================================================================== +*/ + +/* +=============== +Info_ValueForKey + +Searches the string (userinfo or masterinfo) for the given +key and returns the associated value, or an empty string. +=============== +*/ +char *Info_ValueForKey (char *s, char *key) +{ + char pkey[512]; + static char value[512]; + char *o; + + if (*s == '\\') + s++; + while (1) + { + o = pkey; + while (*s != '\\') + { + if (!*s) + return ""; + *o++ = *s++; + } + *o = 0; + s++; + + o = value; + while (*s != '\\' && *s) + { + if (!*s) + return ""; + *o++ = *s++; + } + *o = 0; + + if (!strcmp (key, pkey) ) + return value; + + if (!*s) + return ""; + s++; + } +} + +void Info_RemoveKey (char *s, char *key) +{ + char *start; + char pkey[512]; + char value[512]; + char *o; + + if (strstr (key, "\\")) + { + printf ("Can't use a key with a \\\n"); + return; + } + + while (1) + { + start = s; + if (*s == '\\') + s++; + o = pkey; + while (*s != '\\') + { + if (!*s) + return; + *o++ = *s++; + } + *o = 0; + s++; + + o = value; + while (*s != '\\' && *s) + { + if (!*s) + return; + *o++ = *s++; + } + *o = 0; + + if (!strcmp (key, pkey) ) + { + strcpy (start, s); // remove this part + return; + } + + if (!*s) + return; + } + +} + +void Info_RemovePrefixedKeys (char *start, char prefix) +{ + char *s; + char pkey[512]; + char value[512]; + char *o; + + s = start; + while (1) + { + if (*s == '\\') + s++; + o = pkey; + while (*s != '\\') + { + if (!*s) + return; + *o++ = *s++; + } + *o = 0; + s++; + + o = value; + while (*s != '\\' && *s) + { + if (!*s) + return; + *o++ = *s++; + } + *o = 0; + + if (pkey[0] == prefix) + { + Info_RemoveKey (start, pkey); + s = start; + } + + if (!*s) + return; + } + +} + +void Info_SetValueForKey (char *s, char *key, char *value) +{ + char new[512]; + + if (strstr (key, "\\") || strstr (value, "\\") ) + { + printf ("Can't use keys or values with a \\\n"); + return; + } + if (strstr (key, "\"") || strstr (value, "\"") ) + { + printf ("Can't use keys or values with a \\\n"); + return; + } + + Info_RemoveKey (s, key); + if (!value || !strlen(value)) + return; + + sprintf (new, "\\%s\\%s", key, value); + + if (strlen(new) + strlen(s) > MAX_INFO_STRING) + { + printf ("Info string length exceeded\n"); + return; + } + strcat (s, new); +} + +void Info_Print (char *s) +{ + char key[512]; + char value[512]; + char *o; + int l; + + if (*s == '\\') + s++; + while (*s) + { + o = key; + while (*s && *s != '\\') + *o++ = *s++; + + l = o - key; + if (l < 20) + { + memset (o, ' ', 20-l); + key[20] = 0; + } + else + *o = 0; + printf ("%s", key); + + if (!*s) + { + printf ("MISSING VALUE\n"); + return; + } + + o = value; + s++; + while (*s && *s != '\\') + *o++ = *s++; + *o = 0; + + if (*s) + s++; + printf ("%s\n", value); + } +} diff --git a/QW/qwfwd/qwfwd.001 b/QW/qwfwd/qwfwd.001 new file mode 100644 index 0000000..ad3bbeb --- /dev/null +++ b/QW/qwfwd/qwfwd.001 @@ -0,0 +1,89 @@ +# Microsoft Developer Studio Project File - Name="QWFwd" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 5.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=QWFwd - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "QWFwd.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "QWFwd.mak" CFG="QWFwd - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "QWFwd - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "QWFwd - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "QWFwd - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "QWFwd - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "QWFwd - Win32 Release" +# Name "QWFwd - Win32 Debug" +# Begin Source File + +SOURCE=.\qwfwd.c +# End Source File +# End Target +# End Project diff --git a/QW/qwfwd/qwfwd.c b/QW/qwfwd/qwfwd.c new file mode 100644 index 0000000..014d170 --- /dev/null +++ b/QW/qwfwd/qwfwd.c @@ -0,0 +1,269 @@ +/* +Copyright (C) 1996-1997 Id Software, Inc. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +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. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + + +/* + * udpred - a inetd launched udp port redirector + * + * Version: @(#)udpred.c 0.01 01/15/97 + * + * Author: Chris Faherty + * + * syntax: + * + * udpred toip toport + * + * sample inetd.conf entry: + * + * 7000 dgram udp wait root /usr/sbin/tcpd /usr/sbin/udpred 192.168.100.16 7000 + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + */ +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#else +#include +#include +#include +#include +#include +#include +#include + +#endif + +int host_port; // port we are listening on + +typedef struct peer { + time_t last; + struct sockaddr_in sin; + struct sockaddr_in dest; + int s; // connected socket to remote + struct peer *next; +} peer_t; + +peer_t *peers; + +/* +==================== +NET_Init +==================== +*/ +void NET_Init (void) +{ +#ifdef _WIN32 + static WSADATA winsockdata; +// WORD wVersionRequested; + int r; + +// wVersionRequested = MAKEWORD(1, 1); + + r = WSAStartup (MAKEWORD(2, 1), &winsockdata); + + if (r) { + fprintf(stderr, "Winsock initialization failed."); + exit(1); + } + + printf("Winsock Initialized\n"); +#endif +} + + + +int connectsock(char *host, char *service, char *protocol) +{ + struct hostent *phe; + struct servent *pse; + struct protoent *ppe; + struct sockaddr_in sin; + int s, type; + + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + +/* Map service name to port number */ + if(pse = getservbyname(service, protocol)) + sin.sin_port = pse->s_port; + else if((sin.sin_port = htons((u_short)atoi(service))) == 0) + { + fprintf(stderr, "udpred: can't get \"%s\" service entry\n", service); + exit(2); + } + +/* Map host name to IP address, allowing for dotted decimal */ + if(phe = gethostbyname(host)) + memcpy((char *)&sin.sin_addr, phe->h_addr, phe->h_length); + else if((sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) + { + fprintf(stderr, "udpred: can't get \"%s\" host entry\n", host); + exit(2); + } + +/* Map protocol name to protocol number */ + if((ppe = getprotobyname(protocol)) == 0) + { + fprintf(stderr, "udpred: can't get \"%s\" protocol entry\n", protocol); + exit(2); + } + +/* Use protocol to choose a socket type */ + if(strcmp(protocol, "udp") == 0) + type = SOCK_DGRAM; + else + type = SOCK_STREAM; + +/* Allocate a socket */ + s = socket(PF_INET, type, ppe->p_proto); + if(s < 0) + { + fprintf(stderr, "udpred: can't create socket: %s\n", sys_errlist[errno]); + exit(2); + } + +/* Connect the socket */ + if(connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) + { + fprintf(stderr, "udpred: can't connect to %s.%s: %s\n", host, service, sys_errlist[errno]); + exit(2); + } + return s; +} + +int main(int argc, char *argv[]) +{ + fd_set rfds; + struct timeval tv; + int retval; + int i1; + char buffer[4095]; + struct sockaddr_in fsin; + int alen; + peer_t *p; + int s; + struct sockaddr_in address; + + if (argc < 3) { + printf("Usage: %s \n", argv[0]); + return 1; + } + + NET_Init(); + + if ((s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { + perror("socket"); + return 1; + } + + address.sin_family = AF_INET; + address.sin_addr.s_addr = INADDR_ANY; + address.sin_port = htons((unsigned short)atoi(argv[1])); + if (bind (s, (void *)&address, sizeof(address)) == -1) + perror("bind"); + + while(1) + { + FD_ZERO(&rfds); + FD_SET(s, &rfds); + i1 = s; + for (p = peers; p; p = p->next) { + FD_SET(p->s, &rfds); + if (p->s >= i1) + i1 = p->s + 1; + } + /* Wait up to two minutes. */ + tv.tv_sec = 2; + tv.tv_usec = 0; + retval = select(i1, &rfds, (fd_set *)0, (fd_set *)0, &tv); + if(retval > 0) + { + if(FD_ISSET(s, &rfds)) + { + alen = sizeof(fsin); + i1 = recvfrom(s, buffer, 4096, 0, (struct sockaddr *) &fsin, &alen); + if(i1 > 0) { + for (p = peers; p; p = p->next) + if (memcmp(&p->sin.sin_addr, &fsin.sin_addr, sizeof(p->sin.sin_addr)) == 0 && + memcmp(&p->sin.sin_port, &fsin.sin_port, sizeof(p->sin.sin_port)) == 0) + { + send(p->s, buffer, i1, 0); + time(&p->last); + break; + } + if (p == NULL) { // new peer + printf("peer %s:%d added", inet_ntoa(fsin.sin_addr), (int)ntohs(fsin.sin_port)); + p = malloc(sizeof *p); + p->sin = fsin; + p->s = connectsock(argv[2], argv[3], "udp"); + p->next = peers; + peers = p; + send(p->s, buffer, i1, 0); + time(&p->last); + } + } + } + for (p = peers; p; p = p->next) + if(FD_ISSET(p->s, &rfds)) + { + i1 = recv(p->s, buffer, 4096, 0); + if(i1 > 0) { + time(&p->last); + sendto(s, buffer, i1, 0, (struct sockaddr *) &p->sin, + sizeof(p->sin)); + } + } + } else { + peer_t *pp; + + pp = NULL; + p = peers; + while (p) { + if (time(NULL) - p->last > 300) { + if (!pp && !p->next) { + printf("peer %s:%d removed (timeout)", inet_ntoa(p->sin.sin_addr), (int)ntohs(p->sin.sin_port)); + free(p); + p = pp = NULL; + continue; + } + pp->next = p->next; + printf ("peer %s:%d removed (timeout)", inet_ntoa(p->sin.sin_addr), (int)ntohs(p->sin.sin_port)); + free(p); + p = pp->next; + } else { + pp = p; + p = p->next; + } + } + } + } +} diff --git a/QW/qwfwd/qwfwd.dsp b/QW/qwfwd/qwfwd.dsp new file mode 100644 index 0000000..fc81698 --- /dev/null +++ b/QW/qwfwd/qwfwd.dsp @@ -0,0 +1,90 @@ +# Microsoft Developer Studio Project File - Name="QWFwd" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=QWFwd - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "qwfwd.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "qwfwd.mak" CFG="QWFwd - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "QWFwd - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "QWFwd - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "QWFwd - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "QWFwd - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "QWFwd - Win32 Release" +# Name "QWFwd - Win32 Debug" +# Begin Source File + +SOURCE=.\qwfwd.c +# End Source File +# End Target +# End Project diff --git a/QW/qwfwd/qwfwd.dsw b/QW/qwfwd/qwfwd.dsw new file mode 100644 index 0000000..cae0924 --- /dev/null +++ b/QW/qwfwd/qwfwd.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 5.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "QWFwd"=.\QWFwd.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/QW/qwfwd/qwfwd.plg b/QW/qwfwd/qwfwd.plg new file mode 100644 index 0000000..1948d53 --- /dev/null +++ b/QW/qwfwd/qwfwd.plg @@ -0,0 +1,32 @@ + + +
+

Build Log

+

+--------------------Configuration: QWFwd - Win32 Release-------------------- +

+

Command Lines

+Creating temporary file "C:\TEMP\RSP775.tmp" with contents +[ +/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"Release/qwfwd.pch" /YX /Fo"Release/" /Fd"Release/" /FD /c +"D:\Work\quake source\QW\qwfwd\qwfwd.c" +] +Creating command line "cl.exe @C:\TEMP\RSP775.tmp" +Creating temporary file "C:\TEMP\RSP776.tmp" with contents +[ +wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"Release/qwfwd.pdb" /machine:I386 /out:"Release/qwfwd.exe" +".\Release\qwfwd.obj" +] +Creating command line "link.exe @C:\TEMP\RSP776.tmp" +

Output Window

+Compiling... +qwfwd.c +Linking... + + + +

Results

+qwfwd.exe - 0 error(s), 0 warning(s) +
+ + -- cgit v1.2.3