itvote.c: allow creating polls from query - 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 3089fdd4c6326fa81bef1daa7b401513eaed785e /src/vote/commit/3089fdd4c6326fa81bef1daa7b401513eaed785e.gph mx1.adamsgaard.dk 70 1parent 4cb97e229cbb0d54d85e3960e3d7c4daa53a429e /src/vote/commit/4cb97e229cbb0d54d85e3960e3d7c4daa53a429e.gph mx1.adamsgaard.dk 70 hAuthor: Anders Damsgaard URL:mailto:anders@adamsgaard.dk mx1.adamsgaard.dk 70 iDate: Sun, 27 Sep 2020 13:37:30 +0200 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 ivote.c: allow creating polls from query Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDiffstat: Err mx1.adamsgaard.dk 70 i M vote.c | 62 ++++++++++++++++++++++++++++--- Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i1 file changed, 57 insertions(+), 5 deletions(-) Err mx1.adamsgaard.dk 70 i--- Err mx1.adamsgaard.dk 70 1diff --git a/vote.c b/vote.c /src/vote/file/vote.c.gph mx1.adamsgaard.dk 70 it@@ -2,10 +2,12 @@ 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 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 Err mx1.adamsgaard.dk 70 i #include "util.h" Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 it@@ -13,6 +15,9 @@ Err mx1.adamsgaard.dk 70 i #define POLLS_DIR "polls" Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i static char poll[1024]; Err mx1.adamsgaard.dk 70 i+static char create[2]; Err mx1.adamsgaard.dk 70 i+static char question[4096]; Err mx1.adamsgaard.dk 70 i+static char options[4096]; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 i http_status(int statuscode) Err mx1.adamsgaard.dk 70 it@@ -96,7 +101,7 @@ print_poll_file(FILE *fp, const char *poll_name) Err mx1.adamsgaard.dk 70 i puts(""); 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+int Err mx1.adamsgaard.dk 70 i create_poll_file(const char *name, const char *question, const char *options) Err mx1.adamsgaard.dk 70 i { Err mx1.adamsgaard.dk 70 i FILE *fp; Err mx1.adamsgaard.dk 70 it@@ -111,10 +116,23 @@ create_poll_file(const char *name, const char *question, const char *options) Err mx1.adamsgaard.dk 70 i err(1, "create_poll_file: snprintf fname %s/%s", POLLS_DIR, buf); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+ if (!*name || !*question || !*options) { Err mx1.adamsgaard.dk 70 i+ puts("

Error: Could not create poll

"); Err mx1.adamsgaard.dk 70 i+ puts("
    "); Err mx1.adamsgaard.dk 70 i+ if (!*name) Err mx1.adamsgaard.dk 70 i+ puts("
  • Poll name is missing
  • "); Err mx1.adamsgaard.dk 70 i+ if (!*question) Err mx1.adamsgaard.dk 70 i+ puts("
  • Poll question is missing
  • "); Err mx1.adamsgaard.dk 70 i+ if (!*options) Err mx1.adamsgaard.dk 70 i+ puts("
  • Poll options are missing
  • "); Err mx1.adamsgaard.dk 70 i+ puts("
"); Err mx1.adamsgaard.dk 70 i+ return -1; Err mx1.adamsgaard.dk 70 i+ } Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i if (stat(fname, &sb) == 0) { Err mx1.adamsgaard.dk 70 i printf("

Poll '%s' already exists

", name); Err mx1.adamsgaard.dk 70 i+ return -1; Err mx1.adamsgaard.dk 70 i } else { Err mx1.adamsgaard.dk 70 i- Err mx1.adamsgaard.dk 70 i if (!(fp = fopen(fname, "w"))) { Err mx1.adamsgaard.dk 70 i http_status(404); Err mx1.adamsgaard.dk 70 i exit(1); Err mx1.adamsgaard.dk 70 it@@ -152,6 +170,7 @@ create_poll_file(const char *name, const char *question, const char *options) Err mx1.adamsgaard.dk 70 i fclose(fp); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i+ return 0; Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i void Err mx1.adamsgaard.dk 70 it@@ -178,6 +197,13 @@ show_poll(const char *poll_name) 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+list_polls() Err mx1.adamsgaard.dk 70 i+{ Err mx1.adamsgaard.dk 70 i+ /* something with fts_open, fts_read */ Err mx1.adamsgaard.dk 70 i+ puts("listing polls"); 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 it@@ -185,12 +211,34 @@ parse_query() Err mx1.adamsgaard.dk 70 i if (!(query = getenv("QUERY_STRING"))) Err mx1.adamsgaard.dk 70 i query = ""; Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i+ if ((p = getparam(query, "create"))) { Err mx1.adamsgaard.dk 70 i+ if (decodeparam(create, sizeof(create), p) == -1) { Err mx1.adamsgaard.dk 70 i+ http_status(401); Err mx1.adamsgaard.dk 70 i+ exit(1); 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 ((p = getparam(query, "poll"))) { Err mx1.adamsgaard.dk 70 i if (decodeparam(poll, sizeof(poll), p) == -1) { Err mx1.adamsgaard.dk 70 i http_status(401); Err mx1.adamsgaard.dk 70 i exit(1); 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 ((p = getparam(query, "question"))) { Err mx1.adamsgaard.dk 70 i+ if (decodeparam(question, sizeof(question), p) == -1) { Err mx1.adamsgaard.dk 70 i+ http_status(401); Err mx1.adamsgaard.dk 70 i+ exit(1); 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 ((p = getparam(query, "options"))) { Err mx1.adamsgaard.dk 70 i+ if (decodeparam(options, sizeof(options), p) == -1) { Err mx1.adamsgaard.dk 70 i+ http_status(401); Err mx1.adamsgaard.dk 70 i+ exit(1); 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 Err mx1.adamsgaard.dk 70 i int Err mx1.adamsgaard.dk 70 it@@ -218,10 +266,14 @@ main() Err mx1.adamsgaard.dk 70 i print_html_head(); 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- show_poll(poll); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i- create_poll_file("test poll2", "What is your favorite color?", "Red\nGreen\nBlue"); Err mx1.adamsgaard.dk 70 i+ if (*create) { Err mx1.adamsgaard.dk 70 i+ if (create_poll_file(poll, question, options) == 0) Err mx1.adamsgaard.dk 70 i+ show_poll(poll); Err mx1.adamsgaard.dk 70 i+ } else if (*poll) Err mx1.adamsgaard.dk 70 i+ show_poll(poll); Err mx1.adamsgaard.dk 70 i+ else Err mx1.adamsgaard.dk 70 i+ list_polls(); 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 .