working template and variables - libgcgi - REST library for Gopher
HTML git clone git://bitreich.org/libgcgi git://hg6vgqziawt5s4dj.onion/libgcgi
DIR Log
DIR Files
DIR Refs
DIR Tags
DIR README
DIR LICENSE
---
DIR commit e52fd13abe19a46021a9661b499320da75fed2de
DIR parent 092dce7972a8883e7532c848192785ed60ac9b67
HTML Author: Josuah Demangeon <me@josuah.net>
Date: Sat, 30 Jul 2022 13:04:32 +0200
working template and variables
Diffstat:
M Makefile | 8 +-------
A db/vars | 1 +
A gph/404.gph | 1 +
M index.c | 6 +++++-
M libgcgi.h | 16 ++++++----------
5 files changed, 14 insertions(+), 18 deletions(-)
---
DIR diff --git a/Makefile b/Makefile
@@ -1,13 +1,7 @@
LDFLAGS = -static
CFLAGS = -g -pedantic -std=c99 -Wall -Wextra -Wno-unused-function
-V = v0.0
-
-all: index.cgi tmp db/category db/item db/image
-
-tmp db/category db/item db/image:
- mkdir -p -m 700 $@
- chown www:www $@
+all: index.cgi
index.cgi: index.c libgcgi.h
${CC} ${LDFLAGS} ${CFLAGS} -o $@ index.c
DIR diff --git a/db/vars b/db/vars
@@ -0,0 +1 @@
+Variable-From-Db: Lucky 777 Hat
DIR diff --git a/gph/404.gph b/gph/404.gph
@@ -0,0 +1 @@
+Hello world!
DIR diff --git a/index.c b/index.c
@@ -13,11 +13,16 @@
static void
error_404(char **matches)
{
+ struct gcgi_var_list vars = {0};
char *var;
+ gcgi_read_var_list(&vars, "db/vars");
+
printf("sorry, I could not find %s\n", matches[0]);
if ((var = gcgi_get_var(&gcgi_gopher_query, "var")) != NULL)
printf("I got the $var though! -> '%s'\n", var);
+
+ gcgi_template("gph/404.gph", &vars);
}
static struct gcgi_handler handlers[] = {
@@ -30,7 +35,6 @@ main(int argc, char **argv)
{
/* restrict allowed paths */
unveil("gph", "r");
- unveil("tmp", "rwc");
unveil("db", "rwc");
/* restrict allowed system calls */
DIR diff --git a/libgcgi.h b/libgcgi.h
@@ -24,9 +24,6 @@ static void gcgi_handle_request(struct gcgi_handler h[], char **argv, int argc);
/* abort the program with an error message sent to the client */
static void gcgi_fatal(char *fmt, ...);
-/* receive a file payload from the client onto the disk at `path` */
-static void gcgi_receive_file(char const *path);
-
/* print a template with every "{{name}}" looked up in `vars` */
static void gcgi_template(char const *path, struct gcgi_var_list *vars);
@@ -88,8 +85,10 @@ gcgi_fopenread(char *path)
return NULL;
if ((buf = malloc(sz + 1)) == NULL)
return NULL;
- if (fread(buf, sz, 1, fp) != sz)
+ if (fread(buf, sz, 1, fp) == sz) {
+ errno = EFBIG;
goto error_free;
+ }
if (ferror(fp))
goto error_free;
fclose(fp);
@@ -321,17 +320,14 @@ static void
gcgi_template(char const *path, struct gcgi_var_list *vars)
{
FILE *fp;
- ssize_t ssz;
size_t sz;
- char *line, *head, *tail, *key;
- char *val;
+ char *line, *head, *tail, *key, *val;
if ((fp = fopen(path, "r")) == NULL)
gcgi_fatal("opening template %s", path);
-
sz = 0;
line = NULL;
- while ((ssz = getline(&line, &sz, fp)) > 0) {
+ while (getline(&line, &sz, fp) > 0) {
head = tail = line;
for (; (key = gcgi_next_var(head, &tail)); head = tail) {
fputs(head, stdout);
@@ -342,7 +338,7 @@ gcgi_template(char const *path, struct gcgi_var_list *vars)
}
fputs(tail, stdout);
}
- if (ssz == -1)
+ if (ferror(fp))
gcgi_fatal("reading from template: %s", strerror(errno));
fclose(fp);
}