summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/utils.c83
1 files changed, 49 insertions, 34 deletions
diff --git a/src/utils.c b/src/utils.c
index 4496f75..a4516b2 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -1,4 +1,4 @@
-/* $Id: utils.c,v 1.20 2001-12-20 04:48:52 rjkaes Exp $
+/* $Id: utils.c,v 1.21 2001-12-24 00:02:32 rjkaes Exp $
*
* Misc. routines which are used by the various functions to handle strings
* and memory allocation and pretty much anything else we can think of. Also,
@@ -77,33 +77,29 @@ int
send_http_message(struct conn_s *connptr, int http_code,
const char *error_title, const char *message)
{
- static char *headers =
- "HTTP/1.0 %d %s\r\n"
- "Server: %s/%s\r\n"
- "Date: %s\r\n"
- "Content-Type: text/html\r\n"
- "Content-Length: %d\r\n" "Connection: close\r\n" "\r\n";
-
- char *header_buffer;
+ static char *headers = \
+ "HTTP/1.0 %d %s\r\n" \
+ "Server: %s/%s\r\n" \
+ "Date: %s\r\n" \
+ "Content-Type: text/html\r\n" \
+ "Content-Length: %d\r\n" \
+ "Connection: close\r\n" \
+ "\r\n";
+
char timebuf[30];
time_t global_time;
- header_buffer = safemalloc(HEADER_SIZE);
- if (!header_buffer)
- return -1;
-
global_time = time(NULL);
strftime(timebuf, sizeof(timebuf), "%a, %d %b %Y %H:%M:%S GMT",
gmtime(&global_time));
- snprintf(header_buffer, HEADER_SIZE - 1, headers, http_code,
- error_title, PACKAGE, VERSION, timebuf, strlen(message));
+ write_message(connptr->client_fd,
+ headers,
+ http_code, error_title, PACKAGE, VERSION, timebuf,
+ strlen(message));
- safe_write(connptr->client_fd, header_buffer, strlen(header_buffer));
safe_write(connptr->client_fd, message, strlen(message));
- safefree(header_buffer);
-
connptr->send_response_message = TRUE;
return 0;
@@ -115,31 +111,50 @@ send_http_message(struct conn_s *connptr, int http_code,
int
httperr(struct conn_s *connptr, int err, const char *msg)
{
- static char *message =
- "<html><head><title>%s</title></head>\r\n"
- "<body>\r\n"
- "<font size=\"+2\">Cache Error!</font><br>\r\n"
- "An error of type %d occurred: %s\r\n"
- "<hr>\r\n"
- "<font size=\"-1\"><em>Generated by %s (%s)</em></font>\r\n"
- "</body></html>\r\n\r\n";
+ static char *message = \
+ "<html><head><title>%s</title></head>\r\n" \
+ "<body>\r\n" \
+ "<font size=\"+2\">Cache Error!</font><br>\r\n" \
+ "An error of type %d occurred: %s\r\n" \
+ "<hr>\r\n" \
+ "<font size=\"-1\"><em>Generated by %s (%s)</em></font>\r\n" \
+ "</body></html>\r\n\r\n";
char *message_buffer;
-
- message_buffer = safemalloc(MAXBUFFSIZE);
+ char *tmpbuf;
+ size_t size = (1024 * 8); /* start with 8 KB */
+ ssize_t n;
+ int ret;
+
+ message_buffer = safemalloc(size);
if (!message_buffer)
return -1;
- snprintf(message_buffer, MAXBUFFSIZE - 1, message, msg, err, msg,
- PACKAGE, VERSION);
+ /*
+ * Build a new line. Keep increasing the size until the line fits.
+ * See the write_message() function in sock.c for more information.
+ */
+ while (1) {
+ n = snprintf(message_buffer, size, message, msg, err, msg, PACKAGE, VERSION);
+
+ if (n > -1 && n < size)
+ break;
+
+ if (n > - 1)
+ size = n + 1;
+ else
+ size *= 2;
- if (send_http_message(connptr, err, msg, message_buffer) < 0) {
- safefree(message_buffer);
- return -1;
+ if ((tmpbuf = saferealloc(message_buffer, size)) == NULL) {
+ safefree(message_buffer);
+ return -1;
+ } else
+ message_buffer = tmpbuf;
}
+ ret = send_http_message(connptr, err, msg, message_buffer);
safefree(message_buffer);
- return 0;
+ return ret;
}
void