itopen poll files for reading when ?poll is passed - vote - simple cgi voting system for web and gopher Err mx1.adamsgaard.dk 70 hgit clone git://src.adamsgaard.dk/vote URL:git://src.adamsgaard.dk/vote mx1.adamsgaard.dk 70 1Log /src/vote/log.gph mx1.adamsgaard.dk 70 1Files /src/vote/files.gph mx1.adamsgaard.dk 70 1Refs /src/vote/refs.gph mx1.adamsgaard.dk 70 1README /src/vote/file/README.gph mx1.adamsgaard.dk 70 1LICENSE /src/vote/file/LICENSE.gph mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1commit a6ae3f0db3f76e55a4ecc84bf09ee62e629881e3 /src/vote/commit/a6ae3f0db3f76e55a4ecc84bf09ee62e629881e3.gph mx1.adamsgaard.dk 70 1parent c7fdf4bc6fe1740d10b874ce6da7005f7ca46635 /src/vote/commit/c7fdf4bc6fe1740d10b874ce6da7005f7ca46635.gph mx1.adamsgaard.dk 70 hAuthor: Anders Damsgaard URL:mailto:anders@adamsgaard.dk mx1.adamsgaard.dk 70 iDate: Sun, 27 Sep 2020 08:54:15 +0200 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iopen poll files for reading when ?poll is passed Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDiffstat: Err mx1.adamsgaard.dk 70 i M LICENSE | 1 + Err mx1.adamsgaard.dk 70 i M util.c | 42 ++++++++++++++++++------------- Err mx1.adamsgaard.dk 70 i M util.h | 19 +------------------ Err mx1.adamsgaard.dk 70 i M vote.c | 28 +++++++++++++++++++++------- Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i4 files changed, 47 insertions(+), 43 deletions(-) Err mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1diff --git a/LICENSE b/LICENSE /src/vote/file/LICENSE.gph mx1.adamsgaard.dk 70 it@@ -1,6 +1,7 @@ Err mx1.adamsgaard.dk 70 i ISC License Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i Copyright (c) 2020 Anders Damsgaard Err mx1.adamsgaard.dk 70 i+Copyright (c) 2020 Hiltjo Posthuma (util.c, util.h) Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i Permission to use, copy, modify, and/or distribute this software for any Err mx1.adamsgaard.dk 70 i purpose with or without fee is hereby granted, provided that the above Err mx1.adamsgaard.dk 70 1diff --git a/util.c b/util.c /src/vote/file/util.c.gph mx1.adamsgaard.dk 70 it@@ -1,21 +1,3 @@ Err mx1.adamsgaard.dk 70 i-/* Err mx1.adamsgaard.dk 70 i-* ISC License Err mx1.adamsgaard.dk 70 i-* Err mx1.adamsgaard.dk 70 i-* Copyright (c) 2020 Hiltjo Posthuma Err mx1.adamsgaard.dk 70 i-* Err mx1.adamsgaard.dk 70 i-* Permission to use, copy, modify, and/or distribute this software for any Err mx1.adamsgaard.dk 70 i-* purpose with or without fee is hereby granted, provided that the above Err mx1.adamsgaard.dk 70 i-* copyright notice and this permission notice appear in all copies. Err mx1.adamsgaard.dk 70 i-* Err mx1.adamsgaard.dk 70 i-* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES Err mx1.adamsgaard.dk 70 i-* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF Err mx1.adamsgaard.dk 70 i-* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR Err mx1.adamsgaard.dk 70 i-* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES Err mx1.adamsgaard.dk 70 i-* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN Err mx1.adamsgaard.dk 70 i-* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF Err mx1.adamsgaard.dk 70 i-* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Err mx1.adamsgaard.dk 70 i-*/ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i #include Err mx1.adamsgaard.dk 70 i #include Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 it@@ -222,3 +204,27 @@ gophertext(FILE *fp, const char *s, size_t len) Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i+void Err mx1.adamsgaard.dk 70 i+escapechars(char *s) Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ for (; *s; s++) { Err mx1.adamsgaard.dk 70 i+ switch (*s) { Err mx1.adamsgaard.dk 70 i+ case '#': Err mx1.adamsgaard.dk 70 i+ case ' ': Err mx1.adamsgaard.dk 70 i+ case '\t': Err mx1.adamsgaard.dk 70 i+ case ':': Err mx1.adamsgaard.dk 70 i+ case '.': Err mx1.adamsgaard.dk 70 i+ case '(': Err mx1.adamsgaard.dk 70 i+ case ')': Err mx1.adamsgaard.dk 70 i+ case '/': Err mx1.adamsgaard.dk 70 i+ *s = '_'; Err mx1.adamsgaard.dk 70 i+ break; Err mx1.adamsgaard.dk 70 i+ case '\n': Err mx1.adamsgaard.dk 70 i+ *s = '\0'; Err mx1.adamsgaard.dk 70 i+ return; Err mx1.adamsgaard.dk 70 i+ default: Err mx1.adamsgaard.dk 70 i+ break; Err mx1.adamsgaard.dk 70 i+ } Err mx1.adamsgaard.dk 70 i+ } Err mx1.adamsgaard.dk 70 i+} Err mx1.adamsgaard.dk 70 1diff --git a/util.h b/util.h /src/vote/file/util.h.gph mx1.adamsgaard.dk 70 it@@ -1,21 +1,3 @@ Err mx1.adamsgaard.dk 70 i-/* Err mx1.adamsgaard.dk 70 i-* ISC License Err mx1.adamsgaard.dk 70 i-* Err mx1.adamsgaard.dk 70 i-* Copyright (c) 2020 Hiltjo Posthuma Err mx1.adamsgaard.dk 70 i-* Err mx1.adamsgaard.dk 70 i-* Permission to use, copy, modify, and/or distribute this software for any Err mx1.adamsgaard.dk 70 i-* purpose with or without fee is hereby granted, provided that the above Err mx1.adamsgaard.dk 70 i-* copyright notice and this permission notice appear in all copies. Err mx1.adamsgaard.dk 70 i-* Err mx1.adamsgaard.dk 70 i-* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES Err mx1.adamsgaard.dk 70 i-* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF Err mx1.adamsgaard.dk 70 i-* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR Err mx1.adamsgaard.dk 70 i-* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES Err mx1.adamsgaard.dk 70 i-* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN Err mx1.adamsgaard.dk 70 i-* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF Err mx1.adamsgaard.dk 70 i-* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Err mx1.adamsgaard.dk 70 i-*/ Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i #ifndef __OpenBSD__ Err mx1.adamsgaard.dk 70 i #define pledge(p1,p2) 0 Err mx1.adamsgaard.dk 70 i #define unveil(p1,p2) 0 Err mx1.adamsgaard.dk 70 it@@ -34,3 +16,4 @@ int hexdigit(int c); Err mx1.adamsgaard.dk 70 i int uriencode(const char *s, char *buf, size_t bufsiz); Err mx1.adamsgaard.dk 70 i int utf8pad(char *buf, size_t bufsiz, const char *s, size_t len, int pad); Err mx1.adamsgaard.dk 70 i void xmlencode(const char *s); Err mx1.adamsgaard.dk 70 i+void escapechars(char *s); Err mx1.adamsgaard.dk 70 1diff --git a/vote.c b/vote.c /src/vote/file/vote.c.gph mx1.adamsgaard.dk 70 it@@ -5,6 +5,7 @@ Err mx1.adamsgaard.dk 70 i #include Err mx1.adamsgaard.dk 70 i #include Err mx1.adamsgaard.dk 70 i #include Err mx1.adamsgaard.dk 70 i+#include Err mx1.adamsgaard.dk 70 i #include "util.h" Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i #define OUT(s) (fputs((s), stdout)) Err mx1.adamsgaard.dk 70 it@@ -19,6 +20,9 @@ die(int statuscode) Err mx1.adamsgaard.dk 70 i case 401: Err mx1.adamsgaard.dk 70 i OUT("Status: 401 Bad Request\r\n\r\n"); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 i+ case 404: Err mx1.adamsgaard.dk 70 i+ OUT("Status: 404 Not Found\r\n\r\n"); Err mx1.adamsgaard.dk 70 i+ break; Err mx1.adamsgaard.dk 70 i case 500: Err mx1.adamsgaard.dk 70 i OUT("Status: 500 Internal Server Error\r\n\r\n"); Err mx1.adamsgaard.dk 70 i break; Err mx1.adamsgaard.dk 70 it@@ -50,20 +54,30 @@ void Err mx1.adamsgaard.dk 70 i show_poll(const char *poll_name) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i FILE *fd; Err mx1.adamsgaard.dk 70 i- if ((fd = fopen(poll_name, "r")) != NULL) { Err mx1.adamsgaard.dk 70 i- fclose(fd); Err mx1.adamsgaard.dk 70 i- } else { Err mx1.adamsgaard.dk 70 i- fprintf(stderr, "poll_open %s: %s\n", poll_name, strerror(errno)); Err mx1.adamsgaard.dk 70 i+ char fname[PATH_MAX]; Err mx1.adamsgaard.dk 70 i+ char buf[PATH_MAX]; Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i+ strlcpy(buf, poll_name, sizeof(buf)); Err mx1.adamsgaard.dk 70 i+ escapechars(buf); Err mx1.adamsgaard.dk 70 i+ if (snprintf(fname, sizeof(fname), "%s/%s", POLLS_DIR, buf) < 0) { Err mx1.adamsgaard.dk 70 i+ fprintf(stderr, "snprintf fname %s/%s\n", POLLS_DIR, buf); Err mx1.adamsgaard.dk 70 i die(500); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i+ if (!(fd = fopen(fname, "r"))) { Err mx1.adamsgaard.dk 70 i+ fprintf(stderr, "poll_open %s: %s\n", poll, strerror(errno)); Err mx1.adamsgaard.dk 70 i+ die(404); Err mx1.adamsgaard.dk 70 i+ } else { Err mx1.adamsgaard.dk 70 i+ fclose(fd); Err mx1.adamsgaard.dk 70 i+ } Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i+ printf("

poll: '%s'

\n", poll); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i parse_query() Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i char *query, *p; Err mx1.adamsgaard.dk 70 i- size_t len; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i if (!(query = getenv("QUERY_STRING"))) Err mx1.adamsgaard.dk 70 i query = ""; Err mx1.adamsgaard.dk 70 it@@ -101,7 +115,7 @@ main() Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i parse_query(); Err mx1.adamsgaard.dk 70 i if (*poll) Err mx1.adamsgaard.dk 70 i- printf("

poll: '%s'

\n", poll); Err mx1.adamsgaard.dk 70 i+ show_poll(poll); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i print_html_foot(); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 .