[xmris] Import xmris-4.0.5-5.fc22.src.rpm

Hans de Goede jwrdegoede at rpmfusion.org
Thu Jul 7 13:47:25 CEST 2016


commit cae9a7ae8521c357b2f1fe9a27d5dd177d31f449
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Thu Jul 7 13:46:20 2016 +0200

    Import xmris-4.0.5-5.fc22.src.rpm

 .gitignore                                         |   1 +
 0001-Fix-xm-exiting-with-a-BadFont-error.patch     |  25 +
 0002-Fix-timer-signal-handling-under-Linux.patch   |  38 ++
 0003-Adjust-Imakefile-for-modern-systems.patch     |  94 ++++
 0004-Catch-the-window-being-deleted.patch          |  87 ++++
 0005-Fix-compiling-of-flock-code-under-Linux.patch |  26 ++
 0006-Fix-key-presses-getting-lost.patch            |  27 ++
 ...ge-key-binding-defaults-to-something-sane.patch |  98 ++++
 0008-Fix-compiler-warnings.patch                   | 388 +++++++++++++++
 0009-Remove-TRANSPUTER-stuff.patch                 | 518 +++++++++++++++++++++
 0010-Remove-USELOCKFILE-stuff.patch                | 262 +++++++++++
 0011-Remove-seteuid-stuff.patch                    | 329 +++++++++++++
 0012-Drop-dir-option.patch                         | 467 +++++++++++++++++++
 0013-Drop-support-for-global-personal-file.patch   | 223 +++++++++
 0014-Some-renames.patch                            | 125 +++++
 ...files-only-once-and-keep-them-open-till-t.patch | 306 ++++++++++++
 ...obal-score-file-asap-and-drop-special-rig.patch | 123 +++++
 ...o-Xmsit-Xmris-depending-on-how-we-re-laun.patch |  72 +++
 ...all-manpages-into-section-6-rather-then-1.patch |  26 ++
 0019-Add-.desktop-files.patch                      |  62 +++
 sources                                            |   1 +
 xmris.png                                          | Bin 0 -> 11493 bytes
 xmris.spec                                         | 151 ++++++
 xmsit.png                                          | Bin 0 -> 10994 bytes
 24 files changed, 3449 insertions(+)
---
diff --git a/.gitignore b/.gitignore
index e69de29..1720b42 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/xmris.4.0.5.tar.gz
diff --git a/0001-Fix-xm-exiting-with-a-BadFont-error.patch b/0001-Fix-xm-exiting-with-a-BadFont-error.patch
new file mode 100644
index 0000000..802d20e
--- /dev/null
+++ b/0001-Fix-xm-exiting-with-a-BadFont-error.patch
@@ -0,0 +1,25 @@
+From 2e28187cbb718044cd963d7290f2a4611c305a9a Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Mon, 29 Nov 2010 22:34:51 +0100
+Subject: [PATCH 01/20] Fix xm* exiting with a BadFont error
+
+---
+ defcom.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/defcom.c b/defcom.c
+index 8f354dd..f8a59b5 100644
+--- a/defcom.c
++++ b/defcom.c
+@@ -265,7 +265,7 @@ XtResource resources[] =
+ #endif /* TRANSPUTER */
+ #endif /* XMRED */
+   {XtNfont, XtCFont, XtRFont, sizeof(Font),
+-      XtOffsetOf(DATA, font), XtRImmediate, (XtPointer)FONT_NAME},
++      XtOffsetOf(DATA, font), XtRString, (XtPointer)FONT_NAME},
+   {XtNreverseVideo, XtCReverseVideo, XtRBoolean, sizeof(Boolean),
+       XtOffsetOf(DATA, swap), XtRImmediate, (XtPointer)False},
+   {"monochrome", "Monochrome", XtRBoolean, sizeof(Boolean),
+-- 
+1.7.5
+
diff --git a/0002-Fix-timer-signal-handling-under-Linux.patch b/0002-Fix-timer-signal-handling-under-Linux.patch
new file mode 100644
index 0000000..ff7e80c
--- /dev/null
+++ b/0002-Fix-timer-signal-handling-under-Linux.patch
@@ -0,0 +1,38 @@
+From 10e609fae72b30ee7763e95f202d3ecad13685e6 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Mon, 29 Nov 2010 23:26:44 +0100
+Subject: [PATCH 02/20] Fix timer signal handling under Linux
+
+---
+ timer.c |    8 ++++++--
+ 1 files changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/timer.c b/timer.c
+index 4f56727..c8fa2c1 100644
+--- a/timer.c
++++ b/timer.c
+@@ -75,7 +75,7 @@
+  * signal_release returns the block mask to what it was before signal_hold
+  */
+ #ifndef TRANSPUTER
+-#ifdef POSIX
++#if defined POSIX || defined linux
+ #  define MASK sigset_t
+ #  define signal_hold(signal, maskp) \
+     {\
+@@ -85,7 +85,11 @@
+       sigprocmask(SIG_BLOCK, &temp, (maskp)); \
+     }
+ #  define signal_release(maskp) sigprocmask(SIG_SETMASK, maskp, (MASK *)NULL)
+-#  define signal_pause(maskp) sigpause(*(maskp))
++#  ifdef linux
++#    define signal_pause(maskp) sigsuspend(maskp)
++#  else
++#    define signal_pause(maskp) sigpause(*(maskp))
++#  endif
+ #else
+ #  ifdef __hpux /* hpux is a weird mixture of BSD & SYSV */
+ /* don't know if this is right */
+-- 
+1.7.5
+
diff --git a/0003-Adjust-Imakefile-for-modern-systems.patch b/0003-Adjust-Imakefile-for-modern-systems.patch
new file mode 100644
index 0000000..0cd49b8
--- /dev/null
+++ b/0003-Adjust-Imakefile-for-modern-systems.patch
@@ -0,0 +1,94 @@
+From e9da98bfc559f227fe7784f227ff631e2a774c3f Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Mon, 29 Nov 2010 23:18:26 +0100
+Subject: [PATCH 03/20] Adjust Imakefile for modern systems
+
+---
+ Imakefile |   27 ++++++++++++---------------
+ 1 files changed, 12 insertions(+), 15 deletions(-)
+
+diff --git a/Imakefile b/Imakefile
+index 43345c6..a6c6842 100644
+--- a/Imakefile
++++ b/Imakefile
+@@ -31,10 +31,10 @@ install.man :: @@\
+ XCOMM compiler options
+ XCOMM
+ #if HasGcc
+-EXTRACCOPTIONS = -Wall -Wpointer-arith -Wwrite-strings -Wtraditional
++EXTRACCOPTIONS = -Wall -Wpointer-arith -Wno-write-strings
+ #endif /* HasGcc */
+ #if defined(LinuxArchitecture)
+-#define STATICDEBUG -static
++#define STATICDEBUG
+ XCOMM XINTL=-lXintl
+ #else
+ #define STATICDEBUG
+@@ -61,7 +61,7 @@ TIME =
+ XCOMM TIME = -DUSETIME
+ XCOMM don't you have lockf or flock?
+ LOCK =
+-LOCK = -DUSELOCKFILE
++XCOMM LOCK = -DUSELOCKFILE
+ 
+ XCOMM game defaults, you probably only want to alter the SCORE
+ XCOMM
+@@ -69,9 +69,9 @@ XCOMM
+ /* #define thefont "-*-courier-*-r-*-*-18-*-*-*-m-*-*-*" */
+ XCOMM where is the high score file?
+ XCOMM SCORE = $(LOCAL)/lib/$(APP)
+-SCORE = /var/lib/games/$(APP)
+-/* to install default gardens not in app_defaults/$(APP)
+-/* #define InstallDefaultGardens $(SCORE)/gardens */
++SCORE = /var/games/$(APP)
++/* to install default gardens not in /usr/share/$(APP) */
++/* #define InstallDefaultGardens $(DESTDIR)/usr/share/$(APP) */
+ 
+ XCOMM The following defines are needed for some implementations and/or sites.
+ XCOMM It is xmkmf's job to get these right in the first place.
+@@ -91,7 +91,8 @@ XCOMM install parameters
+ XCOMM
+ XCOMM owner and access rights for executable & score directory
+ XCOMM these are set for a setuid xmris
+-OWNER = -o games
++XCOMM OWNER = -o games
++OWNER =
+ INSTSCOREFLAGS = $(OWNER) -m 755
+ INSTMRISFLAGS = $(OWNER) $(INSTUIDFLAGS)
+ XCOMM normal install locations
+@@ -115,7 +116,7 @@ FONT = thefont
+ 
+ #ifndef InstallDefaultGardens
+ #ifdef InstallAppDefFiles
+-#define InstallDefaultGardens $(DESTDIR)/$(XAPPLOADDIR)/$(APP)
++#define InstallDefaultGardens $(DESTDIR)/usr/share/$(APP)
+ #endif
+ #endif
+ 
+@@ -213,10 +214,6 @@ XCOMM using alltarget can cause gnumake to try and make a target called all.
+ XCOMM the reason is the All Target macro has no rules, so gnumake tries
+ XCOMM to find an implicit one. Other makes just give up.
+ all :: initialize
+-	@echo "NOTE:You might get lots of warnings about discarding const from"
+-	@echo "NOTE:pointer target type. Ignore these. It's because the X header"
+-	@echo "NOTE:files aren't const correct. Fiddle with XrmOptionDescRec in"
+-	@echo "NOTE:Xresource.h and String in Intrinsic.h by adding an _Xconst."
+ 	@#keep gnumake happy
+ 
+ all :: xmris xmred
+@@ -238,9 +235,9 @@ NormalProgramTarget(xmris,$(MRISOBJS),$(DEPLIBS),$(LOCAL_LIBRARIES),)
+ 
+ InstallProgramWithFlags(xmris,$(THEBINDIR),$(INSTMRISFLAGS))
+ 
+-install :: $(THEBINDIR)/xmris
+-	$(RM) $(THEBINDIR)/xmsit
+-	$(LN) ./xmris $(THEBINDIR)/xmsit
++install :: $(DESTDIR)$(THEBINDIR)/xmris
++	$(RM) $(DESTDIR)$(THEBINDIR)/xmsit
++	$(LN) xmris $(DESTDIR)$(THEBINDIR)/xmsit
+ 
+ XCOMM xmred build
+ NormalProgramTarget(xmred,$(MREDOBJS) $(WIDGETOBJS),$(DEPLIBS),$(LOCAL_LIBRARIES) -lm,)
+-- 
+1.7.5
+
diff --git a/0004-Catch-the-window-being-deleted.patch b/0004-Catch-the-window-being-deleted.patch
new file mode 100644
index 0000000..fbbbe26
--- /dev/null
+++ b/0004-Catch-the-window-being-deleted.patch
@@ -0,0 +1,87 @@
+From 5ffc5a653acb6f4d9747f98d05e3a86119baeb9f Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Mon, 29 Nov 2010 22:28:49 +0100
+Subject: [PATCH 04/20] Catch the window being deleted
+
+This fixes the keyboard repeat getting fsck-ed up when quiting using
+the window delete button on the title bar / alt+f4 while playing the game.
+
+This patch comes from the Mandriva SRPM, thanks guys!
+---
+ xmris.c |   25 +++++++++++++++++++++++++
+ 1 files changed, 25 insertions(+), 0 deletions(-)
+
+diff --git a/xmris.c b/xmris.c
+index 77cd0ea..22fa1af 100644
+--- a/xmris.c
++++ b/xmris.c
+@@ -55,6 +55,8 @@ static VOIDFUNC action_pause
+     PROTOARG((Widget, XEvent *, String *, Cardinal *));
+ static VOIDFUNC action_unmap
+     PROTOARG((Widget, XEvent *, String *, Cardinal *));
++static VOIDFUNC action_quit
++    PROTOARG((Widget, XEvent *, String *, Cardinal *));
+ static VOIDFUNC age_scores PROTOARG((VOIDARG));
+ static PROTOANIMATE(animate_death);
+ static PROTOANIMATE(animate_pause);
+@@ -75,6 +77,7 @@ static XtActionsRec actions[] =
+   {"map", action_map},
+   {"unmap", action_unmap},
+   {"expose", action_expose},
++  {"quit", action_quit},
+ };
+ /*}}}*/
+ /*{{{  static char CONST garden_translations[] =*/
+@@ -96,6 +99,7 @@ static char CONST toplevel_translations[] =
+ "\
+ <MapNotify>:map()\n\
+ <UnmapNotify>:unmap()\n\
++<Message>WM_PROTOCOLS: quit()\n\
+ ";
+ /*}}}*/
+ /*}}}*/
+@@ -116,6 +120,22 @@ ARGSEP  Cardinal  *num_params
+   return;
+ }
+ /*}}}*/
++/*{{{  void action_quit(widget, event, params, num_params)*/
++static VOIDFUNC action_quit
++FUNCARG((widget, event, params, num_params),
++	Widget    widget
++ARGSEP  XEvent    *event
++ARGSEP  String    *params
++ARGSEP  Cardinal  *num_params
++)
++{
++#ifdef DEBUGEVENTLOOP
++  fprintf(stderr, "action_quit(0x%lx)\n", XtWindow(widget));
++#endif /* DEBUGEVENTLOOP */
++  set_key_default();
++  global.quit = 1;
++}
++/*}}}*/
+ /*{{{  void action_keypress(widget, event, params, num_params)*/
+ static VOIDFUNC action_keypress
+ FUNCARG((widget, event, params, num_params),
+@@ -1235,6 +1255,7 @@ ARGSEP  char CONST **argv
+ )
+ {
+   PROTOANIMATE((*animate));
++  Atom wm_delete_window;
+   
+   myname = *argv ? *argv : "Xmris";
+ #ifndef TRANSPUTER
+@@ -1280,6 +1301,10 @@ ARGSEP  char CONST **argv
+   XtOverrideTranslations(display.toplevel,
+       XtParseTranslationTable(toplevel_translations));
+   XtRealizeWidget(display.toplevel);
++  wm_delete_window = XInternAtom(XtDisplay(display.toplevel), "WM_DELETE_WINDOW",
++				 False);
++  (void)XSetWMProtocols(XtDisplay(display.toplevel), XtWindow(display.toplevel),
++			&wm_delete_window, 1);
+ #ifdef DEBUGEVENTLOOP
+   printf("Toplevel is 0x%lx\n", (long)XtWindow(display.toplevel));
+   printf("Garden is 0x%lx\n", (long)XtWindow(display.garden));
+-- 
+1.7.5
+
diff --git a/0005-Fix-compiling-of-flock-code-under-Linux.patch b/0005-Fix-compiling-of-flock-code-under-Linux.patch
new file mode 100644
index 0000000..84bc7ed
--- /dev/null
+++ b/0005-Fix-compiling-of-flock-code-under-Linux.patch
@@ -0,0 +1,26 @@
+From 51f13c5ef15a4a63e5184579ac1ddc8fab03382b Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Mon, 29 Nov 2010 23:30:59 +0100
+Subject: [PATCH 05/20] Fix compiling of flock code under Linux
+
+---
+ scoring.c |    3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/scoring.c b/scoring.c
+index 0c61b9b..6f1030f 100644
+--- a/scoring.c
++++ b/scoring.c
+@@ -38,6 +38,9 @@
+ /*}}}*/
+ /*{{{  file locking*/
+ #ifndef SYSV
++#ifdef linux
++#include <sys/file.h>
++#endif
+ #define lock_file(stream) flock(fileno(stream), LOCK_EX)
+ #define unlock_file(stream) flock(fileno(stream), LOCK_UN)
+ #else
+-- 
+1.7.5
+
diff --git a/0006-Fix-key-presses-getting-lost.patch b/0006-Fix-key-presses-getting-lost.patch
new file mode 100644
index 0000000..c7368c7
--- /dev/null
+++ b/0006-Fix-key-presses-getting-lost.patch
@@ -0,0 +1,27 @@
+From 3acb9936eb6ec40de5188c47e5a720d375657ba8 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Tue, 30 Nov 2010 15:00:29 +0100
+Subject: [PATCH 06/20] Fix key presses getting lost
+
+Without this patch keypresses get lost when the mouse is outside the window,
+but the keyboard focus is on the window.
+---
+ xmris.c |    2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/xmris.c b/xmris.c
+index 22fa1af..2f6cc62 100644
+--- a/xmris.c
++++ b/xmris.c
+@@ -91,6 +91,8 @@ static char CONST garden_translations[] =
+ /*{{{  static char CONST form_translations[] =*/
+ static char CONST form_translations[] =
+ "\
++<KeyPress>:keypress()\n\
++<KeyRelease>:keyrelease()\n\
+ <FocusOut>:pause()\n\
+ ";
+ /*}}}*/
+-- 
+1.7.5
+
diff --git a/0007-Change-key-binding-defaults-to-something-sane.patch b/0007-Change-key-binding-defaults-to-something-sane.patch
new file mode 100644
index 0000000..59a7a9d
--- /dev/null
+++ b/0007-Change-key-binding-defaults-to-something-sane.patch
@@ -0,0 +1,98 @@
+From dc28065b144dbfa1da8007b4482f8415894eee43 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Tue, 30 Nov 2010 15:55:00 +0100
+Subject: [PATCH 07/20] Change key binding defaults to something sane
+
+---
+ Xmris-ad.src |    8 ++++----
+ defcom.c     |    8 ++++----
+ xmris.man    |   21 ++++-----------------
+ 3 files changed, 12 insertions(+), 25 deletions(-)
+
+diff --git a/Xmris-ad.src b/Xmris-ad.src
+index fd94b76..60be0ac 100644
+--- a/Xmris-ad.src
++++ b/Xmris-ad.src
+@@ -4,10 +4,10 @@
+ ! These are some of the resources you can fiddle with for xmris
+ ! The defaults are shown in the man page.
+ 
+-*Up:			apostrophe
+-*Down:			slash
+-*Left:			z
+-*Right:			x
++*Up:			Up
++*Down:			Down
++*Left:			Left
++*Right:			Right
+ *Throw:			space
+ *Pause:			p
+ *Quit:			q
+diff --git a/defcom.c b/defcom.c
+index f8a59b5..5934c5e 100644
+--- a/defcom.c
++++ b/defcom.c
+@@ -234,13 +234,13 @@ XtResource resources[] =
+   {"dir", "Dir", XtRString, sizeof(String),
+       XtOffsetOf(DATA, dir), XtRString, (XtPointer)SCORE_DIR},
+   {"up", "Up", XtRKeySym, sizeof(KeySym),
+-      XtOffsetOf(DATA, keysyms[0]), XtRString, (XtPointer)"apostrophe"},
++      XtOffsetOf(DATA, keysyms[0]), XtRString, (XtPointer)"Up"},
+   {"down", "Down", XtRKeySym, sizeof(KeySym),
+-      XtOffsetOf(DATA, keysyms[1]), XtRString, (XtPointer)"slash"},
++      XtOffsetOf(DATA, keysyms[1]), XtRString, (XtPointer)"Down"},
+   {"left", "Left", XtRKeySym, sizeof(KeySym),
+-      XtOffsetOf(DATA, keysyms[2]), XtRString, (XtPointer)"z"},
++      XtOffsetOf(DATA, keysyms[2]), XtRString, (XtPointer)"Left"},
+   {"right", "Right", XtRKeySym, sizeof(KeySym),
+-      XtOffsetOf(DATA, keysyms[3]), XtRString, (XtPointer)"x"},
++      XtOffsetOf(DATA, keysyms[3]), XtRString, (XtPointer)"Right"},
+   {"throw", "Throw", XtRKeySym, sizeof(KeySym),
+       XtOffsetOf(DATA, keysyms[KEY_THROW]), XtRString, (XtPointer)"space"},
+   {"pause", "Pause", XtRKeySym, sizeof(KeySym),
+diff --git a/xmris.man b/xmris.man
+index 0d69f88..1e7c47f 100644
+--- a/xmris.man
++++ b/xmris.man
+@@ -401,14 +401,14 @@ defaults in '[]'.)
+ .br
+ .ne 11
+ .TP
+-.B Xmris.Up: \fIkeysym\fP [apostrophe]
++.B Xmris.Up: \fIkeysym\fP [Up]
+ .PD 0
+ .TP
+-.B Xmris.Down: \fIkeysym\fP [slash]
++.B Xmris.Down: \fIkeysym\fP [Down]
+ .TP
+-.B Xmris.Left: \fIkeysym\fP [z]
++.B Xmris.Left: \fIkeysym\fP [Left]
+ .TP
+-.B Xmris.Right: \fIkeysym\fP [x]
++.B Xmris.Right: \fIkeysym\fP [Right]
+ .TP
+ .B Xmris.Throw: \fIkeysym\fP [space]
+ .TP
+@@ -493,19 +493,6 @@ Set the number of distinct colours allocated from the colour map.
+ .B Xmris.Static: \fI{yes, no}\fP [no]
+ Do not use dynamic background colors.
+ .PP
+-For example, if you want to use the arrow keys, the following will work
+-.br
+-.ne 6
+-.IP
+-Xmris.Up:       Up
+-.br
+-Xmris.Down:     Down
+-.br
+-Xmris.Left:     Left
+-.br
+-Xmris.Right:    Right
+-.br
+-.PP
+ In addition, you have the normal resources such as '*Font'.
+ .PP
+ Normally the cursor is invisible in the Mr Is window. You can force
+-- 
+1.7.5
+
diff --git a/0008-Fix-compiler-warnings.patch b/0008-Fix-compiler-warnings.patch
new file mode 100644
index 0000000..52fe00d
--- /dev/null
+++ b/0008-Fix-compiler-warnings.patch
@@ -0,0 +1,388 @@
+From 383d6b1c86c0697f422e169499ba84c1231f7df5 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Fri, 29 Apr 2011 16:14:33 +0200
+Subject: [PATCH 08/20] Fix compiler warnings
+
+---
+ Drag.c       |    3 +--
+ Icon.c       |    3 +--
+ PixmapList.c |   23 ++++++++++-------------
+ control.c    |   35 +++++++++++++++++------------------
+ dialogs.c    |    8 ++++----
+ makemred.c   |    2 +-
+ makemris.c   |    4 ++--
+ menubar.c    |   12 ++++++------
+ player.c     |    4 ++--
+ scram.c      |    2 +-
+ 10 files changed, 45 insertions(+), 51 deletions(-)
+
+diff --git a/Drag.c b/Drag.c
+index 32e863b..6376614 100644
+--- a/Drag.c
++++ b/Drag.c
+@@ -510,9 +510,8 @@ FUNCARG((widget),
+       int x, y;
+       unsigned border;
+       unsigned depth;
+-      Status status;
+       
+-      status = XGetGeometry(XtDisplay(widget), widget->drag.pixmap, &root,
++      XGetGeometry(XtDisplay(widget), widget->drag.pixmap, &root,
+ 	  &x, &y, &widget->drag.width, &widget->drag.height, &border, &depth);
+     }
+   else
+diff --git a/Icon.c b/Icon.c
+index 215c979..d54a239 100644
+--- a/Icon.c
++++ b/Icon.c
+@@ -620,9 +620,8 @@ FUNCARG((widget),
+       int x, y;
+       unsigned border;
+       unsigned depth;
+-      Status status;
+       
+-      status = XGetGeometry(XtDisplay(widget), widget->icon.pixmap, &root,
++      XGetGeometry(XtDisplay(widget), widget->icon.pixmap, &root,
+ 	  &x, &y, &widget->icon.width, &widget->icon.height, &border, &depth);
+     }
+   else
+diff --git a/PixmapList.c b/PixmapList.c
+index ab128fa..aeb7155 100644
+--- a/PixmapList.c
++++ b/PixmapList.c
+@@ -1199,9 +1199,8 @@ ARGSEP  PixmapInfo *pi
+       int x, y;
+       unsigned border;
+       unsigned depth;
+-      Status status;
+       
+-      status = XGetGeometry(XtDisplay(plw), pi->pixmap,
++      XGetGeometry(XtDisplay(plw), pi->pixmap,
+ 	  &root, &x, &y, (unsigned int *)&pi->width,
+ 	  (unsigned int *)&pi->height, &border, &depth);
+     }
+@@ -1359,12 +1358,12 @@ ARGSEP  XtPointer call
+   int       length;
+   
+   plw = (PixmapListWidget)client;
+-  if(!(int)call)
++  if(!(long)call)
+     return;
+   length = plw->pixmap_list.orient == XtorientVertical ?
+       plw->core.height : plw->core.width;
+   start = length / 2;
+-  if((int)call > 0)
++  if((long)call > 0)
+     start = -start;
+   start -= plw->pixmap_list.orient == XtorientVertical ?
+       plw->pixmap_list.y : plw->pixmap_list.x;
+@@ -1410,23 +1409,21 @@ FUNCARG((plw),
+  *  our geometry changes
+  */
+ {
+-  float     shown, top;
++  union { float f; XtArgVal xav; } shown, top;
+   Arg       args[2];
+   
+   if(!plw->pixmap_list.scroll)
+     return;
+-  shown = (float)(plw->pixmap_list.orient == XtorientVertical ?
++  shown.f = (float)(plw->pixmap_list.orient == XtorientVertical ?
+       plw->core.height + 1 : plw->core.width + 1) /
+       (float)plw->pixmap_list.length;
+-  if(shown > (float)1.0)
+-    shown = (float)1.0;
+-  top = (float)(plw->pixmap_list.orient == XtorientVertical ?
++  if(shown.f > (float)1.0)
++    shown.f = (float)1.0;
++  top.f = (float)(plw->pixmap_list.orient == XtorientVertical ?
+       -plw->pixmap_list.y : -plw->pixmap_list.x) /
+       (float)plw->pixmap_list.length;
+-  XtSetArg(args[0], XtNtopOfThumb, sizeof(float) > sizeof(XtArgVal) ?
+-      (XtArgVal)&top : *(XtArgVal *)&top);
+-  XtSetArg(args[1], XtNshown, sizeof(float) > sizeof(XtArgVal) ?
+-      (XtArgVal)&shown : *(XtArgVal *)&shown);
++  XtSetArg(args[0], XtNtopOfThumb, top.xav);
++  XtSetArg(args[1], XtNshown, shown.xav);
+   XtSetValues(plw->pixmap_list.scroll, args, 2);
+   return;
+ }
+diff --git a/control.c b/control.c
+index 8261ad4..d5059b4 100644
+--- a/control.c
++++ b/control.c
+@@ -373,7 +373,7 @@ ARGSEP  XtPointer call
+ {
+   int     delta;
+   
+-  delta = (int)call ? (int)call < 0 ? -1 : 1 : 0;
++  delta = (long)call ? (long)call < 0 ? -1 : 1 : 0;
+   if((delta >= 0 || state.counts[5]) && (delta <= 0 ||
+       state.counts[5] != APPLE_LIMIT))
+     adjust_count(5, delta);
+@@ -431,7 +431,7 @@ ARGSEP  XtPointer call
+   IconCallback *call_data;
+   int       option;
+   
+-  option = state.button[(unsigned)client];
++  option = state.button[(unsigned long)client];
+   call_data = (IconCallback *)call;
+   if(option == OPTION_APPLES)
+     select_apple(call_data->selection);
+@@ -454,13 +454,13 @@ ARGSEP  XtPointer call
+ {
+   if(state.edit)
+     {
+-      state.edit->board->colors = (unsigned)client;
++      state.edit->board->colors = (unsigned long)client;
+       paint_garden_icon(state.edit);
+       paint_garden_image();
+       repaint_garden_icon();
+       changed_flag |= state.change;
+     }
+-  set_icon_color((unsigned)client);
++  set_icon_color((unsigned long)client);
+   return;
+ }
+ /*}}}*/
+@@ -477,13 +477,13 @@ ARGSEP  XtPointer call
+ {
+   if(state.edit)
+     {
+-      state.edit->board->fill = (unsigned)client;
++      state.edit->board->fill = (unsigned long)client;
+       paint_garden_icon(state.edit);
+       paint_garden_image();
+       repaint_garden_icon();
+       changed_flag |= state.change;
+     }
+-  set_icon_fill((unsigned)client);
++  set_icon_fill((unsigned long)client);
+   return;
+ }
+ /*}}}*/
+@@ -498,9 +498,9 @@ ARGSEP  XtPointer call
+  * change the display mode and update the garden
+  */
+ {
+-  if(state.mode != (unsigned)client)
++  if(state.mode != (unsigned long)client)
+     {
+-      state.mode = (unsigned)client;
++      state.mode = (unsigned long)client;
+       paint_garden_icon(state.edit);
+       paint_garden_image();
+       repaint_garden_icon();
+@@ -525,7 +525,7 @@ ARGSEP  XtPointer call
+   IconCallback *call_data;
+   unsigned  option;
+   
+-  option = (unsigned)client;
++  option = (unsigned long)client;
+   call_data = (IconCallback *)call;
+   if(option == OPTION_APPLES)
+     if(select_apple(call_data->selection))
+@@ -802,36 +802,35 @@ FUNCARG((root),
+   /*{{{  set option callback*/
+   for(gptr = &gizmos[GIZMO_OPTIONS + OPTIONS - 1], ix = OPTIONS;
+       ix--; gptr--)
+-    XtAddCallback(gptr->widget, XtNcallback, command_option, (XtPointer)ix);
++    XtAddCallback(gptr->widget, XtNcallback, command_option, (XtPointer)(unsigned long)ix);
+   /*}}}*/
+   /*{{{  set fill callback*/
+   for(gptr = &gizmos[GIZMO_FILLS + FILLS - 1], ix = FILLS; ix--; gptr--)
+-    XtAddCallback(gptr->widget, XtNcallback, command_fill, (XtPointer)ix);
++    XtAddCallback(gptr->widget, XtNcallback, command_fill, (XtPointer)(unsigned long)ix);
+   /*}}}*/
+   /*{{{  set color callback*/
+   for(gptr = &gizmos[GIZMO_COLORS + BACKGROUNDS - 1], ix = BACKGROUNDS;
+       ix--; gptr--)
+-    XtAddCallback(gptr->widget, XtNcallback, command_color, (XtPointer)ix);
++    XtAddCallback(gptr->widget, XtNcallback, command_color, (XtPointer)(unsigned long)ix);
+   /*}}}*/
+   /*{{{  set mode callback*/
+   for(gptr = &gizmos[GIZMO_DISPLAY_BASE + MODES - 1], ix = MODES;
+       ix--; gptr--)
+-    XtAddCallback(gptr->widget, XtNcallback, command_mode, (XtPointer)ix);
++    XtAddCallback(gptr->widget, XtNcallback, command_mode, (XtPointer)(unsigned long)ix);
+   /*}}}*/
+   /*{{{  set button callback*/
+   for(gptr = &gizmos[GIZMO_BUTTONS + BUTTONS - 1], ix = BUTTONS;
+       ix--; gptr--)
+-    XtAddCallback(gptr->widget, XtNcallback, command_button, (XtPointer)ix);
++    XtAddCallback(gptr->widget, XtNcallback, command_button, (XtPointer)(unsigned long)ix);
+   /*}}}*/
+   /*{{{  setup apple scrollbar*/
+   {
+-    float     shown;
++    union { float f; XtArgVal xav; } shown;
+     Arg       arg[1];
+     
+     gptr = &gizmos[GIZMO_TOTAL_WARNINGS + 5];
+-    shown = (float)1.0;
+-    XtSetArg(arg[0], XtNshown, sizeof(float) > sizeof(XtArgVal) ?
+-  	(XtArgVal)&shown : *(XtArgVal *)&shown);
++    shown.f = (float)1.0;
++    XtSetArg(arg[0], XtNshown, shown.xav);
+     XtSetValues(gptr->widget, arg, 1);
+     XtAddCallback(gptr->widget, XtNjumpProc, apple_jump, (XtPointer)NULL);
+     XtAddCallback(gptr->widget, XtNscrollProc, apple_scroll, (XtPointer)NULL);
+diff --git a/dialogs.c b/dialogs.c
+index 43410b5..9d864e4 100644
+--- a/dialogs.c
++++ b/dialogs.c
+@@ -87,7 +87,7 @@ ARGSEP  Cardinal  *argc
+     for(optr = dialog_options; optr->text; optr ++)
+       if(!strcmp(optr->text, *argv))
+ 	{
+-	  dialog_option(widget, (XtPointer)optr->option, (XtPointer)NULL);
++	  dialog_option(widget, (XtPointer)(unsigned long)optr->option, (XtPointer)NULL);
+ 	  break;
+ 	}
+   return;
+@@ -135,7 +135,7 @@ ARGSEP  XtPointer call
+     widget = XtParent(widget);
+   if(!widget)
+     /* EMPTY */;
+-  else if((unsigned)client == DIALOG_CLEAR)
++  else if((unsigned long)client == DIALOG_CLEAR)
+     {
+       Widget    text;
+       
+@@ -160,7 +160,7 @@ ARGSEP  XtPointer call
+ 	if(dptr->dialog == widget)
+ 	  {
+ 	    dptr->selection |=
+-		(unsigned)client & dptr->options;
++		(unsigned long)client & dptr->options;
+ 	    if(dptr->selection && dptr->up)
+ 	      {
+ 		dptr->up = 0;
+@@ -320,7 +320,7 @@ FUNCARG((root),
+ 	      if(optr->option & (1 << count))
+ 		{
+ 		  XawDialogAddButton(dptr->dialog, optr->text,
+-		      dialog_option, (XtPointer)(1 << count));
++		      dialog_option, (XtPointer)(unsigned long)(1 << count));
+ 		  break;
+ 		}
+ 	  }
+diff --git a/makemred.c b/makemred.c
+index 18aa078..ee1f7a1 100644
+--- a/makemred.c
++++ b/makemred.c
+@@ -492,7 +492,7 @@ ARGSEP  String  *argv
+ 	/* EMPTY */;
+       display.toplevel = XtAppInitialize(&display.context, "Xmris",
+ 	  options, (Cardinal)(ptr - options),
+-	  (Cardinal *)&argc, (String *)argv,
++	  &argc, (String *)argv,
+ 	  (String *)fallback_resources,
+ 	  toplevel_args, XtNumber(toplevel_args));
+       if(argc > 1)
+diff --git a/makemris.c b/makemris.c
+index 9ea2bb5..4bf8d20 100644
+--- a/makemris.c
++++ b/makemris.c
+@@ -282,7 +282,7 @@ ARGSEP  String  *argv
+ 	    /* EMPTY */;
+ 	  display.toplevel = XtAppInitialize(&display.context, "Xmris",
+ 	      options, (Cardinal)(ptr - options),
+-	      (Cardinal *)&argc, (String *)argv,
++	      &argc, (String *)argv,
+ 	      (String *)NULL, toplevel_args, XtNumber(toplevel_args));
+ 	}
+       if(argc > 1)
+@@ -309,7 +309,7 @@ ARGSEP  String  *argv
+ 	/*{{{  some more setup*/
+ 	{
+ 	  XtResource CONST *ptr;
+-	  char CONST *dir;
++	  char *dir;
+ 	  
+ 	  XtAppSetTypeConverter(display.context, XtRString, XtRKeySym,
+ 	      convert_string2keysym, (XtConvertArgRec *)NULL, 0, XtCacheNone,
+diff --git a/menubar.c b/menubar.c
+index 616a70c..57db711 100644
+--- a/menubar.c
++++ b/menubar.c
+@@ -147,7 +147,7 @@ ARGSEP  XtPointer call
+   char  CONST *error;
+   int       insert;
+   
+-  if((unsigned)client == GIZMO_FILE_LOAD - GIZMO_FILE_BASE)
++  if((unsigned long)client == GIZMO_FILE_LOAD - GIZMO_FILE_BASE)
+     {
+       if(!check_saved(CHANGED_ANY))
+ 	return;
+@@ -166,7 +166,7 @@ ARGSEP  XtPointer call
+ 	  dialog = DIALOG_FILE_ERROR;
+ 	  title = "Cannot load";
+ 	  menu_filename(result);
+-	  if((unsigned)client == GIZMO_FILE_LOAD - GIZMO_FILE_BASE)
++	  if((unsigned long)client == GIZMO_FILE_LOAD - GIZMO_FILE_BASE)
+ 	    free_descriptors();
+ 	  error = load_boards(filename, insert);
+ 	}
+@@ -174,7 +174,7 @@ ARGSEP  XtPointer call
+ 	break;
+     }
+   while(error);
+-  if((unsigned)client == GIZMO_FILE_LOAD - GIZMO_FILE_BASE)
++  if((unsigned long)client == GIZMO_FILE_LOAD - GIZMO_FILE_BASE)
+     changed_flag = 0;
+   return;
+ }
+@@ -234,7 +234,7 @@ ARGSEP  XtPointer call
+   char CONST *error;
+   
+   XtVaGetValues(widget, XtNlabel, &title, NULL);
+-  dialog = filename && *filename && (unsigned)client ==
++  dialog = filename && *filename && (unsigned long)client ==
+       GIZMO_FILE_SAVE - GIZMO_FILE_BASE ? -1 : DIALOG_FILENAME;
+   error = NULL;
+   option = DIALOG_NONE;
+@@ -475,10 +475,10 @@ FUNCARG((root),
+   create_gizmos(root, gizmos, XtNumber(gizmos));
+   for(ix = XtNumber(file_callbacks); ix--;)
+     XtAddCallback(gizmos[GIZMO_FILE_BASE + ix].widget,
+-	XtNcallback, file_callbacks[ix], (XtPointer)ix);
++	XtNcallback, file_callbacks[ix], (XtPointer)(unsigned long)ix);
+   for(ix = XtNumber(garden_callbacks); ix--;)
+     XtAddCallback(gizmos[GIZMO_GARDEN_BASE + ix].widget,
+-	XtNcallback, garden_callbacks[ix], (XtPointer)ix);
++	XtNcallback, garden_callbacks[ix], (XtPointer)(unsigned long)ix);
+   menu_filename(NULL);
+   menu_total(0);
+   return;
+diff --git a/player.c b/player.c
+index 560fb1d..944393f 100644
+--- a/player.c
++++ b/player.c
+@@ -8,8 +8,8 @@ extern VOIDFUNC bounce_ball FUNCARGVOID
+  * bouncing the ball is rather involved
+  */
+ {
+-  COORD     tl;
+-  COORD     br;
++  COORD     tl = { 0, 0 };
++  COORD     br = { 0, 0 };
+   CELL      *cptr;
+   CELL      *optr;
+   
+diff --git a/scram.c b/scram.c
+index 62546e7..7d34d33 100644
+--- a/scram.c
++++ b/scram.c
+@@ -113,7 +113,7 @@ ARGSEP  BITMAP    *bitmap     /* bitmap ptr */
+   FILE      *stream;
+   unsigned  state;
+   char      line[128];
+-  SIZE      place;
++  SIZE      place = { 0, 0 };
+   unsigned  extra;
+   
+   stream = fopen(name, "r");
+-- 
+1.7.5
+
diff --git a/0009-Remove-TRANSPUTER-stuff.patch b/0009-Remove-TRANSPUTER-stuff.patch
new file mode 100644
index 0000000..49ddf4c
--- /dev/null
+++ b/0009-Remove-TRANSPUTER-stuff.patch
@@ -0,0 +1,518 @@
+From 361a5e7c3ebfbbe7fecbdbdd9d5f7497679f3be1 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Fri, 29 Apr 2011 17:17:12 +0200
+Subject: [PATCH 09/20] Remove TRANSPUTER stuff
+
+This is not used (never defined by any makefiles) and obfuscates the code
+needlessly. Removing this is a preparation step for cleaning up the highscore
+support for dropping setgid rights directly on start, rather then using
+unsafe seteg/uid tricks.
+---
+ common.h  |    4 ---
+ defcom.c  |    6 -----
+ scoring.c |   49 ------------------------------------------
+ scram.c   |    4 ---
+ timer.c   |   71 -------------------------------------------------------------
+ xmris.c   |    2 -
+ xmris.h   |   11 ---------
+ 7 files changed, 0 insertions(+), 147 deletions(-)
+
+diff --git a/common.h b/common.h
+index e1fd8dd..0babbce 100644
+--- a/common.h
++++ b/common.h
+@@ -16,9 +16,7 @@
+ #include <errno.h>
+ #include <ctype.h>
+ #include <time.h>
+-#ifndef TRANSPUTER
+ #include <unistd.h>
+-#endif /* TRANSPUTER */
+ #include <X11/Xlib.h>
+ #include <X11/Xutil.h>
+ #include <X11/keysym.h>
+@@ -294,9 +292,7 @@ typedef struct Data
+   Boolean username; /* use username of user */
+   Boolean nodynamic; /* don't take advantage of dynamic visuals */
+   Boolean nodisplay; /* don't open the display, even to get X resources */
+-#ifndef TRANSPUTER
+   Boolean busywait; /* do busy waiting */
+-#endif /* TRANSPUTER */
+ #endif /* XMRED */
+   Boolean gender;   /* he or she? */
+   int     distinct; /* distinct colors allocated */
+diff --git a/defcom.c b/defcom.c
+index 5934c5e..9715fe9 100644
+--- a/defcom.c
++++ b/defcom.c
+@@ -219,9 +219,7 @@ XrmOptionDescRec options[] =
+   {"-username",".username",     XrmoptionNoArg, (XtPointer)XtEyes},
+   {"-realname",".username",     XrmoptionNoArg, (XtPointer)XtEno},
+   {"-static",  ".static",       XrmoptionNoArg, (XtPointer)XtEyes},
+-#ifndef TRANSPUTER
+   {"-busywait", ".busywait",    XrmoptionNoArg, (XtPointer)XtEyes},
+-#endif /* TRANSPUTER */
+ #endif /* XMRED */
+   {NULL}
+ };
+@@ -259,10 +257,8 @@ XtResource resources[] =
+       XtOffsetOf(DATA, username), XtRImmediate, (XtPointer)False},
+   {"static", "Static", XtRBoolean, sizeof(Boolean),
+       XtOffsetOf(DATA, nodynamic), XtRImmediate, (XtPointer)False},
+-#ifndef TRANSPUTER
+   {"busywait", "Busywait", XtRBoolean, sizeof(Boolean),
+       XtOffsetOf(DATA, busywait), XtRImmediate, (XtPointer)False},
+-#endif /* TRANSPUTER */
+ #endif /* XMRED */
+   {XtNfont, XtCFont, XtRFont, sizeof(Font),
+       XtOffsetOf(DATA, font), XtRString, (XtPointer)FONT_NAME},
+@@ -394,9 +390,7 @@ HELP CONST help[] =
+   {"Remove user's scores",          "-remove",    "", "<name>"},
+   {"Do not open display",           "+display", "", ""},
+   {"Store date format change",      "-format",    "", ""},
+-#ifndef TRANSPUTER
+   {"Force busywaiting",             "-busywait",  "Busywait:yes", ""},
+-#endif /* TRANSPUTER */
+ #endif /* XMRED */
+   {NULL}
+ };
+diff --git a/scoring.c b/scoring.c
+index 6f1030f..b63c2b6 100644
+--- a/scoring.c
++++ b/scoring.c
+@@ -26,15 +26,11 @@
+ /*}}}*/
+ #include "xmris.h"
+ /*{{{  other includes*/
+-#ifdef TRANSPUTER
+-#include <iocntrl.h>
+-#else
+ #include <pwd.h>
+ #include <sys/stat.h>
+ #ifdef USELOCKFILE
+ #include <fcntl.h>
+ #endif /* USELOCKFILE */
+-#endif /* TRANSPUTER */
+ /*}}}*/
+ /*{{{  file locking*/
+ #ifndef SYSV
+@@ -131,9 +127,6 @@ ARGSEP  uid_t       uid
+  * so that we pick up the new scores
+  */
+ {
+-#ifdef TRANSPUTER
+-  return 1; /* assume that it has changed */
+-#else
+   static  time_t last_time[2];
+   struct stat buffer;
+   unsigned  changed;
+@@ -151,7 +144,6 @@ ARGSEP  uid_t       uid
+   if(real_uid != current_uid)
+     set_euid((current_uid = real_uid));
+   return changed;
+-#endif /* TRANSPUTER */
+ }
+ /*}}}*/
+ /*{{{  void get_lock(name, flag, uid)*/
+@@ -172,34 +164,6 @@ ARGSEP  uid_t     uid
+ {
+   FILE    *stream;
+ 
+-#ifdef TRANSPUTER
+-  if(locking_file && !locks)
+-    /*{{{  attempt file lock*/
+-    {
+-      unsigned  count;
+-      FILE      *lock;
+-    
+-      for(count = 3; count; count--)
+-	{
+-	  lock = fopen(locking_file, "r");
+-	  if(lock)
+-	    {
+-	      fclose(lock);
+-	      sleep(1);
+-	    }
+-	  else
+-	    {
+-	      lock = fopen(locking_file, "w");
+-	      if(lock)
+-		fclose(lock);
+-	      else
+-		perror(locking_file);
+-	      break;
+-	    }
+-	}
+-    }
+-    /*}}}*/
+-#else
+ #ifdef USELOCKFILE
+   if(locking_file && !locks)
+     /*{{{  attempt exclusive file lock*/
+@@ -235,7 +199,6 @@ ARGSEP  uid_t     uid
+ #endif /* USELOCKFILE */
+   if(uid != current_uid)
+     set_euid((current_uid = uid));
+-#endif /* TRANSPUTER */
+   stream = fopen(name, flag & 1 ? "w+" : "r+");
+   if(!stream && !(flag & 2))
+     perror(name);
+@@ -244,10 +207,8 @@ ARGSEP  uid_t     uid
+     locks++;
+   else if(locking_file && !locks)
+     {
+-#ifndef TRANSPUTER
+       if(current_uid != effective_uid)
+ 	set_euid((current_uid = effective_uid));
+-#endif /* TRANSPUTER */
+       unlink(locking_file);
+     }
+ #else
+@@ -260,12 +221,10 @@ ARGSEP  uid_t     uid
+       }
+     /*}}}*/
+ #endif /* USELOCKFILE */
+-#ifndef TRANSPUTER
+   if(stream && flag & 4 && effective_uid == real_uid)
+     chmod(name, 0666); /* not everyone has fchmod */
+   if(current_uid != real_uid)
+     set_euid((current_uid = real_uid));
+-#endif /* TRANSPUTER */
+   return stream;
+ }
+ /*}}}*/
+@@ -284,15 +243,11 @@ FUNCARG((stream),
+   locks--;
+   if(locking_file && locks)
+     {
+-#ifndef TRANSPUTER
+       if(current_uid != effective_uid)
+ 	set_euid((current_uid = effective_uid));
+-#endif
+       unlink(locking_file);
+-#ifndef TRANSPUTER
+       if(current_uid != real_uid)
+ 	set_euid((current_uid = real_uid));
+-#endif /* TRANSPUTER */
+     }
+ #else
+   rewind(stream);
+@@ -342,7 +297,6 @@ extern VOIDFUNC init_scores FUNCARGVOID
+   user = NULL;
+   home = NULL;
+   reallife = NULL;
+-#ifndef TRANSPUTER
+   /*{{{  read passwd information*/
+   {
+     struct passwd *ptr;
+@@ -409,7 +363,6 @@ extern VOIDFUNC init_scores FUNCARGVOID
+       }
+   }
+   /*}}}*/
+-#endif
+   scoring.mine.score = 0;
+   /*{{{  set username*/
+   {
+@@ -720,7 +673,6 @@ FUNCARG((insert),
+ 	  
+ 	  personal = 0;
+ 	  truename = home = NULL;
+-#ifndef TRANSPUTER
+ 	  /*{{{  find name & home*/
+ 	  {
+ 	    struct passwd *ptr;
+@@ -733,7 +685,6 @@ FUNCARG((insert),
+ 	      }
+ 	  }
+ 	  /*}}}*/
+-#endif /* TRANSPUTER */
+ 	  /*{{{  search*/
+ 	  for(found = index = 0; index != 2; index++)
+ 	    {
+diff --git a/scram.c b/scram.c
+index 7d34d33..d68cf03 100644
+--- a/scram.c
++++ b/scram.c
+@@ -25,11 +25,7 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <ctype.h>
+-#ifdef TRANSPUTER
+-#include <iocntrl.h>
+-#else
+ #include <unistd.h>
+-#endif /* TRANSPUTER */
+ /*}}}*/
+ #define SUFFIXMONO  ".bw"
+ #define SUFFIXCOLOR ".rgb"
+diff --git a/timer.c b/timer.c
+index c8fa2c1..028f8f0 100644
+--- a/timer.c
++++ b/timer.c
+@@ -54,12 +54,8 @@
+  */
+ /*}}}*/
+ #include "xmris.h"
+-#ifdef TRANSPUTER
+-#include <process.h>
+-#else
+ #include <sys/time.h>
+ #include <signal.h>
+-#endif
+ #ifdef SVR4
+ #ifndef SYSV
+ #define SYSV
+@@ -74,7 +70,6 @@
+  *    reblocks the signal
+  * signal_release returns the block mask to what it was before signal_hold
+  */
+-#ifndef TRANSPUTER
+ #if defined POSIX || defined linux
+ #  define MASK sigset_t
+ #  define signal_hold(signal, maskp) \
+@@ -125,7 +120,6 @@
+ #    endif /* SYSV */
+ #  endif /* __hpux */
+ #endif /* POSIX */
+-#endif /* TRANSPUTER */
+ /*}}}*/
+ /*{{{  get current time*/
+ /* TICKTIME specifies how many microseconds in each timer tick
+@@ -133,14 +127,6 @@
+  * BUSYWAIT is set if the timer is precise enough for busywait code
+  * to work
+  */
+-#ifdef TRANSPUTER
+-# define gettick(ptr) (*(ptr) = ProcTime())
+-# define TICKTIME (unsigned long)64
+-# define tickdelta(later, earlier) ProcTimeMinus(later, earlier)
+-# define tickafter(later, earlier) ProcTimerAfter(later, earlier)
+-# define tickadd(time, interval) ProcTimePlus(time, interval)
+-  typedef int tick_t;
+-#else
+ # ifdef USETIME
+ #   define gettick(ptr) (*(ptr) = time((time_t *)NULL))
+ #   define TICKTIME (unsigned long)1000000
+@@ -181,17 +167,12 @@
+       (tickdelta(later, earlier) < ~(~(unsigned long)0 >> 1))
+     typedef unsigned long tick_t;
+ # endif /* USETIME */
+-#endif /* TRANSPUTER */
+ /*}}}*/
+ /*{{{  timer*/
+ static struct
+ {
+   VOIDFUNC  (*handler) PROTOARG((int));   /* original handler */
+   unsigned  long usec;              /* interval time in usec */
+-#ifdef TRANSPUTER
+-  tick_t    delay;                  /* tickdelay waiting */
+-  tick_t    timeout;                /* when the next one should timeout */
+-#else
+   struct itimerval interval;        /* internal interval time */
+   unsigned  VOLATILE elapsed;       /* timer elapsed */
+   unsigned  VOLATILE waiting;       /* waiting for the interrupt */
+@@ -201,7 +182,6 @@ static struct
+   tick_t    timeout;                /* timeout */
+   tick_t    delay;                  /* interval delay */
+ #endif /* BUSYWAIT */
+-#endif /* TRANSPUTER */
+   unsigned  state;          /* timing state */
+   tick_t    game;           /* start of game tick */
+   tick_t    start;          /* timing start */
+@@ -226,26 +206,11 @@ static unsigned next;
+ /*}}}*/
+ #endif
+ /*{{{  prototypes*/
+-#ifndef TRANSPUTER
+ static VOIDFUNC timer_alarm PROTOARG((int));
+-#endif /* TRANSPUTER */
+ #ifndef NDEBUG
+ static VOIDFUNC timer_debug PROTOARG((char CONST *));
+ #endif
+ /*}}}*/
+-#ifdef TRANSPUTER
+-/*{{{  void sleep(delay)*/
+-extern VOIDFUNC sleep
+-FUNCARG((delay),
+-	unsigned  delay
+-)
+-{
+-  ProcWait((int)(delay * (1000000 / TICKTIME)));
+-  return;
+-}
+-/*}}}*/
+-#endif /* TRANSPUTER */
+-#ifndef TRANSPUTER
+ /*{{{  void timer_alarm(sig)*/
+ static VOIDFUNC timer_alarm
+ /* ARGSUSED */
+@@ -297,14 +262,12 @@ FUNCARG((sig),
+   return;
+ }
+ /*}}}*/
+-#endif /* TRANSPUTER */
+ /*{{{  void timer_close()*/
+ extern VOIDFUNC timer_close FUNCARGVOID
+ /*
+  * closes the timer stuff
+  */
+ {
+-#ifndef TRANSPUTER
+   if(data.busywait == False)
+     {
+       MASK      mask;
+@@ -322,7 +285,6 @@ extern VOIDFUNC timer_close FUNCARGVOID
+       signal(SIGALRM, timer.handler);
+ #endif /* USESIGSET */
+     }
+-#endif /* TRANSPUTER */
+   return;
+ }
+ /*}}}*/
+@@ -354,10 +316,6 @@ extern VOIDFUNC timer_open FUNCARGVOID
+  * and starting the first tick
+  */
+ {
+-#ifdef TRANSPUTER
+-  assert(ProcGetPriority());
+-  gettick(&timer.timeout);
+-#else
+   if(data.busywait != False)
+ # ifdef BUSYWAIT
+     {
+@@ -382,7 +340,6 @@ extern VOIDFUNC timer_open FUNCARGVOID
+ #endif /* USESIGSET */
+   timer.waiting = 0;
+   timer.elapsed = 1;
+-#endif /* TRANSPUTER */
+ #ifndef NDEBUG
+   timer_debug("Init");
+ #endif
+@@ -418,14 +375,10 @@ ARGSEP  unsigned  state
+ 	assert(t1 || t2);
+       }
+       timer.usec = tick;
+-#ifdef TRANSPUTER
+-      timer.delay = (tick_t)(tick / TICKTIME);
+-#else
+ #ifdef BUSYWAIT
+       timer.delay = (tick_t)(tick / TICKTIME);
+ #endif /* BUSYWAIT */
+       timer.interval.it_value.tv_usec = tick;
+-#endif /* TRASNPUTER */
+     }
+   value = timer.state;
+   switch(state)
+@@ -501,27 +454,6 @@ extern VOIDFUNC timer_wait FUNCARGVOID
+ {
+   int       point;
+   
+-#ifdef TRANSPUTER
+-  /*{{{  wait for it*/
+-  {
+-    tick_t    now;
+-    
+-    gettick(&now);
+-    if(timeafter(now, timer.timeout))
+-      {
+-	point = 1;
+-	timer.timeout = now;
+-	timer.missed++;
+-      }
+-    else
+-      {
+-	point = -1;
+-	ProcAfter(timer.timeout);
+-      }
+-    timer.timeout = tickadd(timer.timeout, timer.delay);
+-  }
+-  /*}}}*/
+-#else
+   {
+     MASK      mask;
+     
+@@ -585,7 +517,6 @@ extern VOIDFUNC timer_wait FUNCARGVOID
+     }
+   /*}}}*/
+ #endif /* BUSYWAIT */
+-#endif /* TRANSPUTER */
+   if(timer.state != TIMING_ON)
+     /* EMPTY */;
+   else if(!timer.count)
+@@ -603,7 +534,6 @@ extern VOIDFUNC timer_wait FUNCARGVOID
+       usec = (unsigned long)tickdelta(timer.stop, timer.start) * TICKTIME;
+       dilation = (unsigned)(usec / FRAME_RATIO_UPDATE *
+ 	  FRAME_SCALE / timer.usec);
+-#ifndef TRANSPUTER
+ #ifdef BUSYWAIT
+       if(!timer.busywait && dilation * 100 < FRAME_SCALE * 97)
+ 	{
+@@ -613,7 +543,6 @@ extern VOIDFUNC timer_wait FUNCARGVOID
+ 	  timer.busywait = 1;
+ 	}
+ #endif /* BUSYWAIT */
+-#endif /* TRANSPUTER */
+       if(dilation <= FRAME_SCALE)
+ 	dilation = FRAME_SCALE;
+       else if(timer.missed <= (global.dilation == FRAME_SCALE ?
+diff --git a/xmris.c b/xmris.c
+index 2f6cc62..d79815a 100644
+--- a/xmris.c
++++ b/xmris.c
+@@ -1260,13 +1260,11 @@ ARGSEP  char CONST **argv
+   Atom wm_delete_window;
+   
+   myname = *argv ? *argv : "Xmris";
+-#ifndef TRANSPUTER
+   real_uid = getuid();
+   effective_uid = geteuid();
+   if(real_uid != effective_uid)
+     set_euid(real_uid);
+   current_uid = real_uid;
+-#endif /* TRANSPUTER */
+   open_toolkit(argc, (String *)argv);
+   init_scores();
+   /*{{{  help?*/
+diff --git a/xmris.h b/xmris.h
+index ac4fd50..9918502 100644
+--- a/xmris.h
++++ b/xmris.h
+@@ -13,25 +13,17 @@
+ #define FUNCANIMATE(name, arg) PROTOVOID(*name(arg)) PROTOVOID(*arg);
+ #endif
+ /*}}}*/
+-#ifdef TRANSPUTER
+-#undef USELOCKFILE
+-#define USELOCKFILE
+-#endif /* TRANSPUTER */
+ /*{{{  check score*/
+ #ifndef SCORE_DIR
+   #error No default score directory
+ #endif /* SCORE_DIR */
+ /*}}}*/
+ /*{{{  set_euid*/
+-#ifdef TRANSPUTER
+-typedef int uid_t;
+-#else
+ #ifdef __hpux
+ #define set_euid(euid) setresuid((uid_t)-1, euid, (uid_t)-1)
+ #else
+ #define set_euid(euid) seteuid(euid)
+ #endif /* __hpux */
+-#endif /* TRANSPUTER */
+ /*}}}*/
+ /*{{{  defines*/
+ /*{{{  board sizes*/
+@@ -564,9 +556,6 @@ extern VOIDFUNC high_score PROTOARG((unsigned long, unsigned, unsigned long));
+ extern VOIDFUNC init_scores PROTOARG((VOIDARG));
+ /*}}}*/
+ /*{{{  timer*/
+-#ifdef TRANSPUTER
+-extern VOIDFUNC sleep PROTOARG((unsigned));
+-#endif /* TRANSPUTER */
+ extern VOIDFUNC timer_close PROTOARG((VOIDARG));
+ extern VOIDFUNC timer_open PROTOARG((VOIDARG));
+ extern unsigned timer_set PROTOARG((unsigned long, unsigned));
+-- 
+1.7.5
+
diff --git a/0010-Remove-USELOCKFILE-stuff.patch b/0010-Remove-USELOCKFILE-stuff.patch
new file mode 100644
index 0000000..5dd95b1
--- /dev/null
+++ b/0010-Remove-USELOCKFILE-stuff.patch
@@ -0,0 +1,262 @@
+From 4f1962e509a1338bd607937b6e55f9a82023d6ba Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Fri, 29 Apr 2011 17:19:05 +0200
+Subject: [PATCH 10/20] Remove USELOCKFILE stuff
+
+Removing this is a preparation step for cleaning up the highscore
+support for dropping setgid rights directly on start, rather then using
+unsafe seteg/uid tricks. In this mode using a separate lockfile is not
+supported.
+---
+ Imakefile    |    5 +--
+ Makefile.std |    5 +--
+ scoring.c    |  102 ----------------------------------------------------------
+ xmris.man    |   14 +-------
+ 4 files changed, 3 insertions(+), 123 deletions(-)
+
+diff --git a/Imakefile b/Imakefile
+index a6c6842..ad062d7 100644
+--- a/Imakefile
++++ b/Imakefile
+@@ -59,9 +59,6 @@ XCOMM
+ XCOMM don't you have gettimeofday?
+ TIME =
+ XCOMM TIME = -DUSETIME
+-XCOMM don't you have lockf or flock?
+-LOCK =
+-XCOMM LOCK = -DUSELOCKFILE
+ 
+ XCOMM game defaults, you probably only want to alter the SCORE
+ XCOMM
+@@ -121,7 +118,7 @@ FONT = thefont
+ #endif
+ 
+ DEFINES = $(EXTRACCOPTIONS) -DFONT_NAME='$(FONT)' $(NDEBUG) \
+-	-DSCORE_DIR='"$(SCORE)"' $(LOCK) $(TIME) $(KNR) -DSCROLLBARBUGFIX
++	-DSCORE_DIR='"$(SCORE)"' $(TIME) $(KNR) -DSCROLLBARBUGFIX
+ LOCAL_LIBRARIES = $(XAWLIB) $(XTOOLLIB) $(XMULIB) $(XINTL) $(XLIB) $(MATHSLIB)
+ DEPLIBS = $(DEPXLIB)
+ 
+diff --git a/Makefile.std b/Makefile.std
+index 72d1ba9..39b8935 100644
+--- a/Makefile.std
++++ b/Makefile.std
+@@ -434,9 +434,6 @@ KNR =
+ # don't you have gettimeofday?
+ TIME =
+ # TIME = -DUSETIME
+-# don't you have lockf or flock?
+-LOCK =
+-LOCK = -DUSELOCKFILE
+ 
+ # game defaults, you probably only want to alter the SCORE
+ #
+@@ -488,7 +485,7 @@ COFLAGS = -l
+ RCSFLAGS =
+ 
+ DEFINES = $(EXTRACCOPTIONS) -DFONT_NAME='$(FONT)' $(NDEBUG) \
+-	-DSCORE_DIR='"$(SCORE)"' $(LOCK) $(TIME) $(KNR) -DSCROLLBARBUGFIX
++	-DSCORE_DIR='"$(SCORE)"' $(TIME) $(KNR) -DSCROLLBARBUGFIX
+ LOCAL_LIBRARIES = $(XAWLIB) $(XTOOLLIB) $(XMULIB) $(XLIB) $(MATHSLIB)
+ DEPLIBS = $(DEPXLIB)
+ 
+diff --git a/scoring.c b/scoring.c
+index b63c2b6..015dd43 100644
+--- a/scoring.c
++++ b/scoring.c
+@@ -1,36 +1,8 @@
+ /* Copyright (C) 1993, 1992 Nathan Sidwell */
+-/* RCS $Id: scoring.c 1.2 Tue, 16 Mar 1999 11:28:16 +0000 nathan $ */
+-/*{{{  file locking problems*/
+-/*
+- * USELOCKFILE file locking as suggested by
+- * Daniel Edward Lovinger <del+ at cmu.edu>
+- * With lockf (or flock), we just use the kernel's locking stuff to lock the
+- * entire score file while we read, or update it. But some distributed
+- * file systems don't support it and some are broken (SunOS 4.1).
+- * USELOCKFILE uses uses open(O_CREAT | O_EXCL) to create
+- * a lock file in the same directory as the xmris high score file, with
+- * the name "xmris.lock".
+- * The personal score files are either in the score file directory
+- * with names "xmris-<name>", or in the user's home directory with name
+- * ".xmris.scores".
+- * In order to work correctly, if xmris is set_euid'd to get the access
+- * permissions to the high score directory, we keep juggling
+- * the effective user id between the set_euid'd one and the real uid.
+- * This ensures that xmris can open the display on servers which use
+- * magic cookie and access control (like openwindows), and that the
+- * personal file has the correct attributes when created in the user's
+- * home directory.
+- *
+- * Some systems have flock (BSD), and some have lockf (SYSV).
+- */
+-/*}}}*/
+ #include "xmris.h"
+ /*{{{  other includes*/
+ #include <pwd.h>
+ #include <sys/stat.h>
+-#ifdef USELOCKFILE
+-#include <fcntl.h>
+-#endif /* USELOCKFILE */
+ /*}}}*/
+ /*{{{  file locking*/
+ #ifndef SYSV
+@@ -53,10 +25,6 @@ static int      personal_make = 2;
+ static uid_t    personal_uid = -1;  /* uid for personal file */
+ static char     date_format[4] = "   ";
+ static char     *alternate = NULL;    /* alternative name */
+-#ifdef USELOCKFILE
+-static char     *locking_file = NULL;  /* lock file name */
+-static unsigned locks;      /* number of locks open */
+-#endif /* USELOCKFILE */
+ static HIGH_SCORE *CONST tables[] =
+   {scoring.high, scoring.today, scoring.personal};
+ /*}}}*/
+@@ -164,54 +132,11 @@ ARGSEP  uid_t     uid
+ {
+   FILE    *stream;
+ 
+-#ifdef USELOCKFILE
+-  if(locking_file && !locks)
+-    /*{{{  attempt exclusive file lock*/
+-    {
+-      unsigned  count;
+-      int       filed;
+-    
+-      for(count = 3; count;)
+-	{
+-	  if(current_uid != effective_uid)
+-	    set_euid((current_uid = effective_uid));
+-	  filed = open(locking_file, O_CREAT | O_EXCL, 0666);
+-	  if(filed >= 0)
+-	    break;
+-	  if(errno == EINTR)
+-	    continue;
+-	  else if(errno == EEXIST)
+-	    {
+-	      sleep(1);
+-	      if(!file_changed(name, uid))
+-		count--;
+-	    }
+-	  else
+-	    {
+-	      perror(locking_file);
+-	      break;
+-	    }
+-	}
+-      if(filed >= 0)
+-	close(filed);
+-    }
+-    /*}}}*/
+-#endif /* USELOCKFILE */
+   if(uid != current_uid)
+     set_euid((current_uid = uid));
+   stream = fopen(name, flag & 1 ? "w+" : "r+");
+   if(!stream && !(flag & 2))
+     perror(name);
+-#ifdef USELOCKFILE
+-  if(stream)
+-    locks++;
+-  else if(locking_file && !locks)
+-    {
+-      if(current_uid != effective_uid)
+-	set_euid((current_uid = effective_uid));
+-      unlink(locking_file);
+-    }
+-#else
+   if(stream)
+     /*{{{  get lock on the file*/
+     while(lock_file(stream))
+@@ -220,7 +145,6 @@ ARGSEP  uid_t     uid
+ 	  continue;
+       }
+     /*}}}*/
+-#endif /* USELOCKFILE */
+   if(stream && flag & 4 && effective_uid == real_uid)
+     chmod(name, 0666); /* not everyone has fchmod */
+   if(current_uid != real_uid)
+@@ -238,22 +162,9 @@ FUNCARG((stream),
+  */
+ {
+   fflush(stream);
+-#ifdef USELOCKFILE
+-  fclose(stream);
+-  locks--;
+-  if(locking_file && locks)
+-    {
+-      if(current_uid != effective_uid)
+-	set_euid((current_uid = effective_uid));
+-      unlink(locking_file);
+-      if(current_uid != real_uid)
+-	set_euid((current_uid = real_uid));
+-    }
+-#else
+   rewind(stream);
+   unlock_file(stream);
+   fclose(stream);
+-#endif /* USELOCKFILE */
+   return;
+ }
+ /*}}}*/
+@@ -394,19 +305,6 @@ extern VOIDFUNC init_scores FUNCARGVOID
+   dirlen = data.dir ? strlen(data.dir) : 0;
+   if(dirlen && data.dir[dirlen - 1] == '/')
+     dirlen--;
+-#ifdef USELOCKFILE
+-  /*{{{  lock file?*/
+-  if(dirlen)
+-    {
+-      locking_file = malloc(dirlen + 12);
+-      if(locking_file)
+-	{
+-	  strcpy(locking_file, data.dir);
+-	  strcpy(&locking_file[dirlen], "/xmris.lock");
+-	}
+-    }
+-  /*}}}*/
+-#endif /* USELOCKFILE */
+   /*{{{  score directory?*/
+   if(dirlen)
+     {
+diff --git a/xmris.man b/xmris.man
+index 1e7c47f..fab41d3 100644
+--- a/xmris.man
++++ b/xmris.man
+@@ -866,14 +866,6 @@ file to 666 if creating it.
+ .br
+ .ne 3
+ .TP
+-.B .../xmris.lock
+-In some systems, where lockf or flock doesn't work, this temporary file
+-is used to perform the locking. The directory containing it must be
+-writable by Mr Is. This can be done by chmoding the directory, or
+-by setuiding Mr Is appropriately.
+-.br
+-.ne 4
+-.TP
+ .PD 0
+ .B .../xmris-<name>
+ .TP
+@@ -888,7 +880,7 @@ to move it to the score directory. Mr Is
+ will attempt to create the personal files in the score directory. If this
+ cannot be done, the personal score file is placed in the home directory. In
+ order to create the personal score file in the score directory, Mr Is will
+-have to have the correct access rights, as with the lock file. A setuid Mr Is
++have to have the correct access rights. A setuid Mr Is
+ will juggle the effective uid correctly for accessing both the score directory
+ and the users' home directories.
+ .br
+@@ -923,10 +915,6 @@ Some of the garden files.
+ .BR xmred (6)
+ .SH ERRORS
+ .PP
+-If you use a lock file, rather than lockf, and an error occurs
+-creating the lock file, a message is printed on stderr, and file
+-locking is not done for that access. Subsequent accesses may be alright.
+-.PP
+ If an error occurs opening the score file, a message is printed on
+ stderr, and the score file is disabled. Personal score files will
+ be generated in the users' home directories.
+-- 
+1.7.5
+
diff --git a/0011-Remove-seteuid-stuff.patch b/0011-Remove-seteuid-stuff.patch
new file mode 100644
index 0000000..5ae8055
--- /dev/null
+++ b/0011-Remove-seteuid-stuff.patch
@@ -0,0 +1,329 @@
+From da2715a3b82134d118b032a1db06881d128b564b Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Fri, 29 Apr 2011 17:52:33 +0200
+Subject: [PATCH 11/20] Remove seteuid stuff
+
+Removing this is a preparation step for cleaning up the highscore
+support for dropping setgid rights directly on start, rather then using
+unsafe seteg/uid tricks.
+---
+ scoring.c |   60 ++++++++++++++++++++++--------------------------------------
+ xmris.c   |    5 -----
+ xmris.h   |   10 ----------
+ xmris.man |   19 +++++--------------
+ 4 files changed, 27 insertions(+), 67 deletions(-)
+
+diff --git a/scoring.c b/scoring.c
+index 015dd43..ede2f07 100644
+--- a/scoring.c
++++ b/scoring.c
+@@ -22,7 +22,6 @@ static char     *score_file = NULL;   /* high score file name */
+ static char     *personal_file = NULL;  /* personal in high score dir */
+ static char     *personal_home = NULL;  /* personal in home dir */
+ static int      personal_make = 2;
+-static uid_t    personal_uid = -1;  /* uid for personal file */
+ static char     date_format[4] = "   ";
+ static char     *alternate = NULL;    /* alternative name */
+ static HIGH_SCORE *CONST tables[] =
+@@ -30,8 +29,8 @@ static HIGH_SCORE *CONST tables[] =
+ /*}}}*/
+ /*{{{  prototypes*/
+ static unsigned expire PROTOARG((time_t, time_t));
+-static unsigned file_changed PROTOARG((char CONST *, uid_t));
+-static FILE *get_lock PROTOARG((char CONST *, unsigned, uid_t));
++static unsigned file_changed PROTOARG((char CONST *));
++static FILE *get_lock PROTOARG((char CONST *, unsigned));
+ static VOIDFUNC get_unlock PROTOARG((FILE *));
+ static unsigned insert_personal PROTOARG((HIGH_SCORE CONST *));
+ static unsigned insert_score
+@@ -53,9 +52,9 @@ static unsigned long write_table
+ extern VOIDFUNC check_scores FUNCARGVOID
+ {
+   retire_scores();
+-  if((score_file && file_changed(score_file, effective_uid)) ||
++  if((score_file && file_changed(score_file)) ||
+       (!personal_make && personal_file &&
+-      file_changed(personal_file, personal_uid)))
++      file_changed(personal_file)))
+     load_check_expire_insert(0);
+   return;
+ }
+@@ -84,11 +83,10 @@ ARGSEP  time_t    then
+       then_hour >= 21 && now_hour < 12));
+ }
+ /*}}}*/
+-/*{{{  void file_changed(name, uid)*/
++/*{{{  void file_changed(name)*/
+ static unsigned file_changed
+-FUNCARG((name, uid),
++FUNCARG((name),
+ 	char CONST *name
+-ARGSEP  uid_t       uid
+ )
+ /*
+  * check if a score file has been changed since last I looked,
+@@ -100,8 +98,6 @@ ARGSEP  uid_t       uid
+   unsigned  changed;
+   
+   assert(name);
+-  if(uid != current_uid)
+-    set_euid((current_uid = uid));
+   if(!stat(name, &buffer))
+     {
+       changed = buffer.st_mtime != last_time[name == score_file];
+@@ -109,31 +105,24 @@ ARGSEP  uid_t       uid
+     }
+   else
+     changed = 0;
+-  if(real_uid != current_uid)
+-    set_euid((current_uid = real_uid));
+   return changed;
+ }
+ /*}}}*/
+-/*{{{  void get_lock(name, flag, uid)*/
++/*{{{  void get_lock(name, flag)*/
+ static FILE *get_lock
+-FUNCARG((name, flag, uid),
++FUNCARG((name, flag),
+ 	char CONST *name
+ ARGSEP  unsigned  flag
+-ARGSEP  uid_t     uid
+ )
+ /*
+  * open and locks a high score file
+  * flag & 1 == 0 -> "r+"
+  * flag & 1 != 0 -> "w+"
+  * flag & 2 inhibit error message
+- * flag & 4 && effective_uid == real_uid set chmod 666
+- * uid required to access
+  */
+ {
+   FILE    *stream;
+ 
+-  if(uid != current_uid)
+-    set_euid((current_uid = uid));
+   stream = fopen(name, flag & 1 ? "w+" : "r+");
+   if(!stream && !(flag & 2))
+     perror(name);
+@@ -145,10 +134,6 @@ ARGSEP  uid_t     uid
+ 	  continue;
+       }
+     /*}}}*/
+-  if(stream && flag & 4 && effective_uid == real_uid)
+-    chmod(name, 0666); /* not everyone has fchmod */
+-  if(current_uid != real_uid)
+-    set_euid((current_uid = real_uid));
+   return stream;
+ }
+ /*}}}*/
+@@ -212,7 +197,7 @@ extern VOIDFUNC init_scores FUNCARGVOID
+   {
+     struct passwd *ptr;
+     
+-    ptr = getpwuid(real_uid);
++    ptr = getpwuid(getuid());
+     if(ptr)
+       {
+ 	user = ptr->pw_name;
+@@ -344,7 +329,6 @@ extern VOIDFUNC init_scores FUNCARGVOID
+       }
+   }
+   /*}}}*/
+-  personal_uid = effective_uid;
+   if(data.expire || data.format || data.remove)
+     data.scores = True;
+   load_check_expire_insert(0);
+@@ -448,7 +432,7 @@ FUNCARG((insert),
+   /*{{{  score_file?*/
+   if(score_file)
+     {
+-      score_stream = get_lock(score_file, 2, effective_uid);
++      score_stream = get_lock(score_file, 2);
+       if(score_stream)
+ 	do_score = merge_scores(score_stream);
+       else
+@@ -458,7 +442,7 @@ FUNCARG((insert),
+   /*{{{  personal_file?*/
+   if(personal_file)
+     {
+-      personal_stream = get_lock(personal_file, personal_make, personal_uid);
++      personal_stream = get_lock(personal_file, personal_make);
+       if(personal_stream)
+ 	{
+ 	  personal_make = 0;
+@@ -473,7 +457,7 @@ FUNCARG((insert),
+   /*{{{  personal_home?*/
+   if(personal_home)
+     {
+-      home_stream = get_lock(personal_home, 2, real_uid);
++      home_stream = get_lock(personal_home, 2);
+       if(home_stream)
+ 	{
+ 	  merge_personal(home_stream);
+@@ -482,7 +466,6 @@ FUNCARG((insert),
+ 	      personal_file = personal_home;
+ 	      personal_home = NULL;
+ 	      personal_make = 0;
+-	      personal_uid = real_uid;
+ 	    }
+ 	  else
+ 	    do_personal = 1;
+@@ -534,10 +517,12 @@ FUNCARG((insert),
+   }
+   /*}}}*/
+   /* expire person? */
+-  if(effective_uid != real_uid)
++  if(getuid() != 0)
+     {
+-      if(data.remove || data.format)
+-	fprintf(stderr, "Not owner");
++      if(data.remove)
++	fprintf(stderr, "Removing a person can only be done by root");
++      if(data.format)
++	fprintf(stderr, "Changing the date format can only be done by root");
+       data.remove = data.format = NULL;
+     }
+   else
+@@ -1010,7 +995,7 @@ FUNCARG((insert),
+     {
+       if(!score_stream && score_file)
+ 	{
+-	  score_stream = get_lock(score_file, 5, effective_uid);
++	  score_stream = get_lock(score_file, 5);
+ 	  if(!score_stream)
+ 	    score_file = NULL;
+ 	}
+@@ -1022,7 +1007,7 @@ FUNCARG((insert),
+   if(do_personal)
+     {
+       if(!personal_stream && score_stream && personal_file)
+-	personal_stream = get_lock(personal_file, 3, personal_uid);
++	personal_stream = get_lock(personal_file, 3);
+       if(personal_stream)
+ 	{
+ 	  write_personal(personal_stream);
+@@ -1033,12 +1018,11 @@ FUNCARG((insert),
+       else
+ 	{
+ 	  if(!home_stream)
+-	    home_stream = get_lock(personal_home, 1, real_uid);
++	    home_stream = get_lock(personal_home, 1);
+ 	  if(home_stream)
+ 	    write_personal(home_stream);
+ 	  else
+ 	    personal_home = NULL;
+-	  personal_uid = real_uid;
+ 	  personal_file = personal_home;
+ 	  personal_home = NULL;
+ 	}
+@@ -1052,9 +1036,9 @@ FUNCARG((insert),
+   if(score_stream)
+     get_unlock(score_stream);
+   if(do_score && score_file)
+-    file_changed(score_file, effective_uid);
++    file_changed(score_file);
+   if(do_personal && personal_file)
+-    file_changed(personal_file, personal_uid);
++    file_changed(personal_file);
+   return;
+ }
+ /*}}}*/
+diff --git a/xmris.c b/xmris.c
+index d79815a..b1a0404 100644
+--- a/xmris.c
++++ b/xmris.c
+@@ -1260,11 +1260,6 @@ ARGSEP  char CONST **argv
+   Atom wm_delete_window;
+   
+   myname = *argv ? *argv : "Xmris";
+-  real_uid = getuid();
+-  effective_uid = geteuid();
+-  if(real_uid != effective_uid)
+-    set_euid(real_uid);
+-  current_uid = real_uid;
+   open_toolkit(argc, (String *)argv);
+   init_scores();
+   /*{{{  help?*/
+diff --git a/xmris.h b/xmris.h
+index 9918502..1802e87 100644
+--- a/xmris.h
++++ b/xmris.h
+@@ -18,13 +18,6 @@
+   #error No default score directory
+ #endif /* SCORE_DIR */
+ /*}}}*/
+-/*{{{  set_euid*/
+-#ifdef __hpux
+-#define set_euid(euid) setresuid((uid_t)-1, euid, (uid_t)-1)
+-#else
+-#define set_euid(euid) seteuid(euid)
+-#endif /* __hpux */
+-/*}}}*/
+ /*{{{  defines*/
+ /*{{{  board sizes*/
+ #define KNOCK_THROUGH /* how far we go to knock through a new cell */\
+@@ -355,9 +348,6 @@ EXTERN struct
+   unsigned  pressed;    /* keys we had pressed */
+ } player;
+ /*}}}*/
+-EXTERN uid_t real_uid;          /* who I really am */
+-EXTERN uid_t effective_uid;     /* who I'm pretending to be */
+-EXTERN uid_t current_uid;       /* who I currently am */
+ EXTERN CELL garden[(CELLS_DOWN + CELL_TOP * 2) * CELL_STRIDE];
+ /*{{{  global*/
+ EXTERN struct
+diff --git a/xmris.man b/xmris.man
+index fab41d3..3fe5028 100644
+--- a/xmris.man
++++ b/xmris.man
+@@ -277,13 +277,9 @@ to use the -dir option too.
+ .ne 3
+ .TP
+ .B \-remove \fIname\fP
+-Allows the game's owner to remove someone's scores. The option will only
+-work when the real and effective user ids are the same. (ie
+-a setuid Mr Is has been run by its owner). After updating the files,
++Allows root to remove someone's scores. After updating the files,
+ the score tables are listed, and the game does not start. An X display
+-will still need to be opened, to read the X resources, which may override
+-the default score directory. The +display option may be used to prevent
+-this.
++will still be opened. The +display option may be used to prevent this.
+ .br
+ .ne 3
+ .TP
+@@ -324,7 +320,7 @@ and a warning is given. The following are valid unambiguous dates, '11jun93'
+ .ne 3
+ .TP
+ .B \-format \fIformat\fP
+-Allows the game's owner to set the date format which is stored with the
++Allows root to set the date format which is stored with the
+ score file, for future use disambiguating dates. The format is
+ automatically stored if none is set. The format must be a three character
+ string containing one each of 'D', 'M' and 'Y'.
+@@ -859,10 +855,7 @@ following names.
+ The high score file. The directory is system dependent, and may be
+ changed by application resource or option.
+ This file must either exist and be writable to by Mr Is, or the
+-directory containing it must be writable by Mr Is. This
+-can be done by chmoding the score file or directory, or by
+-setuiding Mr Is appropriately. A non-setuid Mr Is will chmod the score
+-file to 666 if creating it.
++directory containing it must be writable by Mr Is.
+ .br
+ .ne 3
+ .TP
+@@ -880,9 +873,7 @@ to move it to the score directory. Mr Is
+ will attempt to create the personal files in the score directory. If this
+ cannot be done, the personal score file is placed in the home directory. In
+ order to create the personal score file in the score directory, Mr Is will
+-have to have the correct access rights. A setuid Mr Is
+-will juggle the effective uid correctly for accessing both the score directory
+-and the users' home directories.
++have to have the correct access rights.
+ .br
+ .ne 5
+ .TP
+-- 
+1.7.5
+
diff --git a/0012-Drop-dir-option.patch b/0012-Drop-dir-option.patch
new file mode 100644
index 0000000..4204528
--- /dev/null
+++ b/0012-Drop-dir-option.patch
@@ -0,0 +1,467 @@
+From ff2baedb64e331b3a3742be72461d37307257c11 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Sat, 30 Apr 2011 12:43:03 +0200
+Subject: [PATCH 12/20] Drop -dir option
+
+Allowing the user to specify the directory in which files will be created
+using elevated rights, seems like a bad idea.
+---
+ Imakefile    |   33 +++------------------------------
+ Makefile.std |   35 +++--------------------------------
+ README       |   10 ----------
+ Xmris-ad.src |    1 -
+ common.h     |    1 -
+ defcom.c     |    5 -----
+ draw.c       |    4 ----
+ makemris.c   |    6 ------
+ scoring.c    |   15 ++++++---------
+ xmris.h      |    8 --------
+ xmris.man    |   28 +++++-----------------------
+ 11 files changed, 17 insertions(+), 129 deletions(-)
+
+diff --git a/Imakefile b/Imakefile
+index ad062d7..dcf93c8 100644
+--- a/Imakefile
++++ b/Imakefile
+@@ -60,13 +60,10 @@ XCOMM don't you have gettimeofday?
+ TIME =
+ XCOMM TIME = -DUSETIME
+ 
+-XCOMM game defaults, you probably only want to alter the SCORE
++XCOMM game defaults, you probably do not want to alter these
+ XCOMM
+ /* You must specify a fixed width font that exists. */
+ /* #define thefont "-*-courier-*-r-*-*-18-*-*-*-m-*-*-*" */
+-XCOMM where is the high score file?
+-XCOMM SCORE = $(LOCAL)/lib/$(APP)
+-SCORE = /var/games/$(APP)
+ /* to install default gardens not in /usr/share/$(APP) */
+ /* #define InstallDefaultGardens $(DESTDIR)/usr/share/$(APP) */
+ 
+@@ -90,14 +87,10 @@ XCOMM owner and access rights for executable & score directory
+ XCOMM these are set for a setuid xmris
+ XCOMM OWNER = -o games
+ OWNER =
+-INSTSCOREFLAGS = $(OWNER) -m 755
+ INSTMRISFLAGS = $(OWNER) $(INSTUIDFLAGS)
+ XCOMM normal install locations
+ THEBINDIR = $(BINDIR)
+ THEMANDIR = $(MANDIR)
+-XCOMM for open access you want 777 and $(INSTPGMFLAGS),
+-XCOMM (the personal score files go in users' home dirs.)
+-XCOMM INSTSCOREFLAGS = -m 777
+ XCOMM INSTMRISFLAGS = $(INSTPGMFLAGS)
+ XCOMM If you're not installing in the default locations
+ XCOMM DESTDIR = 
+@@ -118,7 +111,7 @@ FONT = thefont
+ #endif
+ 
+ DEFINES = $(EXTRACCOPTIONS) -DFONT_NAME='$(FONT)' $(NDEBUG) \
+-	-DSCORE_DIR='"$(SCORE)"' $(TIME) $(KNR) -DSCROLLBARBUGFIX
++	$(TIME) $(KNR) -DSCROLLBARBUGFIX
+ LOCAL_LIBRARIES = $(XAWLIB) $(XTOOLLIB) $(XMULIB) $(XINTL) $(XLIB) $(MATHSLIB)
+ DEPLIBS = $(DEPXLIB)
+ 
+@@ -260,24 +253,7 @@ XCOMM application resource files
+ InstallAppDefaults(Xmris)
+ 
+ Xmris.ad : Xmris-ad.src
+-	sed -e 's at SCORE@$(SCORE)@' -e s at FONT@$(FONT)@ < Xmris-ad.src > Xmris.ad
+-
+-XCOMM score directory install
+-install ::
+-	MakeDir($(SCORE))
+-	@#not all $(INSTALL) have a -d flag, have to do it explicitly
+-	@echo installing $(INSTSCOREFLAGS) $(SCORE)
+-	@set -- $(INSTSCOREFLAGS) ; \
+-	while [ $$# -ne 0 ] ; \
+-	do \
+-	case "$$1" in \
+-	"-o") shift ; chown $$1 $(SCORE) ; echo owner is $$1 ;; \
+-	"-m") shift ; chmod $$1 $(SCORE) ;; \
+-	"-g") shift ; chgrp $$1 $(SCORE) ; echo group is $$1 ;; \
+-	*) echo unknown option '$$1' ;; \
+-	esac ; \
+-	shift ; \
+-	done
++	sed -e s at FONT@$(FONT)@ < Xmris-ad.src > Xmris.ad
+ 
+ #ifdef InstallDefaultGardens
+ XCOMM install default gardens
+@@ -848,9 +824,6 @@ initialize :
+ 	@if [ `ls -t Makefile Imakefile | sed '2,$$d'` = Imakefile ] ; then \
+ 	  echo Warning:Makefile is older than Imakefile ; \
+ 	fi
+-	@if [ ! -d `echo '$(SCORE)' | sed 's=/[^/]*$$=='` ] ; then \
+-	  echo The parent of $(SCORE) does not exist ; \
+-	fi
+ 	@if [ $(FONT) = "" ] ; then true ; \
+ 	elif echo $(FONT) | grep -c -- '-m-.*-.*-.*$$' > /dev/null ; then \
+ 	  if [ "$(XLSFONTS)" = "" -o "$(DISPLAY)" = "" ] ; then \
+diff --git a/Makefile.std b/Makefile.std
+index 39b8935..84fdd8e 100644
+--- a/Makefile.std
++++ b/Makefile.std
+@@ -435,13 +435,9 @@ KNR =
+ TIME =
+ # TIME = -DUSETIME
+ 
+-# game defaults, you probably only want to alter the SCORE
++# game defaults, you probably do not want to alter these
+ #
+ 
+-# where is the high score file?
+-# SCORE = $(LOCAL)/lib/$(APP)
+-SCORE = $(LIBDIR)/$(APP)
+-
+ # The following defines are needed for some implementations and/or sites.
+ # It is xmkmf's job to get these right in the first place.
+ # If you have to declare any of these, X may not be installed correctly.
+@@ -462,14 +458,10 @@ SCORE = $(LIBDIR)/$(APP)
+ # owner and access rights for executable & score directory
+ # these are set for a setuid xmris
+ OWNER = -o games
+-INSTSCOREFLAGS = $(OWNER) -m 755
+ INSTMRISFLAGS = $(OWNER) $(INSTUIDFLAGS)
+ # normal install locations
+ THEBINDIR = $(BINDIR)
+ THEMANDIR = $(MANDIR)
+-# for open access you want 777 and $(INSTPGMFLAGS),
+-# (the personal score files go in users' home dirs.)
+-# INSTSCOREFLAGS = -m 777
+ # INSTMRISFLAGS = $(INSTPGMFLAGS)
+ # If you're not installing in the default locations
+ # DESTDIR =
+@@ -485,7 +477,7 @@ COFLAGS = -l
+ RCSFLAGS =
+ 
+ DEFINES = $(EXTRACCOPTIONS) -DFONT_NAME='$(FONT)' $(NDEBUG) \
+-	-DSCORE_DIR='"$(SCORE)"' $(TIME) $(KNR) -DSCROLLBARBUGFIX
++	$(TIME) $(KNR) -DSCROLLBARBUGFIX
+ LOCAL_LIBRARIES = $(XAWLIB) $(XTOOLLIB) $(XMULIB) $(XLIB) $(MATHSLIB)
+ DEPLIBS = $(DEPXLIB)
+ 
+@@ -665,25 +657,7 @@ install:: Xmris.ad
+ 	$(INSTALL) $(INSTALLFLAGS) $(INSTAPPFLAGS) Xmris.ad $(DESTDIR)$(XAPPLOADDIR)/Xmris
+ 
+ Xmris.ad : Xmris-ad.src
+-	sed -e 's at SCORE@$(SCORE)@' -e s at FONT@$(FONT)@ < Xmris-ad.src > Xmris.ad
+-
+-# score directory install
+-install ::
+-	@if [ -d $(SCORE) ]; then set +x; \
+-	else (set -x; $(MKDIRHIER) $(SCORE)); fi
+-	@#not all $(INSTALL) have a -d flag, have to do it explicitly
+-	@echo installing $(INSTSCOREFLAGS) $(SCORE)
+-	@set -- $(INSTSCOREFLAGS) ; \
+-	while [ $$# -ne 0 ] ; \
+-	do \
+-	case "$$1" in \
+-	"-o") shift ; chown $$1 $(SCORE) ; echo owner is $$1 ;; \
+-	"-m") shift ; chmod $$1 $(SCORE) ;; \
+-	"-g") shift ; chgrp $$1 $(SCORE) ; echo group is $$1 ;; \
+-	*) echo unknown option '$$1' ;; \
+-	esac ; \
+-	shift ; \
+-	done
++	sed -e s at FONT@$(FONT)@ < Xmris-ad.src > Xmris.ad
+ 
+ # install default gardens
+ install :: $(GARDENS)
+@@ -1257,9 +1231,6 @@ initialize :
+ 	@if [ `ls -t Makefile Imakefile | sed '2,$$d'` = Imakefile ] ; then \
+ 	  echo Warning:Makefile is older than Imakefile ; \
+ 	fi
+-	@if [ ! -d `echo '$(SCORE)' | sed 's=/[^/]*$$=='` ] ; then \
+-	  echo The parent of $(SCORE) does not exist ; \
+-	fi
+ 	@if [ $(FONT) = "" ] ; then true ; \
+ 	elif echo $(FONT) | grep -c -- '-m-.*-.*-.*$$' > /dev/null ; then \
+ 	  if [ "$(XLSFONTS)" = "" -o "$(DISPLAY)" = "" ] ; then \
+diff --git a/README b/README
+index f6c80b0..58dc90a 100644
+--- a/README
++++ b/README
+@@ -29,16 +29,6 @@ the define USETIME, this will give less accurate timing. Also
+ gettimeofday may or may not need a timezone argument, this is checked
+ by the system type in timer.c.
+ 
+-Set SCORE to the name of the high score directory.
+-The score file uses lockf or flock by default, this doesn't work
+-on some distributed filing systems. If so,
+-define USELOCKFILE, and a lock file is used to do the locking with
+-open(O_CREAT | O_EXCL). The name of the lock file is xmris.lock.
+-For this to work the high score directory must be writeable, which
+-is not the case with lockf. Personal high score files are also put
+-in this directory, if xmris can create them there, otherwise they
+-will be put in the users' home directory.
+-
+ You may need to force static linking, and not use shared libraries, or
+ store a library load path with the binary with the linker -R option.
+ The EXTRA_LOAD_FLAGS can be used for this. (This may be necessary for
+diff --git a/Xmris-ad.src b/Xmris-ad.src
+index 60be0ac..6368076 100644
+--- a/Xmris-ad.src
++++ b/Xmris-ad.src
+@@ -13,7 +13,6 @@
+ *Quit:			q
+ *Iconize:		i
+ *Keyboard:		k
+-*Dir:			SCORE
+ *ReverseVideo:		no
+ *Monochrome:		no
+ *Gender:		he
+diff --git a/common.h b/common.h
+index 0babbce..b146a47 100644
+--- a/common.h
++++ b/common.h
+@@ -280,7 +280,6 @@ typedef struct Data
+ {
+   Font    font;     /* font to use */
+ #ifndef XMRED
+-  String  dir;      /* score directory */
+   String  expire;   /* expiration */
+   String  remove;   /* removal */
+   String  boards;   /* board definitions */
+diff --git a/defcom.c b/defcom.c
+index 9715fe9..1c63cbc 100644
+--- a/defcom.c
++++ b/defcom.c
+@@ -193,7 +193,6 @@ CommandOptionDesc command_options[] =
+   {"-remove",  1,  XtOffsetOf(DATA, remove)},
+   {"-nodisplay",0, XtOffsetOf(DATA, nodisplay)},
+   {"+display", 0,  XtOffsetOf(DATA, nodisplay)},
+-  {"-dir",     1,  XtOffsetOf(DATA, dir)},
+ #endif /* XMRED */
+   {NULL}
+ };
+@@ -228,9 +227,6 @@ XrmOptionDescRec options[] =
+ XtResource resources[] =
+ {
+ #ifndef XMRED
+-  /* dir must be first */
+-  {"dir", "Dir", XtRString, sizeof(String),
+-      XtOffsetOf(DATA, dir), XtRString, (XtPointer)SCORE_DIR},
+   {"up", "Up", XtRKeySym, sizeof(KeySym),
+       XtOffsetOf(DATA, keysyms[0]), XtRString, (XtPointer)"Up"},
+   {"down", "Down", XtRKeySym, sizeof(KeySym),
+@@ -371,7 +367,6 @@ HELP CONST help[] =
+   {"Modern sprites",                "-msit",      "Gender:she", ""},
+ #ifndef XMRED
+   {"Random apples",                 "-random",    "Random:yes", ""},
+-  {"High score directory",          "-dir",       "Dir:", "<directory>"},
+   {"Use username in score",         "-username",  "UserName:yes", ""},
+   {"Use realname in score",         "-realname",  "UserName:no", ""},
+ #endif /* XMRED */
+diff --git a/draw.c b/draw.c
+index ea0f65d..fcf5401 100644
+--- a/draw.c
++++ b/draw.c
+@@ -1039,10 +1039,6 @@ ARGSEP  char CONST *parent
+ 	      if(!lib)
+ 		lib = XtResolvePathname(display.display, "app-defaults/xmris",
+ 		    name, FILE_SUFFIX, NULL, NULL, 0, NULL);
+-	      if(!lib && data.dir)
+-		lib = XtResolvePathname(display.display, data.dir, name,
+-		    FILE_SUFFIX, "%T/%N:%T/%N%S:%T/gardens/%N:%T/gardens/%N%S",
+-		    NULL, 0, NULL);
+ 	      if(lib)
+ 		{
+ 		  XtFree(filename);
+diff --git a/makemris.c b/makemris.c
+index 4bf8d20..95046d7 100644
+--- a/makemris.c
++++ b/makemris.c
+@@ -309,7 +309,6 @@ ARGSEP  String  *argv
+ 	/*{{{  some more setup*/
+ 	{
+ 	  XtResource CONST *ptr;
+-	  char *dir;
+ 	  
+ 	  XtAppSetTypeConverter(display.context, XtRString, XtRKeySym,
+ 	      convert_string2keysym, (XtConvertArgRec *)NULL, 0, XtCacheNone,
+@@ -320,13 +319,10 @@ ARGSEP  String  *argv
+ 	      (void (*)PROTOARG((XtAppContext, XrmValue *, XtPointer,
+ 		  XrmValue *, Cardinal *)))NULL);
+ 	  display.display = XtDisplay(display.toplevel);
+-	  dir = data.dir;
+ 	  for(ptr = resources; *(char CONST **)ptr; ptr++)
+ 	    /* EMPTY */;
+ 	  XtGetApplicationResources(display.toplevel, (XtPointer)&data,
+ 	      resources, (Cardinal)(ptr - resources), (Arg *)NULL, 0);
+-	  if(dir)
+-	    data.dir = dir;
+ 	  gettoplevelresources();
+ 	  XtVaSetValues(display.toplevel,
+ 	      XtNtitle, (XtArgVal)names[data.gender != False],
+@@ -340,8 +336,6 @@ ARGSEP  String  *argv
+ 	  }
+ 	}
+ 	/*}}}*/
+-      if(!data.dir)
+-	data.dir = (char *)resources[0].default_addr;
+     }
+     /*}}}*/
+   return;
+diff --git a/scoring.c b/scoring.c
+index ede2f07..2e93b30 100644
+--- a/scoring.c
++++ b/scoring.c
+@@ -17,6 +17,7 @@
+ #endif /* SYSV */
+ /*}}}*/
+ /*{{{  static*/
++static CONST char *score_dir = "/var/games";
+ static CONST char date_formats[4] = "DMY";
+ static char     *score_file = NULL;   /* high score file name */
+ static char     *personal_file = NULL;  /* personal in high score dir */
+@@ -287,25 +288,22 @@ extern VOIDFUNC init_scores FUNCARGVOID
+       scoring.alternate = alternate;
+   }
+   /*}}}*/
+-  dirlen = data.dir ? strlen(data.dir) : 0;
+-  if(dirlen && data.dir[dirlen - 1] == '/')
+-    dirlen--;
+   /*{{{  score directory?*/
+-  if(dirlen)
+     {
+       size_t    nlen;
+   
++      dirlen = strlen(score_dir);
+       score_file = malloc(dirlen + 14);
+       if(score_file)
+ 	{
+-	  strcpy(score_file, data.dir);
++	  strcpy(score_file, score_dir);
+ 	  strcpy(&score_file[dirlen], "/xmris.score");
+ 	}
+       nlen = strlen(user);
+       personal_file = malloc(dirlen + 8 + nlen);
+       if(personal_file)
+ 	{
+-	  strcpy(personal_file, data.dir);
++	  strcpy(personal_file, score_dir);
+ 	  strcpy(&personal_file[dirlen], "/xmris-");
+ 	  strcpy(&personal_file[dirlen + 7], user);
+ 	}
+@@ -591,16 +589,15 @@ FUNCARG((insert),
+ 	  /*{{{  try personal files too*/
+ 	  {
+ 	    /*{{{  score directory?*/
+-	    if(data.dir)
+ 	      {
+ 		size_t    dirlen;
+ 		char      *file;
+ 		
+-		dirlen = strlen(data.dir);
++		dirlen = strlen(score_dir);
+ 		file = malloc(dirlen + 8 + strlen(data.remove));
+ 		if(file)
+ 		  {
+-		    strcpy(file, data.dir);
++		    strcpy(file, score_dir);
+ 		    strcpy(&file[dirlen], "/xmris-");
+ 		    strcpy(&file[dirlen + 7], data.remove);
+ 		    if(!unlink(file))
+diff --git a/xmris.h b/xmris.h
+index 1802e87..1e696c5 100644
+--- a/xmris.h
++++ b/xmris.h
+@@ -13,11 +13,6 @@
+ #define FUNCANIMATE(name, arg) PROTOVOID(*name(arg)) PROTOVOID(*arg);
+ #endif
+ /*}}}*/
+-/*{{{  check score*/
+-#ifndef SCORE_DIR
+-  #error No default score directory
+-#endif /* SCORE_DIR */
+-/*}}}*/
+ /*{{{  defines*/
+ /*{{{  board sizes*/
+ #define KNOCK_THROUGH /* how far we go to knock through a new cell */\
+@@ -41,9 +36,6 @@
+ #define SCORE_SCALE 1024    /* precision of score scaling */
+ /*}}}*/
+ /*{{{  score file*/
+-#ifndef SCORE_DIR
+-#define SCORE_DIR NULL
+-#endif /* SCORE_DIR */
+ #define SCORE_THRESHOLD 10000 /* minimum score for fame */
+ #define SCORE_ROUND     5     /* scores are rounded */
+ #define HIGH_SCORES (CELLS_DOWN - 2)
+diff --git a/xmris.man b/xmris.man
+index 3fe5028..f108e24 100644
+--- a/xmris.man
++++ b/xmris.man
+@@ -231,17 +231,12 @@ is still being used for the initial part of the frame delay.
+ .br
+ .ne 3
+ .TP
+-.B \-dir \fIscore-directory\fP
+-Specify a different score directory.
+-.br
+-.ne 4
+-.TP
+ .PD 0
+ .B \-username
+ .TP
+ .B \-realname
+ .PD
+-The name for the score file can be either the username or the real name.
++The name inside the score file can be either the username or the real name.
+ These options select which to use. The default is to use the real name.
+ If the real name is unobtainable, the username will
+ be used anyway. If the current score file has an entry by the other
+@@ -257,10 +252,8 @@ the Mr Is subdirectory of app-defaults. These are explained below.
+ .ne 3
+ .TP
+ .B \-scores
+-List the high scores to stdout. Does not start the game. Note that this
+-will still need to open an X display, in order to read the X resources
+-(which may affect the score directory). If you don't want the defaults
+-read, use the +display option too.
++List the high scores to stdout. Does not start the game. An X display
++will still be opened. The +display option may be used to prevent this.
+ .br
+ .ne 4
+ .TP
+@@ -422,11 +415,6 @@ sensitive.
+ .br
+ .ne 3
+ .TP
+-.B Xmris.Dir: \fIscore-directory\fP
+-The name of the high score directory.
+-.br
+-.ne 3
+-.TP
+ .B Xmris.UserName: \fI{yes, no}\fP [no]
+ Selects whether the username or real name should be used for your entry
+ in the high score table.
+@@ -851,9 +839,8 @@ following names.
+ .br
+ .ne 3
+ .TP
+-.B .../xmris.score
+-The high score file. The directory is system dependent, and may be
+-changed by application resource or option.
++.B /var/games/xmris.score
++The high score file.
+ This file must either exist and be writable to by Mr Is, or the
+ directory containing it must be writable by Mr Is.
+ .br
+@@ -888,12 +875,7 @@ See X for information about how these are searched.
+ .br
+ .ne 6
+ .TP
+-.PD 0
+ .B .../app-defaults/xmris/<gardens>
+-.TP
+-.B <score-dir>/<gardens>
+-.TP
+-.B <score-dir>/gardens/<gardens>
+ .PD
+ Search path for loadable gardens. The suffix ".gdn" is appended to the
+ filename, if required.
+-- 
+1.7.5
+
diff --git a/0013-Drop-support-for-global-personal-file.patch b/0013-Drop-support-for-global-personal-file.patch
new file mode 100644
index 0000000..39f4991
--- /dev/null
+++ b/0013-Drop-support-for-global-personal-file.patch
@@ -0,0 +1,223 @@
+From 256730c26c8369518d131d9b85a871907cf3f7bc Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Sat, 30 Apr 2011 16:09:45 +0200
+Subject: [PATCH 13/20] Drop support for global personal file
+
+Having it in $home works fine and having support for both just
+needlessly complicates the code.
+---
+ scoring.c |   91 +++++-------------------------------------------------------
+ xmris.man |   14 +---------
+ 2 files changed, 9 insertions(+), 96 deletions(-)
+
+diff --git a/scoring.c b/scoring.c
+index 2e93b30..fd2cd77 100644
+--- a/scoring.c
++++ b/scoring.c
+@@ -20,9 +20,7 @@
+ static CONST char *score_dir = "/var/games";
+ static CONST char date_formats[4] = "DMY";
+ static char     *score_file = NULL;   /* high score file name */
+-static char     *personal_file = NULL;  /* personal in high score dir */
+ static char     *personal_home = NULL;  /* personal in home dir */
+-static int      personal_make = 2;
+ static char     date_format[4] = "   ";
+ static char     *alternate = NULL;    /* alternative name */
+ static HIGH_SCORE *CONST tables[] =
+@@ -54,8 +52,7 @@ extern VOIDFUNC check_scores FUNCARGVOID
+ {
+   retire_scores();
+   if((score_file && file_changed(score_file)) ||
+-      (!personal_make && personal_file &&
+-      file_changed(personal_file)))
++     (personal_home && file_changed(personal_home)))
+     load_check_expire_insert(0);
+   return;
+ }
+@@ -290,8 +287,6 @@ extern VOIDFUNC init_scores FUNCARGVOID
+   /*}}}*/
+   /*{{{  score directory?*/
+     {
+-      size_t    nlen;
+-  
+       dirlen = strlen(score_dir);
+       score_file = malloc(dirlen + 14);
+       if(score_file)
+@@ -299,14 +294,6 @@ extern VOIDFUNC init_scores FUNCARGVOID
+ 	  strcpy(score_file, score_dir);
+ 	  strcpy(&score_file[dirlen], "/xmris.score");
+ 	}
+-      nlen = strlen(user);
+-      personal_file = malloc(dirlen + 8 + nlen);
+-      if(personal_file)
+-	{
+-	  strcpy(personal_file, score_dir);
+-	  strcpy(&personal_file[dirlen], "/xmris-");
+-	  strcpy(&personal_file[dirlen + 7], user);
+-	}
+     }
+   /*}}}*/
+   /*{{{  personal file*/
+@@ -421,11 +408,10 @@ FUNCARG((insert),
+  */
+ {
+   FILE      *score_stream;
+-  FILE      *personal_stream;
+   FILE      *home_stream;
+   unsigned  do_score, do_personal;
+   
+-  score_stream = personal_stream = home_stream = NULL;
++  score_stream = home_stream = NULL;
+   do_score = do_personal = 0;
+   /*{{{  score_file?*/
+   if(score_file)
+@@ -437,37 +423,14 @@ FUNCARG((insert),
+ 	do_score = 1;
+     }
+   /*}}}*/
+-  /*{{{  personal_file?*/
+-  if(personal_file)
+-    {
+-      personal_stream = get_lock(personal_file, personal_make);
+-      if(personal_stream)
+-	{
+-	  personal_make = 0;
+-	  if(personal_home && !unlink(personal_home))
+-	      fprintf(stderr, "Two personal score files, '%s' removed\n",
+-		personal_home);
+-	  personal_home = NULL;
+-	  do_personal = merge_personal(personal_stream);
+-	}
+-    }
+-  /*}}}*/
+   /*{{{  personal_home?*/
+   if(personal_home)
+     {
+       home_stream = get_lock(personal_home, 2);
+       if(home_stream)
+-	{
+-	  merge_personal(home_stream);
+-	  if(!personal_file)
+-	    {
+-	      personal_file = personal_home;
+-	      personal_home = NULL;
+-	      personal_make = 0;
+-	    }
+-	  else
+-	    do_personal = 1;
+-	}
++	do_personal = merge_personal(home_stream);
++      else
++	do_personal = 1;
+     }
+   /*}}}*/
+   /*{{{  check alternate*/
+@@ -588,27 +551,6 @@ FUNCARG((insert),
+ 	  do_score |= found;
+ 	  /*{{{  try personal files too*/
+ 	  {
+-	    /*{{{  score directory?*/
+-	      {
+-		size_t    dirlen;
+-		char      *file;
+-		
+-		dirlen = strlen(score_dir);
+-		file = malloc(dirlen + 8 + strlen(data.remove));
+-		if(file)
+-		  {
+-		    strcpy(file, score_dir);
+-		    strcpy(&file[dirlen], "/xmris-");
+-		    strcpy(&file[dirlen + 7], data.remove);
+-		    if(!unlink(file))
+-		      {
+-			personal = 1;
+-			found = 1;
+-		      }
+-		    free(file);
+-		  }
+-	      }
+-	    /*}}}*/
+ 	    /*{{{  home directory?*/
+ 	    {
+ 	      if(home)
+@@ -1003,39 +945,22 @@ FUNCARG((insert),
+   /*{{{  write personal?*/
+   if(do_personal)
+     {
+-      if(!personal_stream && score_stream && personal_file)
+-	personal_stream = get_lock(personal_file, 3);
+-      if(personal_stream)
+-	{
+-	  write_personal(personal_stream);
+-	  if(personal_home)
+-	    unlink(personal_home);
+-	  personal_home = NULL;
+-	}
+-      else
+-	{
+ 	  if(!home_stream)
+ 	    home_stream = get_lock(personal_home, 1);
+ 	  if(home_stream)
+ 	    write_personal(home_stream);
+ 	  else
+ 	    personal_home = NULL;
+-	  personal_file = personal_home;
+-	  personal_home = NULL;
+-	}
+-      personal_make = 0;
+     }
+   /*}}}*/
+-  if(personal_stream)
+-    get_unlock(personal_stream);
+   if(home_stream)
+     get_unlock(home_stream);
+   if(score_stream)
+     get_unlock(score_stream);
+   if(do_score && score_file)
+     file_changed(score_file);
+-  if(do_personal && personal_file)
+-    file_changed(personal_file);
++  if(do_personal && personal_home)
++    file_changed(personal_home);
+   return;
+ }
+ /*}}}*/
+@@ -1103,7 +1028,7 @@ FUNCARG((stream),
+   if(failed)
+     {
+       fprintf(stderr, "%s:Your personal score file '%s' has been corrupted.\n",
+-	  myname, personal_file);
++	  myname, personal_home);
+       scoring.personal[0].score = 0;
+     }
+   return failed;
+diff --git a/xmris.man b/xmris.man
+index f108e24..ae881c0 100644
+--- a/xmris.man
++++ b/xmris.man
+@@ -846,21 +846,9 @@ directory containing it must be writable by Mr Is.
+ .br
+ .ne 3
+ .TP
+-.PD 0
+-.B .../xmris-<name>
+-.TP
+ .B ~/.xmris.score
+ .PD
+-One of these files is used to store the personal best scores.
+-Mr Is first looks for the personal score file in the score directory and
+-then in the home directory. If a personal
+-score file cannot be found, Mr Is attempts to create one. 
+-If the file is found in the user's home directory, Mr Is attempts
+-to move it to the score directory. Mr Is
+-will attempt to create the personal files in the score directory. If this
+-cannot be done, the personal score file is placed in the home directory. In
+-order to create the personal score file in the score directory, Mr Is will
+-have to have the correct access rights.
++This file is used to store the personal best scores.
+ .br
+ .ne 5
+ .TP
+-- 
+1.7.5
+
diff --git a/0014-Some-renames.patch b/0014-Some-renames.patch
new file mode 100644
index 0000000..e1eb616
--- /dev/null
+++ b/0014-Some-renames.patch
@@ -0,0 +1,125 @@
+From 5997920c77b25c8ed4a79f44da13436ad05412e5 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Sat, 30 Apr 2011 16:12:48 +0200
+Subject: [PATCH 14/20] Some renames
+
+Things make more sense after the previous commit with some vars renamed:
+s/personal_home/personal_file/
+s/home_stream/personal_stream/
+---
+ scoring.c |   46 +++++++++++++++++++++++-----------------------
+ 1 files changed, 23 insertions(+), 23 deletions(-)
+
+diff --git a/scoring.c b/scoring.c
+index fd2cd77..72f08d6 100644
+--- a/scoring.c
++++ b/scoring.c
+@@ -20,7 +20,7 @@
+ static CONST char *score_dir = "/var/games";
+ static CONST char date_formats[4] = "DMY";
+ static char     *score_file = NULL;   /* high score file name */
+-static char     *personal_home = NULL;  /* personal in home dir */
++static char     *personal_file = NULL;  /* personal in home dir */
+ static char     date_format[4] = "   ";
+ static char     *alternate = NULL;    /* alternative name */
+ static HIGH_SCORE *CONST tables[] =
+@@ -52,7 +52,7 @@ extern VOIDFUNC check_scores FUNCARGVOID
+ {
+   retire_scores();
+   if((score_file && file_changed(score_file)) ||
+-     (personal_home && file_changed(personal_home)))
++     (personal_file && file_changed(personal_file)))
+     load_check_expire_insert(0);
+   return;
+ }
+@@ -305,11 +305,11 @@ extern VOIDFUNC init_scores FUNCARGVOID
+ 	size_t    length;
+ 	
+ 	length = strlen(home);
+-	personal_home = malloc(length + 15);
+-	if(personal_home)
++	personal_file = malloc(length + 15);
++	if(personal_file)
+ 	  {
+-	    strcpy(personal_home, home);
+-	    strcpy(&personal_home[length], "/.xmris.score");
++	    strcpy(personal_file, home);
++	    strcpy(&personal_file[length], "/.xmris.score");
+ 	  }
+       }
+   }
+@@ -408,10 +408,10 @@ FUNCARG((insert),
+  */
+ {
+   FILE      *score_stream;
+-  FILE      *home_stream;
++  FILE      *personal_stream;
+   unsigned  do_score, do_personal;
+   
+-  score_stream = home_stream = NULL;
++  score_stream = personal_stream = NULL;
+   do_score = do_personal = 0;
+   /*{{{  score_file?*/
+   if(score_file)
+@@ -423,12 +423,12 @@ FUNCARG((insert),
+ 	do_score = 1;
+     }
+   /*}}}*/
+-  /*{{{  personal_home?*/
+-  if(personal_home)
++  /*{{{  personal_file?*/
++  if(personal_file)
+     {
+-      home_stream = get_lock(personal_home, 2);
+-      if(home_stream)
+-	do_personal = merge_personal(home_stream);
++      personal_stream = get_lock(personal_file, 2);
++      if(personal_stream)
++	do_personal = merge_personal(personal_stream);
+       else
+ 	do_personal = 1;
+     }
+@@ -945,22 +945,22 @@ FUNCARG((insert),
+   /*{{{  write personal?*/
+   if(do_personal)
+     {
+-	  if(!home_stream)
+-	    home_stream = get_lock(personal_home, 1);
+-	  if(home_stream)
+-	    write_personal(home_stream);
++	  if(!personal_stream)
++	    personal_stream = get_lock(personal_file, 1);
++	  if(personal_stream)
++	    write_personal(personal_stream);
+ 	  else
+-	    personal_home = NULL;
++	    personal_file = NULL;
+     }
+   /*}}}*/
+-  if(home_stream)
+-    get_unlock(home_stream);
++  if(personal_stream)
++    get_unlock(personal_stream);
+   if(score_stream)
+     get_unlock(score_stream);
+   if(do_score && score_file)
+     file_changed(score_file);
+-  if(do_personal && personal_home)
+-    file_changed(personal_home);
++  if(do_personal && personal_file)
++    file_changed(personal_file);
+   return;
+ }
+ /*}}}*/
+@@ -1028,7 +1028,7 @@ FUNCARG((stream),
+   if(failed)
+     {
+       fprintf(stderr, "%s:Your personal score file '%s' has been corrupted.\n",
+-	  myname, personal_home);
++	  myname, personal_file);
+       scoring.personal[0].score = 0;
+     }
+   return failed;
+-- 
+1.7.5
+
diff --git a/0015-Open-score-files-only-once-and-keep-them-open-till-t.patch b/0015-Open-score-files-only-once-and-keep-them-open-till-t.patch
new file mode 100644
index 0000000..6fa0e0a
--- /dev/null
+++ b/0015-Open-score-files-only-once-and-keep-them-open-till-t.patch
@@ -0,0 +1,306 @@
+From 1105d6f3df03ffe6f3bd26fc37f8daf092f920e5 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Sun, 1 May 2011 10:59:39 +0200
+Subject: [PATCH 15/20] Open score files only once and keep them open till the
+ program exits
+
+---
+ scoring.c |  151 ++++++++++++++++++++++++++++++-------------------------------
+ xmris.c   |    1 +
+ xmris.h   |    1 +
+ 3 files changed, 76 insertions(+), 77 deletions(-)
+
+diff --git a/scoring.c b/scoring.c
+index 72f08d6..381057b 100644
+--- a/scoring.c
++++ b/scoring.c
+@@ -17,10 +17,11 @@
+ #endif /* SYSV */
+ /*}}}*/
+ /*{{{  static*/
+-static CONST char *score_dir = "/var/games";
+ static CONST char date_formats[4] = "DMY";
+-static char     *score_file = NULL;   /* high score file name */
++static char     *score_file = "/var/games/xmris.score"; /* score file name */
+ static char     *personal_file = NULL;  /* personal in home dir */
++static FILE     *score_stream = NULL;
++static FILE     *personal_stream = NULL;
+ static char     date_format[4] = "   ";
+ static char     *alternate = NULL;    /* alternative name */
+ static HIGH_SCORE *CONST tables[] =
+@@ -29,7 +30,7 @@ static HIGH_SCORE *CONST tables[] =
+ /*{{{  prototypes*/
+ static unsigned expire PROTOARG((time_t, time_t));
+ static unsigned file_changed PROTOARG((char CONST *));
+-static FILE *get_lock PROTOARG((char CONST *, unsigned));
++static unsigned get_lock PROTOARG((FILE *));
+ static VOIDFUNC get_unlock PROTOARG((FILE *));
+ static unsigned insert_personal PROTOARG((HIGH_SCORE CONST *));
+ static unsigned insert_score
+@@ -106,33 +107,29 @@ FUNCARG((name),
+   return changed;
+ }
+ /*}}}*/
+-/*{{{  void get_lock(name, flag)*/
+-static FILE *get_lock
+-FUNCARG((name, flag),
+-	char CONST *name
+-ARGSEP  unsigned  flag
++/*{{{  unsigned get_lock(stream)*/
++static unsigned get_lock
++FUNCARG((stream),
++	FILE *stream
+ )
+ /*
+- * open and locks a high score file
+- * flag & 1 == 0 -> "r+"
+- * flag & 1 != 0 -> "w+"
+- * flag & 2 inhibit error message
++ * lock the high score file
+  */
+ {
+-  FILE    *stream;
+-
+-  stream = fopen(name, flag & 1 ? "w+" : "r+");
+-  if(!stream && !(flag & 2))
+-    perror(name);
+-  if(stream)
+     /*{{{  get lock on the file*/
+-    while(lock_file(stream))
++    while(1)
+       {
+-	if(errno == EINTR)
+-	  continue;
++	int res = lock_file(stream);
++	if(res)
++	  {
++	    if(errno == EINTR)
++	      continue;
++	    perror("Error locking score file");
++	  }
++
++	return res == 0;
+       }
+     /*}}}*/
+-  return stream;
+ }
+ /*}}}*/
+ /*{{{  void get_unlock(stream)*/
+@@ -141,14 +138,10 @@ FUNCARG((stream),
+ 	FILE    *stream
+ )
+ /*
+- * unlock and close the high score file
++ * unlock the high score file
+  */
+ {
+-  fflush(stream);
+-  rewind(stream);
+   unlock_file(stream);
+-  fclose(stream);
+-  return;
+ }
+ /*}}}*/
+ /*{{{  void high_score(score, screen, msec)*/
+@@ -186,7 +179,6 @@ extern VOIDFUNC init_scores FUNCARGVOID
+   char CONST *user;
+   char CONST *home;
+   char      *reallife;
+-  size_t    dirlen;
+   
+   user = NULL;
+   home = NULL;
+@@ -287,13 +279,12 @@ extern VOIDFUNC init_scores FUNCARGVOID
+   /*}}}*/
+   /*{{{  score directory?*/
+     {
+-      dirlen = strlen(score_dir);
+-      score_file = malloc(dirlen + 14);
+-      if(score_file)
+-	{
+-	  strcpy(score_file, score_dir);
+-	  strcpy(&score_file[dirlen], "/xmris.score");
+-	}
++      score_stream = fopen(score_file, "r+");
++      /* If we cannot open it, try creating it */
++      if(!score_stream)
++	score_stream = fopen(score_file, "w+");
++      if (!score_stream)
++	score_file = NULL;
+     }
+   /*}}}*/
+   /*{{{  personal file*/
+@@ -310,6 +301,15 @@ extern VOIDFUNC init_scores FUNCARGVOID
+ 	  {
+ 	    strcpy(personal_file, home);
+ 	    strcpy(&personal_file[length], "/.xmris.score");
++
++	    personal_stream = fopen(personal_file, "r+");
++	    if(!personal_stream)
++	      personal_stream = fopen(personal_file, "w+");
++	    if(!personal_stream)
++	      {
++		free(personal_file);
++		personal_file = NULL;
++	      }
+ 	  }
+       }
+   }
+@@ -320,6 +320,24 @@ extern VOIDFUNC init_scores FUNCARGVOID
+   return;
+ }
+ /*}}}*/
++/*{{{  void init_scores()*/
++extern VOIDFUNC cleanup_scores FUNCARGVOID
++/*
++ * Close open score files
++ */
++{
++  if(score_stream)
++    {
++      fclose(score_stream);
++      score_stream = NULL;
++    }
++  if(personal_stream)
++    {
++      fclose(personal_stream);
++      personal_stream = NULL;
++    }
++}
++/*}}}*/
+ /*{{{  unsigned insert_personal(sptr)*/
+ static unsigned insert_personal
+ FUNCARG((sptr),
+@@ -407,32 +425,23 @@ FUNCARG((insert),
+  * write the files back
+  */
+ {
+-  FILE      *score_stream;
+-  FILE      *personal_stream;
+-  unsigned  do_score, do_personal;
+-  
+-  score_stream = personal_stream = NULL;
+-  do_score = do_personal = 0;
+-  /*{{{  score_file?*/
+-  if(score_file)
++  unsigned do_score = 0, do_personal = 0;
++  unsigned score_lock = 0, personal_lock = 0;
++
++  if(score_stream)
+     {
+-      score_stream = get_lock(score_file, 2);
+-      if(score_stream)
++      score_lock = get_lock(score_stream);
++      if(score_lock)
+ 	do_score = merge_scores(score_stream);
+-      else
+-	do_score = 1;
+     }
+-  /*}}}*/
+-  /*{{{  personal_file?*/
+-  if(personal_file)
++
++  if(personal_stream)
+     {
+-      personal_stream = get_lock(personal_file, 2);
+-      if(personal_stream)
++      personal_lock = get_lock(personal_stream);
++      if(personal_lock)
+ 	do_personal = merge_personal(personal_stream);
+-      else
+-	do_personal = 1;
+     }
+-  /*}}}*/
++
+   /*{{{  check alternate*/
+   if(alternate)
+     {
+@@ -930,37 +939,23 @@ FUNCARG((insert),
+     }
+   /*}}}*/
+   /*{{{  write_score?*/
+-  if(do_score)
++  if(do_score && score_lock)
+     {
+-      if(!score_stream && score_file)
+-	{
+-	  score_stream = get_lock(score_file, 5);
+-	  if(!score_stream)
+-	    score_file = NULL;
+-	}
+-      if(score_stream)
+-	write_scores(score_stream);
++      write_scores(score_stream);
++      file_changed(score_file);
+     }
+   /*}}}*/
+   /*{{{  write personal?*/
+-  if(do_personal)
++  if(do_personal && personal_lock)
+     {
+-	  if(!personal_stream)
+-	    personal_stream = get_lock(personal_file, 1);
+-	  if(personal_stream)
+-	    write_personal(personal_stream);
+-	  else
+-	    personal_file = NULL;
++      write_personal(personal_stream);
++      file_changed(personal_file);
+     }
+   /*}}}*/
+-  if(personal_stream)
++  if(personal_lock)
+     get_unlock(personal_stream);
+-  if(score_stream)
++  if(score_lock)
+     get_unlock(score_stream);
+-  if(do_score && score_file)
+-    file_changed(score_file);
+-  if(do_personal && personal_file)
+-    file_changed(personal_file);
+   return;
+ }
+ /*}}}*/
+@@ -1218,6 +1213,7 @@ FUNCARG((stream),
+       check = 0;
+     }
+   fprintf(stream, "+%lu\n", check);
++  fflush(stream);
+   return;
+ }
+ /*}}}*/
+@@ -1245,6 +1241,7 @@ FUNCARG((stream),
+       check = 0;
+     }
+   fprintf(stream, "+%lu %s\n", check, date_format);
++  fflush(stream);
+   return;
+ }
+ /*}}}*/
+diff --git a/xmris.c b/xmris.c
+index b1a0404..f10e3f7 100644
+--- a/xmris.c
++++ b/xmris.c
+@@ -1348,6 +1348,7 @@ ARGSEP  char CONST **argv
+       assert(monster.normals < 20);
+     }
+   timer_close();
++  cleanup_scores();
+   return 0;
+ }
+ /*}}}*/
+diff --git a/xmris.h b/xmris.h
+index 1e696c5..34969df 100644
+--- a/xmris.h
++++ b/xmris.h
+@@ -536,6 +536,7 @@ extern unsigned move_player PROTOARG((VOIDARG));
+ extern VOIDFUNC check_scores PROTOARG((VOIDARG));
+ extern VOIDFUNC high_score PROTOARG((unsigned long, unsigned, unsigned long));
+ extern VOIDFUNC init_scores PROTOARG((VOIDARG));
++extern VOIDFUNC cleanup_scores PROTOARG((VOIDARG));
+ /*}}}*/
+ /*{{{  timer*/
+ extern VOIDFUNC timer_close PROTOARG((VOIDARG));
+-- 
+1.7.5
+
diff --git a/0016-Open-the-global-score-file-asap-and-drop-special-rig.patch b/0016-Open-the-global-score-file-asap-and-drop-special-rig.patch
new file mode 100644
index 0000000..e20093a
--- /dev/null
+++ b/0016-Open-the-global-score-file-asap-and-drop-special-rig.patch
@@ -0,0 +1,123 @@
+From 74743124c7cd2ed7ff5e33e436a73d3f0f70ce6a Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Sun, 1 May 2011 11:12:09 +0200
+Subject: [PATCH 16/20] Open the global score file asap, and drop special
+ rights directly after
+
+This completes making the highscore code truely safe for sgid usage.
+---
+ Imakefile |    4 ++--
+ scoring.c |   42 ++++++++++++++++++++++++++++++++----------
+ xmris.c   |    2 ++
+ xmris.h   |    1 +
+ 4 files changed, 37 insertions(+), 12 deletions(-)
+
+diff --git a/Imakefile b/Imakefile
+index dcf93c8..09931d8 100644
+--- a/Imakefile
++++ b/Imakefile
+@@ -85,9 +85,9 @@ XCOMM install parameters
+ XCOMM
+ XCOMM owner and access rights for executable & score directory
+ XCOMM these are set for a setuid xmris
+-XCOMM OWNER = -o games
++XCOMM OWNER = -g games
+ OWNER =
+-INSTMRISFLAGS = $(OWNER) $(INSTUIDFLAGS)
++INSTMRISFLAGS = $(OWNER) $(INSTGIDFLAGS)
+ XCOMM normal install locations
+ THEBINDIR = $(BINDIR)
+ THEMANDIR = $(MANDIR)
+diff --git a/scoring.c b/scoring.c
+index 381057b..45c14d8 100644
+--- a/scoring.c
++++ b/scoring.c
+@@ -1,4 +1,5 @@
+ /* Copyright (C) 1993, 1992 Nathan Sidwell */
++#define _GNU_SOURCE /* for setresuid / setresgid */
+ #include "xmris.h"
+ /*{{{  other includes*/
+ #include <pwd.h>
+@@ -169,6 +170,37 @@ ARGSEP  unsigned long msec
+   return;
+ }
+ /*}}}*/
++/*{{{  void init_scores_early()*/
++extern VOIDFUNC init_scores_early FUNCARGVOID
++/*
++ * To be called asap from main, open the global highscore file and drop
++ * sgid rights
++ */
++{
++  /* Figure out who we really are. */
++  gid_t realgid = getgid();
++  uid_t realuid = getuid();
++
++  score_stream = fopen(score_file, "r+");
++  /* If we cannot open it, try creating it */
++  if(!score_stream)
++    score_stream = fopen(score_file, "w+");
++  if(!score_stream)
++    score_file = NULL;
++
++  /* This is where we drop our setuid/setgid privileges. */
++  if(setresgid(-1, realgid, realgid) != 0)
++    {
++      perror("Could not drop setgid privileges.  Aborting.");
++      exit(1);
++    }
++  if(setresuid(-1, realuid, realuid) != 0)
++    {
++      perror("Could not drop setuid privileges.  Aborting.");
++      exit(1);
++    }
++}
++/*}}}*/
+ /*{{{  void init_scores()*/
+ extern VOIDFUNC init_scores FUNCARGVOID
+ /*
+@@ -277,16 +309,6 @@ extern VOIDFUNC init_scores FUNCARGVOID
+       scoring.alternate = alternate;
+   }
+   /*}}}*/
+-  /*{{{  score directory?*/
+-    {
+-      score_stream = fopen(score_file, "r+");
+-      /* If we cannot open it, try creating it */
+-      if(!score_stream)
+-	score_stream = fopen(score_file, "w+");
+-      if (!score_stream)
+-	score_file = NULL;
+-    }
+-  /*}}}*/
+   /*{{{  personal file*/
+   {
+     if(!home)
+diff --git a/xmris.c b/xmris.c
+index f10e3f7..a38139d 100644
+--- a/xmris.c
++++ b/xmris.c
+@@ -1259,6 +1259,8 @@ ARGSEP  char CONST **argv
+   PROTOANIMATE((*animate));
+   Atom wm_delete_window;
+   
++  init_scores_early();
++  
+   myname = *argv ? *argv : "Xmris";
+   open_toolkit(argc, (String *)argv);
+   init_scores();
+diff --git a/xmris.h b/xmris.h
+index 34969df..99af882 100644
+--- a/xmris.h
++++ b/xmris.h
+@@ -535,6 +535,7 @@ extern unsigned move_player PROTOARG((VOIDARG));
+ /*{{{  scoring*/
+ extern VOIDFUNC check_scores PROTOARG((VOIDARG));
+ extern VOIDFUNC high_score PROTOARG((unsigned long, unsigned, unsigned long));
++extern VOIDFUNC init_scores_early PROTOARG((VOIDARG));
+ extern VOIDFUNC init_scores PROTOARG((VOIDARG));
+ extern VOIDFUNC cleanup_scores PROTOARG((VOIDARG));
+ /*}}}*/
+-- 
+1.7.5
+
diff --git a/0017-Set-class-to-Xmsit-Xmris-depending-on-how-we-re-laun.patch b/0017-Set-class-to-Xmsit-Xmris-depending-on-how-we-re-laun.patch
new file mode 100644
index 0000000..3862995
--- /dev/null
+++ b/0017-Set-class-to-Xmsit-Xmris-depending-on-how-we-re-laun.patch
@@ -0,0 +1,72 @@
+From 07e599150a81a85f327ad8b84102c359da442ed8 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Mon, 2 May 2011 11:58:04 +0200
+Subject: [PATCH 17/20] Set class to Xmsit / Xmris depending on how we're
+ launched
+
+And also create a separate Xmsit.ad with gender: she so that launching as
+xmsit actually gives us msit.
+---
+ Imakefile  |    7 ++++++-
+ makemris.c |    3 ++-
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/Imakefile b/Imakefile
+index 09931d8..31c8550 100644
+--- a/Imakefile
++++ b/Imakefile
+@@ -209,7 +209,7 @@ all :: initialize
+ all :: xmris xmred
+ 	@#keep gnumake happy
+ 
+-all :: README.xmris README.xmred Xmris.ad
++all :: README.xmris README.xmred Xmris.ad Xmsit.ad
+ 	@#keep gnumake happy
+ 
+ XCOMM rules to make sure the initialize thing is done
+@@ -251,10 +251,14 @@ InstallManPage(xmred,$(THEMANDIR))
+ 
+ XCOMM application resource files
+ InstallAppDefaults(Xmris)
++InstallAppDefaults(Xmsit)
+ 
+ Xmris.ad : Xmris-ad.src
+ 	sed -e s at FONT@$(FONT)@ < Xmris-ad.src > Xmris.ad
+ 
++Xmsit.ad : Xmris.ad
++	sed -e "s at Gender:\t\the at Gender:\t\tshe@" < Xmris.ad > Xmsit.ad
++
+ #ifdef InstallDefaultGardens
+ XCOMM install default gardens
+ install :: $(GARDENS)
+@@ -273,6 +277,7 @@ NormalProgramTarget(scram,$(SCRAMOBJS),,,)
+ clean ::
+ 	$(RM) $(MRISOBJS)
+ 	$(RM) Xmris.ad
++	$(RM) Xmsit.ad
+ 	$(RM) $(MREDOBJS)
+ 	$(RM) $(WIDGETOBJS)
+ 	$(RM) $(SCRAMOBJS)
+diff --git a/makemris.c b/makemris.c
+index 95046d7..6b129c1 100644
+--- a/makemris.c
++++ b/makemris.c
+@@ -274,13 +274,14 @@ ARGSEP  String  *argv
+       if(data.nodisplay == False)
+ 	{
+ 	  XrmOptionDescRec CONST *ptr;
++	  const char *myclass = default_gender ? "Xmsit" : "Xmris";
+     
+ 	  /* as options is an extern of unknown size, I can't use
+ 	   * XtNumber() to get its size, so I've done it this way
+ 	   */
+ 	  for(ptr = options; *(char CONST **)ptr; ptr++)
+ 	    /* EMPTY */;
+-	  display.toplevel = XtAppInitialize(&display.context, "Xmris",
++	  display.toplevel = XtAppInitialize(&display.context, myclass,
+ 	      options, (Cardinal)(ptr - options),
+ 	      &argc, (String *)argv,
+ 	      (String *)NULL, toplevel_args, XtNumber(toplevel_args));
+-- 
+1.7.5
+
diff --git a/0018-Install-manpages-into-section-6-rather-then-1.patch b/0018-Install-manpages-into-section-6-rather-then-1.patch
new file mode 100644
index 0000000..b4b41b0
--- /dev/null
+++ b/0018-Install-manpages-into-section-6-rather-then-1.patch
@@ -0,0 +1,26 @@
+From ce1204bfff0c925002033206659c755ab589adb4 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Mon, 2 May 2011 12:00:32 +0200
+Subject: [PATCH 18/20] Install manpages into section 6 rather then 1
+
+---
+ Imakefile |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+diff --git a/Imakefile b/Imakefile
+index 31c8550..b999fda 100644
+--- a/Imakefile
++++ b/Imakefile
+@@ -90,7 +90,8 @@ OWNER =
+ INSTMRISFLAGS = $(OWNER) $(INSTGIDFLAGS)
+ XCOMM normal install locations
+ THEBINDIR = $(BINDIR)
+-THEMANDIR = $(MANDIR)
++THEMANDIR = $(MANSOURCEPATH)6
++MANSUFFIX = 6
+ XCOMM INSTMRISFLAGS = $(INSTPGMFLAGS)
+ XCOMM If you're not installing in the default locations
+ XCOMM DESTDIR = 
+-- 
+1.7.5
+
diff --git a/0019-Add-.desktop-files.patch b/0019-Add-.desktop-files.patch
new file mode 100644
index 0000000..1f3fa53
--- /dev/null
+++ b/0019-Add-.desktop-files.patch
@@ -0,0 +1,62 @@
+From e9445fb7ea16fdbcfe7577dfbad3544c90670fe8 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Sun, 1 May 2011 17:14:50 +0200
+Subject: [PATCH 19/20] Add .desktop files
+
+---
+ xmred.desktop |    9 +++++++++
+ xmris.desktop |    9 +++++++++
+ xmsit.desktop |    9 +++++++++
+ 3 files changed, 27 insertions(+), 0 deletions(-)
+ create mode 100644 xmred.desktop
+ create mode 100644 xmris.desktop
+ create mode 100644 xmsit.desktop
+
+diff --git a/xmred.desktop b/xmred.desktop
+new file mode 100644
+index 0000000..e60a49f
+--- /dev/null
++++ b/xmred.desktop
+@@ -0,0 +1,9 @@
++[Desktop Entry]
++Name=X Mr Ed
++Comment=Level Editor for X Mr Is
++Exec=xmred
++Icon=xmris
++Terminal=false
++StartupNotify=false
++Type=Application
++Categories=Game;ArcadeGame;
+diff --git a/xmris.desktop b/xmris.desktop
+new file mode 100644
+index 0000000..6cd97f2
+--- /dev/null
++++ b/xmris.desktop
+@@ -0,0 +1,9 @@
++[Desktop Entry]
++Name=X Mr Is
++Comment=Maze digging and cherry eating game
++Exec=xmris
++Icon=xmris
++Terminal=false
++StartupNotify=false
++Type=Application
++Categories=Game;ArcadeGame;
+diff --git a/xmsit.desktop b/xmsit.desktop
+new file mode 100644
+index 0000000..e14bdef
+--- /dev/null
++++ b/xmsit.desktop
+@@ -0,0 +1,9 @@
++[Desktop Entry]
++Name=X Ms It
++Comment=Maze digging and cherry eating game
++Exec=xmsit
++Icon=xmsit
++Terminal=false
++StartupNotify=false
++Type=Application
++Categories=Game;ArcadeGame;
+-- 
+1.7.5
+
diff --git a/sources b/sources
index e69de29..c791e9a 100644
--- a/sources
+++ b/sources
@@ -0,0 +1 @@
+108beb6df3cda34f6797605e975345a8  xmris.4.0.5.tar.gz
diff --git a/xmris.png b/xmris.png
new file mode 100644
index 0000000..87bbc9e
Binary files /dev/null and b/xmris.png differ
diff --git a/xmris.spec b/xmris.spec
new file mode 100644
index 0000000..a7917aa
--- /dev/null
+++ b/xmris.spec
@@ -0,0 +1,151 @@
+Name:           xmris
+Version:        4.0.5
+Release:        5%{?dist}
+Summary:        Maze digging and cherry eating game
+Group:          Amusements/Games
+License:        GPL+
+URL:            http://sourceforge.net/projects/xmris/
+Source0:        http://downloads.sourceforge.net/xmris/xmris.%{version}.tar.gz
+# These were created from screenshots from the game
+Source1:        xmris.png
+Source2:        xmsit.png
+# Various fixes
+Patch1:         0001-Fix-xm-exiting-with-a-BadFont-error.patch
+Patch2:         0002-Fix-timer-signal-handling-under-Linux.patch
+Patch3:         0003-Adjust-Imakefile-for-modern-systems.patch
+Patch4:         0004-Catch-the-window-being-deleted.patch
+Patch5:         0005-Fix-compiling-of-flock-code-under-Linux.patch
+Patch6:         0006-Fix-key-presses-getting-lost.patch
+Patch7:         0007-Change-key-binding-defaults-to-something-sane.patch
+Patch8:         0008-Fix-compiler-warnings.patch
+# Patches for safe global highscore handling
+Patch9:        0009-Remove-TRANSPUTER-stuff.patch
+Patch10:        0010-Remove-USELOCKFILE-stuff.patch
+Patch11:        0011-Remove-seteuid-stuff.patch
+Patch12:        0012-Drop-dir-option.patch
+Patch13:        0013-Drop-support-for-global-personal-file.patch
+Patch14:        0014-Some-renames.patch
+Patch15:        0015-Open-score-files-only-once-and-keep-them-open-till-t.patch
+Patch16:        0016-Open-the-global-score-file-asap-and-drop-special-rig.patch
+# Misc patches
+Patch17:        0017-Set-class-to-Xmsit-Xmris-depending-on-how-we-re-laun.patch
+Patch18:        0018-Install-manpages-into-section-6-rather-then-1.patch
+Patch19:        0019-Add-.desktop-files.patch
+BuildRequires:  libXt-devel libXaw-devel groff imake desktop-file-utils
+Requires:       hicolor-icon-theme
+Requires:       xorg-x11-fonts-ISO8859-1-75dpi
+Requires:       xorg-x11-fonts-ISO8859-1-100dpi
+
+%description
+You control a gnome, who can walk around a garden, along paths  already
+marked,  or  create  new paths wherever you wish. You also have a ball,
+which can be thrown in the direction you're facing, towards the gnome's
+feet.  Points  are scored for collecting cherries (if you collect eight
+cherries without stopping or  pushing  an  apple,  you  get  a  bonus),
+killing monsters (by squashing them, or throwing the ball at them), and
+collecting the prize left when all the monsters have come out of  their
+den.
+
+
+%package        editor
+Summary:        Level editor for %{name}
+Requires:       %{name} = %{version}-%{release}
+
+%description    editor
+A level editor for %{name}.
+
+
+%prep
+%setup -q -n %{name}.%{version}
+%patch1 -p1
+%patch2 -p1
+%patch3 -p1
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
+%patch8 -p1
+%patch9 -p1
+%patch10 -p1
+%patch11 -p1
+%patch12 -p1
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
+%patch17 -p1
+%patch18 -p1
+%patch19 -p1
+
+
+%build
+xmkmf
+make %{?_smp_mflags} CDEBUGFLAGS="$RPM_OPT_FLAGS"
+
+
+%install
+make install install.man DESTDIR=$RPM_BUILD_ROOT
+rm $RPM_BUILD_ROOT/usr/lib/X11/app-defaults
+
+mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/games
+touch $RPM_BUILD_ROOT%{_localstatedir}/games/%{name}.score
+
+mkdir -p $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/128x128/apps
+install -p -m 644 %{SOURCE1} $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/128x128/apps
+install -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/128x128/apps
+
+mkdir -p $RPM_BUILD_ROOT%{_datadir}/applications
+desktop-file-install --dir $RPM_BUILD_ROOT%{_datadir}/applications xm*.desktop
+
+
+%post
+touch --no-create %{_datadir}/icons/hicolor &>/dev/null || :
+
+%postun
+if [ $1 -eq 0 ] ; then
+    touch --no-create %{_datadir}/icons/hicolor &>/dev/null
+    gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
+fi
+
+%posttrans
+gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
+
+
+%files
+%defattr(-,root,root,-)
+%doc CHANGES* COPYING-2.0 COPYRIGHT README.xmris
+%attr(2755,root,games) %{_bindir}/%{name}
+%{_bindir}/xmsit
+%{_datadir}/%{name}
+%{_datadir}/X11/app-defaults/Xm*
+%{_datadir}/applications/xmris.desktop
+%{_datadir}/applications/xmsit.desktop
+%{_datadir}/icons/hicolor/128x128/apps/xm*.png
+%{_mandir}/man6/xmris.6*
+%{_mandir}/man6/xmsit.6*
+%verify(not md5 size mtime) %config(noreplace) %attr(0664,root,games) %{_localstatedir}/games/%{name}.score
+
+%files editor
+%defattr(-,root,root,-)
+%doc README.xmred
+%{_bindir}/xmred
+%{_datadir}/applications/xmred.desktop
+%{_mandir}/man6/xmred.6*
+
+
+%changelog
+* Sun Aug 31 2014 Sérgio Basto <sergio at serjux.com> - 4.0.5-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Sun Mar 03 2013 Nicolas Chauvet <kwizart at gmail.com> - 4.0.5-4
+- Mass rebuilt for Fedora 19 Features
+
+* Wed Feb 08 2012 Nicolas Chauvet <kwizart at gmail.com> - 4.0.5-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Sat May 21 2011 Hans de Goede <j.w.r.degoede at gmail.com> 4.0.5-2
+- Add missing BuildRequires: libXaw-devel groff
+- Change font requires to: xorg-x11-fonts-ISO8859-1-75dpi + 100dpi
+
+* Tue May  3 2011 Hans de Goede <j.w.r.degoede at gmail.com> 4.0.5-1
+- Initial rpmfusion package
diff --git a/xmsit.png b/xmsit.png
new file mode 100644
index 0000000..ad9fd60
Binary files /dev/null and b/xmsit.png differ


More information about the rpmfusion-commits mailing list