"Fossies" - the Fresh Open Source Software Archive 
Member "rman-3.2/contrib/http-rman.c" (26 Jul 2003, 4978 Bytes) of package /linux/www/old/rman-3.2.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "http-rman.c" see the
Fossies "Dox" file reference documentation.
1 /* $Id: http-rman.c,v 1.2 1994/05/15 14:55:12 fredrik Exp $
2 *
3 * Name:
4 * http-rman.c -- a rudimentary man-page HTTP server
5 *
6 * Description:
7 * This is a minimal HTTP server using RosettaMan by T.A. Phelps
8 * (phelps@ACM.org) to produce hypertext renditions
9 * of man-pages on the fly.
10 *
11 * This server processes URLs with the following syntax:
12 *
13 * [/man] ?<command> [ ?<section> ]
14 *
15 * For URLs matching this format, it pipes the output of
16 * man <section> <command> through rman and sends it to
17 * the HTTP client. For other URLs, it returns the document
18 * given as argv[1] (using cat(1). The leading /man is
19 * optional, but is strongly recommended.
20 *
21 * This server is shipped as two files, the http-rman.c
22 * sources and the http-rman.html sample frontpage. I have
23 * not included a Makefile; you can write your own or just
24 * type [g]cc -o http-rman http-rman.c
25 *
26 * What do I need to run this:
27 * If you don't have it, pick up RosettaMan by anonymous ftp
28 * from ftp.cs.berkeley.edu: /ucb/people/phelps/tcl/rman.tar.Z
29 *
30 * You'll also need an HTTP client such as NCSA Mosaic to talk
31 * to this server. Mosaic is available by anonymous FTP from
32 * ftp://ftp.ncsa.uiuc.edu/Mosaic
33 *
34 * Both RosettaMan (rman) and Mosaic are available from many
35 * other sites. Try Archie, or check your local or national net
36 * archive.
37 *
38 * How do I get it running:
39 * First, compile the server (see above), and install it
40 * somewhere.
41 *
42 * The server runs under inetd(8). Add a service to
43 * /etc/services, say:
44 *
45 * http-rman 4080/tcp
46 *
47 * If you're not about to install another HTTP server on your
48 * machine, you may use the default HTTP port, 80, instead.
49 *
50 * Then add an entry to /etc/inetd.conf, such as (on a single line):
51 *
52 * http-rman stream tcp nowait root /usr/local/bin/http-rman
53 * http-rman /usr/local/lib/rman/http-rman.html
54 *
55 * Change /usr/local/bin and /usr/local/lib/rman to where you
56 * installed the two files. In addition, you may wish to run
57 * the server as something other than root...
58 *
59 * Restart inetd(8) (use kill -HUP or kill it and start it again)
60 * and try the following:
61 *
62 * $ Mosaic http://localhost:4080
63 *
64 * If you don't have Mosaic, try the following instead:
65 *
66 * $ telnet localhost 4080
67 * Trying 127.0.0.1...
68 * Connected to localhost.
69 * Escape character is '^]'.
70 * GET /man?ls <return>
71 * <return>
72 * HTTP/1.0 200 OK
73 * ...
74 *
75 * Portability:
76 * You'll need an ANSI compiler (or an editor and some patience).
77 * As it stands right now, this code has been successfully
78 * compiled on OSF/1 AXP using cc, and on SunOS 4.1 using gcc.
79 * Might need some tuning for other platforms.
80 *
81 * Legal Issues:
82 * Check the external visibility of the http-rman service
83 * you choose. This server gives a user access to ALL man-
84 * pages on your machine. You may have installed copyrighted
85 * software (your operating system, for example) with
86 * man-pages that you are NOT allowed to make visible for
87 * anyone out there...
88 *
89 * History:
90 * 94-04-30 fl: created
91 * 94-05-13 fl: stripped away everything but rman support
92 *
93 * Copyright (c) Fredrik Lundh 1994 (fredrik_lundh@ivab.se)
94 * All rights reserved.
95 */
96
97
98 #include <stdio.h> /* printf(), fflush(stdio) etc */
99 #include <string.h> /* strrchr(), strcmp() etc */
100
101
102 static int
103 http_error(int error)
104 {
105 char *p;
106
107 switch (error) {
108 case 400:
109 p = "Bad Request";
110 break;
111 case 404:
112 p = "Not Found";
113 break;
114 default:
115 p = "Error";
116 }
117 printf("HTTP/1.0 %d %s\r\n", error, p);
118 printf("MIME-version: 1.0\r\n");
119 printf("Content-Type: text/html\r\n\r\n");
120 printf("<head><title>%d %s</title></head>\r\n", error, p);
121 printf("<body><h1>%d %s</h1></body>\r\n", error, p);
122 return 0;
123 }
124
125
126 static int
127 http_rman(char *url)
128 {
129 char *pName;
130 char *pSection;
131 char buf[200];
132
133 /* parse URL: should be /man?command[?section] */
134 pSection = strrchr(url, '?');
135 if (!pSection) {
136 return -1;
137 }
138 pName = pSection-1;
139 *pSection++ = '\0';
140
141 pName = strrchr(url, '?');
142 if (!pName) {
143 pName = pSection;
144 pSection = "";
145 }
146 else
147 pName++;
148
149 sprintf(buf, "man %s %s | rman -r \"man?%%s?%%s\" -n %s -f html",
150 pSection, pName, pName);
151
152 return system(buf);
153 }
154
155
156 int
157 main(int ac, char **av)
158 {
159 char buf[200];
160 char url[200];
161 int status;
162 char *sFrontpage = "/usr/local/lib/rman/http-rman.html";
163
164 /* check arguments */
165
166 if (ac > 1)
167 sFrontpage = av[1];
168
169 /* just read in one line from stdin and make sure it is a GET
170 command */
171
172 if (gets(buf)) {
173
174 /* read rest of command (just for the sake of it) */
175 while (gets(url) && url[0] != '\r')
176 ;
177
178 /* command should be GET <url> [HTTP/1.0] */
179 if (sscanf(buf, "GET %s", url) == 1) {
180
181 status = http_rman(url);
182
183 if (status < 0) {
184 sprintf(buf, "cat %s", sFrontpage);
185 if (system(buf) == 0)
186 status = 0;
187 }
188
189 if (status < 0)
190 http_error(404);
191
192 } else
193
194 http_error(400);
195 }
196
197 fflush(stdout);
198
199 exit(0);
200 }