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