aboutsummaryrefslogtreecommitdiff
path: root/modules/mod_sys/mod_sys.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/mod_sys/mod_sys.c')
-rw-r--r--modules/mod_sys/mod_sys.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/modules/mod_sys/mod_sys.c b/modules/mod_sys/mod_sys.c
new file mode 100644
index 0000000..c9304dc
--- /dev/null
+++ b/modules/mod_sys/mod_sys.c
@@ -0,0 +1,135 @@
+/*
+ * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd)
+ *
+ * This file is part of Bennu - Game Development
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source
+ * distribution.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "bgddl.h"
+#include "files.h"
+#include "xstrings.h"
+
+#include <unistd.h>
+
+#ifndef WIN32
+#include <sys/wait.h>
+#else
+#include <process.h>
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+#include "mod_sys.h"
+
+/* ---------------------------------------------------------------------- */
+
+static int modsys_exec( INSTANCE * my, int * params )
+{
+ int mode = params[0];
+ char * filename = ( char * ) string_get( params[1] );
+ int argc = params[2];
+ char ** argv;
+ int n = 0;
+#ifndef WIN32
+ pid_t child;
+#endif
+ int status = -1;
+
+ // fill argv
+ argv = ( char ** ) calloc( argc + 2, sizeof( char * ) );
+ argv[0] = filename;
+ for ( n = 0; n < argc; n++ )
+ argv[n + 1] = ( char * ) string_get((( int * )( params[3] ) )[n] );
+
+ // Execute program
+#ifdef WIN32
+ status = spawnvp( mode, filename, ( const char ** )argv );
+#else
+ if (( child = fork() ) == -1 )
+ {
+ //Error
+ status = -1 ;
+ }
+ else if ( child == 0 )
+ {
+ execvp( filename, ( const char ** )argv );
+ exit(-1);
+ }
+ else
+ {
+ /* father */
+ switch ( mode )
+ {
+ case _P_WAIT:
+ if ( waitpid( child, &status, WUNTRACED ) != child )
+ status = -1;
+ else
+ status = (int)(char)WEXITSTATUS(status);
+ break;
+
+ case _P_NOWAIT:
+ status = child;
+ break;
+ }
+ }
+#endif
+
+ // Free resources
+ string_discard( params[1] );
+ if ( argv ) free( argv );
+
+ return ( status ) ;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int modsys_getenv( INSTANCE * my, int * params )
+{
+ char *e ;
+ int str ;
+
+ if (( e = getenv( string_get( params[0] ) ) ) )
+ {
+ str = string_new( e ) ;
+ }
+ else
+ {
+ str = string_new( "" ) ;
+ }
+
+ string_discard( params[0] ) ;
+ string_use( str ) ;
+ return str ;
+}
+
+/* ----------------------------------------------------------------- */
+/* exports */
+/* ----------------------------------------------------------------- */
+
+#include "mod_sys_exports.h"
+
+/* ----------------------------------------------------------------- */