itvote.c: add preliminary implementation to create polls - 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 4cb97e229cbb0d54d85e3960e3d7c4daa53a429e /src/vote/commit/4cb97e229cbb0d54d85e3960e3d7c4daa53a429e.gph mx1.adamsgaard.dk 70 1parent f5b5aff4672c9a58d24ef7a2d06629870e411a6e /src/vote/commit/f5b5aff4672c9a58d24ef7a2d06629870e411a6e.gph mx1.adamsgaard.dk 70 hAuthor: Anders Damsgaard URL:mailto:anders@adamsgaard.dk mx1.adamsgaard.dk 70 iDate: Sun, 27 Sep 2020 10:42:16 +0200 Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 ivote.c: add preliminary implementation to create polls Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 iDiffstat: Err mx1.adamsgaard.dk 70 i M vote.c | 72 ++++++++++++++++++++++++++++--- Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i1 file changed, 66 insertions(+), 6 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@@ -97,9 +97,67 @@ print_poll_file(FILE *fp, 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+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 i+ char fname[PATH_MAX]; Err mx1.adamsgaard.dk 70 i+ char buf[PATH_MAX]; Err mx1.adamsgaard.dk 70 i+ struct stat sb; Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i+ strlcpy(buf, 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+ http_status(500); 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 (stat(fname, &sb) == 0) { Err mx1.adamsgaard.dk 70 i+ printf("

Poll '%s' already exists

", name); 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 i+ } else { Err mx1.adamsgaard.dk 70 i+ fputs(question, fp); Err mx1.adamsgaard.dk 70 i+ fputs("\n0\t", fp); Err mx1.adamsgaard.dk 70 i+ /*while (*question != '\0') { Err mx1.adamsgaard.dk 70 i+ switch(*question) { Err mx1.adamsgaard.dk 70 i+ case '<': Err mx1.adamsgaard.dk 70 i+ case '>': Err mx1.adamsgaard.dk 70 i+ fputc(' ', fp); Err mx1.adamsgaard.dk 70 i+ break; Err mx1.adamsgaard.dk 70 i+ default: Err mx1.adamsgaard.dk 70 i+ fputc(*question, fp); Err mx1.adamsgaard.dk 70 i+ } Err mx1.adamsgaard.dk 70 i+ (void)*question++; Err mx1.adamsgaard.dk 70 i+ }*/ Err mx1.adamsgaard.dk 70 i+ while (*options != '\0') { Err mx1.adamsgaard.dk 70 i+ switch(*options) { 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+ fputc(' ', fp); Err mx1.adamsgaard.dk 70 i+ break; Err mx1.adamsgaard.dk 70 i+ case '\n': Err mx1.adamsgaard.dk 70 i+ fprintf(fp, "\n0\t"); Err mx1.adamsgaard.dk 70 i+ break; Err mx1.adamsgaard.dk 70 i+ default: Err mx1.adamsgaard.dk 70 i+ fputc(*options, fp); Err mx1.adamsgaard.dk 70 i+ break; Err mx1.adamsgaard.dk 70 i+ } Err mx1.adamsgaard.dk 70 i+ (void)*options++; Err mx1.adamsgaard.dk 70 i+ } Err mx1.adamsgaard.dk 70 i+ fputc('\n', fp); 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+} Err mx1.adamsgaard.dk 70 i+ Err mx1.adamsgaard.dk 70 i+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+ FILE *fp; 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 it@@ -107,15 +165,15 @@ show_poll(const char *poll_name) 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 http_status(500); Err mx1.adamsgaard.dk 70 i- err(1, "snprintf fname %s/%s", POLLS_DIR, buf); Err mx1.adamsgaard.dk 70 i+ err(1, "show_poll: 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 (!(fd = fopen(fname, "r"))) { Err mx1.adamsgaard.dk 70 i+ if (!(fp = fopen(fname, "r"))) { Err mx1.adamsgaard.dk 70 i http_status(404); Err mx1.adamsgaard.dk 70 i exit(1); Err mx1.adamsgaard.dk 70 i } else { Err mx1.adamsgaard.dk 70 i- print_poll_file(fd, poll_name); Err mx1.adamsgaard.dk 70 i- fclose(fd); Err mx1.adamsgaard.dk 70 i+ print_poll_file(fp, poll_name); 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 Err mx1.adamsgaard.dk 70 it@@ -145,7 +203,7 @@ main() Err mx1.adamsgaard.dk 70 i err(1, "unveil"); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i- if (pledge("stdio cpath rpath", NULL) == -1) { Err mx1.adamsgaard.dk 70 i+ if (pledge("stdio cpath rpath wpath", NULL) == -1) { Err mx1.adamsgaard.dk 70 i http_status(500); Err mx1.adamsgaard.dk 70 i err(1, "pledge"); Err mx1.adamsgaard.dk 70 i } Err mx1.adamsgaard.dk 70 it@@ -163,6 +221,8 @@ main() 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+ Err mx1.adamsgaard.dk 70 i print_html_foot(); Err mx1.adamsgaard.dk 70 i Err mx1.adamsgaard.dk 70 i return 0; Err mx1.adamsgaard.dk 70 .