Added the `httrcall' program.
authorFredrik Tolf <fredrik@dolda2000.com>
Thu, 13 Feb 2014 02:29:44 +0000 (03:29 +0100)
committerFredrik Tolf <fredrik@dolda2000.com>
Thu, 13 Feb 2014 02:29:44 +0000 (03:29 +0100)
src/.gitignore
src/Makefile.am
src/httrcall.c [new file with mode: 0644]

index 582f3e7..1ecc66e 100644 (file)
@@ -12,3 +12,4 @@
 /errlogger
 /psendfile
 /httimed
+/httrcall
index 5c4f895..5422e74 100644 (file)
@@ -2,7 +2,7 @@ SUBDIRS = dirplex
 
 bin_PROGRAMS = htparser sendfile callcgi patplex userplex htls \
                callscgi accesslog htextauth callfcgi multifscgi \
-               errlogger httimed psendfile
+               errlogger httimed psendfile httrcall
 
 htparser_SOURCES = htparser.c htparser.h plaintcp.c ssl-gnutls.c
 
diff --git a/src/httrcall.c b/src/httrcall.c
new file mode 100644 (file)
index 0000000..0d7d845
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+    ashd - A Sane HTTP Daemon
+    Copyright (C) 2008  Fredrik Tolf <fredrik@dolda2000.com>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <signal.h>
+#include <sys/wait.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <utils.h>
+#include <log.h>
+#include <req.h>
+#include <proc.h>
+#include <resp.h>
+
+static char **prog;
+
+static void serve(struct hthead *req, int fd)
+{
+    if(stdforkserve(prog, req, fd, NULL, NULL) < 0)
+       simpleerror(fd, 500, "Server Error", "The server appears to be overloaded.");
+}
+
+static void chldhandler(int sig)
+{
+    pid_t pid;
+    int st;
+    
+    while((pid = waitpid(-1, &st, WNOHANG)) > 0) {
+       if(WCOREDUMP(st))
+           flog(LOG_WARNING, "child process %i dumped core", pid);
+    }
+}
+
+static void usage(FILE *out)
+{
+    fprintf(out, "usage: httrcall [-h] PROGRAM [ARGS...]\n");
+}
+
+int main(int argc, char **argv)
+{
+    int c;
+    struct hthead *req;
+    int fd;
+    
+    while((c = getopt(argc, argv, "+h")) >= 0) {
+       switch(c) {
+       case 'h':
+           usage(stdout);
+           exit(0);
+       default:
+           usage(stderr);
+           exit(1);
+       }
+    }
+    if(argc < optind - 1) {
+       usage(stderr);
+       exit(1);
+    }
+    prog = argv + optind;
+    signal(SIGCHLD, chldhandler);
+    while(1) {
+       if((fd = recvreq(0, &req)) < 0) {
+           if(errno == EINTR)
+               continue;
+           if(errno != 0)
+               flog(LOG_ERR, "recvreq: %s", strerror(errno));
+           break;
+       }
+       serve(req, fd);
+       freehthead(req);
+       close(fd);
+    }
+    return(0);
+}