aboutsummaryrefslogtreecommitdiff
path: root/games/quake2-source
diff options
context:
space:
mode:
authorEdwin Groothuis <edwin@FreeBSD.org>2005-10-16 05:58:42 +0000
committerEdwin Groothuis <edwin@FreeBSD.org>2005-10-16 05:58:42 +0000
commit7e4cbdf713e92dcd3bbbb81798f53bfa8e900201 (patch)
tree34a6271409eb26f5cad65b008da7d80afbb93cb7 /games/quake2-source
parent385b4cf1e7879edd02668eff425bab0004024841 (diff)
downloadports-7e4cbdf713e92dcd3bbbb81798f53bfa8e900201.tar.gz
ports-7e4cbdf713e92dcd3bbbb81798f53bfa8e900201.zip
[NEW PORT] games/quake2-source - Quake II game source
Quake II game source. This port installs the Quake II game source, together with BSD Makefiles, for building modifications. It can also install the Capture the Flag mod, Rogue and Xatrix game source. PR: ports/86737 Submitted by: Alejandro Pulver <alejandro@varnet.biz>
Notes
Notes: svn path=/head/; revision=145520
Diffstat (limited to 'games/quake2-source')
-rw-r--r--games/quake2-source/Makefile86
-rw-r--r--games/quake2-source/distinfo6
-rw-r--r--games/quake2-source/files/Makefile.ctf32
-rw-r--r--games/quake2-source/files/Makefile.game54
-rw-r--r--games/quake2-source/files/Makefile.rogue68
-rw-r--r--games/quake2-source/files/Makefile.xatrix58
-rw-r--r--games/quake2-source/files/extra-patch-src_rogue_g__local.h10
-rw-r--r--games/quake2-source/files/extra-patch-src_rogue_q__shared.c11
-rw-r--r--games/quake2-source/files/extra-patch-src_xatrix_q__shared.c11
-rw-r--r--games/quake2-source/files/patch-security201
-rw-r--r--games/quake2-source/files/patch-src_game_g__phys.c17
-rw-r--r--games/quake2-source/pkg-descr5
-rw-r--r--games/quake2-source/pkg-plist306
13 files changed, 865 insertions, 0 deletions
diff --git a/games/quake2-source/Makefile b/games/quake2-source/Makefile
new file mode 100644
index 000000000000..8d9529dd24fe
--- /dev/null
+++ b/games/quake2-source/Makefile
@@ -0,0 +1,86 @@
+# New ports collection makefile for: quake2-source
+# Date created: 29 Sep 2005
+# Whom: Alejandro Pulver <alejandro@varnet.biz>
+#
+# $FreeBSD$
+#
+
+PORTNAME= source
+PORTVERSION= 3.21
+CATEGORIES= games
+MASTER_SITES= http://www.icculus.org/quake2/files/:icc \
+ ftp://ftp.idsoftware.com/idstuff/quake2/source/:id
+PKGNAMEPREFIX= quake2-
+DISTNAME= quake2-r0.16.2
+DISTFILES= ${DISTNAME}${EXTRACT_SUFX}:icc
+DIST_SUBDIR= quake2lnx
+EXTRACT_ONLY= ${DISTNAME}${EXTRACT_SUFX}
+
+MAINTAINER= alejandro@varnet.biz
+COMMENT= Quake II game source
+
+NO_BUILD= yes
+
+OPTIONS= CTF "Install Capture The Flag mod source" off \
+ ROGUE "Install Ground Zero (Rogue) mission pack source" off \
+ XATRIX "Install The Reckoning (Xatrix) mission pack source" off
+
+LATEST_LINK= ${PKGNAMEPREFIX}${PORTNAME}
+
+DATADIR= ${PREFIX}/share/${PKGNAMEPREFIX}${PORTNAME}
+
+.include <bsd.port.pre.mk>
+
+.if defined(WITH_CTF)
+PLIST_SUB+= CTF=""
+.else
+PLIST_SUB+= CTF="@comment "
+.endif
+
+.if defined(WITH_ROGUE)
+DISTFILES+= roguesrc320.shar.Z:id
+EXTRA_PATCHES+= ${FILESDIR}/extra-patch-src_rogue_g__local.h \
+ ${FILESDIR}/extra-patch-src_rogue_q__shared.c
+ROGUE_OFF= 454
+PLIST_SUB+= ROGUE=""
+.else
+PLIST_SUB+= ROGUE="@comment "
+.endif
+
+.if defined(WITH_XATRIX)
+DISTFILES+= xatrixsrc320.shar.Z:id
+EXTRA_PATCHES+= ${FILESDIR}/extra-patch-src_xatrix_q__shared.c
+XATRIX_OFF= 441
+PLIST_SUB+= XATRIX=""
+.else
+PLIST_SUB+= XATRIX="@comment "
+.endif
+
+post-extract:
+.for f in rogue xatrix
+. if defined(WITH_${f:U})
+ @${MKDIR} ${WRKSRC}/src/${f}
+ @(cd ${WRKSRC}/src/${f} && ${GUNZIP_CMD} -c \
+ ${DISTDIR}/${DIST_SUBDIR}/${f}src320.shar.Z > \
+ ${f}src320.shar && \
+ ${TAIL} +${${f:U}_OFF} ${f}src320.shar | ${SH})
+. endif
+.endfor
+
+pre-install:
+ @${FIND} -E ${WRKSRC} -type f \
+ -iregex "(Makefile|.*\.(def|dsp|orig|shar))" -print0 | \
+ ${XARGS} -0 ${RM}
+
+do-install:
+ @${MKDIR} ${DATADIR}
+ @${CP} -R ${WRKSRC}/src/game ${DATADIR}
+ @${INSTALL_DATA} ${FILESDIR}/Makefile.game ${DATADIR}/game/Makefile
+.for f in ctf rogue xatrix
+. if defined(WITH_${f:U})
+ @${CP} -R ${WRKSRC}/src/${f} ${DATADIR}
+ @${INSTALL_DATA} ${FILESDIR}/Makefile.${f} ${DATADIR}/${f}/Makefile
+. endif
+.endfor
+
+.include <bsd.port.post.mk>
diff --git a/games/quake2-source/distinfo b/games/quake2-source/distinfo
new file mode 100644
index 000000000000..c5ecd52b8aff
--- /dev/null
+++ b/games/quake2-source/distinfo
@@ -0,0 +1,6 @@
+MD5 (quake2lnx/quake2-r0.16.2.tar.gz) = 872fee27fb13a2a4c8876d5973c3c691
+SIZE (quake2lnx/quake2-r0.16.2.tar.gz) = 1496377
+MD5 (quake2lnx/roguesrc320.shar.Z) = 7d5e052839c9e629bad0a6570aa70554
+SIZE (quake2lnx/roguesrc320.shar.Z) = 626769
+MD5 (quake2lnx/xatrixsrc320.shar.Z) = 41fc4ecc4f25c068e7d1f488bd4a1e1a
+SIZE (quake2lnx/xatrixsrc320.shar.Z) = 455917
diff --git a/games/quake2-source/files/Makefile.ctf b/games/quake2-source/files/Makefile.ctf
new file mode 100644
index 000000000000..5cb06beae90d
--- /dev/null
+++ b/games/quake2-source/files/Makefile.ctf
@@ -0,0 +1,32 @@
+# BSD Makefile for Quake II: Capture The Flag game source
+
+SHLIB_NAME= game.so
+
+SRCS= g_ai.c \
+ g_chase.c \
+ g_cmds.c \
+ g_combat.c \
+ g_ctf.c \
+ g_func.c \
+ g_items.c \
+ g_main.c \
+ g_misc.c \
+ g_monster.c \
+ g_phys.c \
+ g_save.c \
+ g_spawn.c \
+ g_svcmds.c \
+ g_target.c \
+ g_trigger.c \
+ g_utils.c \
+ g_weapon.c \
+ m_move.c \
+ p_client.c \
+ p_hud.c \
+ p_menu.c \
+ p_trail.c \
+ p_view.c \
+ p_weapon.c \
+ q_shared.c
+
+.include <bsd.lib.mk>
diff --git a/games/quake2-source/files/Makefile.game b/games/quake2-source/files/Makefile.game
new file mode 100644
index 000000000000..0e31cad102ba
--- /dev/null
+++ b/games/quake2-source/files/Makefile.game
@@ -0,0 +1,54 @@
+# BSD Makefile for Quake II game source
+
+SHLIB_NAME= game.so
+
+SRCS= g_ai.c \
+ g_chase.c \
+ g_cmds.c \
+ g_combat.c \
+ g_func.c \
+ g_items.c \
+ g_main.c \
+ g_misc.c \
+ g_monster.c \
+ g_phys.c \
+ g_save.c \
+ g_spawn.c \
+ g_svcmds.c \
+ g_target.c \
+ g_trigger.c \
+ g_turret.c \
+ g_utils.c \
+ g_weapon.c \
+ m_actor.c \
+ m_berserk.c \
+ m_boss2.c \
+ m_boss3.c \
+ m_boss31.c \
+ m_boss32.c \
+ m_brain.c \
+ m_chick.c \
+ m_flash.c \
+ m_flipper.c \
+ m_float.c \
+ m_flyer.c \
+ m_gladiator.c \
+ m_gunner.c \
+ m_hover.c \
+ m_infantry.c \
+ m_insane.c \
+ m_medic.c \
+ m_move.c \
+ m_mutant.c \
+ m_parasite.c \
+ m_soldier.c \
+ m_supertank.c \
+ m_tank.c \
+ p_client.c \
+ p_hud.c \
+ p_trail.c \
+ p_view.c \
+ p_weapon.c \
+ q_shared.c
+
+.include <bsd.lib.mk>
diff --git a/games/quake2-source/files/Makefile.rogue b/games/quake2-source/files/Makefile.rogue
new file mode 100644
index 000000000000..c62c037704ab
--- /dev/null
+++ b/games/quake2-source/files/Makefile.rogue
@@ -0,0 +1,68 @@
+# BSD Makefile for Quake II: Ground Zero (Rogue) game source
+
+SHLIB_NAME= game.so
+
+SRCS= dm_ball.c \
+ dm_tag.c \
+ g_ai.c \
+ g_chase.c \
+ g_cmds.c \
+ g_combat.c \
+ g_func.c \
+ g_items.c \
+ g_main.c \
+ g_misc.c \
+ g_monster.c \
+ g_newai.c \
+ g_newdm.c \
+ g_newfnc.c \
+ g_newtarg.c \
+ g_newtrig.c \
+ g_newweap.c \
+ g_phys.c \
+ g_save.c \
+ g_spawn.c \
+ g_sphere.c \
+ g_svcmds.c \
+ g_target.c \
+ g_trigger.c \
+ g_turret.c \
+ g_utils.c \
+ g_weapon.c \
+ m_actor.c \
+ m_berserk.c \
+ m_boss2.c \
+ m_boss3.c \
+ m_boss31.c \
+ m_boss32.c \
+ m_brain.c \
+ m_carrier.c \
+ m_chick.c \
+ m_flash.c \
+ m_flipper.c \
+ m_float.c \
+ m_flyer.c \
+ m_gladiator.c \
+ m_gunner.c \
+ m_hover.c \
+ m_infantry.c \
+ m_insane.c \
+ m_medic.c \
+ m_move.c \
+ m_mutant.c \
+ m_parasite.c \
+ m_soldier.c \
+ m_stalker.c \
+ m_supertank.c \
+ m_tank.c \
+ m_turret.c \
+ m_widow.c \
+ m_widow2.c \
+ p_client.c \
+ p_hud.c \
+ p_trail.c \
+ p_view.c \
+ p_weapon.c \
+ q_shared.c
+
+.include <bsd.lib.mk>
diff --git a/games/quake2-source/files/Makefile.xatrix b/games/quake2-source/files/Makefile.xatrix
new file mode 100644
index 000000000000..7a56b35537a2
--- /dev/null
+++ b/games/quake2-source/files/Makefile.xatrix
@@ -0,0 +1,58 @@
+# BSD Makefile for Quake II: The Reckoning (Xatrix) game source
+
+SHLIB_NAME= game.so
+
+SRCS= g_ai.c \
+ g_chase.c \
+ g_cmds.c \
+ g_combat.c \
+ g_func.c \
+ g_items.c \
+ g_main.c \
+ g_misc.c \
+ g_monster.c \
+ g_phys.c \
+ g_save.c \
+ g_spawn.c \
+ g_svcmds.c \
+ g_target.c \
+ g_trigger.c \
+ g_turret.c \
+ g_utils.c \
+ g_weapon.c \
+ m_actor.c \
+ m_berserk.c \
+ m_boss2.c \
+ m_boss3.c \
+ m_boss31.c \
+ m_boss32.c \
+ m_boss5.c \
+ m_brain.c \
+ m_chick.c \
+ m_fixbot.c \
+ m_flash.c \
+ m_flipper.c \
+ m_float.c \
+ m_flyer.c \
+ m_gekk.c \
+ m_gladb.c \
+ m_gladiator.c \
+ m_gunner.c \
+ m_hover.c \
+ m_infantry.c \
+ m_insane.c \
+ m_medic.c \
+ m_move.c \
+ m_mutant.c \
+ m_parasite.c \
+ m_soldier.c \
+ m_supertank.c \
+ m_tank.c \
+ p_client.c \
+ p_hud.c \
+ p_trail.c \
+ p_view.c \
+ p_weapon.c \
+ q_shared.c
+
+.include <bsd.lib.mk>
diff --git a/games/quake2-source/files/extra-patch-src_rogue_g__local.h b/games/quake2-source/files/extra-patch-src_rogue_g__local.h
new file mode 100644
index 000000000000..6b43c988effc
--- /dev/null
+++ b/games/quake2-source/files/extra-patch-src_rogue_g__local.h
@@ -0,0 +1,10 @@
+--- src/rogue/g_local.h.orig Mon Nov 30 17:53:20 1998
++++ src/rogue/g_local.h Tue Sep 27 20:20:27 2005
+@@ -22,7 +22,6 @@
+ //==================================================================
+
+ #ifndef _WIN32
+-#include <nan.h>
+ #define min(a,b) ((a) < (b) ? (a) : (b))
+ #define max(a,b) ((a) > (b) ? (a) : (b))
+ #ifdef __sun__
diff --git a/games/quake2-source/files/extra-patch-src_rogue_q__shared.c b/games/quake2-source/files/extra-patch-src_rogue_q__shared.c
new file mode 100644
index 000000000000..25ffc42c24b4
--- /dev/null
+++ b/games/quake2-source/files/extra-patch-src_rogue_q__shared.c
@@ -0,0 +1,11 @@
+--- src/rogue/q_shared.c.orig Mon Nov 30 17:53:34 1998
++++ src/rogue/q_shared.c Tue Sep 27 20:03:24 2005
+@@ -329,7 +329,7 @@
+ Returns 1, 2, or 1 + 2
+ ==================
+ */
+-#if !id386 || defined __linux__
++#if !id386 || defined __linux__ || defined __FreeBSD__
+ int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *p)
+ {
+ float dist1, dist2;
diff --git a/games/quake2-source/files/extra-patch-src_xatrix_q__shared.c b/games/quake2-source/files/extra-patch-src_xatrix_q__shared.c
new file mode 100644
index 000000000000..917934b400b9
--- /dev/null
+++ b/games/quake2-source/files/extra-patch-src_xatrix_q__shared.c
@@ -0,0 +1,11 @@
+--- src/xatrix/q_shared.c.orig Mon Nov 30 17:55:36 1998
++++ src/xatrix/q_shared.c Tue Sep 27 20:04:53 2005
+@@ -326,7 +326,7 @@
+ Returns 1, 2, or 1 + 2
+ ==================
+ */
+-#if !id386 || defined __linux__
++#if !id386 || defined __linux__ || defined __FreeBSD__
+ int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *p)
+ {
+ float dist1, dist2;
diff --git a/games/quake2-source/files/patch-security b/games/quake2-source/files/patch-security
new file mode 100644
index 000000000000..89934359d270
--- /dev/null
+++ b/games/quake2-source/files/patch-security
@@ -0,0 +1,201 @@
+Index: client/cl_parse.c
+===================================================================
+RCS file: /cvs/cvsroot/quake2/src/client/cl_parse.c,v
+retrieving revision 1.3
+diff -u -r1.3 cl_parse.c
+--- src/client/cl_parse.c 24 Sep 2004 22:06:52 -0000 1.3
++++ src/client/cl_parse.c 29 Jan 2005 20:57:01 -0000
+@@ -397,6 +397,9 @@
+ strncpy(ci->cinfo, s, sizeof(ci->cinfo));
+ ci->cinfo[sizeof(ci->cinfo)-1] = 0;
+
++ // sku - avoid potentional buffer overflow vulnerability
++ s = ci->cinfo;
++
+ // isolate the player's name
+ strncpy(ci->name, s, sizeof(ci->name));
+ ci->name[sizeof(ci->name)-1] = 0;
+@@ -528,6 +531,7 @@
+ int i;
+ char *s;
+ char olds[MAX_QPATH];
++ int length;
+
+ i = MSG_ReadShort (&net_message);
+ if (i < 0 || i >= MAX_CONFIGSTRINGS)
+@@ -537,6 +541,12 @@
+ strncpy (olds, cl.configstrings[i], sizeof(olds));
+ olds[sizeof(olds) - 1] = 0;
+
++ // sku - avoid potentional buffer overflow vulnerability
++ length = strlen( s );
++ if( length > sizeof( cl.configstrings ) - sizeof( cl.configstrings[0] ) * i - 1 ) {
++ Com_Error( ERR_DROP, "CL_ParseConfigString: oversize configstring" );
++ }
++
+ strcpy (cl.configstrings[i], s);
+
+ // do something apropriate
+Index: qcommon/cmd.c
+===================================================================
+RCS file: /cvs/cvsroot/quake2/src/qcommon/cmd.c,v
+retrieving revision 1.2
+diff -u -r1.2 cmd.c
+--- src/qcommon/cmd.c 3 Jan 2002 05:10:14 -0000 1.2
++++ src/qcommon/cmd.c 29 Jan 2005 20:57:01 -0000
+@@ -215,8 +215,11 @@
+ if (text[i] == '\n')
+ break;
+ }
+-
+-
++
++ // sku - removed potentional buffer overflow vulnerability
++ if( i > sizeof( line ) - 1 ) {
++ i = sizeof( line ) - 1;
++ }
+ memcpy (line, text, i);
+ line[i] = 0;
+
+@@ -657,7 +660,8 @@
+ {
+ int l;
+
+- strcpy (cmd_args, text);
++ // sku - removed potentional buffer overflow vulnerability
++ strncpy( cmd_args, text, sizeof( cmd_args ) );
+
+ // strip off any trailing whitespace
+ l = strlen(cmd_args) - 1;
+Index: qcommon/common.c
+===================================================================
+RCS file: /cvs/cvsroot/quake2/src/qcommon/common.c,v
+retrieving revision 1.4
+diff -u -r1.4 common.c
+--- src/qcommon/common.c 30 Mar 2002 22:48:36 -0000 1.4
++++ src/qcommon/common.c 29 Jan 2005 20:57:02 -0000
+@@ -797,7 +797,9 @@
+ l = 0;
+ do
+ {
+- c = MSG_ReadChar (msg_read);
++ // sku - replaced MSG_ReadChar with MSG_ReadByte to avoid
++ // potentional vulnerability
++ c = MSG_ReadByte (msg_read);
+ if (c == -1 || c == 0)
+ break;
+ string[l] = c;
+@@ -817,7 +819,9 @@
+ l = 0;
+ do
+ {
+- c = MSG_ReadChar (msg_read);
++ // sku - replaced MSG_ReadChar with MSG_ReadByte to avoid
++ // potentional vulnerability
++ c = MSG_ReadByte (msg_read);
+ if (c == -1 || c == 0 || c == '\n')
+ break;
+ string[l] = c;
+Index: server/sv_main.c
+===================================================================
+RCS file: /cvs/cvsroot/quake2/src/server/sv_main.c,v
+retrieving revision 1.2
+diff -u -r1.2 sv_main.c
+--- src/server/sv_main.c 22 Mar 2002 00:24:37 -0000 1.2
++++ src/server/sv_main.c 29 Jan 2005 20:57:03 -0000
+@@ -293,8 +293,9 @@
+
+ challenge = atoi(Cmd_Argv(3));
+
+- strncpy (userinfo, Cmd_Argv(4), sizeof(userinfo)-1);
+- userinfo[sizeof(userinfo) - 1] = 0;
++ // sku - reserve 32 bytes for the IP address
++ strncpy (userinfo, Cmd_Argv(4), sizeof(userinfo)-32);
++ userinfo[sizeof(userinfo) - 32] = 0;
+
+ // force the IP key/value pair so the game can filter based on ip
+ Info_SetValueForKey (userinfo, "ip", NET_AdrToString(net_from));
+@@ -317,8 +318,11 @@
+ {
+ if (NET_CompareBaseAdr (net_from, svs.challenges[i].adr))
+ {
+- if (challenge == svs.challenges[i].challenge)
++ // sku - ignore zero challenges
++ if( svs.challenges[i].challenge && challenge == svs.challenges[i].challenge ) {
++ svs.challenges[i].challenge = 0;
+ break; // good
++ }
+ Netchan_OutOfBandPrint (NS_SERVER, adr, "print\nBad challenge.\n");
+ return;
+ }
+@@ -342,6 +346,11 @@
+ && ( cl->netchan.qport == qport
+ || adr.port == cl->netchan.remote_address.port ) )
+ {
++ // sku - avoid reusing slot of the client already connected
++ if( cl->state != cs_zombie ) {
++ Netchan_OutOfBandPrint( NS_SERVER, adr, "print\nConnected client from this IP is already present.\n" );
++ return;
++ }
+ if (!NET_IsLocalAddress (adr) && (svs.realtime - cl->lastconnect) < ((int)sv_reconnect_limit->value * 1000))
+ {
+ Com_DPrintf ("%s:reconnect rejected : too soon\n", NET_AdrToString (adr));
+Index: server/sv_user.c
+===================================================================
+RCS file: /cvs/cvsroot/quake2/src/server/sv_user.c,v
+retrieving revision 1.2
+diff -u -r1.2 sv_user.c
+--- src/server/sv_user.c 21 Mar 2002 04:44:46 -0000 1.2
++++ src/server/sv_user.c 29 Jan 2005 20:57:04 -0000
+@@ -142,6 +142,9 @@
+ }
+
+ start = atoi(Cmd_Argv(2));
++ if( start < 0 ) {
++ start = 0; // sku - catch negative offsets
++ }
+
+ // write a packet full of data
+
+@@ -150,9 +153,18 @@
+ {
+ if (sv.configstrings[start][0])
+ {
++ int length;
++
++ // sku - write configstrings that exceed MAX_QPATH in proper-sized chunks
++ length = strlen( sv.configstrings[start] );
++ if( length > MAX_QPATH ) {
++ length = MAX_QPATH;
++ }
++
+ MSG_WriteByte (&sv_client->netchan.message, svc_configstring);
+ MSG_WriteShort (&sv_client->netchan.message, start);
+- MSG_WriteString (&sv_client->netchan.message, sv.configstrings[start]);
++ SZ_Write (&sv_client->netchan.message, sv.configstrings[start], length);
++ MSG_WriteByte (&sv_client->netchan.message, 0);
+ }
+ start++;
+ }
+@@ -199,6 +211,9 @@
+ }
+
+ start = atoi(Cmd_Argv(2));
++ if( start < 0 ) {
++ start = 0;
++ }
+
+ memset (&nullstate, 0, sizeof(nullstate));
+
+@@ -398,7 +413,7 @@
+ */
+ void SV_ShowServerinfo_f (void)
+ {
+- Info_Print (Cvar_Serverinfo());
++// Info_Print (Cvar_Serverinfo());
+ }
+
+
+
+
+
diff --git a/games/quake2-source/files/patch-src_game_g__phys.c b/games/quake2-source/files/patch-src_game_g__phys.c
new file mode 100644
index 000000000000..d6684b01e770
--- /dev/null
+++ b/games/quake2-source/files/patch-src_game_g__phys.c
@@ -0,0 +1,17 @@
+--- src/game/g_phys.c.orig Tue Mar 15 22:15:11 2005
++++ src/game/g_phys.c Tue Mar 15 22:16:41 2005
+@@ -356,7 +356,13 @@
+ mask = MASK_SOLID;
+
+ trace = gi.trace (start, ent->mins, ent->maxs, end, ent, mask);
+-
++
++ if (trace.startsolid || trace.allsolid)
++ {
++ mask ^= CONTENTS_DEADMONSTER;
++ trace = gi.trace (start, ent->mins, ent->maxs, end, ent, mask);
++ }
++
+ VectorCopy (trace.endpos, ent->s.origin);
+ gi.linkentity (ent);
+
diff --git a/games/quake2-source/pkg-descr b/games/quake2-source/pkg-descr
new file mode 100644
index 000000000000..4b82f4c49328
--- /dev/null
+++ b/games/quake2-source/pkg-descr
@@ -0,0 +1,5 @@
+Quake II game source.
+
+This port installs the Quake II game source, together with BSD Makefiles, for
+building modifications. It can also install the Capture the Flag mod, Rogue
+and Xatrix game source.
diff --git a/games/quake2-source/pkg-plist b/games/quake2-source/pkg-plist
new file mode 100644
index 000000000000..e88dbecf7e9c
--- /dev/null
+++ b/games/quake2-source/pkg-plist
@@ -0,0 +1,306 @@
+%%CTF%%%%DATADIR%%/ctf/docs/admin.gif
+%%CTF%%%%DATADIR%%/ctf/docs/adminset.gif
+%%CTF%%%%DATADIR%%/ctf/docs/automac.gif
+%%CTF%%%%DATADIR%%/ctf/docs/ghost.jpg
+%%CTF%%%%DATADIR%%/ctf/docs/grapple.jpg
+%%CTF%%%%DATADIR%%/ctf/docs/layout.jpg
+%%CTF%%%%DATADIR%%/ctf/docs/mainctf_back.jpg
+%%CTF%%%%DATADIR%%/ctf/docs/menu.gif
+%%CTF%%%%DATADIR%%/ctf/docs/q2ctf.html
+%%CTF%%%%DATADIR%%/ctf/docs/say_team.gif
+%%CTF%%%%DATADIR%%/ctf/docs/stats.jpg
+%%CTF%%%%DATADIR%%/ctf/docs/tech1.gif
+%%CTF%%%%DATADIR%%/ctf/docs/tech2.gif
+%%CTF%%%%DATADIR%%/ctf/docs/tech3.gif
+%%CTF%%%%DATADIR%%/ctf/docs/tech4.gif
+%%CTF%%%%DATADIR%%/ctf/Makefile
+%%CTF%%%%DATADIR%%/ctf/g_ai.c
+%%CTF%%%%DATADIR%%/ctf/g_chase.c
+%%CTF%%%%DATADIR%%/ctf/g_cmds.c
+%%CTF%%%%DATADIR%%/ctf/g_combat.c
+%%CTF%%%%DATADIR%%/ctf/g_ctf.c
+%%CTF%%%%DATADIR%%/ctf/g_ctf.h
+%%CTF%%%%DATADIR%%/ctf/g_func.c
+%%CTF%%%%DATADIR%%/ctf/g_items.c
+%%CTF%%%%DATADIR%%/ctf/g_local.h
+%%CTF%%%%DATADIR%%/ctf/g_main.c
+%%CTF%%%%DATADIR%%/ctf/g_misc.c
+%%CTF%%%%DATADIR%%/ctf/g_monster.c
+%%CTF%%%%DATADIR%%/ctf/g_phys.c
+%%CTF%%%%DATADIR%%/ctf/g_save.c
+%%CTF%%%%DATADIR%%/ctf/g_spawn.c
+%%CTF%%%%DATADIR%%/ctf/g_svcmds.c
+%%CTF%%%%DATADIR%%/ctf/g_target.c
+%%CTF%%%%DATADIR%%/ctf/g_trigger.c
+%%CTF%%%%DATADIR%%/ctf/g_utils.c
+%%CTF%%%%DATADIR%%/ctf/g_weapon.c
+%%CTF%%%%DATADIR%%/ctf/game.h
+%%CTF%%%%DATADIR%%/ctf/m_move.c
+%%CTF%%%%DATADIR%%/ctf/m_player.h
+%%CTF%%%%DATADIR%%/ctf/p_client.c
+%%CTF%%%%DATADIR%%/ctf/p_hud.c
+%%CTF%%%%DATADIR%%/ctf/p_menu.c
+%%CTF%%%%DATADIR%%/ctf/p_menu.h
+%%CTF%%%%DATADIR%%/ctf/p_trail.c
+%%CTF%%%%DATADIR%%/ctf/p_view.c
+%%CTF%%%%DATADIR%%/ctf/p_weapon.c
+%%CTF%%%%DATADIR%%/ctf/q_shared.c
+%%CTF%%%%DATADIR%%/ctf/q_shared.h
+%%DATADIR%%/game/Makefile
+%%DATADIR%%/game/g_ai.c
+%%DATADIR%%/game/g_chase.c
+%%DATADIR%%/game/g_cmds.c
+%%DATADIR%%/game/g_combat.c
+%%DATADIR%%/game/g_func.c
+%%DATADIR%%/game/g_items.c
+%%DATADIR%%/game/g_local.h
+%%DATADIR%%/game/g_main.c
+%%DATADIR%%/game/g_misc.c
+%%DATADIR%%/game/g_monster.c
+%%DATADIR%%/game/g_phys.c
+%%DATADIR%%/game/g_save.c
+%%DATADIR%%/game/g_spawn.c
+%%DATADIR%%/game/g_svcmds.c
+%%DATADIR%%/game/g_target.c
+%%DATADIR%%/game/g_trigger.c
+%%DATADIR%%/game/g_turret.c
+%%DATADIR%%/game/g_utils.c
+%%DATADIR%%/game/g_weapon.c
+%%DATADIR%%/game/game.h
+%%DATADIR%%/game/m_actor.c
+%%DATADIR%%/game/m_actor.h
+%%DATADIR%%/game/m_berserk.c
+%%DATADIR%%/game/m_berserk.h
+%%DATADIR%%/game/m_boss2.c
+%%DATADIR%%/game/m_boss2.h
+%%DATADIR%%/game/m_boss3.c
+%%DATADIR%%/game/m_boss31.c
+%%DATADIR%%/game/m_boss31.h
+%%DATADIR%%/game/m_boss32.c
+%%DATADIR%%/game/m_boss32.h
+%%DATADIR%%/game/m_brain.c
+%%DATADIR%%/game/m_brain.h
+%%DATADIR%%/game/m_chick.c
+%%DATADIR%%/game/m_chick.h
+%%DATADIR%%/game/m_flash.c
+%%DATADIR%%/game/m_flipper.c
+%%DATADIR%%/game/m_flipper.h
+%%DATADIR%%/game/m_float.c
+%%DATADIR%%/game/m_float.h
+%%DATADIR%%/game/m_flyer.c
+%%DATADIR%%/game/m_flyer.h
+%%DATADIR%%/game/m_gladiator.c
+%%DATADIR%%/game/m_gladiator.h
+%%DATADIR%%/game/m_gunner.c
+%%DATADIR%%/game/m_gunner.h
+%%DATADIR%%/game/m_hover.c
+%%DATADIR%%/game/m_hover.h
+%%DATADIR%%/game/m_infantry.c
+%%DATADIR%%/game/m_infantry.h
+%%DATADIR%%/game/m_insane.c
+%%DATADIR%%/game/m_insane.h
+%%DATADIR%%/game/m_medic.c
+%%DATADIR%%/game/m_medic.h
+%%DATADIR%%/game/m_move.c
+%%DATADIR%%/game/m_mutant.c
+%%DATADIR%%/game/m_mutant.h
+%%DATADIR%%/game/m_parasite.c
+%%DATADIR%%/game/m_parasite.h
+%%DATADIR%%/game/m_player.h
+%%DATADIR%%/game/m_rider.h
+%%DATADIR%%/game/m_soldier.c
+%%DATADIR%%/game/m_soldier.h
+%%DATADIR%%/game/m_supertank.c
+%%DATADIR%%/game/m_supertank.h
+%%DATADIR%%/game/m_tank.c
+%%DATADIR%%/game/m_tank.h
+%%DATADIR%%/game/p_client.c
+%%DATADIR%%/game/p_hud.c
+%%DATADIR%%/game/p_trail.c
+%%DATADIR%%/game/p_view.c
+%%DATADIR%%/game/p_weapon.c
+%%DATADIR%%/game/q_shared.c
+%%DATADIR%%/game/q_shared.h
+%%ROGUE%%%%DATADIR%%/rogue/Makefile
+%%ROGUE%%%%DATADIR%%/rogue/dm_ball.c
+%%ROGUE%%%%DATADIR%%/rogue/dm_tag.c
+%%ROGUE%%%%DATADIR%%/rogue/g_ai.c
+%%ROGUE%%%%DATADIR%%/rogue/g_chase.c
+%%ROGUE%%%%DATADIR%%/rogue/g_cmds.c
+%%ROGUE%%%%DATADIR%%/rogue/g_combat.c
+%%ROGUE%%%%DATADIR%%/rogue/g_func.c
+%%ROGUE%%%%DATADIR%%/rogue/g_items.c
+%%ROGUE%%%%DATADIR%%/rogue/g_local.h
+%%ROGUE%%%%DATADIR%%/rogue/g_main.c
+%%ROGUE%%%%DATADIR%%/rogue/g_misc.c
+%%ROGUE%%%%DATADIR%%/rogue/g_monster.c
+%%ROGUE%%%%DATADIR%%/rogue/g_newai.c
+%%ROGUE%%%%DATADIR%%/rogue/g_newdm.c
+%%ROGUE%%%%DATADIR%%/rogue/g_newfnc.c
+%%ROGUE%%%%DATADIR%%/rogue/g_newtarg.c
+%%ROGUE%%%%DATADIR%%/rogue/g_newtrig.c
+%%ROGUE%%%%DATADIR%%/rogue/g_newweap.c
+%%ROGUE%%%%DATADIR%%/rogue/g_phys.c
+%%ROGUE%%%%DATADIR%%/rogue/g_save.c
+%%ROGUE%%%%DATADIR%%/rogue/g_spawn.c
+%%ROGUE%%%%DATADIR%%/rogue/g_sphere.c
+%%ROGUE%%%%DATADIR%%/rogue/g_svcmds.c
+%%ROGUE%%%%DATADIR%%/rogue/g_target.c
+%%ROGUE%%%%DATADIR%%/rogue/g_trigger.c
+%%ROGUE%%%%DATADIR%%/rogue/g_turret.c
+%%ROGUE%%%%DATADIR%%/rogue/g_utils.c
+%%ROGUE%%%%DATADIR%%/rogue/g_weapon.c
+%%ROGUE%%%%DATADIR%%/rogue/game.h
+%%ROGUE%%%%DATADIR%%/rogue/m_actor.c
+%%ROGUE%%%%DATADIR%%/rogue/m_actor.h
+%%ROGUE%%%%DATADIR%%/rogue/m_berserk.c
+%%ROGUE%%%%DATADIR%%/rogue/m_berserk.h
+%%ROGUE%%%%DATADIR%%/rogue/m_boss2.c
+%%ROGUE%%%%DATADIR%%/rogue/m_boss2.h
+%%ROGUE%%%%DATADIR%%/rogue/m_boss3.c
+%%ROGUE%%%%DATADIR%%/rogue/m_boss31.c
+%%ROGUE%%%%DATADIR%%/rogue/m_boss31.h
+%%ROGUE%%%%DATADIR%%/rogue/m_boss32.c
+%%ROGUE%%%%DATADIR%%/rogue/m_boss32.h
+%%ROGUE%%%%DATADIR%%/rogue/m_brain.c
+%%ROGUE%%%%DATADIR%%/rogue/m_brain.h
+%%ROGUE%%%%DATADIR%%/rogue/m_carrier.c
+%%ROGUE%%%%DATADIR%%/rogue/m_carrier.h
+%%ROGUE%%%%DATADIR%%/rogue/m_chick.c
+%%ROGUE%%%%DATADIR%%/rogue/m_chick.h
+%%ROGUE%%%%DATADIR%%/rogue/m_flash.c
+%%ROGUE%%%%DATADIR%%/rogue/m_flipper.c
+%%ROGUE%%%%DATADIR%%/rogue/m_flipper.h
+%%ROGUE%%%%DATADIR%%/rogue/m_float.c
+%%ROGUE%%%%DATADIR%%/rogue/m_float.h
+%%ROGUE%%%%DATADIR%%/rogue/m_flyer.c
+%%ROGUE%%%%DATADIR%%/rogue/m_flyer.h
+%%ROGUE%%%%DATADIR%%/rogue/m_gladiator.c
+%%ROGUE%%%%DATADIR%%/rogue/m_gladiator.h
+%%ROGUE%%%%DATADIR%%/rogue/m_gunner.c
+%%ROGUE%%%%DATADIR%%/rogue/m_gunner.h
+%%ROGUE%%%%DATADIR%%/rogue/m_hover.c
+%%ROGUE%%%%DATADIR%%/rogue/m_hover.h
+%%ROGUE%%%%DATADIR%%/rogue/m_infantry.c
+%%ROGUE%%%%DATADIR%%/rogue/m_infantry.h
+%%ROGUE%%%%DATADIR%%/rogue/m_insane.c
+%%ROGUE%%%%DATADIR%%/rogue/m_insane.h
+%%ROGUE%%%%DATADIR%%/rogue/m_medic.c
+%%ROGUE%%%%DATADIR%%/rogue/m_medic.h
+%%ROGUE%%%%DATADIR%%/rogue/m_move.c
+%%ROGUE%%%%DATADIR%%/rogue/m_move2.c
+%%ROGUE%%%%DATADIR%%/rogue/m_mutant.c
+%%ROGUE%%%%DATADIR%%/rogue/m_mutant.h
+%%ROGUE%%%%DATADIR%%/rogue/m_parasite.c
+%%ROGUE%%%%DATADIR%%/rogue/m_parasite.h
+%%ROGUE%%%%DATADIR%%/rogue/m_player.h
+%%ROGUE%%%%DATADIR%%/rogue/m_rider.h
+%%ROGUE%%%%DATADIR%%/rogue/m_soldier.c
+%%ROGUE%%%%DATADIR%%/rogue/m_soldier.h
+%%ROGUE%%%%DATADIR%%/rogue/m_stalker.c
+%%ROGUE%%%%DATADIR%%/rogue/m_stalker.h
+%%ROGUE%%%%DATADIR%%/rogue/m_supertank.c
+%%ROGUE%%%%DATADIR%%/rogue/m_supertank.h
+%%ROGUE%%%%DATADIR%%/rogue/m_tank.c
+%%ROGUE%%%%DATADIR%%/rogue/m_tank.h
+%%ROGUE%%%%DATADIR%%/rogue/m_turret.c
+%%ROGUE%%%%DATADIR%%/rogue/m_turret.h
+%%ROGUE%%%%DATADIR%%/rogue/m_widow.c
+%%ROGUE%%%%DATADIR%%/rogue/m_widow.h
+%%ROGUE%%%%DATADIR%%/rogue/m_widow2.c
+%%ROGUE%%%%DATADIR%%/rogue/m_widow2.h
+%%ROGUE%%%%DATADIR%%/rogue/p_client.c
+%%ROGUE%%%%DATADIR%%/rogue/p_hud.c
+%%ROGUE%%%%DATADIR%%/rogue/p_trail.c
+%%ROGUE%%%%DATADIR%%/rogue/p_view.c
+%%ROGUE%%%%DATADIR%%/rogue/p_weapon.c
+%%ROGUE%%%%DATADIR%%/rogue/q_shared.c
+%%ROGUE%%%%DATADIR%%/rogue/q_shared.h
+%%XATRIX%%%%DATADIR%%/xatrix/Makefile
+%%XATRIX%%%%DATADIR%%/xatrix/g_ai.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_chase.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_cmds.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_combat.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_func.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_items.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_local.h
+%%XATRIX%%%%DATADIR%%/xatrix/g_main.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_misc.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_monster.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_phys.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_save.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_spawn.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_svcmds.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_target.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_trigger.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_turret.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_utils.c
+%%XATRIX%%%%DATADIR%%/xatrix/g_weapon.c
+%%XATRIX%%%%DATADIR%%/xatrix/game.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_actor.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_actor.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_berserk.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_berserk.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_boss2.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_boss2.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_boss3.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_boss31.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_boss31.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_boss32.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_boss32.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_boss5.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_brain.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_brain.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_chick.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_chick.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_fixbot.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_fixbot.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_flash.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_flipper.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_flipper.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_float.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_float.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_flyer.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_flyer.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_gekk.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_gekk.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_gladb.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_gladiator.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_gladiator.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_gunner.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_gunner.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_hover.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_hover.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_infantry.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_infantry.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_insane.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_insane.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_medic.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_medic.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_move.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_mutant.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_mutant.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_parasite.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_parasite.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_player.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_rider.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_soldier.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_soldier.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_soldierh.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_supertank.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_supertank.h
+%%XATRIX%%%%DATADIR%%/xatrix/m_tank.c
+%%XATRIX%%%%DATADIR%%/xatrix/m_tank.h
+%%XATRIX%%%%DATADIR%%/xatrix/p_client.c
+%%XATRIX%%%%DATADIR%%/xatrix/p_hud.c
+%%XATRIX%%%%DATADIR%%/xatrix/p_trail.c
+%%XATRIX%%%%DATADIR%%/xatrix/p_view.c
+%%XATRIX%%%%DATADIR%%/xatrix/p_weapon.c
+%%XATRIX%%%%DATADIR%%/xatrix/q_shared.c
+%%XATRIX%%%%DATADIR%%/xatrix/q_shared.h
+%%XATRIX%%@dirrm %%DATADIR%%/xatrix
+%%ROGUE%%@dirrm %%DATADIR%%/rogue
+@dirrm %%DATADIR%%/game
+%%CTF%%@dirrm %%DATADIR%%/ctf/docs
+%%CTF%%@dirrm %%DATADIR%%/ctf
+@dirrm %%DATADIR%%