From 59254ed4b7314e7b47c6ee691087322b5ac9698a Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sat, 31 Mar 2007 21:05:12 +0000 Subject: [PATCH] Add 'chdir' per-game config variable, which defines the dir where dgl will chdir to before executing the game. git-svn-id: svn://katsu.triplehelix.org/dgamelaunch/trunk@350 db0b04b0-f4d1-0310-9a6d-de3e77497b0e --- config.l | 1 + config.y | 8 ++++++++ dgamelaunch.h | 1 + dgl-common.c | 2 +- ttyrec.c | 3 +++ 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/config.l b/config.l index 15c96fd..6d4f924 100644 --- a/config.l +++ b/config.l @@ -63,6 +63,7 @@ COMMENT ^#.* "chroot_path" { return TYPE_PATH_CHROOT; } "game_name" { return TYPE_NAME_GAME; } "game_path" { return TYPE_PATH_GAME; } +"chdir" { return TYPE_PATH_CHDIR; } "dglroot" { return TYPE_PATH_DGLDIR; } "spooldir" { return TYPE_PATH_SPOOL; } "banner" { return TYPE_PATH_BANNER; } diff --git a/config.y b/config.y index 0c09caa..6947459 100644 --- a/config.y +++ b/config.y @@ -31,6 +31,7 @@ static const char* lookup_token (int t); } %token TYPE_SUSER TYPE_SGROUP TYPE_SGID TYPE_SUID TYPE_MAX TYPE_MAXNICKLEN +%token TYPE_PATH_CHDIR %token TYPE_PATH_GAME TYPE_NAME_GAME TYPE_PATH_DGLDIR TYPE_PATH_SPOOL %token TYPE_PATH_BANNER TYPE_PATH_CANNED TYPE_PATH_CHROOT TYPE_GAMENUM %token TYPE_PATH_PASSWD TYPE_PATH_LOCKFILE TYPE_PATH_SAVEFILEFMT @@ -138,6 +139,11 @@ KeyPair: KeyType '=' TYPE_VALUE { myconfig[ncnf]->game_name = strdup($3); break; + case TYPE_PATH_CHDIR: + if (myconfig[ncnf]->chdir) free(myconfig[ncnf]->chdir); + myconfig[ncnf]->chdir = strdup ($3); + break; + case TYPE_PATH_DGLDIR: if (globalconfig.dglroot) free(globalconfig.dglroot); globalconfig.dglroot = strdup($3); @@ -291,6 +297,7 @@ KeyType : TYPE_SUSER { $$ = TYPE_SUSER; } | TYPE_PATH_CHROOT { $$ = TYPE_PATH_CHROOT; } | TYPE_PATH_GAME { $$ = TYPE_PATH_GAME; } | TYPE_NAME_GAME { $$ = TYPE_NAME_GAME; } + | TYPE_PATH_CHDIR { $$ = TYPE_PATH_CHDIR; } | TYPE_PATH_DGLDIR { $$ = TYPE_PATH_DGLDIR; } | TYPE_PATH_SPOOL { $$ = TYPE_PATH_SPOOL; } | TYPE_PATH_BANNER { $$ = TYPE_PATH_BANNER; } @@ -317,6 +324,7 @@ const char* lookup_token (int t) case TYPE_MAXNICKLEN: return "maxnicklen"; case TYPE_GAMENUM: return "game_num"; case TYPE_PATH_CHROOT: return "chroot_path"; + case TYPE_PATH_CHDIR: return "chdir"; case TYPE_PATH_GAME: return "game_path"; case TYPE_NAME_GAME: return "game_name"; case TYPE_PATH_DGLDIR: return "dglroot"; diff --git a/dgamelaunch.h b/dgamelaunch.h index 7965fbc..c82169d 100644 --- a/dgamelaunch.h +++ b/dgamelaunch.h @@ -45,6 +45,7 @@ struct dg_config { char* game_path; char* game_name; + char* chdir; char* lockfile; char* passwd; char* rcfile; diff --git a/dgl-common.c b/dgl-common.c index 2f244a8..f3f8e75 100644 --- a/dgl-common.c +++ b/dgl-common.c @@ -21,6 +21,7 @@ struct dg_config defconfig = { /* chroot = */ /*"/var/lib/dgamelaunch/",*/ /* game_path = */ "/bin/nethack", /* game_name = */ "NetHack", + /* chdir = */ NULL, /* dglroot = *//* "/dgldir/",*/ /* lockfile = */ "/dgl-lock", /* passwd = */ "/dgl-login", @@ -332,7 +333,6 @@ create_config () if (!myconfig[tmp]->savefilefmt) myconfig[tmp]->savefilefmt = defconfig.savefilefmt; if (!myconfig[tmp]->inprogressdir) myconfig[tmp]->inprogressdir = defconfig.inprogressdir; - } if (!globalconfig.chroot) globalconfig.chroot = "/var/lib/dgamelaunch/"; diff --git a/ttyrec.c b/ttyrec.c index 274d8d0..f0f925b 100644 --- a/ttyrec.c +++ b/ttyrec.c @@ -271,6 +271,9 @@ doshell (int game, char *username) (void) dup2 (slave, 2); (void) close (slave); + if (myconfig[game]->chdir) + (void) chdir(myconfig[game]->chdir); + execvp (myconfig[game]->game_path, myconfig[game]->bin_args); fail (); -- 2.47.3