diff options
Diffstat (limited to 'nx-X11/extras/rman/contrib/http-rman.c')
-rw-r--r-- | nx-X11/extras/rman/contrib/http-rman.c | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/nx-X11/extras/rman/contrib/http-rman.c b/nx-X11/extras/rman/contrib/http-rman.c new file mode 100644 index 000000000..687a8fc36 --- /dev/null +++ b/nx-X11/extras/rman/contrib/http-rman.c @@ -0,0 +1,200 @@ +/* $Id: http-rman.c,v 1.1.1.4 2004/03/14 08:29:12 eich Exp $ + * + * Name: + * http-rman.c -- a rudimentary man-page HTTP server + * + * Description: + * This is a minimal HTTP server using RosettaMan by T.A. Phelps + * (phelps@ACM.org) to produce hypertext renditions + * of man-pages on the fly. + * + * This server processes URLs with the following syntax: + * + * [/man] ?<command> [ ?<section> ] + * + * For URLs matching this format, it pipes the output of + * man <section> <command> through rman and sends it to + * the HTTP client. For other URLs, it returns the document + * given as argv[1] (using cat(1). The leading /man is + * optional, but is strongly recommended. + * + * This server is shipped as two files, the http-rman.c + * sources and the http-rman.html sample frontpage. I have + * not included a Makefile; you can write your own or just + * type [g]cc -o http-rman http-rman.c + * + * What do I need to run this: + * If you don't have it, pick up RosettaMan by anonymous ftp + * from ftp.cs.berkeley.edu: /ucb/people/phelps/tcl/rman.tar.Z + * + * You'll also need an HTTP client such as NCSA Mosaic to talk + * to this server. Mosaic is available by anonymous FTP from + * ftp://ftp.ncsa.uiuc.edu/Mosaic + * + * Both RosettaMan (rman) and Mosaic are available from many + * other sites. Try Archie, or check your local or national net + * archive. + * + * How do I get it running: + * First, compile the server (see above), and install it + * somewhere. + * + * The server runs under inetd(8). Add a service to + * /etc/services, say: + * + * http-rman 4080/tcp + * + * If you're not about to install another HTTP server on your + * machine, you may use the default HTTP port, 80, instead. + * + * Then add an entry to /etc/inetd.conf, such as (on a single line): + * + * http-rman stream tcp nowait root /usr/local/bin/http-rman + * http-rman /usr/local/lib/rman/http-rman.html + * + * Change /usr/local/bin and /usr/local/lib/rman to where you + * installed the two files. In addition, you may wish to run + * the server as something other than root... + * + * Restart inetd(8) (use kill -HUP or kill it and start it again) + * and try the following: + * + * $ Mosaic http://localhost:4080 + * + * If you don't have Mosaic, try the following instead: + * + * $ telnet localhost 4080 + * Trying 127.0.0.1... + * Connected to localhost. + * Escape character is '^]'. + * GET /man?ls <return> + * <return> + * HTTP/1.0 200 OK + * ... + * + * Portability: + * You'll need an ANSI compiler (or an editor and some patience). + * As it stands right now, this code has been successfully + * compiled on OSF/1 AXP using cc, and on SunOS 4.1 using gcc. + * Might need some tuning for other platforms. + * + * Legal Issues: + * Check the external visibility of the http-rman service + * you choose. This server gives a user access to ALL man- + * pages on your machine. You may have installed copyrighted + * software (your operating system, for example) with + * man-pages that you are NOT allowed to make visible for + * anyone out there... + * + * History: + * 94-04-30 fl: created + * 94-05-13 fl: stripped away everything but rman support + * + * Copyright (c) Fredrik Lundh 1994 (fredrik_lundh@ivab.se) + * All rights reserved. + */ + + +#include <stdio.h> /* printf(), fflush(stdio) etc */ +#include <string.h> /* strrchr(), strcmp() etc */ + + +static int +http_error(int error) +{ + char *p; + + switch (error) { + case 400: + p = "Bad Request"; + break; + case 404: + p = "Not Found"; + break; + default: + p = "Error"; + } + printf("HTTP/1.0 %d %s\r\n", error, p); + printf("MIME-version: 1.0\r\n"); + printf("Content-Type: text/html\r\n\r\n"); + printf("<head><title>%d %s</title></head>\r\n", error, p); + printf("<body><h1>%d %s</h1></body>\r\n", error, p); + return 0; +} + + +static int +http_rman(char *url) +{ + char *pName; + char *pSection; + char buf[200]; + + /* parse URL: should be /man?command[?section] */ + pSection = strrchr(url, '?'); + if (!pSection) { + return -1; + } + pName = pSection-1; + *pSection++ = '\0'; + + pName = strrchr(url, '?'); + if (!pName) { + pName = pSection; + pSection = ""; + } + else + pName++; + + sprintf(buf, "man %s %s | rman -r \"man?%%s?%%s\" -n %s -f html", + pSection, pName, pName); + + return system(buf); +} + + +int +main(int ac, char **av) +{ + char buf[200]; + char url[200]; + int status; + char *sFrontpage = "/usr/local/lib/rman/http-rman.html"; + +/* check arguments */ + + if (ac > 1) + sFrontpage = av[1]; + +/* just read in one line from stdin and make sure it is a GET +command */ + + if (gets(buf)) { + + /* read rest of command (just for the sake of it) */ + while (gets(url) && url[0] != '\r') + ; + + /* command should be GET <url> [HTTP/1.0] */ + if (sscanf(buf, "GET %s", url) == 1) { + + status = http_rman(url); + + if (status < 0) { + sprintf(buf, "cat %s", sFrontpage); + if (system(buf) == 0) + status = 0; + } + + if (status < 0) + http_error(404); + + } else + + http_error(400); + } + + fflush(stdout); + + exit(0); +} |