]> sipb.mit.edu Git - snippets/.git/commitdiff
gccrun: Run tiny programs from the command line.
authorGeoffrey Thomas <geofft@mit.edu>
Mon, 23 Aug 2010 09:59:41 +0000 (05:59 -0400)
committerGeoffrey Thomas <geofft@mit.edu>
Mon, 23 Aug 2010 10:02:23 +0000 (06:02 -0400)
e.g.,
dr-wily:~ geofft$ gccrun 'printf("Hello world!\n");'
Hello world!

See http://geofft.mit.edu/blog/sipb/132 for a bit more info.

Signed-off-by: Geoffrey Thomas <geofft@mit.edu>
programming/gccrun [new file with mode: 0755]

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