SMOLNET PORTAL home about changes
iconvert tab to space in README - libgcgi - REST library for Gopher	Err	bitreich.org	70
hgit clone git://bitreich.org/libgcgi git://hg6vgqziawt5s4dj.onion/libgcgi	URL:git://bitreich.org/libgcgi git://hg6vgqziawt5s4dj.onion/libgcgi	bitreich.org	70
1Log	/scm/libgcgi/log.gph	bitreich.org	70
1Files	/scm/libgcgi/files.gph	bitreich.org	70
1Refs	/scm/libgcgi/refs.gph	bitreich.org	70
1Tags	/scm/libgcgi/tag	bitreich.org	70
1README	/scm/libgcgi/file/README.gph	bitreich.org	70
1LICENSE	/scm/libgcgi/file/LICENSE.gph	bitreich.org	70
i---	Err	bitreich.org	70
1commit 7a737dac78b68760118454337c2caeb6906fd90c	/scm/libgcgi/commit/7a737dac78b68760118454337c2caeb6906fd90c.gph	bitreich.org	70
1parent b3f118ffbf6488c5e8897be2fa8e225d5149c394	/scm/libgcgi/commit/b3f118ffbf6488c5e8897be2fa8e225d5149c394.gph	bitreich.org	70
hAuthor: Josuah Demangeon <me@josuah.net>	URL:mailto:me@josuah.net	bitreich.org	70
iDate:   Wed,  3 Aug 2022 23:59:08 +0200	Err	bitreich.org	70
i	Err	bitreich.org	70
iconvert tab to space in README	Err	bitreich.org	70
i	Err	bitreich.org	70
iDiffstat:	Err	bitreich.org	70
i  M Makefile                            |       2 +-	Err	bitreich.org	70
i  M README                              |     146 ++++++++++++++++----------------	Err	bitreich.org	70
i  M index.c                             |      15 +++++++++++++++	Err	bitreich.org	70
i	Err	bitreich.org	70
i3 files changed, 89 insertions(+), 74 deletions(-)	Err	bitreich.org	70
i---	Err	bitreich.org	70
1diff --git a/Makefile b/Makefile	/scm/libgcgi/file/Makefile.gph	bitreich.org	70
i@@ -8,7 +8,7 @@ clean:	Err	bitreich.org	70
i         rm -f *.o index.cgi	Err	bitreich.org	70
i 	Err	bitreich.org	70
i README: libgcgi.3	Err	bitreich.org	70
i-        mandoc -Tutf8 libgcgi.3 | col -b | sed '1h; $$g' >$@	Err	bitreich.org	70
i+        mandoc -Tutf8 libgcgi.3 | col -b | expand | sed '1h; $$g' >$@	Err	bitreich.org	70
i 	Err	bitreich.org	70
i index.cgi: index.c libgcgi.c libgcgi.h	Err	bitreich.org	70
i         ${CC} ${LDFLAGS} ${CFLAGS} -o $@ index.c libgcgi.c ${LIBS}	Err	bitreich.org	70
1diff --git a/README b/README	/scm/libgcgi/file/README.gph	bitreich.org	70
i@@ -1,4 +1,4 @@	Err	bitreich.org	70
i-LIBGCGI(3)                   Library Functions Manual                    LIBGCGI(3)	Err	bitreich.org	70
i+LIBGCGI(3)                 Library Functions Manual                 LIBGCGI(3)	Err	bitreich.org	70
i 	Err	bitreich.org	70
i NAME	Err	bitreich.org	70
i      gcgi_handle_request, gcgi_fatal, gcgi_template, gcgi_set_var,	Err	bitreich.org	70
i@@ -42,7 +42,7 @@ SYNOPSIS	Err	bitreich.org	70
i 	Err	bitreich.org	70
i DESCRIPTION	Err	bitreich.org	70
i      This library is a C wrapper around the geomyidae(8) new CGI interface,	Err	bitreich.org	70
i-     which permits REST applications to be written for Gopher.        In this mode,	Err	bitreich.org	70
i+     which permits REST applications to be written for Gopher.  In this mode,	Err	bitreich.org	70
i      geomyidae(8) directs all requests to a single binary in charge of	Err	bitreich.org	70
i      handling all paths, rather than trying to serve a file.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i@@ -51,8 +51,8 @@ DESCRIPTION	Err	bitreich.org	70
i      appropriate handler depending on the query path.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      struct gcgi_handler {	Err	bitreich.org	70
i-             char const *glob;	Err	bitreich.org	70
i-             void (*fn)(char **matches);	Err	bitreich.org	70
i+             char const *glob;	Err	bitreich.org	70
i+             void (*fn)(char **matches);	Err	bitreich.org	70
i      };	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      The glob is a string against which the path (everything in the query	Err	bitreich.org	70
i@@ -63,103 +63,103 @@ DESCRIPTION	Err	bitreich.org	70
i      glob.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      void gcgi_handle_request(struct gcgi_handler h[], int argc, char **argv)	Err	bitreich.org	70
i-             Given an array of handlers h, call the first function pointer	Err	bitreich.org	70
i-             that matches.  argc and argv should be set to the program ones to	Err	bitreich.org	70
i-             extract the arguments given by geomyidae(8).  The h struct is an	Err	bitreich.org	70
i-             array of struct gcgi_handler:	Err	bitreich.org	70
i+             Given an array of handlers h, call the first function pointer	Err	bitreich.org	70
i+             that matches.  argc and argv should be set to the program ones to	Err	bitreich.org	70
i+             extract the arguments given by geomyidae(8).  The h struct is an	Err	bitreich.org	70
i+             array of struct gcgi_handler:	Err	bitreich.org	70
i 	Err	bitreich.org	70
i    Content Generation	Err	bitreich.org	70
i      According to geomyidae(8) behavior, the output format will be:	Err	bitreich.org	70
i-     •        a raw gophermap if the binary is “index.cgi”,	Err	bitreich.org	70
i-     •        a geomyidae(8) ‘gph’ format if the binary is “index.dcgi”.	Err	bitreich.org	70
i+     •        a raw gophermap if the binary is “index.cgi”,	Err	bitreich.org	70
i+     •        a geomyidae(8) ‘gph’ format if the binary is “index.dcgi”.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      void gcgi_fatal(char *fmt, ...)	Err	bitreich.org	70
i-             Prints an error message formatted by fmt and exit(3) the program	Err	bitreich.org	70
i-             with status 1.	Err	bitreich.org	70
i+             Prints an error message formatted by fmt and exit(3) the program	Err	bitreich.org	70
i+             with status 1.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      void gcgi_template(char const *path, struct gcgi_var_list *vars)	Err	bitreich.org	70
i-             Format the template at path replacing every occurence of	Err	bitreich.org	70
i-             “{{key}}” by the matching value by searching in vars.	Err	bitreich.org	70
i+             Format the template at path replacing every occurence of	Err	bitreich.org	70
i+             “{{key}}” by the matching value by searching in vars.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      void gcgi_print_gophermap(char type, char *desc, char *path, char *host,	Err	bitreich.org	70
i-             char *port)	Err	bitreich.org	70
i-             Print a gophermap entry line with type, desc, path, host, port to	Err	bitreich.org	70
i-             be set to the chosen value as described in RFC 1436.  Both host	Err	bitreich.org	70
i-             and port are NULL, default values will be used.	Err	bitreich.org	70
i+             char *port)	Err	bitreich.org	70
i+             Print a gophermap entry line with type, desc, path, host, port to	Err	bitreich.org	70
i+             be set to the chosen value as described in RFC 1436.  Both host	Err	bitreich.org	70
i+             and port are NULL, default values will be used.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      void gcgi_print_gph(char type, char *desc, char *path, char *host, char	Err	bitreich.org	70
i-             *port)	Err	bitreich.org	70
i-             Print a gph entry line with type, desc, path, host, port to be	Err	bitreich.org	70
i-             set to the chosen value as described in geomyidae(8) manual page.	Err	bitreich.org	70
i-             If host or port are NULL, default values will be used.	Err	bitreich.org	70
i+             *port)	Err	bitreich.org	70
i+             Print a gph entry line with type, desc, path, host, port to be	Err	bitreich.org	70
i+             set to the chosen value as described in geomyidae(8) manual page.	Err	bitreich.org	70
i+             If host or port are NULL, default values will be used.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i    Variable List Handling	Err	bitreich.org	70
i      A common data format is used for handling lists of variables:	Err	bitreich.org	70
i-     •        For parsing a simple text-based database format and writing it back.	Err	bitreich.org	70
i-     •        For storing the parsed query string in gcgi_gopher_query.	Err	bitreich.org	70
i-     •        For passing variables to expand in the templates.	Err	bitreich.org	70
i+     •        For parsing a simple text-based database format and writing it back.	Err	bitreich.org	70
i+     •        For storing the parsed query string in gcgi_gopher_query.	Err	bitreich.org	70
i+     •        For passing variables to expand in the templates.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      void gcgi_set_var(struct gcgi_var_list *vars, char *key, char *val)	Err	bitreich.org	70
i-             Overwrite with val the value of a variable matching key of vars.	Err	bitreich.org	70
i-             The key and val buffers are not duplicated, and must remain valid	Err	bitreich.org	70
i-             at all time they need to be accessible, such as through	Err	bitreich.org	70
i-             gcgi_get_var().	Err	bitreich.org	70
i+             Overwrite with val the value of a variable matching key of vars.	Err	bitreich.org	70
i+             The key and val buffers are not duplicated, and must remain valid	Err	bitreich.org	70
i+             at all time they need to be accessible, such as through	Err	bitreich.org	70
i+             gcgi_get_var().	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      char * gcgi_get_var(struct gcgi_var_list *vars, char *key)	Err	bitreich.org	70
i-             Get the value of the variable of vars matching key or NULL if	Err	bitreich.org	70
i-             none match.	Err	bitreich.org	70
i+             Get the value of the variable of vars matching key or NULL if	Err	bitreich.org	70
i+             none match.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      void gcgi_free_var_list(struct gcgi_var_list *vars)	Err	bitreich.org	70
i-             Free memory used by a list of variable.  This only frees the	Err	bitreich.org	70
i-             memory allocated by this library.	Err	bitreich.org	70
i+             Free memory used by a list of variable.  This only frees the	Err	bitreich.org	70
i+             memory allocated by this library.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      void gcgi_read_var_list(struct gcgi_var_list *vars, char *path)	Err	bitreich.org	70
i-             Store all variables from path onto variables in vars.  The file	Err	bitreich.org	70
i-             format is similar to RFC822 messages or HTTP headers:	Err	bitreich.org	70
i-             •        One line per variable, with a key=value format.	Err	bitreich.org	70
i-             •        The key is everything at the beginning of the line until the	Err	bitreich.org	70
i-                occurence of “:”.	Err	bitreich.org	70
i-             •        The value is everything after “: ”.	Err	bitreich.org	70
i-             •        After the list of variables, an empty line declares the body	Err	bitreich.org	70
i-                of the message, which continues until the end and is stored in	Err	bitreich.org	70
i-                a “text” key.	Err	bitreich.org	70
i+             Store all variables from path onto variables in vars.  The file	Err	bitreich.org	70
i+             format is similar to RFC822 messages or HTTP headers:	Err	bitreich.org	70
i+             •        One line per variable, with a key=value format.	Err	bitreich.org	70
i+             •        The key is everything at the beginning of the line until the	Err	bitreich.org	70
i+                occurence of “:”.	Err	bitreich.org	70
i+             •        The value is everything after “: ”.	Err	bitreich.org	70
i+             •        After the list of variables, an empty line declares the body	Err	bitreich.org	70
i+                of the message, which continues until the end and is stored in	Err	bitreich.org	70
i+                a “text” key.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      int gcgi_write_var_list(struct gcgi_var_list *vars, char *path)	Err	bitreich.org	70
i-             Encode the variable list vars into a new file at path.  A	Err	bitreich.org	70
i-             temporary file will be created in the meantime, and the	Err	bitreich.org	70
i-             replacement will be atomic so that no partial write can occur.	Err	bitreich.org	70
i-             The “text” special key will be turned into the body of the	Err	bitreich.org	70
i-             message after an empty line instead of a variable on its own	Err	bitreich.org	70
i-             line.	Err	bitreich.org	70
i+             Encode the variable list vars into a new file at path.  A	Err	bitreich.org	70
i+             temporary file will be created in the meantime, and the	Err	bitreich.org	70
i+             replacement will be atomic so that no partial write can occur.	Err	bitreich.org	70
i+             The “text” special key will be turned into the body of the	Err	bitreich.org	70
i+             message after an empty line instead of a variable on its own	Err	bitreich.org	70
i+             line.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i    Global Variables	Err	bitreich.org	70
i      These variables are filled with the components of the query.  They will	Err	bitreich.org	70
i      only be valid after handle_request() is called.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      char *gcgi_gopher_search	Err	bitreich.org	70
i-             From argv[1], this is the search string, passed after a tab in	Err	bitreich.org	70
i-             the gopher protocol for item type “7”.	Err	bitreich.org	70
i+             From argv[1], this is the search string, passed after a tab in	Err	bitreich.org	70
i+             the gopher protocol for item type “7”.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      char *gcgi_gopher_path	Err	bitreich.org	70
i-             From argv[2], this is the query path.  It is the full query	Err	bitreich.org	70
i-             without the search string and with the query string removed.	Err	bitreich.org	70
i+             From argv[2], this is the query path.  It is the full query	Err	bitreich.org	70
i+             without the search string and with the query string removed.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      struct gcgi_var_list gcgi_gopher_query	Err	bitreich.org	70
i-             From argv[2], this is the query string stored as a key-value	Err	bitreich.org	70
i-             gcgi_var_list.  It is extracted from the part of the query after	Err	bitreich.org	70
i-             the “”?, usually formated as	Err	bitreich.org	70
i-             “?key1=value1&key2=value2&key3=value3”	Err	bitreich.org	70
i+             From argv[2], this is the query string stored as a key-value	Err	bitreich.org	70
i+             gcgi_var_list.  It is extracted from the part of the query after	Err	bitreich.org	70
i+             the “”?, usually formated as	Err	bitreich.org	70
i+             “?key1=value1&key2=value2&key3=value3”	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      char *gcgi_gopher_host	Err	bitreich.org	70
i-             From argv[3], this is the current host name configured in	Err	bitreich.org	70
i-             geomyidae(8).  It is what to use as a ‘host’ in links printed	Err	bitreich.org	70
i-             out.	Err	bitreich.org	70
i+             From argv[3], this is the current host name configured in	Err	bitreich.org	70
i+             geomyidae(8).  It is what to use as a ‘host’ in links printed	Err	bitreich.org	70
i+             out.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      char *gcgi_gopher_port	Err	bitreich.org	70
i-             From argv[4], this is the current port number configured in	Err	bitreich.org	70
i-             geomyidae(8).  It is what to use as a ‘port’ in links printed	Err	bitreich.org	70
i-             out.	Err	bitreich.org	70
i+             From argv[4], this is the current port number configured in	Err	bitreich.org	70
i+             geomyidae(8).  It is what to use as a ‘port’ in links printed	Err	bitreich.org	70
i+             out.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i EXAMPLES	Err	bitreich.org	70
i      #include "libgcgi.h"	Err	bitreich.org	70
i@@ -167,25 +167,25 @@ EXAMPLES	Err	bitreich.org	70
i      /* implementation of each handler here */	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      static struct gcgi_handler handlers[] = {	Err	bitreich.org	70
i-             { "/",             page_home },	Err	bitreich.org	70
i-             { "/song",             page_song_list },	Err	bitreich.org	70
i-             { "/song/*",    page_song_item },	Err	bitreich.org	70
i-             { "*",             page_not_found },	Err	bitreich.org	70
i-             { NULL,             NULL },	Err	bitreich.org	70
i+             { "/",          page_home },	Err	bitreich.org	70
i+             { "/song",      page_song_list },	Err	bitreich.org	70
i+             { "/song/*",    page_song_item },	Err	bitreich.org	70
i+             { "*",          page_not_found },	Err	bitreich.org	70
i+             { NULL,         NULL },	Err	bitreich.org	70
i      };	Err	bitreich.org	70
i 	Err	bitreich.org	70
i      int	Err	bitreich.org	70
i      main(int argc, char **argv)	Err	bitreich.org	70
i      {	Err	bitreich.org	70
i-             /* privilege dropping, chroot and/or syscall restriction here */	Err	bitreich.org	70
i+             /* privilege dropping, chroot and/or syscall restriction here */	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-             gcgi_handle_request(handlers, argv, argc);	Err	bitreich.org	70
i-             return 0;	Err	bitreich.org	70
i+             gcgi_handle_request(handlers, argv, argc);	Err	bitreich.org	70
i+             return 0;	Err	bitreich.org	70
i      }	Err	bitreich.org	70
i 	Err	bitreich.org	70
i ENVIRONMENT VARIABLES	Err	bitreich.org	70
i      libgcgi does not use environment variable, but the application code can	Err	bitreich.org	70
i-     make use of them.        The environment variables applied to geomyidae(8) will	Err	bitreich.org	70
i+     make use of them.  The environment variables applied to geomyidae(8) will	Err	bitreich.org	70
i      be inherited and accessible.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i BUGS	Err	bitreich.org	70
i@@ -198,7 +198,7 @@ CAVEATS	Err	bitreich.org	70
i      The Gopher protocol is not designed for file upload.  A dedicated file	Err	bitreich.org	70
i      upload protocol such as SFTP or FTP may be used instead.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-     The Gopher protocol is not designed for dynamic scripting.         A dedicated	Err	bitreich.org	70
i+     The Gopher protocol is not designed for dynamic scripting.  A dedicated	Err	bitreich.org	70
i      remote interface protocol such as SSH or telnet may be used instead.	Err	bitreich.org	70
i 	Err	bitreich.org	70
i SEE ALSO	Err	bitreich.org	70
i@@ -208,4 +208,4 @@ AUTHORS	Err	bitreich.org	70
i      Josuah Demangeon <me@josuah.net>	Err	bitreich.org	70
i      gopher://bitreich.org: The Bitreich Project	Err	bitreich.org	70
i 	Err	bitreich.org	70
i-LIBGCGI(3)                   Library Functions Manual                    LIBGCGI(3)	Err	bitreich.org	70
i+LIBGCGI(3)                 Library Functions Manual                 LIBGCGI(3)	Err	bitreich.org	70
1diff --git a/index.c b/index.c	/scm/libgcgi/file/index.c.gph	bitreich.org	70
i@@ -34,6 +34,21 @@ main(int argc, char **argv)	Err	bitreich.org	70
i                 gcgi_fatal("unveil failed: %s", strerror(errno));	Err	bitreich.org	70
i         if (pledge("stdio rpath wpath cpath", NULL) == -1)	Err	bitreich.org	70
i                 gcgi_fatal("pledge failed: %s", strerror(errno));	Err	bitreich.org	70
i+#elif defined(__linux__)	Err	bitreich.org	70
i+        scmp_filter_ctx ctx;	Err	bitreich.org	70
i+        if (chroot(".") == -1)	Err	bitreich.org	70
i+                gcgi_fatal("chroot failed");	Err	bitreich.org	70
i+        if ((ctx = seccomp_init(SCMP_ACT_KILL)) == NULL)	Err	bitreich.org	70
i+                gcgi_fatal("seccomp_init failed: %s", strerror(errno));	Err	bitreich.org	70
i+        if (seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0) < 0	Err	bitreich.org	70
i+         || seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit), 0) < 0	Err	bitreich.org	70
i+         || seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(close), 0) < 0	Err	bitreich.org	70
i+         || seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0) < 0	Err	bitreich.org	70
i+         || seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 1,	Err	bitreich.org	70
i+                        SCMP_A0(SCMP_CMP_EQ, 0)) < 0)	Err	bitreich.org	70
i+                gcgi_fatal("seccomp_rule_add failed");	Err	bitreich.org	70
i+        if (seccomp_load(ctx) < 0)	Err	bitreich.org	70
i+                gcgi_fatal("seccomp_load failed: %s", strerror(errno));	Err	bitreich.org	70
i #else	Err	bitreich.org	70
i #warning "no syscall restriction enabled"	Err	bitreich.org	70
i #endif	Err	bitreich.org	70
.
Response: text/plain
Original URLgopher://bitreich.org/0/scm/libgcgi/commit/7a737dac78b687...
Content-Typetext/plain; charset=utf-8