summaryrefslogtreecommitdiffhomepage
path: root/src/html-error.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/html-error.c')
-rw-r--r--src/html-error.c63
1 files changed, 40 insertions, 23 deletions
diff --git a/src/html-error.c b/src/html-error.c
index 95ee9cf..fcb0b94 100644
--- a/src/html-error.c
+++ b/src/html-error.c
@@ -20,9 +20,9 @@
* HTML error pages with variable substitution.
*/
+#include "common.h"
#include "main.h"
-#include "common.h"
#include "buffer.h"
#include "conns.h"
#include "heap.h"
@@ -31,25 +31,33 @@
#include "utils.h"
#include "conf.h"
+#include <regex.h>
+
/*
* Add an error number -> filename mapping to the errorpages list.
*/
#define ERRORNUM_BUFSIZE 8 /* this is more than required */
#define ERRPAGES_BUCKETCOUNT 16
-int add_new_errorpage (char *filepath, unsigned int errornum)
+int add_new_errorpage (struct config_s *conf, char *filepath,
+ unsigned int errornum)
{
- char errornbuf[ERRORNUM_BUFSIZE];
+ char errornbuf[ERRORNUM_BUFSIZE], *k;
- config->errorpages = hashmap_create (ERRPAGES_BUCKETCOUNT);
- if (!config->errorpages)
+ if (!conf->errorpages)
+ conf->errorpages = htab_create (ERRPAGES_BUCKETCOUNT);
+ if (!conf->errorpages)
return (-1);
snprintf (errornbuf, ERRORNUM_BUFSIZE, "%u", errornum);
- if (hashmap_insert (config->errorpages, errornbuf,
- filepath, strlen (filepath) + 1) < 0)
+ k = safestrdup(errornbuf);
+ if (!k) return -1;
+
+ if (!htab_insert (conf->errorpages, k, HTV_P(filepath))) {
+ safefree(k);
return (-1);
+ }
return (0);
}
@@ -59,10 +67,8 @@ int add_new_errorpage (char *filepath, unsigned int errornum)
*/
static char *get_html_file (unsigned int errornum)
{
- hashmap_iter result_iter;
char errornbuf[ERRORNUM_BUFSIZE];
- char *key;
- char *val;
+ htab_value *hv;
assert (errornum >= 100 && errornum < 1000);
@@ -71,16 +77,15 @@ static char *get_html_file (unsigned int errornum)
snprintf (errornbuf, ERRORNUM_BUFSIZE, "%u", errornum);
- result_iter = hashmap_find (config->errorpages, errornbuf);
-
- if (hashmap_is_end (config->errorpages, result_iter))
- return (config->errorpage_undef);
-
- if (hashmap_return_entry (config->errorpages, result_iter,
- &key, (void **) &val) < 0)
- return (config->errorpage_undef);
+ hv = htab_find (config->errorpages, errornbuf);
+ if (!hv) return (config->errorpage_undef);
+ return hv->p;
+}
- return (val);
+static char *lookup_variable (struct htab *map, const char *varname) {
+ htab_value *v;
+ v = htab_find(map, varname);
+ return v ? v->p : 0;
}
static void varsubst_sendline(struct conn_s *connptr, regex_t *re, char *p) {
@@ -203,14 +208,25 @@ int send_http_error_message (struct conn_s *connptr)
int
add_error_variable (struct conn_s *connptr, const char *key, const char *val)
{
+ char *k, *v;
+
if (!connptr->error_variables)
if (!
(connptr->error_variables =
- hashmap_create (ERRVAR_BUCKETCOUNT)))
+ htab_create (ERRVAR_BUCKETCOUNT)))
return (-1);
- return hashmap_insert (connptr->error_variables, key, val,
- strlen (val) + 1);
+ k = safestrdup(key);
+ v = safestrdup(val);
+
+ if (!v || !k) goto oom;
+
+ if(htab_insert (connptr->error_variables, k, HTV_P(v)))
+ return 1;
+oom:;
+ safefree(k);
+ safefree(v);
+ return -1;
}
#define ADD_VAR_RET(x, y) \
@@ -229,6 +245,7 @@ int add_standard_vars (struct conn_s *connptr)
char errnobuf[16];
char timebuf[30];
time_t global_time;
+ struct tm tm_buf;
snprintf (errnobuf, sizeof errnobuf, "%d", connptr->error_number);
ADD_VAR_RET ("errno", errnobuf);
@@ -244,7 +261,7 @@ int add_standard_vars (struct conn_s *connptr)
global_time = time (NULL);
strftime (timebuf, sizeof (timebuf), "%a, %d %b %Y %H:%M:%S GMT",
- gmtime (&global_time));
+ gmtime_r (&global_time, &tm_buf));
add_error_variable (connptr, "date", timebuf);
add_error_variable (connptr, "website",