cp { yylval.i = DGLCMD_CP; return TYPE_DGLCMD2; }
unlink { yylval.i = DGLCMD_UNLINK; return TYPE_DGLCMD1; }
setenv { yylval.i = DGLCMD_SETENV; return TYPE_DGLCMD2; }
+exec { yylval.i = DGLCMD_EXEC; return TYPE_DGLCMD2; }
DEFINE { return TYPE_DEFINE_GAME; }
DGLCMD_CHDIR, /* chdir foo */
DGLCMD_CP, /* cp foo bar */
DGLCMD_UNLINK, /* unlink foo */
+ DGLCMD_EXEC, /* exec foo bar */
DGLCMD_SETENV /* setenv foo bar */
} dglcmd_actions;
#include "dgamelaunch.h"
#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
#include <dirent.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
+#include <curses.h>
extern FILE* yyin;
extern int yyparse ();
fclose (newfile);
}
break;
+ case DGLCMD_EXEC:
+ if (p1 && p2) {
+ pid_t child;
+ char *myargv[3];
+
+ myargv[0] = p1;
+ myargv[1] = p2;
+ myargv[2] = 0;
+
+ endwin();
+ child = fork();
+ if (child == -1) {
+ perror("fork");
+ graceful_exit(114);
+ } else if (child == 0) {
+ execvp(p1, myargv);
+ exit(0);
+ } else
+ waitpid(child, NULL, 0);
+ refresh();
+ }
+ break;
case DGLCMD_SETENV:
if (p1 && p2) mysetenv(p1, p2, 1);
break;
# cp "foo" "bar" = copies file "foo" to "bar", overwriting previous "bar"
# unlink "foo" = deletes file "foo"
# setenv "foo "bar" = sets environment variable "foo" to "bar"
+# exec "foo" "bar" = execute "foo" with "bar" as it's param
#
# The commands will be done inside the chroot and with the uid and gid
# defined above.