From 4e509075f46bf66e4ad1c6ddae27a519df6dc9f9 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Sun, 1 Apr 2007 12:09:42 +0000 Subject: [PATCH] Add new config file value 'mkdir', and allow variables in mkdir and chdir git-svn-id: svn://katsu.triplehelix.org/dgamelaunch/trunk@355 db0b04b0-f4d1-0310-9a6d-de3e77497b0e --- config.l | 1 + config.y | 9 ++++++++- dgamelaunch.c | 11 ++++++++++- dgamelaunch.h | 3 ++- dgl-common.c | 1 + ttyrec.c | 3 +++ 6 files changed, 25 insertions(+), 3 deletions(-) diff --git a/config.l b/config.l index 4823f05..d41dcb5 100644 --- a/config.l +++ b/config.l @@ -65,6 +65,7 @@ COMMENT ^#.* "short_name" { return TYPE_GAME_SHORT_NAME; } "game_path" { return TYPE_PATH_GAME; } "chdir" { return TYPE_PATH_CHDIR; } +"mkdir" { return TYPE_PATH_MKDIR; } "dglroot" { return TYPE_PATH_DGLDIR; } "spooldir" { return TYPE_PATH_SPOOL; } "banner" { return TYPE_PATH_BANNER; } diff --git a/config.y b/config.y index ff197ed..58a554e 100644 --- a/config.y +++ b/config.y @@ -31,7 +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 TYPE_GAME_SHORT_NAME +%token TYPE_PATH_CHDIR TYPE_PATH_MKDIR TYPE_GAME_SHORT_NAME %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 @@ -149,6 +149,11 @@ KeyPair: KeyType '=' TYPE_VALUE { myconfig[ncnf]->chdir = strdup ($3); break; + case TYPE_PATH_MKDIR: + if (myconfig[ncnf]->mkdir) free(myconfig[ncnf]->mkdir); + myconfig[ncnf]->mkdir = strdup ($3); + break; + case TYPE_PATH_DGLDIR: if (globalconfig.dglroot) free(globalconfig.dglroot); globalconfig.dglroot = strdup($3); @@ -304,6 +309,7 @@ KeyType : TYPE_SUSER { $$ = TYPE_SUSER; } | TYPE_NAME_GAME { $$ = TYPE_NAME_GAME; } | TYPE_GAME_SHORT_NAME { $$ = TYPE_GAME_SHORT_NAME; } | TYPE_PATH_CHDIR { $$ = TYPE_PATH_CHDIR; } + | TYPE_PATH_MKDIR { $$ = TYPE_PATH_MKDIR; } | TYPE_PATH_DGLDIR { $$ = TYPE_PATH_DGLDIR; } | TYPE_PATH_SPOOL { $$ = TYPE_PATH_SPOOL; } | TYPE_PATH_BANNER { $$ = TYPE_PATH_BANNER; } @@ -331,6 +337,7 @@ const char* lookup_token (int t) case TYPE_GAMENUM: return "game_num"; case TYPE_PATH_CHROOT: return "chroot_path"; case TYPE_PATH_CHDIR: return "chdir"; + case TYPE_PATH_MKDIR: return "mkdir"; case TYPE_PATH_GAME: return "game_path"; case TYPE_NAME_GAME: return "game_name"; case TYPE_GAME_SHORT_NAME: return "short_name"; diff --git a/dgamelaunch.c b/dgamelaunch.c index 866d4e0..eaf3e68 100644 --- a/dgamelaunch.c +++ b/dgamelaunch.c @@ -1749,6 +1749,7 @@ main (int argc, char** argv) int c, i; int nhext = 0, nhauth = 0; int userchoice; + char *tmp; #ifndef HAVE_SETPROCTITLE /* save argc, argv */ @@ -1953,11 +1954,19 @@ main (int argc, char** argv) /* fix the variables in the arguments */ for (i = 0; i < myconfig[userchoice]->num_args; i++) { - char *tmp = strdup(dgl_format_str(userchoice, me, myconfig[userchoice]->bin_args[i])); + tmp = strdup(dgl_format_str(userchoice, me, myconfig[userchoice]->bin_args[i])); free(myconfig[userchoice]->bin_args[i]); myconfig[userchoice]->bin_args[i] = tmp; } + tmp = strdup(dgl_format_str(userchoice, me, myconfig[userchoice]->mkdir)); + free(myconfig[userchoice]->mkdir); + myconfig[userchoice]->mkdir = tmp; + + tmp = strdup(dgl_format_str(userchoice, me, myconfig[userchoice]->chdir)); + free(myconfig[userchoice]->chdir); + myconfig[userchoice]->chdir = tmp; + /* launch program */ ttyrec_main (userchoice, me->username, gen_ttyrec_filename()); diff --git a/dgamelaunch.h b/dgamelaunch.h index b89e7de..af87eb3 100644 --- a/dgamelaunch.h +++ b/dgamelaunch.h @@ -14,7 +14,7 @@ /* max # of different games playable from within this dgl */ -#define DIFF_GAMES 3 +#define DIFF_GAMES 4 struct dg_user { @@ -48,6 +48,7 @@ struct dg_config char* game_name; char* shortname; char* chdir; + char* mkdir; char* rcfile; char* spool; char* savefilefmt; diff --git a/dgl-common.c b/dgl-common.c index 7686d8c..f07c759 100644 --- a/dgl-common.c +++ b/dgl-common.c @@ -23,6 +23,7 @@ struct dg_config defconfig = { /* game_name = */ "NetHack", /* shortname = */ "NH", /* chdir = */ NULL, + /* mkdir = */ NULL, /* dglroot = *//* "/dgldir/",*/ /* lockfile = */ /*"/dgl-lock",*/ /* passwd = */ /*"/dgl-login",*/ diff --git a/ttyrec.c b/ttyrec.c index f0f925b..c4a3b95 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]->mkdir) + (void) mkdir(myconfig[game]->mkdir, 0755); + if (myconfig[game]->chdir) (void) chdir(myconfig[game]->chdir);