iinitial working version to proofread - 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 092dce7972a8883e7532c848192785ed60ac9b67 /scm/libgcgi/commit/092dce7972a8883e7532c848192785ed60ac9b67.gph bitreich.org 70 1parent 758508d75c969333c3f72f0e01faa0a5129153b9 /scm/libgcgi/commit/758508d75c969333c3f72f0e01faa0a5129153b9.gph bitreich.org 70 hAuthor: Josuah Demangeon URL:mailto:me@josuah.net bitreich.org 70 iDate: Sat, 30 Jul 2022 12:30:03 +0200 Err bitreich.org 70 i Err bitreich.org 70 iinitial working version to proofread Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M index.c | 12 +++++++++++- Err bitreich.org 70 i M libgcgi.h | 42 +++++++++++++++++++++----------- Err bitreich.org 70 i Err bitreich.org 70 i2 files changed, 39 insertions(+), 15 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/index.c b/index.c /scm/libgcgi/file/index.c.gph bitreich.org 70 i@@ -10,8 +10,18 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include "libgcgi.h" Err bitreich.org 70 i Err bitreich.org 70 i+static void Err bitreich.org 70 i+error_404(char **matches) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *var; Err bitreich.org 70 i+ Err bitreich.org 70 i+ printf("sorry, I could not find %s\n", matches[0]); Err bitreich.org 70 i+ if ((var = gcgi_get_var(&gcgi_gopher_query, "var")) != NULL) Err bitreich.org 70 i+ printf("I got the $var though! -> '%s'\n", var); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i static struct gcgi_handler handlers[] = { Err bitreich.org 70 i-// { "*", error_404 }, Err bitreich.org 70 i+ { "*", error_404 }, Err bitreich.org 70 i { NULL, NULL }, Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 1diff --git a/libgcgi.h b/libgcgi.h /scm/libgcgi/file/libgcgi.h.gph bitreich.org 70 i@@ -44,15 +44,12 @@ static void gcgi_free_var_list(struct gcgi_var_list *vars); Err bitreich.org 70 i static void gcgi_read_var_list(struct gcgi_var_list *vars, char *path); Err bitreich.org 70 i static int gcgi_write_var_list(struct gcgi_var_list *vars, char *path); Err bitreich.org 70 i Err bitreich.org 70 i-/* parse various components of the Gopher request */ Err bitreich.org 70 i-static struct gcgi_var_list * gcgi_parse_query_string(void); Err bitreich.org 70 i- Err bitreich.org 70 i /* components of the gopher request */ Err bitreich.org 70 i char *gcgi_gopher_search; Err bitreich.org 70 i char *gcgi_gopher_path; Err bitreich.org 70 i char *gcgi_gopher_host; Err bitreich.org 70 i char *gcgi_gopher_port; Err bitreich.org 70 i-char *gcgi_gopher_args; Err bitreich.org 70 i+static struct gcgi_var_list gcgi_gopher_query; Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i /// POLICE LINE /// DO NOT CROSS /// Err bitreich.org 70 i@@ -68,7 +65,6 @@ gcgi_fatal(char *fmt, ...) Err bitreich.org 70 i Err bitreich.org 70 i va_start(va, fmt); Err bitreich.org 70 i vsnprintf(msg, sizeof msg, fmt, va); Err bitreich.org 70 i- printf("Status: 500 Server Error\n\n"); Err bitreich.org 70 i printf("error: %s\n", msg); Err bitreich.org 70 i exit(1); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -237,9 +233,26 @@ gcgi_match(char const *glob, char *path, char **matches, size_t m) Err bitreich.org 70 i return *glob == '\0' && *path == '\0'; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+static inline void Err bitreich.org 70 i+gcgi_decode_url(struct gcgi_var_list *vars, char *s) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ char *tok, *eq; Err bitreich.org 70 i+ Err bitreich.org 70 i+ while ((tok = strsep(&s, "&"))) { Err bitreich.org 70 i+ //gcgi_decode_hex(tok); Err bitreich.org 70 i+ if ((eq = strchr(tok, '=')) == NULL) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i+ *eq = '\0'; Err bitreich.org 70 i+ gcgi_add_var(vars, tok, eq + 1); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ gcgi_sort_var_list(vars); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i static void Err bitreich.org 70 i gcgi_handle_request(struct gcgi_handler h[], char **argv, int argc) Err bitreich.org 70 i { Err bitreich.org 70 i+ char *query_string; Err bitreich.org 70 i+ Err bitreich.org 70 i if (argc != 5) Err bitreich.org 70 i gcgi_fatal("wrong number of arguments: %c", argc); Err bitreich.org 70 i assert(argv[0] && argv[1] && argv[2] && argv[3]); Err bitreich.org 70 i@@ -249,11 +262,10 @@ gcgi_handle_request(struct gcgi_handler h[], char **argv, int argc) Err bitreich.org 70 i gcgi_gopher_path = argv[2]; Err bitreich.org 70 i gcgi_gopher_host = argv[3]; Err bitreich.org 70 i gcgi_gopher_port = argv[4]; Err bitreich.org 70 i- gcgi_gopher_args = strchr(gcgi_gopher_path, '?'); Err bitreich.org 70 i- if (gcgi_gopher_args == NULL) { Err bitreich.org 70 i- gcgi_gopher_args = ""; Err bitreich.org 70 i- } else { Err bitreich.org 70 i- *gcgi_gopher_args++ = '\0'; Err bitreich.org 70 i+ query_string = strchr(gcgi_gopher_path, '?'); Err bitreich.org 70 i+ if (query_string != NULL) { Err bitreich.org 70 i+ *query_string++ = '\0'; Err bitreich.org 70 i+ gcgi_decode_url(&gcgi_gopher_query, query_string); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i for (; h->glob != NULL; h++) { Err bitreich.org 70 i@@ -309,17 +321,17 @@ static void Err bitreich.org 70 i gcgi_template(char const *path, struct gcgi_var_list *vars) Err bitreich.org 70 i { Err bitreich.org 70 i FILE *fp; Err bitreich.org 70 i+ ssize_t ssz; Err bitreich.org 70 i size_t sz; Err bitreich.org 70 i char *line, *head, *tail, *key; Err bitreich.org 70 i char *val; Err bitreich.org 70 i Err bitreich.org 70 i- sz = 0; Err bitreich.org 70 i- line = NULL; Err bitreich.org 70 i- Err bitreich.org 70 i if ((fp = fopen(path, "r")) == NULL) Err bitreich.org 70 i gcgi_fatal("opening template %s", path); Err bitreich.org 70 i Err bitreich.org 70 i- while (getline(&line, &sz, fp) > 0) { Err bitreich.org 70 i+ sz = 0; Err bitreich.org 70 i+ line = NULL; Err bitreich.org 70 i+ while ((ssz = getline(&line, &sz, fp)) > 0) { Err bitreich.org 70 i head = tail = line; Err bitreich.org 70 i for (; (key = gcgi_next_var(head, &tail)); head = tail) { Err bitreich.org 70 i fputs(head, stdout); Err bitreich.org 70 i@@ -330,6 +342,8 @@ gcgi_template(char const *path, struct gcgi_var_list *vars) Err bitreich.org 70 i } Err bitreich.org 70 i fputs(tail, stdout); Err bitreich.org 70 i } Err bitreich.org 70 i+ if (ssz == -1) Err bitreich.org 70 i+ gcgi_fatal("reading from template: %s", strerror(errno)); Err bitreich.org 70 i fclose(fp); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 .