]> snippets.scripts.mit.edu Git - Scripts/git/.git/blobdiff - programming/gccrun
gccrun: Run tiny programs from the command line.
[Scripts/git/.git] / programming / gccrun
diff --git a/programming/gccrun b/programming/gccrun
new file mode 100755 (executable)
index 0000000..55e6b68
--- /dev/null
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+if [ "$#" = 0 ]; then
+    echo "usage: $0 [-w wrapper] <C code...>" >&2
+    exit 1
+fi
+
+if [ "$1" = -w ]; then
+    wrapper="$2"
+    shift 2
+fi
+
+f=$(mktemp -d -t gccrun.XXXXXXXX) || exit 1
+cat > "$f/command.c" << EOF
+#define _GNU_SOURCE
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <sys/ptrace.h>
+#include <sys/syscall.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+int
+main(int argc, char *argv[], char *envp[])
+{
+       $@;
+       return 0;
+}
+EOF
+if ! gcc -o "$f/command" "$f/command.c"; then
+    exit 1
+fi
+if [ -n "$wrapper" ]; then
+    "$wrapper" "$f/command"
+else
+    "$f/command"
+fi
+r=$?
+rm -r "$f"
+exit $r