diff options
Diffstat (limited to 'src/htmlerror.c')
-rw-r--r-- | src/htmlerror.c | 342 |
1 files changed, 179 insertions, 163 deletions
diff --git a/src/htmlerror.c b/src/htmlerror.c index d02eae8..afc1e63 100644 --- a/src/htmlerror.c +++ b/src/htmlerror.c @@ -1,4 +1,4 @@ -/* $Id: htmlerror.c,v 1.7 2003-08-01 00:14:34 rjkaes Exp $ +/* $Id: htmlerror.c,v 1.8 2005-08-15 03:54:31 rjkaes Exp $ * * This file contains source code for the handling and display of * HTML error pages with variable substitution. @@ -29,73 +29,77 @@ /* * Add an error number -> filename mapping to the errorpages list. */ -#define ERRORNUM_BUFSIZE 8 /* this is more than required */ +#define ERRORNUM_BUFSIZE 8 /* this is more than required */ #define ERRPAGES_BUCKETCOUNT 16 int -add_new_errorpage(char *filepath, unsigned int errornum) { - char errornbuf[ERRORNUM_BUFSIZE]; +add_new_errorpage(char *filepath, unsigned int errornum) +{ + char errornbuf[ERRORNUM_BUFSIZE]; - config.errorpages = hashmap_create(ERRPAGES_BUCKETCOUNT); - if (!config.errorpages) - return(-1); + config.errorpages = hashmap_create(ERRPAGES_BUCKETCOUNT); + if (!config.errorpages) + return (-1); - snprintf(errornbuf, ERRORNUM_BUFSIZE, "%u", errornum); + snprintf(errornbuf, ERRORNUM_BUFSIZE, "%u", errornum); - if (hashmap_insert(config.errorpages, errornbuf, - filepath, strlen(filepath) + 1) < 0) - return(-1); + if (hashmap_insert(config.errorpages, errornbuf, + filepath, strlen(filepath) + 1) < 0) + return (-1); - return(0); + return (0); } /* * Get the file appropriate for a given error. */ -static char* -get_html_file(unsigned int errornum) { - hashmap_iter result_iter; - char errornbuf[ERRORNUM_BUFSIZE]; - char *key; - static char *val; +static char * +get_html_file(unsigned int errornum) +{ + hashmap_iter result_iter; + char errornbuf[ERRORNUM_BUFSIZE]; + char *key; + static char *val; - assert(errornum >= 100 && errornum < 1000); + assert(errornum >= 100 && errornum < 1000); - if (!config.errorpages) return(config.errorpage_undef); + if (!config.errorpages) + return (config.errorpage_undef); - snprintf(errornbuf, ERRORNUM_BUFSIZE, "%u", errornum); + snprintf(errornbuf, ERRORNUM_BUFSIZE, "%u", errornum); - result_iter = hashmap_find(config.errorpages, errornbuf); + result_iter = hashmap_find(config.errorpages, errornbuf); - if (hashmap_is_end(config.errorpages, result_iter)) - return(config.errorpage_undef); + 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); + if (hashmap_return_entry(config.errorpages, result_iter, + &key, (void **)&val) < 0) + return (config.errorpage_undef); - return(val); + return (val); } /* * Look up the value for a variable. */ -static char* -lookup_variable(struct conn_s *connptr, char *varname) { - hashmap_iter result_iter; - char *key; - static char *data; +static char * +lookup_variable(struct conn_s *connptr, char *varname) +{ + hashmap_iter result_iter; + char *key; + static char *data; - result_iter = hashmap_find(connptr->error_variables, varname); + result_iter = hashmap_find(connptr->error_variables, varname); - if (hashmap_is_end(connptr->error_variables, result_iter)) - return(NULL); + if (hashmap_is_end(connptr->error_variables, result_iter)) + return (NULL); - if (hashmap_return_entry(connptr->error_variables, result_iter, - &key, (void **)&data) < 0) - return(NULL); + if (hashmap_return_entry(connptr->error_variables, result_iter, + &key, (void **)&data) < 0) + return (NULL); - return(data); + return (data); } #define HTML_BUFSIZE 4096 @@ -104,66 +108,75 @@ lookup_variable(struct conn_s *connptr, char *varname) { * Send an already-opened file to the client with variable substitution. */ int -send_html_file(FILE *infile, struct conn_s *connptr) { - char inbuf[HTML_BUFSIZE], *varstart = NULL, *p; - char *varval; - int in_variable = 0, writeret; - - while(fgets(inbuf, HTML_BUFSIZE, infile) != NULL) { - for (p = inbuf; *p; p++) { - switch(*p) { - case '}': - if(in_variable) { - *p = '\0'; - if(!(varval = lookup_variable(connptr, varstart))) - varval = "(unknown)"; - writeret = write_message(connptr->client_fd, "%s", - varval); - if(writeret) return(writeret); - in_variable = 0; - } else { - writeret = write_message(connptr->client_fd, "%c", *p); - if (writeret) return(writeret); - } - break; - case '{': - /* a {{ will print a single {. If we are NOT - * already in a { variable, then proceed with - * setup. If we ARE already in a { variable, - * this code will fallthrough to the code that - * just dumps a character to the client fd. - */ - if(!in_variable) { - varstart = p+1; - in_variable++; - } else - in_variable = 0; - default: - if(!in_variable) { - writeret = write_message(connptr->client_fd, "%c", - *p); - if(writeret) return(writeret); - } - - } - } - in_variable = 0; - } - return(0); +send_html_file(FILE * infile, struct conn_s *connptr) +{ + char inbuf[HTML_BUFSIZE], *varstart = NULL, *p; + char *varval; + int in_variable = 0, writeret; + + while (fgets(inbuf, HTML_BUFSIZE, infile) != NULL) { + for (p = inbuf; *p; p++) { + switch (*p) { + case '}': + if (in_variable) { + *p = '\0'; + if (! + (varval = + lookup_variable(connptr, + varstart))) + varval = "(unknown)"; + writeret = + write_message(connptr->client_fd, + "%s", varval); + if (writeret) + return (writeret); + in_variable = 0; + } else { + writeret = + write_message(connptr->client_fd, + "%c", *p); + if (writeret) + return (writeret); + } + break; + case '{': + /* a {{ will print a single {. If we are NOT + * already in a { variable, then proceed with + * setup. If we ARE already in a { variable, + * this code will fallthrough to the code that + * just dumps a character to the client fd. + */ + if (!in_variable) { + varstart = p + 1; + in_variable++; + } else + in_variable = 0; + default: + if (!in_variable) { + writeret = + write_message(connptr->client_fd, + "%c", *p); + if (writeret) + return (writeret); + } + + } + } + in_variable = 0; + } + return (0); } int -send_http_headers(struct conn_s *connptr, int code, char *message) { - char *headers = \ - "HTTP/1.0 %d %s\r\n" \ - "Server: %s/%s\r\n" \ - "Content-Type: text/html\r\n" \ - "Connection: close\r\n" \ - "\r\n"; - - return(write_message(connptr->client_fd, headers, - code, message, - PACKAGE, VERSION)); +send_http_headers(struct conn_s *connptr, int code, char *message) +{ + char *headers = + "HTTP/1.0 %d %s\r\n" + "Server: %s/%s\r\n" + "Content-Type: text/html\r\n" "Connection: close\r\n" "\r\n"; + + return (write_message(connptr->client_fd, headers, + code, message, PACKAGE, VERSION)); } /* @@ -172,33 +185,32 @@ send_http_headers(struct conn_s *connptr, int code, char *message) { int send_http_error_message(struct conn_s *connptr) { - char *error_file; - FILE *infile; - int ret; - char *fallback_error = \ - "<html><head><title>%s</title></head>" \ - "<body><blockquote><i>%s %s</i><br>" \ - "The page you requested was unavailable. The error code is listed " \ - "below. In addition, the HTML file which has been configured as the " \ - "page to be displayed when an error of this type was unavailable, " \ - "with the error code %d (%s). Please contact your administrator." \ - "<center>%s</center>" \ - "</body></html>" \ - "\r\n"; - - send_http_headers(connptr, connptr->error_number, connptr->error_string); - - error_file = get_html_file(connptr->error_number); - if(!(infile = fopen(error_file, "r"))) - return(write_message(connptr->client_fd, fallback_error, - connptr->error_string, - PACKAGE, VERSION, - errno, strerror(errno), - connptr->error_string)); - - ret = send_html_file(infile, connptr); - fclose(infile); - return(ret); + char *error_file; + FILE *infile; + int ret; + char *fallback_error = + "<html><head><title>%s</title></head>" + "<body><blockquote><i>%s %s</i><br>" + "The page you requested was unavailable. The error code is listed " + "below. In addition, the HTML file which has been configured as the " + "page to be displayed when an error of this type was unavailable, " + "with the error code %d (%s). Please contact your administrator." + "<center>%s</center>" "</body></html>" "\r\n"; + + send_http_headers(connptr, connptr->error_number, + connptr->error_string); + + error_file = get_html_file(connptr->error_number); + if (!(infile = fopen(error_file, "r"))) + return (write_message(connptr->client_fd, fallback_error, + connptr->error_string, + PACKAGE, VERSION, + errno, strerror(errno), + connptr->error_string)); + + ret = send_html_file(infile, connptr); + fclose(infile); + return (ret); } /* @@ -207,18 +219,20 @@ send_http_error_message(struct conn_s *connptr) #define ERRVAR_BUCKETCOUNT 16 -int -add_error_variable(struct conn_s *connptr, char *key, char *val) +int +add_error_variable(struct conn_s *connptr, char *key, char *val) { - if(!connptr->error_variables) - if (!(connptr->error_variables = hashmap_create(ERRVAR_BUCKETCOUNT))) - return(-1); + if (!connptr->error_variables) + if (! + (connptr->error_variables = + hashmap_create(ERRVAR_BUCKETCOUNT))) + return (-1); - if (hashmap_insert(connptr->error_variables, key, val, - strlen(val) + 1) < 0) - return(-1); + if (hashmap_insert(connptr->error_variables, key, val, + strlen(val) + 1) < 0) + return (-1); - return(0); + return (0); } #define ADD_VAR_RET(x, y) if(y) { if(add_error_variable(connptr, x, y) == -1) return(-1); } @@ -227,46 +241,48 @@ add_error_variable(struct conn_s *connptr, char *key, char *val) * Set some standard variables used by all HTML pages */ int -add_standard_vars(struct conn_s *connptr) { - char timebuf[30]; - time_t global_time = time(NULL); - - strftime(timebuf, sizeof(timebuf), "%a, %d %b %Y %H:%M:%S GMT", - gmtime(&global_time)); - - ADD_VAR_RET("request", connptr->request_line); - ADD_VAR_RET("cause", connptr->error_string); - ADD_VAR_RET("clientip", connptr->client_ip_addr); - ADD_VAR_RET("clienthost", connptr->client_string_addr); - ADD_VAR_RET("version", VERSION); - ADD_VAR_RET("package", PACKAGE); - ADD_VAR_RET("date", timebuf); - return(0); +add_standard_vars(struct conn_s *connptr) +{ + char timebuf[30]; + time_t global_time = time(NULL); + + strftime(timebuf, sizeof(timebuf), "%a, %d %b %Y %H:%M:%S GMT", + gmtime(&global_time)); + + ADD_VAR_RET("request", connptr->request_line); + ADD_VAR_RET("cause", connptr->error_string); + ADD_VAR_RET("clientip", connptr->client_ip_addr); + ADD_VAR_RET("clienthost", connptr->client_string_addr); + ADD_VAR_RET("version", VERSION); + ADD_VAR_RET("package", PACKAGE); + ADD_VAR_RET("date", timebuf); + return (0); } /* * Add the error information to the conn structure. */ int -indicate_http_error(struct conn_s* connptr, int number, char *message, ...) +indicate_http_error(struct conn_s *connptr, int number, char *message, ...) { - va_list ap; - char *key, *val; + va_list ap; + char *key, *val; + + va_start(ap, message); - va_start(ap, message); + while ((key = va_arg(ap, char *))) { + val = va_arg(ap, char *); - while((key = va_arg(ap, char *))) { - val = va_arg(ap, char *); - if(add_error_variable(connptr, key, val) == -1) { - va_end(ap); - return(-1); - } - } + if (add_error_variable(connptr, key, val) == -1) { + va_end(ap); + return (-1); + } + } - connptr->error_number = number; - connptr->error_string = safestrdup(message); + connptr->error_number = number; + connptr->error_string = safestrdup(message); - va_end(ap); + va_end(ap); - return(add_standard_vars(connptr)); + return (add_standard_vars(connptr)); } |