allow the template system to work as a standalone system or under CGI
authortridge <>
Thu, 10 Jan 2002 17:29:27 +0000 (17:29 +0000)
committertridge <>
Thu, 10 Jan 2002 17:29:27 +0000 (17:29 +0000)
tserver/Makefile
tserver/cgi.c
tserver/template_main.c

index 64218a5..c77899a 100644 (file)
@@ -16,7 +16,7 @@ tserver: $(OBJS)
        @$(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS)
        @strip $@
 
-template: template.o template_main.o util.o
+template: template.o template_main.o util.o cgi.o
        @echo Linking $@
        @$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
 
index 4888f42..53d5e28 100644 (file)
@@ -392,16 +392,43 @@ static void download(struct cgi_state *cgi, const char *path)
        }
 }
 
-/*
-  read and parse the http request
- */
-static int setup(struct cgi_state *cgi)
+
+/* we're running under a web server as cgi */
+static int setup_cgi(struct cgi_state *cgi)
+{
+       char *p;
+
+       if ((p = getenv("CONTENT_LENGTH"))) {
+               cgi->content_length = atoi(p);
+       }
+       if ((p = getenv("REQUEST_METHOD"))) {
+               cgi->got_request = 1;
+               if (strcasecmp(p, "POST") == 0) {
+                       cgi->request_post = 1;
+               }
+       }
+       if ((p = getenv("QUERY_STRING"))) {
+               cgi->query_string = strdup(p);
+       }
+       if ((p = getenv("SCRIPT_NAME"))) {
+               cgi->url = strdup(p);
+               cgi->pathinfo = cgi->url;
+       }
+       if ((p = getenv("CONTENT_TYPE"))) {
+               cgi->content_type = strdup(p);
+       }
+       return 0;
+}
+
+
+
+/* we are a mini-web server. We need to read the request from stdin */
+static int setup_standalone(struct cgi_state *cgi)
 {
        char line[1024];
        char *url=NULL;
        char *p;
 
-       /* we are a mini-web server. We need to read the request from stdin */
        while (fgets(line, sizeof(line)-1, stdin)) {
                trim_tail(line, CRLF);
                if (line[0] == 0) break;
@@ -442,12 +469,26 @@ static int setup(struct cgi_state *cgi)
        }
 
        cgi->url = url;
-
        cgi->pathinfo = url;
+       return 0;
+}
+
+/*
+  read and parse the http request
+ */
+static int setup(struct cgi_state *cgi)
+{
+       int ret;
 
-       while (*cgi->pathinfo == '/') cgi->pathinfo++;
+       if (getenv("GATEWAY_INTERFACE")) {
+               ret = setup_cgi(cgi);
+       } else {
+               ret = setup_standalone(cgi);
+       }
 
-       return 0;
+       while (cgi->pathinfo && *cgi->pathinfo == '/') cgi->pathinfo++;
+
+       return ret;
 }
 
 /*
index f5f1edb..d11fd7b 100644 (file)
 /* a simple program that allows template to be used as a scripting system */
 #include "includes.h"
 
+static void usage(void)
+{
+       puts("
+template [options] <files>
+
+Options:
+  -c     run as a cgi script
+  -h show help
+");
+}
+
 int main(int argc, char *argv[])
 {
-       struct template_state *tmpl;
+       struct cgi_state *cgi;
+       extern char *optarg;
+       int opt;
+       int use_cgi = 0;
 
-       tmpl = template_init();
+       while ((opt = getopt(argc, argv, "ch")) != -1) {
+               switch (opt) {
+               case 'c':
+                       use_cgi = 1;
+                       break;
+               case 'h':
+                       usage();
+                       exit(1);
+               }
+       }
+
+       cgi = cgi_init();
+
+       if (use_cgi) {
+               cgi->setup(cgi);
+               cgi->load_variables(cgi);
+       }
        
        if (argc > 1) {
                int i;
                for (i=1; i<argc; i++) {
-                       tmpl->process(tmpl, argv[i]);
+                       cgi->tmpl->process(cgi->tmpl, argv[i]);
                }
        } else {
-               tmpl->process(tmpl, "/proc/self/fd/0");
+               /* this allows us to work as a shell script */
+               cgi->tmpl->process(cgi->tmpl, "/proc/self/fd/0");
        }
 
        return 0;