tvote.c: allow creating polls from query - vote - simple cgi voting system for web and gopher
git clone git://src.adamsgaard.dk/vote
Log
Files
Refs
README
LICENSE
---
commit 3089fdd4c6326fa81bef1daa7b401513eaed785e
parent 4cb97e229cbb0d54d85e3960e3d7c4daa53a429e
Author: Anders Damsgaard 
Date:   Sun, 27 Sep 2020 13:37:30 +0200

vote.c: allow creating polls from query

Diffstat:
  M vote.c                              |      62 ++++++++++++++++++++++++++++---

1 file changed, 57 insertions(+), 5 deletions(-)
---
diff --git a/vote.c b/vote.c
t@@ -2,10 +2,12 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
 #include 
+#include 
 
 #include "util.h"
 
t@@ -13,6 +15,9 @@
 #define POLLS_DIR "polls"
 
 static char poll[1024];
+static char create[2];
+static char question[4096];
+static char options[4096];
 
 void
 http_status(int statuscode)
t@@ -96,7 +101,7 @@ print_poll_file(FILE *fp, const char *poll_name)
         puts("
"); } -void +int create_poll_file(const char *name, const char *question, const char *options) { FILE *fp; t@@ -111,10 +116,23 @@ create_poll_file(const char *name, const char *question, const char *options) err(1, "create_poll_file: snprintf fname %s/%s", POLLS_DIR, buf); } + if (!*name || !*question || !*options) { + puts("

Error: Could not create poll

"); + puts(""); + return -1; + } + if (stat(fname, &sb) == 0) { printf("

Poll '%s' already exists

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