# HG changeset patch
# User John "Elwin" Edwards <elwin@sdf.org>
# Date 1347723966 25200
# Node ID 9945b472aac2e9637512b746b85e015c5aa9151a
# Parent d34f2e40e67db8cacdc0276939a7dac29b24a9c9
Add dgamelaunch configuration to the project.
diff -r d34f2e40e67d -r 9945b472aac2 dgl/dgamelaunch.conf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dgl/dgamelaunch.conf Sat Sep 15 08:46:06 2012 -0700
@@ -0,0 +1,308 @@
+# rlgallery.org configuration file for dgamelaunch
+
+
+# Global config variables:
+
+
+# Max amount of registered users to allow. Has no effect if dgl was
+# compiled with SQLite
+maxusers = 4096
+
+# Allow registration of new nicks? (yes or no)
+allow_new_nicks = yes
+
+# Max length for newly registered nicks. Must be less than 20.
+# By default, NetHack only stores the first 10 chars of a name into
+# the record/logfile.
+maxnicklen = 10
+
+# Set the default watching-screen sorting mode. Can be one of
+# "unsorted", "username" or "idletime". Unsorted is the default.
+sortmode = "username"
+
+# Path to a prepared chroot jail.
+chroot_path = "/var/dgl/"
+
+# From inside the jail, dgamelaunch's working directory for rcfiles/ttyrec/etc
+dglroot = "/dgldir/"
+
+# Server ID string
+server_id = "Roguelike Gallery - rlgallery.org"
+
+# From inside the jail, location of a banner file, the topmost line will be
+# shown in submenus that cannot be defined separately.
+# Some string substitution is done for the file:
+# $VERSION replaced with "dgamelaunch v" + dgl version number.
+# $SERVERID replaced with the server_id string, as defined above.
+banner = "/dgldir/dgl-banner"
+
+# The following two options are fairly insecure. They will force us to
+# load the password/group database into memory while still having root
+# privileges. Replace them with shed_uid/shed_gid entries as soon as
+# possible if you decide to use them. dgamelaunch will inform you of
+# the uids/gids corresponding to your choices when it loads.
+#
+# Note that shed_uid and shed_gid will always take precedence over
+# shed_user and shed_group if they are specified.
+
+# shed_user: username to shed privileges to
+#shed_user = "games"
+# shed_group: group name to shed privileges to
+#shed_group = "games"
+
+# Preferably, you may use the respective gids/uids. This is for Debian:
+# Use the rodney account instead of games:games
+shed_uid = 501
+shed_gid = 501
+
+# The defaults are usually just fine for this. passwd refers to the file
+# that stores the user database, and lockfile is only used internally by
+# dgamelaunch.
+# passwd doesn't matter if dgl was compiled with SQLite, as the name of
+# the sqlite database will be defined at compile time.
+passwd = "/dgldir/dgl-login"
+lockfile = "/dgldir/dgl-lock"
+
+#
+# define some commands that are run when something happens. format is
+# commands [ <time> ] = <command> ...
+#
+# <time> can be one of:
+# dglstart = when someone telnets in
+# login = when user has logged in
+# register = right after a new user is registered
+# gamestart = just before a game is started
+#
+# <command> is:
+# mkdir "foo" = create a directory "foo"
+# chdir "foo" = change current work dir to "foo"
+# cp "foo" "bar" = copy file "foo" to "bar", overwriting previous "bar"
+# ifnxcp "foo" "bar" = copy file "foo" to "bar", if "bar" doesn't exist
+# unlink "foo" = delete file "foo"
+# setenv "foo" "bar" = set environment variable "foo" to "bar"
+# exec "foo" "bar" = execute "foo" with "bar" as it's param
+# chpasswd = do the change password prompting, if logged in
+# chmail = do the change email prompting, if logged in
+# watch_menu = go to the watching menu
+# quit = quit dgl
+# ask_login = do the login prompting, if not logged in
+# ask_register = do register new user prompting, if not logged in and
+# registration of new nicks is allowed.
+# edit_options "foo" = edit options for game which has the short name "foo"
+# (user must be logged in)
+# play_game "foo" = start game which has the short name "foo"
+# (user must be logged in)
+# submenu "foo" = go to submenu "foo"
+# return = return from submenu
+#
+# The commands will be done inside the chroot and with the uid and gid
+# defined above.
+# Parameters to the commands are subject to variable substitution:
+# %r = dglroot, as defined above
+# %n = user nick, if user is logged in
+# %u = shed_uid, as defined above, but numeric
+# %g = game name, if user has selected a game.
+#
+# eg. commands[login] = mkdir "foo", unlink "bar", setenv "Z" "foo"
+#
+
+# create the user's dirs when they register
+commands[register] = mkdir "%ruserdata/%n",
+ mkdir "%rttyrec/%n",
+ mkdir "%rttyrec/%n/rogue3",
+ mkdir "%rttyrec/%n/rogue4",
+ mkdir "%rttyrec/%n/rogue5",
+ mkdir "%rttyrec/%n/srogue",
+ mkdir "%rttyrec/%n/arogue5"
+
+commands[login] = mkdir "%ruserdata/%n",
+ mkdir "%rttyrec/%n",
+ mkdir "%rttyrec/%n/rogue3",
+ mkdir "%rttyrec/%n/rogue4",
+ mkdir "%rttyrec/%n/rogue5",
+ mkdir "%rttyrec/%n/srogue",
+ mkdir "%rttyrec/%n/arogue5"
+
+
+
+
+
+# Define the main menus.
+# You _must_ define "mainmenu_anon" and "mainmenu_user".
+# $VERSION and $SERVERID will be replaced, as per the bannerfile above.
+
+# First, the menu shown to anonymous user:
+menu["mainmenu_anon"] {
+ bannerfile = "/dgldir/dgl_menu_main_anon.txt"
+ cursor = (5,18)
+ commands["l"] = ask_login
+ commands["r"] = ask_register
+ commands["w"] = watch_menu
+ commands["q"] = quit
+}
+
+# Then the menu shown when the user has logged in:
+# $USERNAME in here will be replaced with the user name.
+menu["mainmenu_user"] {
+# contents of this file are written to screen.
+# the file must be inside the chroot.
+ bannerfile = "/dgldir/dgl_menu_main_user.txt"
+# after which cursor is moved to this location
+# if cursor-definition is missing, the cursor is put
+# to the end of the last line of the banner.
+# cursor = (5,18)
+# keys we accept. format is
+# commands["string_of_keys"] = <commandlist>
+# for example, you could use commands["qQ"] = quit
+ commands["c"] = chpasswd
+ commands["e"] = chmail
+ commands["w"] = watch_menu
+ commands["3"] = play_game "RogV3"
+ commands["4"] = play_game "RogV4"
+ commands["5"] = play_game "RogV5"
+ commands["Ss"] = play_game "SRog"
+ commands["Aa"] = play_game "ARog5"
+ commands["q"] = quit
+}
+
+# this menu is shown when user presses '?' in the watching menu
+menu["watchmenu_help"] {
+ bannerfile = "/dgldir/dgl_menu_watchmenu_help.txt"
+ commands["qQ "] = return
+}
+
+
+# Next, we'll define one game's data:
+
+#DEFINE {
+# # From inside the jail, the location of the binary to be launched.
+# game_path = "/bin/nethackstub"
+#
+# # Full name of the game
+# game_name = "NetHack stub"
+#
+# # Short name, used in the watching menu
+# short_name = "NHstb"
+#
+# # arguments for when we exec the binary
+# game_args = "/bin/nethackstub",
+# "foo",
+# "user:%n",
+# "shed_uid:%u",
+# "bar"
+#
+# # From inside the jail, where dgamelaunch should put mail.
+# spooldir = "/var/mail/"
+#
+# # From inside the jail, the default .nethackrc that is copied for new users.
+# # rc_template = "/dgl-default-rcfile"
+#
+# # Make sure the inprogress dir actually exists. default is "inprogress/"
+# # Each game you define here must have it's own.
+# inprogressdir = "%rinprogress-nethackstub/"
+#
+# # We can also define per-game commands, that are executed
+# # when the game starts:
+# # commands = chdir "/dgldir", mkdir "foo_%u_%g"
+#}
+
+
+#DEFINE {
+# game_path = "/nh343/nethack"
+# game_name = "NetHack 3.4.3"
+# short_name = "NH343"
+#
+# game_args = "/nh343/nethack", "-u", "%n"
+#
+# spooldir = "/mail/"
+# rc_template = "/dgl-default-rcfile.nh343"
+#
+# rc_fmt = "%ruserdata/%n/%n.nh343rc"
+#
+# inprogressdir = "%rinprogress-nh343/"
+#
+## The place where ttyrecs are stored for this game.
+## If this is not defined, ttyrecs are not saved for this game.
+## Leaving this undefined also means the games cannot be spectated.
+# ttyrecdir = "%ruserdata/%n/ttyrec/"
+#
+#
+# # back up savefile
+# commands = cp "/nh343/var/save/%u%n.gz" "/nh343/var/save/%u%n.gz.bak",
+# # set NETHACKOPTIONS to point to the rcfile
+# setenv "NETHACKOPTIONS" "@%ruserdata/%n/%n.nh343rc",
+# # set up nethack mail stuff, assuming it's compiled with it...
+# setenv "MAIL" "/mail/%n",
+# setenv "SIMPLEMAIL" "1",
+# # don't let the mail file grow
+# unlink "/mail/%n"
+#}
+
+# Rogue V3: short and simple, like the game
+DEFINE {
+ game_path = "/bin/rogue3"
+ game_name = "Rogue V3 (3.6)"
+ short_name = "RogV3"
+
+ game_args = "/bin/rogue3", "-n", "%n"
+
+ inprogressdir = "%rinprogress-rogue3/"
+ ttyrecdir = "%rttyrec/%n/rogue3/"
+
+ # Don't do anything with rcfiles. Rogue has none.
+
+ # Back up the savefile, just in case
+ commands = cp "/var/games/roguelike/rogue3save/%u-%n.r3sav" "%rbackup/%u-%n.r3sav.bak"
+}
+
+# Rogue V4: just like it, but a little different
+DEFINE {
+ game_path = "/bin/rogue4"
+ game_name = "Rogue V4 (5.2)"
+ short_name = "RogV4"
+
+ game_args = "/bin/rogue4", "-n", "%n"
+ inprogressdir = "%rinprogress-rogue4/"
+ ttyrecdir = "%rttyrec/%n/rogue4/"
+
+ commands = cp "/var/games/roguelike/rogue4save/%u-%n.r4sav" "%rbackup/%u-%n.r4sav.bak"
+}
+
+# Rogue V5: a little more different from both
+DEFINE {
+ game_path = "/bin/rogue5"
+ game_name = "Rogue V5 (5.4)"
+ short_name = "RogV5"
+
+ game_args = "/bin/rogue5", "-n", "%n"
+ inprogressdir = "%rinprogress-rogue5/"
+ ttyrecdir = "%rttyrec/%n/rogue5/"
+
+ commands = cp "/var/games/roguelike/rogue5save/%u-%n.r5sav" "%rbackup/%u-%n.r5sav.bak"
+}
+
+# Super-Rogue: different?
+DEFINE {
+ game_path = "/bin/srogue"
+ game_name = "Super-Rogue"
+ short_name = "SRog"
+
+ game_args = "/bin/srogue", "-n", "%n"
+ inprogressdir = "%rinprogress-srogue/"
+ ttyrecdir = "%rttyrec/%n/srogue/"
+
+ commands = cp "/var/games/roguelike/sroguesave/%u-%n.srsav" "%rbackup/%u-%n.srsav.bak"
+}
+
+# Advanced Rogue 5: not different?
+DEFINE {
+ game_path = "/bin/arogue5"
+ game_name = "Advanced Rogue 5"
+ short_name = "ARog5"
+
+ game_args = "/bin/arogue5", "-n", "%n"
+ inprogressdir = "%rinprogress-arogue5/"
+ ttyrecdir = "%rttyrec/%n/arogue5/"
+
+ commands = cp "/var/games/roguelike/arogue5save/%u-%n.ar5sav" "%rbackup/%u-%n.ar5sav.bak"
+}
diff -r d34f2e40e67d -r 9945b472aac2 dgl/dgl-banner
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dgl/dgl-banner Sat Sep 15 08:46:06 2012 -0700
@@ -0,0 +1,1 @@
+## $SERVERID
diff -r d34f2e40e67d -r 9945b472aac2 dgl/dgl-common.c.patch
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dgl/dgl-common.c.patch Sat Sep 15 08:46:06 2012 -0700
@@ -0,0 +1,24 @@
+504c504
+< int fd, len, n, is_nhext, pid;
+---
+> int fd, len, n, is_nhext, is_node, pid;
+538a539
+> is_node = strchr(pdirent->d_name, ':') && !strncmp(strchr(pdirent->d_name, ':'), ":node:", 6);
+550c551
+< if (fd >= 0 && (is_nhext || fcntl (fd, F_SETLK, &fl) == -1))
+---
+> if (fd >= 0 && (is_nhext || is_node || fcntl (fd, F_SETLK, &fl) == -1))
+567a569,576
+> if (is_node) {
+> replacestr = strchr(replacestr, ':');
+> if (!replacestr) {
+> debug_write("inprogress-filename does not have ':', 1a");
+> graceful_exit(145);
+> }
+> replacestr++;
+> }
+589a599,602
+> if (is_node) {
+> replacestr++;
+> replacestr = strchr(replacestr, ':');
+> }
diff -r d34f2e40e67d -r 9945b472aac2 dgl/dgl_menu_main_anon.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dgl/dgl_menu_main_anon.txt Sat Sep 15 08:46:06 2012 -0700
@@ -0,0 +1,19 @@
+ ## $SERVERID
+ ##
+ ## $VERSION - network console game launcher
+ ## Copyright (c) 2000-2009 The Dgamelaunch Team
+ ## See http://nethack.wikia.com/wiki/dgamelaunch for more info
+ ##
+ ## Games on this server are recorded for in-progress viewing and playback!
+ ## Contact: elwin@sdf.org
+
+ Not logged in.
+
+ l) Login
+ r) Register new user
+ w) Watch games in progress
+ q) Quit
+
+
+
+ =>
diff -r d34f2e40e67d -r 9945b472aac2 dgl/dgl_menu_main_user.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dgl/dgl_menu_main_user.txt Sat Sep 15 08:46:06 2012 -0700
@@ -0,0 +1,22 @@
+ ## $SERVERID
+ ##
+ ## $VERSION - network console game launcher
+ ## Copyright (c) 2000-2009 The Dgamelaunch Team
+ ## See http://nethack.wikia.com/wiki/dgamelaunch for more info
+ ##
+ ## Games on this server are recorded for in-progress viewing and playback!
+ ## Contact: elwin@sdf.org
+
+ Logged in as: $USERNAME
+
+ c) Change password
+ e) Change email address
+ w) Watch games in progress
+ 3) Play Rogue V3 (3.6)
+ 4) Play Rogue V4 (5.2)
+ 5) Play Rogue V5 (5.4)
+ S) Play Super-Rogue
+ A) Play Advanced Rogue 5
+ q) Quit
+
+ =>
diff -r d34f2e40e67d -r 9945b472aac2 dgl/dgl_menu_watchmenu_help.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dgl/dgl_menu_watchmenu_help.txt Sat Sep 15 08:46:06 2012 -0700
@@ -0,0 +1,22 @@
+## $SERVERID
+
+ Help for watching-menu
+ ----------------------
+ ? show this help.
+ > < next/previous page.
+ . change sorting method.
+ q Q return to main menu.
+ a-zA-Z select a game to watch.
+ * start showing a randomly selected game.
+ enter start watching already selected game.
+
+
+ While watching a game
+ ---------------------
+ q return back to the watching menu.
+ m send mail to the player (requires login).
+ s toggle charset stripping between DEC/IBM/none.
+ r resize your terminal to match the player's terminal.
+
+
+ Press 'q' or space to return to the watching menu.