]> skyeroc.xyz Git - dgamelaunch/commitdiff
Add a configuration command to execute an arbitrary file.
authorPasi Kallinen <paxed@alt.org>
Sat, 12 Jan 2008 23:47:45 +0000 (23:47 +0000)
committerPasi Kallinen <paxed@alt.org>
Sat, 12 Jan 2008 23:47:45 +0000 (23:47 +0000)
git-svn-id: svn://katsu.triplehelix.org/dgamelaunch/trunk@409 db0b04b0-f4d1-0310-9a6d-de3e77497b0e

config.l
dgamelaunch.h
dgl-common.c
examples/dgamelaunch.conf

index 103f2cce79df094a9b1eaf1993ef7d7bc15e26cf..09e10dabbe304ef433873eb4be45c76d07e798ff 100644 (file)
--- a/config.l
+++ b/config.l
@@ -88,6 +88,7 @@ chdir         { yylval.i = DGLCMD_CHDIR;  return TYPE_DGLCMD1; }
 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; }
 
 
index 33df47022fdd7b06ca49af7952eb4f958ae0439c..fedfd0a67bd862a1b5353578177ffa6a1ea9c270 100644 (file)
@@ -101,6 +101,7 @@ typedef enum
     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;
 
index 68e44ef06a421bcb50cd0fa81b5d2999d7253f86..69ceedcfc5a56891aa067b1bc9af5a9918e76c33 100644 (file)
@@ -2,6 +2,8 @@
 
 #include "dgamelaunch.h"
 #include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
 #include <dirent.h>
 #include <stdio.h>
 #include <fcntl.h>
@@ -11,6 +13,7 @@
 #include <unistd.h>
 #include <pwd.h>
 #include <grp.h>
+#include <curses.h>
 
 extern FILE* yyin;
 extern int yyparse ();
@@ -162,6 +165,28 @@ dgl_exec_cmdqueue(struct dg_cmdpart *queue, int game, struct dg_user *me)
                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;
index a2c728d5607e873b1783202f4871a13871ae4907..530d2b9ab3518f7822704c4e7abb22096ecef209 100644 (file)
@@ -73,6 +73,7 @@ lockfile = "/dgl-lock"
 #   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.