aboutsummaryrefslogtreecommitdiff
path: root/games/alienarena
diff options
context:
space:
mode:
authorAlejandro Pulver <alepulver@FreeBSD.org>2006-05-18 17:28:15 +0000
committerAlejandro Pulver <alepulver@FreeBSD.org>2006-05-18 17:28:15 +0000
commitb02d4abd83f023ee3dc2387a74da469f3187e2cb (patch)
tree33405ca9618c44da27a7bf9c692bfdbd96b36ddf /games/alienarena
parent456ebe191c4d4790ba81c3503501ad49e727f083 (diff)
downloadports-b02d4abd83f023ee3dc2387a74da469f3187e2cb.tar.gz
ports-b02d4abd83f023ee3dc2387a74da469f3187e2cb.zip
Notes
Diffstat (limited to 'games/alienarena')
-rw-r--r--games/alienarena/Makefile95
-rw-r--r--games/alienarena/distinfo6
-rw-r--r--games/alienarena/files/alienarena-ded.in5
-rw-r--r--games/alienarena/files/alienarena-sdl.in5
-rw-r--r--games/alienarena/files/alienarena.in5
-rw-r--r--games/alienarena/files/patch-client__qmenu.c12
-rw-r--r--games/alienarena/files/patch-client__snd_dma.c48
-rw-r--r--games/alienarena/files/patch-game__acesrc__acebot_compress.c10
-rw-r--r--games/alienarena/files/patch-game__g_phys.c17
-rw-r--r--games/alienarena/files/patch-linux__Makefile142
-rw-r--r--games/alienarena/files/patch-linux__cd_linux.c255
-rw-r--r--games/alienarena/files/patch-linux__gl_glx.c25
-rw-r--r--games/alienarena/files/patch-linux__q_shlinux.c56
-rw-r--r--games/alienarena/files/patch-linux__snd_linux.c363
-rw-r--r--games/alienarena/files/patch-linux__sys_linux.c23
-rw-r--r--games/alienarena/files/patch-qcommon__cmd.c25
-rw-r--r--games/alienarena/files/patch-qcommon__common.c24
-rw-r--r--games/alienarena/files/patch-server__sv_main.c40
-rw-r--r--games/alienarena/files/patch-server__sv_user.c51
-rw-r--r--games/alienarena/pkg-descr10
-rw-r--r--games/alienarena/pkg-message15
-rw-r--r--games/alienarena/pkg-plist34
22 files changed, 1266 insertions, 0 deletions
diff --git a/games/alienarena/Makefile b/games/alienarena/Makefile
new file mode 100644
index 000000000000..349866a70a72
--- /dev/null
+++ b/games/alienarena/Makefile
@@ -0,0 +1,95 @@
+# New ports collection makefile for: alienarena
+# Date created: 11 May 2006
+# Whom: alepulver
+#
+# $FreeBSD$
+#
+
+PORTNAME= alienarena
+DISTVERSION= 2006.ge
+CATEGORIES= games
+MASTER_SITES= http://offload1.icculus.org/~ravage/alienarena2006/ \
+ http://cor.planetquake.gamespy.com/codered/files/
+DISTFILES= ${PORTNAME}-2006ge-x86.run \
+ aa2k6updateGE501c-x86.zip
+
+MAINTAINER= alepulver@FreeBSD.org
+COMMENT= Alien Arena 2006 (native version)
+
+LIB_DEPENDS= jpeg.9:${PORTSDIR}/graphics/jpeg
+RUN_DEPENDS= ${DATADIR}/arena/default.cfg:${PORTSDIR}/games/alienarena-data
+
+USE_X_PREFIX= yes
+USE_ZIP= yes
+USE_DOS2UNIX= yes
+USE_GCC= 3.2+
+USE_GL= yes
+USE_GMAKE= yes
+
+BUILD_WRKSRC= ${WRKDIR}/source/linux
+WRKSRC= ${WRKDIR}/source
+ALL_TARGET= build_release
+
+OPTIONS= OPTIMIZED_CFLAGS "Enable compilation optimizations" on \
+ SDL "Build client that uses SDL for sound" on
+
+SUB_FILES= alienarena alienarena-ded
+SUB_LIST= LIBDIR=${LIBDIR}
+PLIST_SUB= LIBDIR=${LIBDIR:S/${PREFIX}\///}
+
+LIBDIR= ${PREFIX}/lib/${PORTNAME}
+
+.include <bsd.port.pre.mk>
+
+EXE_TARGETS= crx crded
+SCRIPTS= alienarena alienarena-ded
+
+.if !defined(WITHOUT_OPTIMIZED_CFLAGS)
+MAKE_ENV+= OPTIMIZED_CFLAGS=YES
+.endif
+
+.if !defined(WITHOUT_SDL)
+USE_SDL= sdl
+MAKE_ENV+= SDLSOUND=1
+EXE_TARGETS+= crx.sdl
+SCRIPTS+= alienarena-sdl
+SUB_FILES+= alienarena-sdl
+PLIST_SUB+= SDL=""
+.else
+PLIST_SUB+= SDL="@comment "
+.endif
+
+post-patch:
+ @${FIND} ${WRKSRC} -type f | ${GREP} -Ev \
+ '(game/g_main|linux/(gl_glx|(q_sh|snd_)linux))\.c' | \
+ ${XARGS} ${REINPLACE_CMD} -e 's/__linux__/__unix__/g'
+
+do-extract:
+ @${MKDIR} ${WRKDIR}
+ @cd ${WRKDIR} && \
+ ${TAIL} -c +8814 ${DISTDIR}/${PORTNAME}-2006ge-x86.run | \
+ ${TAR} zxf -
+ @${TAR} zxf ${WRKDIR}/alienarena-2006ge-src.tar.gz -C ${WRKDIR}
+ @${UNZIP_CMD} -qod ${WRKDIR} ${DISTDIR}/aa2k6updateGE501c-x86.zip
+
+do-install:
+ ${MKDIR} ${LIBDIR}/arena ${LIBDIR}/data1
+ cd ${BUILD_WRKSRC}/release && \
+ ${INSTALL_PROGRAM} arena/game.so ${LIBDIR}/arena && \
+ ${INSTALL_PROGRAM} game.so ${LIBDIR}/data1
+ ${LN} -s ${DATADIR}/arena/* ${LIBDIR}/arena
+ ${LN} -s ${DATADIR}/botinfo ${LIBDIR}
+ ${LN} -s ${DATADIR}/data1/* ${LIBDIR}/data1
+.for f in ${EXE_TARGETS}
+ ${INSTALL_PROGRAM} ${BUILD_WRKSRC}/release/${f} ${LIBDIR}
+.endfor
+.for f in ${SCRIPTS}
+ ${INSTALL_SCRIPT} ${WRKDIR}/${f} ${PREFIX}/bin
+.endfor
+
+post-install:
+ @${ECHO_CMD}
+ @${CAT} ${PKGMESSAGE}
+ @${ECHO_CMD}
+
+.include <bsd.port.post.mk>
diff --git a/games/alienarena/distinfo b/games/alienarena/distinfo
new file mode 100644
index 000000000000..ec80370b31eb
--- /dev/null
+++ b/games/alienarena/distinfo
@@ -0,0 +1,6 @@
+MD5 (alienarena-2006ge-x86.run) = f27923b13dc586b649134d7a4bfc0709
+SHA256 (alienarena-2006ge-x86.run) = ce6b47c86bde5b3aefc572897c0e46fc5e8b2cafa178293835ee074951b50e1a
+SIZE (alienarena-2006ge-x86.run) = 164160207
+MD5 (aa2k6updateGE501c-x86.zip) = 87266deb278b2d88be0c5c08f16b4885
+SHA256 (aa2k6updateGE501c-x86.zip) = f08207ce05c8862fcf1a59344e4a815904486b636601d28287e54c10328fecc8
+SIZE (aa2k6updateGE501c-x86.zip) = 10860682
diff --git a/games/alienarena/files/alienarena-ded.in b/games/alienarena/files/alienarena-ded.in
new file mode 100644
index 000000000000..1071c8bd7681
--- /dev/null
+++ b/games/alienarena/files/alienarena-ded.in
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+cd %%LIBDIR%% || exit 1
+
+exec ./crded +set game arena "$@"
diff --git a/games/alienarena/files/alienarena-sdl.in b/games/alienarena/files/alienarena-sdl.in
new file mode 100644
index 000000000000..d09ae2fdf5c2
--- /dev/null
+++ b/games/alienarena/files/alienarena-sdl.in
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+cd %%LIBDIR%% || exit 1
+
+exec ./crx.sdl +set game arena "$@"
diff --git a/games/alienarena/files/alienarena.in b/games/alienarena/files/alienarena.in
new file mode 100644
index 000000000000..2f71ae336a90
--- /dev/null
+++ b/games/alienarena/files/alienarena.in
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+cd %%LIBDIR%% || exit 1
+
+exec ./crx +set game arena "$@"
diff --git a/games/alienarena/files/patch-client__qmenu.c b/games/alienarena/files/patch-client__qmenu.c
new file mode 100644
index 000000000000..75805f0cc98a
--- /dev/null
+++ b/games/alienarena/files/patch-client__qmenu.c
@@ -0,0 +1,12 @@
+--- ./client/qmenu.c.orig Tue May 16 15:20:10 2006
++++ ./client/qmenu.c Tue May 16 15:20:10 2006
+@@ -25,7 +25,8 @@
+
+ static void Action_DoEnter( menuaction_s *a );
+ static void Action_Draw( menuaction_s *a );
+-static void Menu_DrawStatusBar( const char *string );
++static void Menu_DrawStatusBar( const char *string );
++void Menu_DrawString( int x, int y, const char *string );
+ static void Menulist_DoEnter( menulist_s *l );
+ static void MenuList_Draw( menulist_s *l );
+ static void Separator_Draw( menuseparator_s *s );
diff --git a/games/alienarena/files/patch-client__snd_dma.c b/games/alienarena/files/patch-client__snd_dma.c
new file mode 100644
index 000000000000..cc2b0d15352f
--- /dev/null
+++ b/games/alienarena/files/patch-client__snd_dma.c
@@ -0,0 +1,48 @@
+--- ./client/snd_dma.c.orig Tue May 16 15:20:10 2006
++++ ./client/snd_dma.c Tue May 16 15:20:10 2006
+@@ -771,8 +771,17 @@
+ clear = 0;
+
+ SNDDMA_BeginPainting ();
+- if (dma.buffer)
+- memset(dma.buffer, clear, dma.samples * dma.samplebits/8);
++ if (dma.buffer) {
++ int i;
++ unsigned char *ptr = (unsigned char *)dma.buffer;
++
++ /* clear it manually because the buffer might be writeonly (mmap) */
++ i = dma.samples * dma.samplebits/8;
++ while (i--) {
++ *ptr = clear;
++ ptr++;
++ }
++ }
+ SNDDMA_Submit ();
+ }
+
+@@ -892,8 +901,23 @@
+ ch->rightvol = right_total;
+ ch->autosound = true; // remove next frame
+ ch->sfx = sfx;
+- ch->pos = paintedtime % sc->length;
+- ch->end = paintedtime + sc->length - ch->pos;
++ /*
++ * PATCH: eliasm
++ *
++ * Sometimes, the sc->length argument can become 0,
++ * and in that case we get a SIGFPE in the next
++ * modulo operation. The workaround checks for this
++ * situation and in that case, sets the pos and end
++ * parameters to 0.
++ */
++ if( sc->length == 0 ) {
++ ch->pos = 0;
++ ch->end = 0;
++ }
++ else {
++ ch->pos = paintedtime % sc->length;
++ ch->end = paintedtime + sc->length - ch->pos;
++ }
+ }
+ }
+
diff --git a/games/alienarena/files/patch-game__acesrc__acebot_compress.c b/games/alienarena/files/patch-game__acesrc__acebot_compress.c
new file mode 100644
index 000000000000..1f5463c56401
--- /dev/null
+++ b/games/alienarena/files/patch-game__acesrc__acebot_compress.c
@@ -0,0 +1,10 @@
+--- ./game/acesrc/acebot_compress.c.orig Tue May 16 15:20:10 2006
++++ ./game/acesrc/acebot_compress.c Tue May 16 15:20:10 2006
+@@ -17,7 +17,6 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <ctype.h>
+-#include <malloc.h>
+
+ #define N 4096 /* size of ring buffer */
+ #define F 18 /* upper limit for match_length */
diff --git a/games/alienarena/files/patch-game__g_phys.c b/games/alienarena/files/patch-game__g_phys.c
new file mode 100644
index 000000000000..6837d615b9ce
--- /dev/null
+++ b/games/alienarena/files/patch-game__g_phys.c
@@ -0,0 +1,17 @@
+--- ./game/g_phys.c.orig Tue May 16 15:20:10 2006
++++ ./game/g_phys.c Tue May 16 15:20:10 2006
+@@ -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/alienarena/files/patch-linux__Makefile b/games/alienarena/files/patch-linux__Makefile
new file mode 100644
index 000000000000..bae475f435ec
--- /dev/null
+++ b/games/alienarena/files/patch-linux__Makefile
@@ -0,0 +1,142 @@
+--- ./linux/Makefile.orig Tue May 16 15:20:10 2006
++++ ./linux/Makefile Tue May 16 15:22:41 2006
+@@ -11,25 +11,14 @@
+ GLIBC=
+ endif
+
+-ifneq (,$(findstring alpha,$(shell uname -m)))
+-ARCH=axp
+-else
+-ifneq (,$(findstring ppc,$(shell uname -m)))
+-ARCH=ppc
+-else
+-ifneq (,$(findstring x86_64,$(shell uname -m)))
+-ARCH=x86_64
+-else
+-ARCH=i386
+-endif
+-endif
+-endif
++ARCH=$(shell uname -m)
++
+ NOARCH=noarch
+
+ MOUNT_DIR=..
+
+-BUILD_DEBUG_DIR=debug$(ARCH)
+-BUILD_RELEASE_DIR=release$(ARCH)
++BUILD_DEBUG_DIR=debug
++BUILD_RELEASE_DIR=release
+ CLIENT_DIR=$(MOUNT_DIR)/client
+ SERVER_DIR=$(MOUNT_DIR)/server
+ REF_GL_DIR=$(MOUNT_DIR)/ref_gl
+@@ -42,54 +31,38 @@
+
+ EGCS=/usr/local/egcs-1.1.2/bin/gcc
+
+-CC=gcc
++CC?=gcc
+
+-ifeq ($(ARCH),x86_64)
+-_LIB := lib64
+-else
+-_LIB := lib
+-endif
++BASE_CFLAGS=$(CFLAGS) -Dstricmp=strcasecmp -D_stricmp=strcasecmp
+
+-BASE_CFLAGS=-Dstricmp=strcasecmp -D_stricmp=strcasecmp -D__linux__
++RELEASE_CFLAGS=$(BASE_CFLAGS)
+
+-ifeq ($(ARCH),axp)
+-RELEASE_CFLAGS=$(BASE_CFLAGS) -ffast-math -funroll-loops \
++ifdef OPTIMIZED_CFLAGS
++RELEASE_CFLAGS+=-O2 -ffast-math -funroll-loops \
+ -fomit-frame-pointer -fexpensive-optimizations
++ ifeq ($(ARCH),i386)
++RELEASE_CFLAGS+=-falign-loops=2 -falign-jumps=2 -falign-functions=2 \
++ -fno-strict-aliasing
++ endif
+ endif
+
+-ifeq ($(ARCH),ppc)
+-RELEASE_CFLAGS=$(BASE_CFLAGS) -O2 -ffast-math -funroll-loops \
+- -fomit-frame-pointer -fexpensive-optimizations
+-endif
++ARENA_CFLAGS=-DARENA
+
+-ifeq ($(ARCH),sparc)
+-RELEASE_CFLAGS=$(BASE_CFLAGS) -ffast-math -funroll-loops \
+- -fomit-frame-pointer -fexpensive-optimizations
+-endif
++DEBUG_CFLAGS=$(BASE_CFLAGS) -g
+
+-ifeq ($(ARCH),i386)
+-RELEASE_CFLAGS=$(BASE_CFLAGS) -O2 -ffast-math -funroll-loops -falign-loops=2 \
+- -falign-jumps=2 -falign-functions=2 -fno-strict-aliasing
+-endif
++LDFLAGS+=-lm
+
+-ifeq ($(ARCH),x86_64)
+-RELEASE_CFLAGS=$(BASE_CFLAGS) -O2 -ffast-math -funroll-loops \
+- -fomit-frame-pointer -fexpensive-optimizations -fno-strict-aliasing
+-endif
++SVGALDFLAGS=-lvga -lm
+
+-ARENA_CFLAGS=-DARENA
++GLCFLAGS=-I$(X11BASE)/include
+
+-DEBUG_CFLAGS=$(BASE_CFLAGS) -g
+-LDFLAGS=-ldl -lm
+-SVGALDFLAGS=-lvga -lm
+-XLDFLAGS=-L/usr/X11R6/$(_LIB) -lX11 -lXext -lXxf86dga
+-XCFLAGS=
++XLDFLAGS=-L$(X11BASE)/lib -lX11 -lXext -lXxf86dga
+
+-GLLDFLAGS=-L/usr/X11R6/$(_LIB) -L/usr/local/$(_LIB) -lX11 -lXext -lvga -lm
+-GLXLDFLAGS=-L/usr/X11R6/$(_LIB) -L/usr/local/$(_LIB) -lX11 -lXext -lXxf86dga -lXxf86vm -lm -ljpeg -lGL -lGLU
++GLLDFLAGS=-L$(X11BASE)/lib -L$(LOCALBASE)/lib -lX11 -lXext -lvga -lm
++GLXLDFLAGS=-L$(X11BASE)/lib -L$(LOCALBASE)/lib -lX11 -lXext -lXxf86dga -lXxf86vm -lm -ljpeg -lGL -lGLU
+
+-SDLCFLAGS=$(shell sdl-config --cflags)
+-SDLLDFLAGS=$(shell sdl-config --libs)
++SDLCFLAGS=$(shell $(SDL_CONFIG) --cflags)
++SDLLDFLAGS=$(shell $(SDL_CONFIG) --libs)
+
+ SHLIBEXT=so
+
+@@ -117,13 +90,13 @@
+
+ ifeq ($(ARCH),axp)
+ TARGETS=$(BUILDDIR)/crded \
+- $(BUILDDIR)/game$(ARCH).$(SHLIBEXT) \
+- $(BUILDDIR)/arena/game$(ARCH).$(SHLIBEXT)
++ $(BUILDDIR)/game.$(SHLIBEXT) \
++ $(BUILDDIR)/arena/game.$(SHLIBEXT)
+ else
+ TARGETS=$(BUILDDIR)/crded \
+ $(BUILDDIR)/crx \
+- $(BUILDDIR)/game$(ARCH).$(SHLIBEXT) \
+- $(BUILDDIR)/arena/game$(ARCH).$(SHLIBEXT)
++ $(BUILDDIR)/game.$(SHLIBEXT) \
++ $(BUILDDIR)/arena/game.$(SHLIBEXT)
+ endif
+
+ ifeq ($(strip $(SDLSOUND)),1)
+@@ -617,7 +590,7 @@
+
+
+
+-$(BUILDDIR)/game$(ARCH).$(SHLIBEXT) : $(GAME_OBJS)
++$(BUILDDIR)/game.$(SHLIBEXT) : $(GAME_OBJS)
+ $(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(GAME_OBJS)
+
+
+@@ -853,7 +826,7 @@
+ $(BUILDDIR)/arena/p_weapon.o \
+ $(BUILDDIR)/arena/vehicles.o
+
+-$(BUILDDIR)/arena/game$(ARCH).$(SHLIBEXT) : $(ARENA_OBJS)
++$(BUILDDIR)/arena/game.$(SHLIBEXT) : $(ARENA_OBJS)
+ $(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(ARENA_OBJS)
+
+
diff --git a/games/alienarena/files/patch-linux__cd_linux.c b/games/alienarena/files/patch-linux__cd_linux.c
new file mode 100644
index 000000000000..6bf7dcbdb7d3
--- /dev/null
+++ b/games/alienarena/files/patch-linux__cd_linux.c
@@ -0,0 +1,255 @@
+--- ./linux/cd_linux.c.orig Tue May 16 15:20:10 2006
++++ ./linux/cd_linux.c Tue May 16 15:20:10 2006
+@@ -31,7 +31,11 @@
+ #include <time.h>
+ #include <errno.h>
+
+-#include <linux/cdrom.h>
++#if defined(__FreeBSD__)
++ #include <sys/cdio.h>
++#else
++ #include <linux/cdrom.h>
++#endif
+
+ #include "../client/client.h"
+
+@@ -61,8 +65,13 @@
+ if (cdfile == -1 || !enabled)
+ return; // no cd init'd
+
++#if defined(__FreeBSD__)
++ if ( ioctl(cdfile, CDIOCEJECT) == -1 )
++ Com_DPrintf("ioctl cdioeject failed\n");
++#else
+ if ( ioctl(cdfile, CDROMEJECT) == -1 )
+ Com_DPrintf("ioctl cdromeject failed\n");
++#endif
+ }
+
+
+@@ -71,30 +80,53 @@
+ if (cdfile == -1 || !enabled)
+ return; // no cd init'd
+
++#if defined(__FreeBSD__)
++ if ( ioctl(cdfile, CDIOCCLOSE) == -1 )
++ Com_DPrintf("ioctl cdiocclose failed\n");
++#else
+ if ( ioctl(cdfile, CDROMCLOSETRAY) == -1 )
+ Com_DPrintf("ioctl cdromclosetray failed\n");
++#endif
+ }
+
+ static int CDAudio_GetAudioDiskInfo(void)
+ {
++#if defined(__FreeBSD__)
++ struct ioc_toc_header tochdr;
++#else
+ struct cdrom_tochdr tochdr;
++#endif
+
+ cdValid = false;
+
++#if defined(__FreeBSD__)
++ if ( ioctl(cdfile, CDIOREADTOCHEADER, &tochdr) == -1 )
++ {
++ Com_DPrintf("ioctl cdioreadtocheader failed\n");
++#else
+ if ( ioctl(cdfile, CDROMREADTOCHDR, &tochdr) == -1 )
+ {
+ Com_DPrintf("ioctl cdromreadtochdr failed\n");
++#endif
+ return -1;
+ }
+
++#if defined(__FreeBSD__)
++ if (tochdr.starting_track < 1)
++#else
+ if (tochdr.cdth_trk0 < 1)
++#endif
+ {
+ Com_DPrintf("CDAudio: no music tracks\n");
+ return -1;
+ }
+
+ cdValid = true;
++#if defined(__FreeBSD__)
++ maxTrack = tochdr.ending_track;
++#else
+ maxTrack = tochdr.cdth_trk1;
++#endif
+
+ return 0;
+ }
+@@ -102,8 +134,14 @@
+
+ void CDAudio_Play(int track, qboolean looping)
+ {
++#if defined(__FreeBSD__)
++ struct ioc_read_toc_entry entry;
++ struct cd_toc_entry toc_buffer;
++ struct ioc_play_track ti;
++#else
+ struct cdrom_tocentry entry;
+ struct cdrom_ti ti;
++#endif
+
+ if (cdfile == -1 || !enabled)
+ return;
+@@ -123,6 +161,21 @@
+ return;
+ }
+
++#if defined(__FreeBSD__)
++ #define CDROM_DATA_TRACK 4
++ bzero((char *)&toc_buffer, sizeof(toc_buffer));
++ entry.data_len = sizeof(toc_buffer);
++ entry.data = &toc_buffer;
++ // don't try to play a non-audio track
++ entry.starting_track = track;
++ entry.address_format = CD_MSF_FORMAT;
++ if ( ioctl(cdfile, CDIOREADTOCENTRYS, &entry) == -1 )
++ {
++ Com_DPrintf("ioctl cdromreadtocentry failed\n");
++ return;
++ }
++ if (toc_buffer.control == CDROM_DATA_TRACK)
++#else
+ // don't try to play a non-audio track
+ entry.cdte_track = track;
+ entry.cdte_format = CDROM_MSF;
+@@ -132,6 +185,7 @@
+ return;
+ }
+ if (entry.cdte_ctrl == CDROM_DATA_TRACK)
++#endif
+ {
+ Com_Printf("CDAudio: track %i is not audio\n", track);
+ return;
+@@ -144,18 +198,33 @@
+ CDAudio_Stop();
+ }
+
++#if defined(__FreeBSD__)
++ ti.start_track = track;
++ ti.end_track = track;
++ ti.start_index = 1;
++ ti.end_index = 99;
++#else
+ ti.cdti_trk0 = track;
+ ti.cdti_trk1 = track;
+- ti.cdti_ind0 = 1;
+- ti.cdti_ind1 = 99;
++ ti.cdti_ind0 = 0;
++ ti.cdti_ind1 = 0;
++#endif
+
+- if ( ioctl(cdfile, CDROMPLAYTRKIND, &ti) == -1 )
+- {
++#if defined(__FreeBSD__)
++ if ( ioctl(cdfile, CDIOCPLAYTRACKS, &ti) == -1 )
++#else
++ if ( ioctl(cdfile, CDROMPLAYTRKIND, &ti) == -1 )
++#endif
++ {
+ Com_DPrintf("ioctl cdromplaytrkind failed\n");
+ return;
+ }
+
+- if ( ioctl(cdfile, CDROMRESUME) == -1 )
++#if defined(__FreeBSD__)
++ if ( ioctl(cdfile, CDIOCRESUME) == -1 )
++#else
++ if ( ioctl(cdfile, CDROMRESUME) == -1 )
++#endif
+ Com_DPrintf("ioctl cdromresume failed\n");
+
+ playLooping = looping;
+@@ -175,8 +244,13 @@
+ if (!playing)
+ return;
+
++#if defined(__FreeBSD__)
++ if ( ioctl(cdfile, CDIOCSTOP) == -1 )
++ Com_DPrintf("ioctl cdiocstop failed (%d)\n", errno);
++#else
+ if ( ioctl(cdfile, CDROMSTOP) == -1 )
+ Com_DPrintf("ioctl cdromstop failed (%d)\n", errno);
++#endif
+
+ wasPlaying = false;
+ playing = false;
+@@ -190,8 +264,13 @@
+ if (!playing)
+ return;
+
++#if defined(__FreeBSD__)
++ if ( ioctl(cdfile, CDIOCPAUSE) == -1 )
++ Com_DPrintf("ioctl cdiocpause failed\n");
++#else
+ if ( ioctl(cdfile, CDROMPAUSE) == -1 )
+ Com_DPrintf("ioctl cdrompause failed\n");
++#endif
+
+ wasPlaying = playing;
+ playing = false;
+@@ -209,8 +288,13 @@
+ if (!wasPlaying)
+ return;
+
++#if defined(__FreeBSD__)
++ if ( ioctl(cdfile, CDIOCRESUME) == -1 )
++ Com_DPrintf("ioctl cdiocresume failed\n");
++#else
+ if ( ioctl(cdfile, CDROMRESUME) == -1 )
+ Com_DPrintf("ioctl cdromresume failed\n");
++#endif
+ playing = true;
+ }
+
+@@ -334,7 +418,12 @@
+
+ void CDAudio_Update(void)
+ {
++#if defined(__FreeBSD__)
++ struct ioc_read_subchannel subchnl;
++ struct cd_sub_channel_info data;
++#else
+ struct cdrom_subchnl subchnl;
++#endif
+ static time_t lastchk;
+
+ if (cdfile == -1 || !enabled)
+@@ -358,6 +447,24 @@
+
+ if (playing && lastchk < time(NULL)) {
+ lastchk = time(NULL) + 2; //two seconds between chks
++#if defined(__FreeBSD__)
++ subchnl.address_format = CD_MSF_FORMAT;
++ subchnl.data_format = CD_CURRENT_POSITION;
++ subchnl.data_len = sizeof(data);
++ subchnl.track = playTrack;
++ subchnl.data = &data;
++ if (ioctl(cdfile, CDIOCREADSUBCHANNEL, &subchnl) == -1 ) {
++ Com_DPrintf("ioctl cdiocreadsubchannel failed\n");
++ playing = false;
++ return;
++ }
++ if (subchnl.data->header.audio_status != CD_AS_PLAY_IN_PROGRESS &&
++ subchnl.data->header.audio_status != CD_AS_PLAY_PAUSED) {
++ playing = false;
++ if (playLooping)
++ CDAudio_Play(playTrack, true);
++ }
++#else
+ subchnl.cdsc_format = CDROM_MSF;
+ if (ioctl(cdfile, CDROMSUBCHNL, &subchnl) == -1 ) {
+ Com_DPrintf("ioctl cdromsubchnl failed\n");
+@@ -370,6 +477,7 @@
+ if (playLooping)
+ CDAudio_Play(playTrack, true);
+ }
++#endif
+ }
+ }
+
diff --git a/games/alienarena/files/patch-linux__gl_glx.c b/games/alienarena/files/patch-linux__gl_glx.c
new file mode 100644
index 000000000000..6559a8661dbe
--- /dev/null
+++ b/games/alienarena/files/patch-linux__gl_glx.c
@@ -0,0 +1,25 @@
+--- ./linux/gl_glx.c.orig Tue May 16 15:20:09 2006
++++ ./linux/gl_glx.c Tue May 16 15:20:10 2006
+@@ -34,7 +34,9 @@
+ #include <termios.h>
+ #include <sys/ioctl.h>
+ #include <sys/stat.h>
++#ifdef __linux__
+ #include <sys/vt.h>
++#endif
+ #include <stdarg.h>
+ #include <stdio.h>
+ #include <unistd.h>
+@@ -342,10 +344,8 @@
+ }
+ else
+ {
+- mx = -((int)event.xmotion.x - mwx);// * 2;
+- my = -((int)event.xmotion.y - mwy);// * 2;
+- mwx = event.xmotion.x;
+- mwy = event.xmotion.y;
++ mx += ((int)event.xmotion.x - mwx) * 2;
++ my += ((int)event.xmotion.y - mwy) * 2;
+
+ if (mx || my)
+ dowarp = true;
diff --git a/games/alienarena/files/patch-linux__q_shlinux.c b/games/alienarena/files/patch-linux__q_shlinux.c
new file mode 100644
index 000000000000..c0cf6650f962
--- /dev/null
+++ b/games/alienarena/files/patch-linux__q_shlinux.c
@@ -0,0 +1,56 @@
+--- ./linux/q_shlinux.c.orig Tue May 16 15:20:09 2006
++++ ./linux/q_shlinux.c Tue May 16 15:20:10 2006
+@@ -30,6 +30,11 @@
+
+ #include "../qcommon/qcommon.h"
+
++#ifndef __linux__
++/* For round_page() macro. */
++#include <machine/param.h>
++#endif
++
+ //===============================================================================
+
+ byte *membase;
+@@ -42,7 +47,7 @@
+ maxhunksize = maxsize + sizeof(int);
+ curhunksize = 0;
+ membase = mmap(0, maxhunksize, PROT_READ|PROT_WRITE,
+- MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
++ MAP_PRIVATE|MAP_ANON, -1, 0);
+ if (membase == NULL || membase == (byte *)-1)
+ Sys_Error("unable to virtual allocate %d bytes", maxsize);
+
+@@ -68,7 +73,32 @@
+ {
+ byte *n;
+
++#ifndef __linux__
++ /*
++ * The Linux system call mremap() is not present, so a wrapper is
++ * needed. This code frees the unused part of the allocated memory
++ * (equivalent to mremap() when shrinking a block of memory).
++ */
++
++ size_t old_size = maxhunksize;
++ size_t new_size = curhunksize + sizeof(int);
++ void * unmap_base;
++ size_t unmap_len;
++
++ new_size = round_page(new_size);
++ old_size = round_page(old_size);
++
++ if (new_size > old_size)
++ n = 0; /* error */
++ else if (new_size < old_size)
++ {
++ unmap_base = (caddr_t)(membase + new_size);
++ unmap_len = old_size - new_size;
++ n = munmap(unmap_base, unmap_len) + membase;
++ }
++#else
+ n = mremap(membase, maxhunksize, curhunksize + sizeof(int), 0);
++#endif
+ if (n != membase)
+ Sys_Error("Hunk_End: Could not remap virtual block (%d)", errno);
+ *((int *)membase) = curhunksize + sizeof(int);
diff --git a/games/alienarena/files/patch-linux__snd_linux.c b/games/alienarena/files/patch-linux__snd_linux.c
new file mode 100644
index 000000000000..c86de1f4d769
--- /dev/null
+++ b/games/alienarena/files/patch-linux__snd_linux.c
@@ -0,0 +1,363 @@
+--- ./linux/snd_linux.c.orig Tue May 16 15:20:09 2006
++++ ./linux/snd_linux.c Tue May 16 15:20:10 2006
+@@ -25,13 +25,17 @@
+ #include <sys/mman.h>
+ #include <sys/shm.h>
+ #include <sys/wait.h>
++#ifdef __linux__
+ #include <linux/soundcard.h>
++#else
++#include <sys/soundcard.h>
++#endif
+ #include <stdio.h>
+
+ #include "../client/client.h"
+ #include "../client/snd_loc.h"
+
+-int audio_fd;
++int audio_fd = -1;
+ int snd_inited;
+
+ cvar_t *sndbits;
+@@ -39,24 +43,26 @@
+ cvar_t *sndchannels;
+ cvar_t *snddevice;
+
+-static int tryrates[] = { 11025, 22051, 44100, 8000 };
++static int tryrates[] = { 11025, 22051, 44100, 48000, 8000 };
+
+ qboolean SNDDMA_Init(void)
+ {
+
+ int rc;
+- int fmt;
++ int fmt;
+ int tmp;
+- int i;
+- char *s;
++ int i;
+ struct audio_buf_info info;
+ int caps;
+ extern uid_t saved_euid;
+
+ if (snd_inited)
+- return;
++ return 1;
+
+- if (!snddevice) {
++ snd_inited = 0;
++
++ if (!snddevice)
++ {
+ sndbits = Cvar_Get("sndbits", "16", CVAR_ARCHIVE);
+ sndspeed = Cvar_Get("sndspeed", "0", CVAR_ARCHIVE);
+ sndchannels = Cvar_Get("sndchannels", "2", CVAR_ARCHIVE);
+@@ -65,165 +71,182 @@
+
+ // open /dev/dsp, confirm capability to mmap, and get size of dma buffer
+
+- if (!audio_fd) {
++ if (audio_fd == -1)
++ {
+ seteuid(saved_euid);
+
+ audio_fd = open(snddevice->string, O_RDWR);
+
+- seteuid(getuid());
+-
+- if (audio_fd < 0)
++ if (audio_fd == -1)
+ {
+ perror(snddevice->string);
+- Com_Printf("Could not open %s\n", snddevice->string);
++ seteuid(getuid());
++ Com_Printf("SNDDMA_Init: Could not open %s.\n", snddevice->string);
+ return 0;
+ }
++ seteuid(getuid());
+ }
+
+- rc = ioctl(audio_fd, SNDCTL_DSP_RESET, 0);
+- if (rc < 0)
++ rc = ioctl(audio_fd, SNDCTL_DSP_RESET, 0);
++ if (rc == -1)
+ {
+ perror(snddevice->string);
+- Com_Printf("Could not reset %s\n", snddevice->string);
++ Com_Printf("SNDDMA_Init: Could not reset %s.\n", snddevice->string);
+ close(audio_fd);
++ audio_fd = -1;
+ return 0;
+ }
+
+ if (ioctl(audio_fd, SNDCTL_DSP_GETCAPS, &caps)==-1)
+ {
+ perror(snddevice->string);
+- Com_Printf("Sound driver too old\n");
++ Com_Printf("SNDDMA_Init: Sound driver too old.\n");
+ close(audio_fd);
++ audio_fd = -1;
+ return 0;
+ }
+
+ if (!(caps & DSP_CAP_TRIGGER) || !(caps & DSP_CAP_MMAP))
+ {
+- Com_Printf("Sorry but your soundcard can't do this\n");
++ Com_Printf("SNDDMA_Init: Sorry, but your soundcard doesn't support trigger or mmap. (%08x)\n", caps);
+ close(audio_fd);
++ audio_fd = -1;
+ return 0;
+ }
+
+- if (ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &info)==-1)
+- {
+- perror("GETOSPACE");
+- Com_Printf("Um, can't do GETOSPACE?\n");
++ if (ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &info)==-1)
++ {
++ perror("GETOSPACE");
++ Com_Printf("SNDDMA_Init: GETOSPACE ioctl failed.\n");
+ close(audio_fd);
++ audio_fd = -1;
+ return 0;
+- }
++ }
+
+ // set sample bits & speed
+
+- dma.samplebits = (int)sndbits->value;
++ dma.samplebits = (int)sndbits->value;
+ if (dma.samplebits != 16 && dma.samplebits != 8)
+- {
+- ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &fmt);
+- if (fmt & AFMT_S16_LE) dma.samplebits = 16;
+- else if (fmt & AFMT_U8) dma.samplebits = 8;
+- }
+-
+- dma.speed = (int)sndspeed->value;
+- if (!dma.speed) {
+- for (i=0 ; i<sizeof(tryrates)/4 ; i++)
+- if (!ioctl(audio_fd, SNDCTL_DSP_SPEED, &tryrates[i])) break;
+- dma.speed = tryrates[i];
+- }
+-
+- dma.channels = (int)sndchannels->value;
+- if (dma.channels < 1 || dma.channels > 2)
+- dma.channels = 2;
+-
+- dma.samples = info.fragstotal * info.fragsize / (dma.samplebits/8);
+- dma.submission_chunk = 1;
+-
+-// memory map the dma buffer
++ {
++ ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &fmt);
++ if (fmt & AFMT_S16_LE) dma.samplebits = 16;
++ else if (fmt & AFMT_U8) dma.samplebits = 8;
++ }
+
+- if (!dma.buffer)
+- dma.buffer = (unsigned char *) mmap(NULL, info.fragstotal
+- * info.fragsize, PROT_WRITE, MAP_FILE|MAP_SHARED, audio_fd, 0);
+- if (!dma.buffer)
++ if (dma.samplebits == 16)
++ {
++ rc = AFMT_S16_LE;
++ rc = ioctl(audio_fd, SNDCTL_DSP_SETFMT, &rc);
++ if (rc < 0)
++ {
++ perror(snddevice->string);
++ Com_Printf("SNDDMA_Init: Could not support 16-bit data. Try 8-bit.\n");
++ close(audio_fd);
++ audio_fd = -1;
++ return 0;
++ }
++ }
++ else if (dma.samplebits == 8)
++ {
++ rc = AFMT_U8;
++ rc = ioctl(audio_fd, SNDCTL_DSP_SETFMT, &rc);
++ if (rc < 0)
++ {
++ perror(snddevice->string);
++ Com_Printf("SNDDMA_Init: Could not support 8-bit data.\n");
++ close(audio_fd);
++ audio_fd = -1;
++ return 0;
++ }
++ }
++ else
+ {
+ perror(snddevice->string);
+- Com_Printf("Could not mmap %s\n", snddevice->string);
++ Com_Printf("SNDDMA_Init: %d-bit sound not supported.", dma.samplebits);
+ close(audio_fd);
++ audio_fd = -1;
+ return 0;
+ }
+
++ dma.speed = (int)sndspeed->value;
++ if (!dma.speed)
++ {
++ for (i=0 ; i<sizeof(tryrates)/4 ; i++)
++ if (!ioctl(audio_fd, SNDCTL_DSP_SPEED, &tryrates[i]))
++ break;
++ dma.speed = tryrates[i];
++ }
++
++ dma.channels = (int)sndchannels->value;
++ if (dma.channels < 1 || dma.channels > 2)
++ dma.channels = 2;
++
+ tmp = 0;
+ if (dma.channels == 2)
+ tmp = 1;
+- rc = ioctl(audio_fd, SNDCTL_DSP_STEREO, &tmp);
+- if (rc < 0)
+- {
++ rc = ioctl(audio_fd, SNDCTL_DSP_STEREO, &tmp); //FP: bugs here.
++ if (rc < 0)
++ {
+ perror(snddevice->string);
+- Com_Printf("Could not set %s to stereo=%d", snddevice->string, dma.channels);
++ Com_Printf("SNDDMA_Init: Could not set %s to stereo=%d.", snddevice->string, dma.channels);
+ close(audio_fd);
+- return 0;
+- }
++ audio_fd = -1;
++ return 0;
++ }
++
+ if (tmp)
+ dma.channels = 2;
+ else
+ dma.channels = 1;
+
+- rc = ioctl(audio_fd, SNDCTL_DSP_SPEED, &dma.speed);
+- if (rc < 0)
+- {
++
++ rc = ioctl(audio_fd, SNDCTL_DSP_SPEED, &dma.speed);
++ if (rc < 0)
++ {
+ perror(snddevice->string);
+- Com_Printf("Could not set %s speed to %d", snddevice->string, dma.speed);
++ Com_Printf("SNDDMA_Init: Could not set %s speed to %d.", snddevice->string, dma.speed);
+ close(audio_fd);
+- return 0;
+- }
++ audio_fd = -1;
++ return 0;
++ }
+
+- if (dma.samplebits == 16)
+- {
+- rc = AFMT_S16_LE;
+- rc = ioctl(audio_fd, SNDCTL_DSP_SETFMT, &rc);
+- if (rc < 0)
+- {
+- perror(snddevice->string);
+- Com_Printf("Could not support 16-bit data. Try 8-bit.\n");
+- close(audio_fd);
+- return 0;
+- }
+- }
+- else if (dma.samplebits == 8)
+- {
+- rc = AFMT_U8;
+- rc = ioctl(audio_fd, SNDCTL_DSP_SETFMT, &rc);
+- if (rc < 0)
+- {
+- perror(snddevice->string);
+- Com_Printf("Could not support 8-bit data.\n");
+- close(audio_fd);
+- return 0;
+- }
+- }
+- else
++ dma.samples = info.fragstotal * info.fragsize / (dma.samplebits/8);
++ dma.submission_chunk = 1;
++
++// memory map the dma buffer
++
++ if (!dma.buffer)
++ dma.buffer = (unsigned char *) mmap(NULL, info.fragstotal
++ * info.fragsize, PROT_WRITE|PROT_READ, MAP_FILE|MAP_SHARED, audio_fd, 0);
++ if (!dma.buffer || dma.buffer == MAP_FAILED)
+ {
+ perror(snddevice->string);
+- Com_Printf("%d-bit sound not supported.", dma.samplebits);
++ Com_Printf("SNDDMA_Init: Could not mmap %s.\n", snddevice->string);
+ close(audio_fd);
++ audio_fd = -1;
+ return 0;
+ }
+
+ // toggle the trigger & start her up
+
+- tmp = 0;
+- rc = ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
++ tmp = 0;
++ rc = ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
+ if (rc < 0)
+ {
+ perror(snddevice->string);
+- Com_Printf("Could not toggle.\n");
++ Com_Printf("SNDDMA_Init: Could not toggle. (1)\n");
+ close(audio_fd);
++ audio_fd = -1;
+ return 0;
+ }
+- tmp = PCM_ENABLE_OUTPUT;
+- rc = ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
++ tmp = PCM_ENABLE_OUTPUT;
++ rc = ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
+ if (rc < 0)
+ {
+ perror(snddevice->string);
+- Com_Printf("Could not toggle.\n");
++ Com_Printf("SNDDMA_Init: Could not toggle. (2)\n");
+ close(audio_fd);
++ audio_fd = -1;
+ return 0;
+ }
+
+@@ -231,12 +254,10 @@
+
+ snd_inited = 1;
+ return 1;
+-
+ }
+
+ int SNDDMA_GetDMAPos(void)
+ {
+-
+ struct count_info count;
+
+ if (!snd_inited) return 0;
+@@ -244,8 +265,9 @@
+ if (ioctl(audio_fd, SNDCTL_DSP_GETOPTR, &count)==-1)
+ {
+ perror(snddevice->string);
+- Com_Printf("Uh, sound dead.\n");
++ Com_Printf("SNDDMA_GetDMAPos: GETOPTR failed.\n");
+ close(audio_fd);
++ audio_fd = -1;
+ snd_inited = 0;
+ return 0;
+ }
+@@ -254,7 +276,6 @@
+ dma.samplepos = count.ptr / (dma.samplebits / 8);
+
+ return dma.samplepos;
+-
+ }
+
+ void SNDDMA_Shutdown(void)
+@@ -263,6 +284,7 @@
+ if (snd_inited)
+ {
+ close(audio_fd);
++ audio_fd = -1;
+ snd_inited = 0;
+ }
+ #endif
diff --git a/games/alienarena/files/patch-linux__sys_linux.c b/games/alienarena/files/patch-linux__sys_linux.c
new file mode 100644
index 000000000000..8b8c5f0f439c
--- /dev/null
+++ b/games/alienarena/files/patch-linux__sys_linux.c
@@ -0,0 +1,23 @@
+--- ./linux/sys_linux.c.orig Tue May 16 15:20:10 2006
++++ ./linux/sys_linux.c Tue May 16 15:20:10 2006
+@@ -217,19 +217,7 @@
+ char name[MAX_OSPATH];
+ char *path;
+ char *str_p;
+-#if defined __i386__
+- const char *gamename = "gamei386.so";
+-#elif defined __x86_64__
+- const char *gamename = "gamex86_64.so";
+-#elif defined __alpha__
+- const char *gamename = "gameaxp.so";
+-#elif defined __powerpc__
+- const char *gamename = "gameppc.so";
+-#elif defined __sparc__
+- const char *gamename = "gamesparc.so";
+-#else
+-#error Unknown arch
+-#endif
++ const char *gamename = "game.so";
+
+ setreuid(getuid(), getuid());
+ setegid(getgid());
diff --git a/games/alienarena/files/patch-qcommon__cmd.c b/games/alienarena/files/patch-qcommon__cmd.c
new file mode 100644
index 000000000000..9d1c96f98164
--- /dev/null
+++ b/games/alienarena/files/patch-qcommon__cmd.c
@@ -0,0 +1,25 @@
+--- ./qcommon/cmd.c.orig Tue May 16 15:20:10 2006
++++ ./qcommon/cmd.c Tue May 16 15:20:10 2006
+@@ -215,8 +215,10 @@
+ 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 +659,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;
diff --git a/games/alienarena/files/patch-qcommon__common.c b/games/alienarena/files/patch-qcommon__common.c
new file mode 100644
index 000000000000..39775aa54f57
--- /dev/null
+++ b/games/alienarena/files/patch-qcommon__common.c
@@ -0,0 +1,24 @@
+--- ./qcommon/common.c.orig Tue May 16 15:20:10 2006
++++ ./qcommon/common.c Tue May 16 15:20:10 2006
+@@ -781,7 +781,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;
+@@ -801,7 +803,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;
diff --git a/games/alienarena/files/patch-server__sv_main.c b/games/alienarena/files/patch-server__sv_main.c
new file mode 100644
index 000000000000..e93cea6dd752
--- /dev/null
+++ b/games/alienarena/files/patch-server__sv_main.c
@@ -0,0 +1,40 @@
+--- ./server/sv_main.c.orig Tue May 16 15:20:10 2006
++++ ./server/sv_main.c Tue May 16 15:20:10 2006
+@@ -445,8 +445,9 @@
+ return;
+ }
+
+- 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;
+
+ //check it is not overflowed, save enough bytes for /ip/111.222.333.444:55555
+ if (strlen(userinfo) + 25 >= sizeof(userinfo)-1)
+@@ -502,8 +503,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;
+ }
+@@ -588,12 +592,6 @@
+ Netchan_OutOfBandPrint (NS_SERVER, adr, "print\nConnection refused.\n" );
+ Com_DPrintf ("Game rejected a connection.\n");
+ return;
+- }
+-
+- if (userinfo[MAX_INFO_STRING-1])
+- {
+- //probably already crashed by now but worth a try
+- Com_Error (ERR_FATAL, "Userinfo string length overflowed after ClientConnect");
+ }
+
+ // parse some info from the info strings
diff --git a/games/alienarena/files/patch-server__sv_user.c b/games/alienarena/files/patch-server__sv_user.c
new file mode 100644
index 000000000000..83f793da66b3
--- /dev/null
+++ b/games/alienarena/files/patch-server__sv_user.c
@@ -0,0 +1,51 @@
+--- ./server/sv_user.c.orig Tue May 16 15:20:10 2006
++++ ./server/sv_user.c Tue May 16 15:20:10 2006
+@@ -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));
+
+@@ -399,7 +414,7 @@
+ */
+ void SV_ShowServerinfo_f (void)
+ {
+- Info_Print (Cvar_Serverinfo());
++// Info_Print (Cvar_Serverinfo());
+ }
+
+
diff --git a/games/alienarena/pkg-descr b/games/alienarena/pkg-descr
new file mode 100644
index 000000000000..a19014498bfe
--- /dev/null
+++ b/games/alienarena/pkg-descr
@@ -0,0 +1,10 @@
+AA2K6 is the latest in a series of standalone games based on a classic Sci-Fi
+theme with a modern, updated visual experience. With 25 levels, five modes of
+play, mutators, built-in bots, 9 characters, 8 weapons (3 with alt-fire
+modes), the game has an endless supply of replayability. Billed as the sequel
+to 2004's CodeRED: Alien Arena, AA2K6 is much more than that. With the trials
+and tribulations of software development, endless hours of playing, gathering
+feedback, COR Entertainment has been able to not only fine tune and perfect
+it's flagship game, but add completely new dimensions to it.
+
+WWW: http://red.planetarena.org/
diff --git a/games/alienarena/pkg-message b/games/alienarena/pkg-message
new file mode 100644
index 000000000000..62c982bae067
--- /dev/null
+++ b/games/alienarena/pkg-message
@@ -0,0 +1,15 @@
+==============================================================================
+
+Alien Arena 2006 (native version) has been installed.
+
+The OSS (native FreeBSD sound) version of Alien Arena 2006 (named
+"alienarena") uses by default a slow sound speed, which causes a notable
+delay. To solve this you have to run it once like this:
+
+alienarena +set sndspeed <speed>
+
+Where <speed> could be 22050 and 44100 for example (the default that has the
+delay is 11025, and the SDL version uses 22050). The value of "sndspeed" will
+be saved in the configuration file for future runs.
+
+==============================================================================
diff --git a/games/alienarena/pkg-plist b/games/alienarena/pkg-plist
new file mode 100644
index 000000000000..c243ecc98551
--- /dev/null
+++ b/games/alienarena/pkg-plist
@@ -0,0 +1,34 @@
+bin/alienarena
+bin/alienarena-ded
+%%SDL%%bin/alienarena-sdl
+%%LIBDIR%%/arena/ctf.cfg
+%%LIBDIR%%/arena/default.cfg
+%%LIBDIR%%/arena/game.so
+%%LIBDIR%%/arena/maps.lst
+%%LIBDIR%%/arena/motd.txt
+%%LIBDIR%%/arena/pics
+%%LIBDIR%%/arena/server.cfg
+%%LIBDIR%%/arena/video
+%%LIBDIR%%/botinfo
+%%LIBDIR%%/crded
+%%LIBDIR%%/crx
+%%SDL%%%%LIBDIR%%/crx.sdl
+%%LIBDIR%%/data1/default.cfg
+%%LIBDIR%%/data1/env
+%%LIBDIR%%/data1/game.so
+%%LIBDIR%%/data1/gfx
+%%LIBDIR%%/data1/levelshots
+%%LIBDIR%%/data1/maps
+%%LIBDIR%%/data1/maps.lst
+%%LIBDIR%%/data1/models
+%%LIBDIR%%/data1/particles
+%%LIBDIR%%/data1/pics
+%%LIBDIR%%/data1/players
+%%LIBDIR%%/data1/scripts
+%%LIBDIR%%/data1/sound
+%%LIBDIR%%/data1/sprites
+%%LIBDIR%%/data1/textures
+%%LIBDIR%%/data1/vehicles
+@dirrm %%LIBDIR%%/data1
+@dirrm %%LIBDIR%%/arena
+@dirrm %%LIBDIR%%