commit cae9a7ae8521c357b2f1fe9a27d5dd177d31f449
Author: Hans de Goede <hdegoede(a)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(a)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(a)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(a)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(a)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(a)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(a)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(a)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(a)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(a)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(a)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+(a)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(a)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(a)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@SCORE@$(SCORE)@' -e s@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@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@SCORE@$(SCORE)@' -e s@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@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(a)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(a)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(a)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(a)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(a)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@FONT@$(FONT)@ < Xmris-ad.src > Xmris.ad
+
++Xmsit.ad : Xmris.ad
++ sed -e "s@Gender:\t\the@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(a)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(a)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(a)serjux.com> - 4.0.5-5
+- Rebuilt for
https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Sun Mar 03 2013 Nicolas Chauvet <kwizart(a)gmail.com> - 4.0.5-4
+- Mass rebuilt for Fedora 19 Features
+
+* Wed Feb 08 2012 Nicolas Chauvet <kwizart(a)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(a)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(a)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