working template and variables - libgcgi - REST library for Gopher | |
git clone git://bitreich.org/libgcgi git://hg6vgqziawt5s4dj.onion/libgcgi | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
commit e52fd13abe19a46021a9661b499320da75fed2de | |
parent 092dce7972a8883e7532c848192785ed60ac9b67 | |
Author: Josuah Demangeon <[email protected]> | |
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(-) | |
--- | |
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 | |
diff --git a/db/vars b/db/vars | |
@@ -0,0 +1 @@ | |
+Variable-From-Db: Lucky 777 Hat | |
diff --git a/gph/404.gph b/gph/404.gph | |
@@ -0,0 +1 @@ | |
+Hello world! | |
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 */ | |
diff --git a/libgcgi.h b/libgcgi.h | |
@@ -24,9 +24,6 @@ static void gcgi_handle_request(struct gcgi_handler h[], char… | |
/* 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); | |
} |