Simplified.
On Sat, Mar 01, 2014 at 02:27:44PM -0500, James Turner wrote:
> So I wanted to test out nginx and slowcgi. I started everything up and
> hit up localhost/cgi-bin/test-cgi. Whoops forgot to move /bin/sh into
> the chroot. Try again, shit forgot to chmod 555 test-cgi.
>
> I was complaining on IRC and tbert suggested I write a simple statically
> linked testcgi.c so people can easily verify cgi is up and working.
>
> That is what is attached. It just prints out the environment like
> test-cgi and printenv but is statically linked and doesn't require
> anything to be copied into the chroot. Also it's 555 by default so it
> just works. Is this so bad?
>
> The BINDIR is set since I have no idea where in /usr/src this should
> live or if this is even anything we want in source but here it is for
> those who don't want to mess around with moving things into the www
> chroot and just want to verify cgi (slowcgi in my case) is working.
>
> Tested with both nginx + slowcgi and httpd.
>
--
James Turner
diff -u -p -N Makefile Makefile
--- Makefile Wed Dec 31 19:00:00 1969
+++ Makefile Sat Mar 1 14:06:39 2014
@@ -0,0 +1,7 @@
+PROG= testcgi
+SRCS= testcgi.c
+LDSTATIC= -static
+NOMAN= 1
+BINDIR= /var/www/cgi-bin
+
+.include <bsd.prog.mk>
diff -u -p -N testcgi.c testcgi.c
--- testcgi.c Wed Dec 31 19:00:00 1969
+++ testcgi.c Sat Mar 1 14:41:15 2014
@@ -0,0 +1,43 @@
+/*
+ * This is free and unencumbered software released into the public domain.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+static void
+printenv(char *name)
+{
+ char *env;
+
+ if ((env = getenv(name)) == NULL)
+ env = "";
+
+ printf("%s = %s\n", name, env);
+}
+
+int
+main(void)
+{
+ printf("Content-type: text/plain\r\n\r\n");
+ printf("CGI/1.1 test script report:\n\n");
+
+ printenv("GATEWAY_INTERFACE");
+ printenv("SERVER_SOFTWARE");
+ printenv("SERVER_PROTOCOL");
+ printenv("SERVER_NAME");
+ printenv("SERVER_ADDR");
+ printenv("SERVER_PORT");
+ printenv("REQUEST_METHOD");
+ printenv("HTTP_ACCEPT");
+ printenv("SCRIPT_NAME");
+ printenv("REQUEST_URI");
+ printenv("PATH_INFO");
+ printenv("QUERY_STRING");
+ printenv("REMOTE_ADDR");
+ printenv("REMOTE_PORT");
+ printenv("CONTENT_TYPE");
+ printenv("CONTENT_LENGTH");
+
+ return (0);
+}