Introduction
Introduction Statistics Contact Development Disclaimer Help
libgcgi.3 - libgcgi - REST library for Gopher
git clone git://bitreich.org/libgcgi/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinw…
Log
Files
Refs
Tags
README
LICENSE
---
libgcgi.3 (7912B)
---
1 .Dd $Mdocdate: August 01 2022 $
2 .Dt LIBGCGI 3
3 .Os
4 .
5 .
6 .Sh NAME
7 .
8 .Nm gcgi_handle_request ,
9 .Nm gcgi_fatal ,
10 .Nm gcgi_template ,
11 .Nm gcgi_set_var ,
12 .Nm gcgi_get_var ,
13 .Nm gcgi_free_var_list ,
14 .Nm gcgi_read_var_list ,
15 .Nm gcgi_write_var_list ,
16 .Nm gcgi_gopher_search ,
17 .Nm gcgi_gopher_path ,
18 .Nm gcgi_gopher_query ,
19 .Nm gcgi_gopher_host ,
20 .Nm gcgi_gopher_port ,
21 .Nd REST library for Gopher
22 .
23 .
24 .Sh SYNOPSIS
25 .
26 .In libgcgi.h
27 .
28 .Ft "void" Fn gcgi_handle_request "struct gcgi_handler h[]" "char **argv…
29 .Ft "void" Fn gcgi_fatal "char *fmt" "..."
30 .Ft "void" Fn gcgi_template "char const *path" "struct gcgi_var_list *va…
31 .Ft "void" Fn gcgi_set_var "struct gcgi_var_list *vars" "char *key" "cha…
32 .Ft "char *" Fn gcgi_get_var "struct gcgi_var_list *vars" "char *key"
33 .Ft "void" Fn gcgi_free_var_list "struct gcgi_var_list *vars"
34 .Ft "void" Fn gcgi_read_var_list "struct gcgi_var_list *vars" "char *pat…
35 .Ft "int" Fn gcgi_write_var_list "struct gcgi_var_list *vars" "char *pat…
36 .Vt char *gcgi_gopher_search
37 .Vt char *gcgi_gopher_path
38 .Vt char *gcgi_gopher_host
39 .Vt char *gcgi_gopher_port
40 .Vt struct gcgi_var_list gcgi_gopher_query
41 .
42 .
43 .Sh DESCRIPTION
44 .
45 This library is a C wrapper around the
46 .Xr geomyidae 8
47 new CGI interface, which permits REST applications to be written for Gop…
48 In this mode,
49 .Xr geomyidae 8
50 directs all requests to a single binary in charge of handling all paths,
51 rather than trying to serve a file.
52 .
53 .
54 .Ss Request Handling
55 .
56 The central element of the library is an array of structures,
57 using appropriate handler depending on the query path.
58 .Pp
59 .Bd -literal
60 struct gcgi_handler {
61 char const *glob;
62 void (*fn)(char **matches);
63 };
64 .Ed
65 .
66 .Pp
67 The
68 .Vt glob
69 is a string against which the path (everything in the query before the
70 .Dq "?" )
71 will be matched against.
72 .Pp
73 The
74 .Vt fn
75 function pointer will be called, with an array of matches passed as argu…
76 There are as many matches populated as there are
77 .Dq "*"
78 in
79 .Vt glob .
80 .
81 .Pp
82 .Bl -tag
83 .
84 .It Ft "void" Fn gcgi_handle_request "struct gcgi_handler h[]" "int argc…
85 Given an array of handlers
86 .Fa h ,
87 call the first function pointer that matches.
88 .Fa argc
89 and
90 .Fa argv
91 should be set to the program ones to extract the arguments given by
92 .Xr geomyidae 8 .
93 The
94 .Fa h
95 struct is an array of
96 .Vt struct gcgi_handler :
97 .
98 .El
99 .
100 .
101 .Ss Content Generation
102 .
103 According to
104 .Xr geomyidae 8
105 behavior, the output format will be:
106 .Bl -bullet -compact -width 1n
107 .
108 .It
109 a raw gophermap if the binary is
110 .Dq index.cgi ,
111 .It
112 a
113 .Xr geomyidae 8
114 .Sq gph
115 format if the binary is
116 .Dq index.dcgi .
117 .El
118 .
119 .Pp
120 .Bl -tag
121 .
122 .It Ft "void" Fn gcgi_fatal "char *fmt" "..."
123 Prints an error message formatted by
124 .Fa fmt
125 and
126 .Xr exit 3
127 the program with status 1.
128 .
129 .It Ft "void" Fn gcgi_template "char const *path" "struct gcgi_var_list …
130 Format the template at
131 .Fa path
132 replacing every occurence of
133 .Dq {{key}}
134 by the matching value by searching in
135 .Fa vars .
136 .
137 .It Vt void Fn gcgi_print_gophermap "char type" "char *desc" "char *path…
138 Print a gophermap entry line with
139 .Fa type ,
140 .Fa desc ,
141 .Fa path ,
142 .Fa host ,
143 .Fa port
144 to be set to the chosen value as described in RFC 1436.
145 Both
146 .Fa host
147 and
148 .Fa port
149 are NULL, default values will be used.
150
151 .It Ft void Fn gcgi_print_gph "char type" "char *desc" "char *path" "cha…
152 Print a gph entry line with
153 .Fa type ,
154 .Fa desc ,
155 .Fa path ,
156 .Fa host ,
157 .Fa port
158 to be set to the chosen value as described in
159 .Xr geomyidae 8
160 manual page.
161 If
162 .Fa host
163 or
164 .Fa port
165 are NULL, default values will be used.
166 .
167 .El
168 .
169 .
170 .Ss Variable List Handling
171 .
172 A common data format is used for handling lists of variables:
173 .Bl -bullet -compact -width 1n
174 .It
175 For parsing a simple text-based database format and writing it back.
176 .It
177 For storing the parsed query string in
178 .Vt gcgi_gopher_query .
179 .It
180 For passing variables to expand in the templates.
181 .El
182 .
183 .Pp
184 .Bl -tag
185 .
186 .It Ft "void" Fn gcgi_set_var "struct gcgi_var_list *vars" "char *key" "…
187 Overwrite with
188 .Fa val
189 the value of a variable matching
190 .Fa key
191 of
192 .Fa vars .
193 The
194 .Fa key
195 and
196 .Fa val
197 buffers are not duplicated, and must remain valid at all time they need …
198 accessible, such as through
199 .Fn gcgi_get_var .
200 .
201 .It Ft "char *" Fn gcgi_get_var "struct gcgi_var_list *vars" "char *key"
202 Get the value of the variable of
203 .Fa vars
204 matching
205 .Fa key
206 or NULL if none match.
207 .
208 .It Ft "void" Fn gcgi_free_var_list "struct gcgi_var_list *vars"
209 Free memory used by a list of variable.
210 This only frees the memory allocated by this library.
211 .
212 .It Ft "void" Fn gcgi_read_var_list "struct gcgi_var_list *vars" "char *…
213 Store all variables from
214 .Fa path
215 onto variables in
216 .Fa vars .
217 The file format is similar to RFC822 messages or HTTP headers:
218 .Bl -bullet -compact -width 1n
219 .It
220 One line per variable, with a key=value format.
221 .It
222 The key is everything at the beginning of the line until the occurence of
223 .Dq ":" .
224 .It
225 The value is everything after
226 .Dq ": " .
227 .It
228 After the list of variables, an empty line declares the body of the mess…
229 which continues until the end and is stored in a
230 .Dq text
231 key.
232 .El
233 .
234 .It Ft "int" Fn gcgi_write_var_list "struct gcgi_var_list *vars" "char *…
235 Encode the variable list
236 .Fa vars
237 into a new file at
238 .Fa path .
239 A temporary file will be created in the meantime,
240 and the replacement will be atomic so that no partial write can occur.
241 The
242 .Dq text
243 special key will be turned into the body of the message after an empty l…
244 instead of a variable on its own line.
245 .
246 .El
247 .
248 .
249 .Ss Global Variables
250 .
251 These variables are filled with the components of the query.
252 They will only be valid after
253 .Fn handle_request
254 is called.
255 .
256 .Pp
257 .Bl -tag
258 .
259 .It Vt char *gcgi_gopher_search
260 From argv[1], this is the search string, passed after a tab in
261 the gopher protocol for item type
262 .Dq 7 .
263 .
264 .It Vt char *gcgi_gopher_path
265 From argv[2], this is the query path.
266 It is the full query without the search string and with the query string…
267 .
268 .It Vt struct gcgi_var_list gcgi_gopher_query
269 From argv[2], this is the query string stored as a key-value
270 .Vt gcgi_var_list .
271 It is extracted from the part of the query after the
272 .Dq ? ,
273 usually formated as
274 .Dq ?key1=value1&key2=value2&key3=value3
275 .
276 .It Vt char *gcgi_gopher_host
277 From argv[3], this is the current host name configured in
278 .Xr geomyidae 8 .
279 It is what to use as a
280 .Sq host
281 in links printed out.
282 .
283 .It Vt char *gcgi_gopher_port
284 From argv[4], this is the current port number configured in
285 .Xr geomyidae 8 .
286 It is what to use as a
287 .Sq port
288 in links printed out.
289 .
290 .El
291 .
292 .
293 .Sh EXAMPLES
294 .
295 .
296 .Bd -literal
297 #include "libgcgi.h"
298
299 /* implementation of each handler here */
300
301 static struct gcgi_handler handlers[] = {
302 { "/", page_home },
303 { "/song", page_song_list },
304 { "/song/*", page_song_item },
305 { "*", page_not_found },
306 { NULL, NULL },
307 };
308
309 int
310 main(int argc, char **argv)
311 {
312 /* privilege dropping, chroot and/or syscall restriction here */
313
314 gcgi_handle_request(handlers, argv, argc);
315 return 0;
316 }
317 .Ed
318 .
319 .
320 .Sh ENVIRONMENT VARIABLES
321 .
322 .Nm libgcgi
323 does not use environment variable, but the application code can make use…
324 The environment variables applied to
325 .Xr geomyidae 8
326 will be inherited and accessible.
327 .
328 .
329 .Sh BUGS
330 .
331 To debug
332 .Nm libgcgi ,
333 it is possible to call it on a command line, which will show all logging…
334 .
335 .Bd -literal
336 $ ./index.cgi "" "/song/never-bored-of-adventure?lyrics=1&comments=1" ""…
337 .Ed
338 .
339 .
340 .Sh CAVEATS
341 .
342 The Gopher protocol is not designed for file upload.
343 A dedicated file upload protocol such as SFTP or FTP may be used instead.
344 .
345 .Pp
346 The Gopher protocol is not designed for dynamic scripting.
347 A dedicated remote interface protocol such as SSH or telnet may be used …
348 .
349 .
350 .Sh SEE ALSO
351 .
352 .Xr geomyidae 8
353 .
354 .
355 .Sh AUTHORS
356 .
357 .Bl -ohang -compact
358 .It
359 .An Josuah Demangeon Aq Mt [email protected]
360 .It
361 .Lk "The Bitreich Project" gopher://bitreich.org
362 .El
You are viewing proxied material from bitreich.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.