changeset 898:0d5be52d7131 HEAD

Use unsigned char* when accessing non-NUL terminating strings. Compiler warnings would then notify about accidentally passing them to functions which require them NUL-terminated. Changed a few functions to use void* to avoid unneeded casting.
author Timo Sirainen <tss@iki.fi>
date Sat, 04 Jan 2003 19:26:29 +0200
parents e27267f227e6
children d3075affded9
files src/lib-charset/charset-iconv.c src/lib-charset/charset-utf8.c src/lib-imap/imap-base-subject.c src/lib-imap/imap-bodystructure.c src/lib-imap/imap-envelope.c src/lib-imap/imap-envelope.h src/lib-imap/imap-message-cache.c src/lib-imap/imap-parser.c src/lib-imap/imap-quote.c src/lib-imap/imap-quote.h src/lib-imap/imap-util.h src/lib-index/mail-index-update.c src/lib-index/mbox/mbox-append.c src/lib-index/mbox/mbox-from.c src/lib-index/mbox/mbox-index.c src/lib-index/mbox/mbox-index.h src/lib-index/mbox/mbox-rewrite.c src/lib-mail/message-body-search.c src/lib-mail/message-content-parser.c src/lib-mail/message-content-parser.h src/lib-mail/message-header-search.c src/lib-mail/message-parser.c src/lib-mail/message-parser.h src/lib-mail/rfc822-address.c src/lib-mail/rfc822-address.h src/lib-mail/rfc822-date.c src/lib-mail/rfc822-tokenize.c src/lib-mail/rfc822-tokenize.h src/lib-storage/index/index-fetch-section.c src/lib-storage/index/index-search.c src/lib-storage/mail-sort.c src/lib/imem.c src/lib/imem.h src/lib/istream-data.c src/lib/istream.h src/lib/str.c src/lib/str.h src/lib/strescape.c src/lib/strescape.h src/lib/strfuncs.c src/lib/strfuncs.h src/login/client-authenticate.c src/login/ssl-proxy-gnutls.c
diffstat 43 files changed, 395 insertions(+), 302 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-charset/charset-iconv.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-charset/charset-iconv.c	Sat Jan 04 19:26:29 2003 +0200
@@ -134,7 +134,7 @@
 		if (!ucase) {
 			if (utf8_size_r != NULL)
 				*utf8_size_r = size;
-			return t_strndup((const char *) data, size);
+			return t_strndup(data, size);
 		}
 
 		return _charset_utf8_ucase_strdup(data, size, utf8_size_r);
--- a/src/lib-charset/charset-utf8.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-charset/charset-utf8.c	Sat Jan 04 19:26:29 2003 +0200
@@ -98,7 +98,7 @@
 			*unknown_charset = FALSE;
 		if (utf8_size_r != NULL)
 			*utf8_size_r = size;
-		return t_strndup((const char *) data, size);
+		return t_strndup(data, size);
 	} else {
 		if (unknown_charset != NULL)
 			*unknown_charset = TRUE;
--- a/src/lib-imap/imap-base-subject.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-imap/imap-base-subject.c	Sat Jan 04 19:26:29 2003 +0200
@@ -224,7 +224,8 @@
 	/* (1) Convert any RFC 2047 encoded-words in the subject to
 	   UTF-8.  Convert all tabs and continuations to space.
 	   Convert all multiple spaces to a single space. */
-	message_header_decode(subject, subject_len, header_decode, buf);
+	message_header_decode((const unsigned char *) subject, subject_len,
+			      header_decode, buf);
 	buffer_append_c(buf, '\0');
 
 	pack_whitespace(buf);
--- a/src/lib-imap/imap-bodystructure.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-imap/imap-bodystructure.c	Sat Jan 04 19:26:29 2003 +0200
@@ -33,7 +33,7 @@
 static void part_write_bodystructure(MessagePart *part, String *str,
 				     int extended);
 
-static void parse_content_type(const char *value, size_t value_len,
+static void parse_content_type(const unsigned char *value, size_t value_len,
 			       void *context)
 {
         MessagePartBodyData *data = context;
@@ -57,8 +57,8 @@
 	}
 }
 
-static void parse_save_params_list(const char *name, size_t name_len,
-				   const char *value, size_t value_len,
+static void parse_save_params_list(const unsigned char *name, size_t name_len,
+				   const unsigned char *value, size_t value_len,
 				   int value_quoted __attr_unused__,
 				   void *context)
 {
@@ -76,8 +76,8 @@
 	str_append_c(data->str, '"');
 }
 
-static void parse_content_transfer_encoding(const char *value, size_t value_len,
-					    void *context)
+static void parse_content_transfer_encoding(const unsigned char *value,
+					    size_t value_len, void *context)
 {
         MessagePartBodyData *data = context;
 
@@ -85,8 +85,8 @@
 		imap_quote_value(data->pool, value, value_len);
 }
 
-static void parse_content_disposition(const char *value, size_t value_len,
-				      void *context)
+static void parse_content_disposition(const unsigned char *value,
+				      size_t value_len, void *context)
 {
         MessagePartBodyData *data = context;
 
@@ -94,7 +94,7 @@
 		imap_quote_value(data->pool, value, value_len);
 }
 
-static void parse_content_language(const char *value, size_t value_len,
+static void parse_content_language(const unsigned char *value, size_t value_len,
 				   MessagePartBodyData *data)
 {
 	Rfc822TokenizeContext *ctx;
@@ -149,8 +149,8 @@
 }
 
 static void parse_header(MessagePart *part,
-			 const char *name, size_t name_len,
-			 const char *value, size_t value_len,
+			 const unsigned char *name, size_t name_len,
+			 const unsigned char *value, size_t value_len,
 			 void *context)
 {
 	Pool pool = context;
@@ -160,7 +160,7 @@
 	parent_rfc822 = part->parent != NULL &&
 		(part->parent->flags & MESSAGE_PART_FLAG_MESSAGE_RFC822);
 	if (!parent_rfc822 && (name_len <= 8 ||
-			       strncasecmp(name, "Content-", 8) != 0))
+			       memcasecmp(name, "Content-", 8) != 0))
 		return;
 
 	if (part->context == NULL) {
@@ -173,48 +173,74 @@
 
 	t_push();
 
-	/* fix the name to be \0-terminated */
-	name = t_strndup(name, name_len);
+	switch (name_len) {
+	case 10:
+		if (memcasecmp(name, "Content-ID", 10) == 0 &&
+		    part_data->content_id == NULL) {
+			part_data->content_id =
+				imap_quote_value(pool, value, value_len);
+		}
+		break;
 
-	if (strcasecmp(name, "Content-Type") == 0 &&
-	    part_data->content_type == NULL) {
+	case 11:
+		if (memcasecmp(name, "Content-MD5", 11) == 0 &&
+		    part_data->content_md5 == NULL) {
+			part_data->content_md5 =
+				imap_quote_value(pool, value, value_len);
+		}
+		break;
+
+	case 12:
+		if (memcasecmp(name, "Content-Type", 12) != 0 ||
+		    part_data->content_type != NULL)
+			break;
+
 		part_data->str = t_str_new(256);
 		message_content_parse_header(value, value_len,
 					     parse_content_type,
 					     parse_save_params_list, part_data);
 		part_data->content_type_params =
 			p_strdup_empty(pool, str_c(part_data->str));
-	} else if (strcasecmp(name, "Content-Transfer-Encoding") == 0 &&
-		   part_data->content_transfer_encoding == NULL) {
+		break;
+
+	case 16:
+		if (memcasecmp(name, "Content-Language", 16) == 0)
+			parse_content_language(value, value_len, part_data);
+		break;
+
+	case 19:
+		if (memcasecmp(name, "Content-Description", 19) == 0 &&
+		    part_data->content_description == NULL) {
+			part_data->content_description =
+				imap_quote_value(pool, value, value_len);
+		}
+		if (memcasecmp(name, "Content-Disposition", 19) == 0 &&
+		    part_data->content_disposition_params == NULL) {
+			part_data->str = t_str_new(256);
+			message_content_parse_header(value, value_len,
+						     parse_content_disposition,
+						     parse_save_params_list,
+						     part_data);
+			part_data->content_disposition_params =
+				p_strdup_empty(pool, str_c(part_data->str));
+		}
+		break;
+
+	case 25:
+		if (memcasecmp(name, "Content-Transfer-Encoding", 25) != 0 ||
+		    part_data->content_transfer_encoding != NULL)
+			break;
+
 		message_content_parse_header(value, value_len,
 					     parse_content_transfer_encoding,
 					     NULL, part_data);
-	} else if (strcasecmp(name, "Content-ID") == 0 &&
-		   part_data->content_id == NULL) {
-		part_data->content_id =
-			imap_quote_value(pool, value, value_len);
-	} else if (strcasecmp(name, "Content-Description") == 0 &&
-		   part_data->content_description == NULL) {
-		part_data->content_description =
-			imap_quote_value(pool, value, value_len);
-	} else if (strcasecmp(name, "Content-Disposition") == 0 &&
-		   part_data->content_disposition_params == NULL) {
-		part_data->str = t_str_new(256);
-		message_content_parse_header(value, value_len,
-					     parse_content_disposition,
-					     parse_save_params_list, part_data);
-		part_data->content_disposition_params =
-			p_strdup_empty(pool, str_c(part_data->str));
-	} else if (strcasecmp(name, "Content-Language") == 0) {
-		parse_content_language(value, value_len, part_data);
-	} else if (strcasecmp(name, "Content-MD5") == 0 &&
-		   part_data->content_md5 == NULL) {
-		part_data->content_md5 =
-			imap_quote_value(pool, value, value_len);
-	} else if (parent_rfc822) {
+		break;
+	}
+
+	if (parent_rfc822) {
 		/* message/rfc822, we need the envelope */
 		imap_envelope_parse_header(pool, &part_data->envelope,
-					   name, value, value_len);
+					   name, name_len, value, value_len);
 	}
 	t_pop();
 }
--- a/src/lib-imap/imap-envelope.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-imap/imap-envelope.c	Sat Jan 04 19:26:29 2003 +0200
@@ -18,15 +18,15 @@
 	char *in_reply_to, *message_id;
 };
 
-static Rfc822Address *parse_address(Pool pool, const char *value,
+static Rfc822Address *parse_address(Pool pool, const unsigned char *value,
 				    size_t value_len)
 {
-	return rfc822_address_parse(pool, t_strndup(value, value_len));
+	return rfc822_address_parse(pool, value, value_len);
 }
 
 void imap_envelope_parse_header(Pool pool, MessagePartEnvelopeData **data,
-				const char *name,
-				const char *value, size_t value_len)
+				const unsigned char *name, size_t name_len,
+				const unsigned char *value, size_t value_len)
 {
 	if (*data == NULL) {
 		*data = p_new(pool, MessagePartEnvelopeData, 1);
@@ -35,28 +35,60 @@
 
 	t_push();
 
-	if (strcasecmp(name, "Date") == 0 && (*data)->date == NULL)
-		(*data)->date = imap_quote_value(pool, value, value_len);
-	else if (strcasecmp(name, "Subject") == 0 && (*data)->subject == NULL)
-		(*data)->subject = imap_quote_value(pool, value, value_len);
-	else if (strcasecmp(name, "From") == 0 && (*data)->from == NULL)
-		(*data)->from = parse_address(pool, value, value_len);
-	else if (strcasecmp(name, "Sender") == 0 && (*data)->sender == NULL)
-		(*data)->sender = parse_address(pool, value, value_len);
-	else if (strcasecmp(name, "Reply-To") == 0 && (*data)->reply_to == NULL)
-		(*data)->reply_to = parse_address(pool, value, value_len);
-	else if (strcasecmp(name, "To") == 0 && (*data)->to == NULL)
-		(*data)->to = parse_address(pool, value, value_len);
-	else if (strcasecmp(name, "Cc") == 0 && (*data)->cc == NULL)
-		(*data)->cc = parse_address(pool, value, value_len);
-	else if (strcasecmp(name, "Bcc") == 0 && (*data)->bcc == NULL)
-		(*data)->bcc = parse_address(pool, value, value_len);
-	else if (strcasecmp(name, "In-Reply-To") == 0 &&
-		 (*data)->in_reply_to == NULL)
-		(*data)->in_reply_to = imap_quote_value(pool, value, value_len);
-	else if (strcasecmp(name, "Message-Id") == 0 &&
-		 (*data)->message_id == NULL)
-		(*data)->message_id = imap_quote_value(pool, value, value_len);
+	switch (name_len) {
+	case 2:
+		if (memcasecmp(name, "To", 2) == 0 && (*data)->to == NULL)
+			(*data)->to = parse_address(pool, value, value_len);
+		else if (memcasecmp(name, "Cc", 2) == 0 && (*data)->cc == NULL)
+			(*data)->cc = parse_address(pool, value, value_len);
+		break;
+	case 3:
+		if (memcasecmp(name, "Bcc", 3) == 0 && (*data)->bcc == NULL)
+			(*data)->bcc = parse_address(pool, value, value_len);
+		break;
+	case 4:
+		if (memcasecmp(name, "From", 4) == 0 && (*data)->from == NULL)
+			(*data)->from = parse_address(pool, value, value_len);
+		else if (memcasecmp(name, "Date", 4) == 0 &&
+			 (*data)->date == NULL) {
+			(*data)->date = imap_quote_value(pool, value,
+							 value_len);
+		}
+		break;
+	case 6:
+		if (memcasecmp(name, "Sender", 6) == 0 &&
+		    (*data)->sender == NULL)
+			(*data)->sender = parse_address(pool, value, value_len);
+		break;
+	case 7:
+		if (memcasecmp(name, "Subject", 7) == 0 &&
+		    (*data)->subject == NULL) {
+			(*data)->subject = imap_quote_value(pool, value,
+							    value_len);
+		}
+		break;
+	case 8:
+		if (memcasecmp(name, "Reply-To", 8) == 0 &&
+		    (*data)->reply_to == NULL) {
+			(*data)->reply_to = parse_address(pool, value,
+							  value_len);
+		}
+		break;
+	case 10:
+		if (memcasecmp(name, "Message-Id", 10) == 0 &&
+		    (*data)->message_id == NULL) {
+			(*data)->message_id = imap_quote_value(pool, value,
+							       value_len);
+		}
+		break;
+	case 11:
+		if (memcasecmp(name, "In-Reply-To", 11) == 0 &&
+		    (*data)->in_reply_to == NULL) {
+			(*data)->in_reply_to = imap_quote_value(pool, value,
+								value_len);
+		}
+		break;
+	}
 
 	t_pop();
 }
--- a/src/lib-imap/imap-envelope.h	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-imap/imap-envelope.h	Sat Jan 04 19:26:29 2003 +0200
@@ -26,8 +26,8 @@
 
 /* Update envelope data based from given header field */
 void imap_envelope_parse_header(Pool pool, MessagePartEnvelopeData **data,
-				const char *name,
-				const char *value, size_t value_len);
+				const unsigned char *name, size_t name_len,
+				const unsigned char *value, size_t value_len);
 
 /* Write envelope to given string */
 void imap_envelope_write_part_data(MessagePartEnvelopeData *data,
--- a/src/lib-imap/imap-message-cache.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-imap/imap-message-cache.c	Sat Jan 04 19:26:29 2003 +0200
@@ -147,8 +147,8 @@
 }
 
 static void parse_envelope_header(MessagePart *part,
-				  const char *name, size_t name_len,
-				  const char *value, size_t value_len,
+				  const unsigned char *name, size_t name_len,
+				  const unsigned char *value, size_t value_len,
 				  void *context)
 {
 	CachedMessage *msg = context;
@@ -156,8 +156,7 @@
 	if (part == NULL || part->parent == NULL) {
 		/* parse envelope headers if we're at the root message part */
 		imap_envelope_parse_header(msg->pool, &msg->envelope,
-					   t_strndup(name, name_len),
-					   value, value_len);
+					   name, name_len, value, value_len);
 	}
 }
 
--- a/src/lib-imap/imap-parser.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-imap/imap-parser.c	Sat Jan 04 19:26:29 2003 +0200
@@ -113,7 +113,8 @@
 }
 
 /* skip over everything parsed so far, plus the following whitespace */
-static int imap_parser_skip_to_next(ImapParser *parser, const char **data,
+static int imap_parser_skip_to_next(ImapParser *parser,
+				    const unsigned char **data,
 				    size_t *data_size)
 {
 	size_t i;
@@ -187,8 +188,8 @@
 	return TRUE;
 }
 
-static void imap_parser_save_arg(ImapParser *parser, const char *data,
-				 size_t lastpos)
+static void imap_parser_save_arg(ImapParser *parser, const unsigned char *data,
+				 size_t size)
 {
 	ImapArg *arg;
 
@@ -196,21 +197,21 @@
 
 	switch (parser->cur_type) {
 	case ARG_PARSE_ATOM:
-		if (lastpos == 3 && strncmp(data, "NIL", 3) == 0) {
+		if (size == 3 && memcmp(data, "NIL", 3) == 0) {
 			/* NIL argument */
 			arg->type = IMAP_ARG_NIL;
 		} else {
 			/* simply save the string */
 			arg->type = IMAP_ARG_ATOM;
-			arg->_data.str = p_strndup(parser->pool, data, lastpos);
+			arg->_data.str = p_strndup(parser->pool, data, size);
 		}
 		break;
 	case ARG_PARSE_STRING:
 		/* data is quoted and may contain escapes. */
-		i_assert(lastpos > 0);
+		i_assert(size > 0);
 
 		arg->type = IMAP_ARG_STRING;
-		arg->_data.str = p_strndup(parser->pool, data+1, lastpos-1);
+		arg->_data.str = p_strndup(parser->pool, data+1, size-1);
 
 		/* remove the escapes */
 		if (parser->str_first_escape >= 0 &&
@@ -224,7 +225,7 @@
 		if ((parser->flags & IMAP_PARSE_FLAG_LITERAL_SIZE) == 0) {
 			/* simply save the string */
 			arg->type = IMAP_ARG_STRING;
-			arg->_data.str = p_strndup(parser->pool, data, lastpos);
+			arg->_data.str = p_strndup(parser->pool, data, size);
 		} else {
 			/* save literal size */
 			arg->type = IMAP_ARG_LITERAL_SIZE;
@@ -238,7 +239,7 @@
 	parser->cur_type = ARG_PARSE_NONE;
 }
 
-static int imap_parser_read_atom(ImapParser *parser, const char *data,
+static int imap_parser_read_atom(ImapParser *parser, const unsigned char *data,
 				 size_t data_size)
 {
 	size_t i;
@@ -275,8 +276,8 @@
 	return parser->cur_type == ARG_PARSE_NONE;
 }
 
-static int imap_parser_read_string(ImapParser *parser, const char *data,
-				   size_t data_size)
+static int imap_parser_read_string(ImapParser *parser,
+				   const unsigned char *data, size_t data_size)
 {
 	size_t i;
 
@@ -339,7 +340,8 @@
 	return TRUE;
 }
 
-static int imap_parser_read_literal(ImapParser *parser, const char *data,
+static int imap_parser_read_literal(ImapParser *parser,
+				    const unsigned char *data,
 				    size_t data_size)
 {
 	size_t i, prev_size;
@@ -370,7 +372,8 @@
 	return FALSE;
 }
 
-static int imap_parser_read_literal_data(ImapParser *parser, const char *data,
+static int imap_parser_read_literal_data(ImapParser *parser,
+					 const unsigned char *data,
 					 size_t data_size)
 {
 	if (parser->literal_skip_crlf) {
@@ -419,10 +422,10 @@
    an argument inside a list was processed. */
 static int imap_parser_read_arg(ImapParser *parser)
 {
-	const char *data;
+	const unsigned char *data;
 	size_t data_size;
 
-	data = (const char *) i_stream_get_data(parser->input, &data_size);
+	data = i_stream_get_data(parser->input, &data_size);
 	if (data_size == 0)
 		return FALSE;
 
@@ -485,8 +488,7 @@
 
 		/* pass through to parsing data. since input->skip was
 		   modified, we need to get the data start position again. */
-		data = (const char *) i_stream_get_data(parser->input,
-							&data_size);
+		data = i_stream_get_data(parser->input, &data_size);
 
 		/* fall through */
 	case ARG_PARSE_LITERAL_DATA:
@@ -551,10 +553,10 @@
 
 const char *imap_parser_read_word(ImapParser *parser)
 {
-	const char *data;
+	const unsigned char *data;
 	size_t i, data_size;
 
-	data = (const char *) i_stream_get_data(parser->input, &data_size);
+	data = i_stream_get_data(parser->input, &data_size);
 
 	for (i = 0; i < data_size; i++) {
 		if (data[i] == ' ' || data[i] == '\r' || data[i] == '\n')
@@ -571,10 +573,10 @@
 
 const char *imap_parser_read_line(ImapParser *parser)
 {
-	const char *data;
+	const unsigned char *data;
 	size_t i, data_size;
 
-	data = (const char *) i_stream_get_data(parser->input, &data_size);
+	data = i_stream_get_data(parser->input, &data_size);
 
 	for (i = 0; i < data_size; i++) {
 		if (data[i] == '\r' || data[i] == '\n')
--- a/src/lib-imap/imap-quote.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-imap/imap-quote.c	Sat Jan 04 19:26:29 2003 +0200
@@ -13,7 +13,7 @@
 #define IS_BREAK_OR_CRLF_CHAR(c) \
 	(IS_BREAK_CHAR(c) || (c) == '\r' || (c) == '\n')
 
-static size_t next_token_quoted(const char *value, size_t len,
+static size_t next_token_quoted(const unsigned char *value, size_t len,
 				int *need_qp, int *quoted)
 {
 	size_t i;
@@ -22,7 +22,7 @@
 	*quoted = TRUE;
 
 	for (i = *quoted ? 0 : 1; i < len; i++) {
-		if ((unsigned char)value[i] & 0x80)
+		if (value[i] & 0x80)
 			*need_qp = TRUE;
 
 		if (value[i] == '"' || value[i] == '\r' || value[i] == '\n') {
@@ -35,7 +35,7 @@
 	return i;
 }
 
-static size_t next_token(const char *value, size_t len,
+static size_t next_token(const unsigned char *value, size_t len,
 			 int *need_qp, int *quoted, int qp_on)
 {
 	size_t i = 0;
@@ -68,7 +68,7 @@
 
 	/* then stop at break-char */
 	for (; i < len; i++) {
-		if ((unsigned char)value[i] & 0x80)
+		if (value[i] & 0x80)
 			*need_qp = TRUE;
 
 		if (IS_BREAK_OR_CRLF_CHAR(value[i]))
@@ -78,7 +78,8 @@
 	return i;
 }
 
-static void append_quoted_qp(String *str, const char *value, size_t len)
+static void append_quoted_qp(String *str, const unsigned char *value,
+			     size_t len)
 {
 	size_t i;
 	unsigned char c;
@@ -96,15 +97,15 @@
 			str_append_c(str, value[i]);
 		} else {
 			str_append_c(str, '=');
-			c = (unsigned char)value[i] >> 4;
+			c = value[i] >> 4;
 			str_append_c(str, c < 10 ? (c+'0') : (c-10+'A'));
-			c = (unsigned char)value[i] & 0x0f;
+			c = value[i] & 0x0f;
 			str_append_c(str, c < 10 ? (c+'0') : (c-10+'A'));
 		}
 	}
 }
 
-static void append_quoted(String *str, const char *value, size_t len)
+static void append_quoted(String *str, const unsigned char *value, size_t len)
 {
 	size_t i;
 
@@ -116,7 +117,7 @@
 }
 
 /* does two things: 1) escape '\' and '"' characters, 2) 8bit text -> QP */
-static String *get_quoted_str(const char *value, size_t value_len)
+static String *get_quoted_str(const unsigned char *value, size_t value_len)
 {
 	String *str;
 	size_t token_len;
@@ -165,13 +166,14 @@
 const char *imap_quote_str_nil(const char *value)
 {
 	return value == NULL ? "NIL" :
-		str_c(get_quoted_str(value, strlen(value)));
+		str_c(get_quoted_str((const unsigned char *) value,
+				     strlen(value)));
 }
 
-char *imap_quote_value(Pool pool, const char *value, size_t value_len)
+char *imap_quote_value(Pool pool, const unsigned char *value, size_t value_len)
 {
 	String *str;
 
 	str = get_quoted_str(value, value_len);
-	return p_strndup(pool, str_c(str), str_len(str));
+	return p_strndup(pool, str_data(str), str_len(str));
 }
--- a/src/lib-imap/imap-quote.h	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-imap/imap-quote.h	Sat Jan 04 19:26:29 2003 +0200
@@ -5,6 +5,6 @@
 const char *imap_quote_str_nil(const char *value);
 
 /* Return value quoted and allocated from specified pool. */
-char *imap_quote_value(Pool pool, const char *value, size_t value_len);
+char *imap_quote_value(Pool pool, const unsigned char *value, size_t value_len);
 
 #endif
--- a/src/lib-imap/imap-util.h	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-imap/imap-util.h	Sat Jan 04 19:26:29 2003 +0200
@@ -10,7 +10,10 @@
 	MAIL_RECENT		= 0x0000020,
 
 	/* rest of the bits are custom flags */
-	MAIL_CUSTOM_FLAG_1      = 0x0000040
+	MAIL_CUSTOM_FLAG_1      = 0x0000040,
+
+	MAIL_SYSTEM_FLAGS_MASK	= 0x000003f,
+	MAIL_CUSTOM_FLAGS_MASK	= 0xfffffc0
 } MailFlags;
 
 /* growing number of flags isn't very easy. biggest problem is that they're
@@ -19,9 +22,6 @@
    file name using 'a'..'z' letters which gets us exactly the needed 26
    flags. if more is added, the current code breaks. */
 enum {
-	MAIL_SYSTEM_FLAGS_MASK	= 0x000003f,
-	MAIL_CUSTOM_FLAGS_MASK	= 0xfffffc0,
-
 	MAIL_CUSTOM_FLAG_1_BIT	= 6,
 	MAIL_CUSTOM_FLAGS_COUNT	= 26,
 
--- a/src/lib-index/mail-index-update.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-index/mail-index-update.c	Sat Jan 04 19:26:29 2003 +0200
@@ -372,8 +372,8 @@
 } HeaderUpdateContext;
 
 static void update_header_func(MessagePart *part,
-			       const char *name, size_t name_len,
-			       const char *value, size_t value_len,
+			       const unsigned char *name, size_t name_len,
+			       const unsigned char *value, size_t value_len,
 			       void *context)
 {
 	HeaderUpdateContext *ctx = context;
@@ -387,12 +387,8 @@
 			ctx->envelope_pool =
 				pool_alloconly_create("index envelope", 2048);
 		}
-		t_push();
-		imap_envelope_parse_header(ctx->envelope_pool,
-					   &ctx->envelope,
-					   t_strndup(name, name_len),
-					   value, value_len);
-		t_pop();
+		imap_envelope_parse_header(ctx->envelope_pool, &ctx->envelope,
+					   name, name_len, value, value_len);
 	}
 
 	if (ctx->header_func != NULL) {
--- a/src/lib-index/mbox/mbox-append.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-index/mbox/mbox-append.c	Sat Jan 04 19:26:29 2003 +0200
@@ -44,7 +44,7 @@
 	}
 
 	/* parse the From-line */
-	internal_date = mbox_from_parse_date((const char *) data + 5, size - 5);
+	internal_date = mbox_from_parse_date(data + 5, size - 5);
 	if (internal_date == (time_t)-1)
 		internal_date = ioloop_time;
 
--- a/src/lib-index/mbox/mbox-from.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-index/mbox/mbox-from.c	Sat Jan 04 19:26:29 2003 +0200
@@ -16,9 +16,9 @@
 	"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
 };
 
-time_t mbox_from_parse_date(const char *msg, size_t size)
+time_t mbox_from_parse_date(const unsigned char *msg, size_t size)
 {
-	const char *msg_end;
+	const unsigned char *msg_end;
 	struct tm tm;
 	int i;
 
@@ -41,7 +41,7 @@
 
 	/* month */
 	for (i = 0; i < 12; i++) {
-		if (strncasecmp(months[i], msg, 3) == 0) {
+		if (memcasecmp(months[i], msg, 3) == 0) {
 			tm.tm_mon = i;
 			break;
 		}
--- a/src/lib-index/mbox/mbox-index.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-index/mbox/mbox-index.c	Sat Jan 04 19:26:29 2003 +0200
@@ -139,7 +139,7 @@
 {
 }
 
-static MailFlags mbox_get_status_flags(const char *value, size_t len)
+static MailFlags mbox_get_status_flags(const unsigned char *value, size_t len)
 {
 	MailFlags flags;
 	size_t i;
@@ -168,7 +168,7 @@
 	return flags;
 }
 
-static void mbox_update_custom_flags(const char *value __attr_unused__,
+static void mbox_update_custom_flags(const unsigned char *value __attr_unused__,
 				     size_t len __attr_unused__,
 				     int index, void *context)
 {
@@ -179,7 +179,7 @@
 }
 
 static MailFlags
-mbox_get_keyword_flags(const char *value, size_t len,
+mbox_get_keyword_flags(const unsigned char *value, size_t len,
 		       const char *custom_flags[MAIL_CUSTOM_FLAGS_COUNT])
 {
 	MailFlags flags;
@@ -190,7 +190,7 @@
 	return flags;
 }
 
-static int mbox_parse_imapbase(const char *value, size_t len,
+static int mbox_parse_imapbase(const unsigned char *value, size_t len,
 			       MboxHeaderContext *ctx)
 {
 	const char **flag;
@@ -247,8 +247,8 @@
 }
 
 void mbox_header_func(MessagePart *part __attr_unused__,
-		      const char *name, size_t name_len,
-		      const char *value, size_t value_len,
+		      const unsigned char *name, size_t name_len,
+		      const unsigned char *value, size_t value_len,
 		      void *context)
 {
 	MboxHeaderContext *ctx = context;
@@ -256,12 +256,10 @@
 	size_t i;
 	int fixed = FALSE;
 
-	/* Pretty much copy&pasted from popa3d by Solar Designer */
-	switch (*name) {
-	case '\0':
+	if (name_len == 0) {
 		/* End of headers */
 		if (!ctx->set_read_limit)
-			break;
+			return;
 
 		/* a) use Content-Length, b) search for "From "-line */
 		start_offset = ctx->input->v_offset;
@@ -279,12 +277,15 @@
 
 		i_stream_seek(ctx->input, start_offset);
 		i_stream_set_read_limit(ctx->input, end_offset);
-		break;
+		return;
+	}
 
+	/* Pretty much copy&pasted from popa3d by Solar Designer */
+	switch (*name) {
 	case 'R':
 	case 'r':
 		if (!ctx->received && name_len == 8 &&
-		    strncasecmp(name, "Received", 8) == 0) {
+		    memcasecmp(name, "Received", 8) == 0) {
 			ctx->received = TRUE;
 			fixed = TRUE;
 		}
@@ -293,7 +294,7 @@
 	case 'C':
 	case 'c':
 		if (name_len == 14 && ctx->set_read_limit &&
-		    strncasecmp(name, "Content-Length", 14) == 0) {
+		    memcasecmp(name, "Content-Length", 14) == 0) {
 			/* manual parsing, so we can deal with uoff_t */
 			ctx->content_length = 0;
 			for (i = 0; i < value_len; i++) {
@@ -312,12 +313,12 @@
 	case 'D':
 	case 'd':
 		if (name_len == 12)
-			fixed = strncasecmp(name, "Delivered-To", 12) == 0;
+			fixed = memcasecmp(name, "Delivered-To", 12) == 0;
 		else if (name_len == 4) {
 			/* Received-header contains date too,
 			   and more trusted one */
 			fixed = !ctx->received &&
-				strncasecmp(name, "Date", 4) == 0;
+				memcasecmp(name, "Date", 4) == 0;
 		}
 		break;
 
@@ -327,13 +328,13 @@
 			/* Received-header contains unique ID too,
 			   and more trusted one */
 			fixed = !ctx->received &&
-				strncasecmp(name, "Message-ID", 10) == 0;
+				memcasecmp(name, "Message-ID", 10) == 0;
 		}
 		break;
 
 	case 'S':
 	case 's':
-		if (name_len == 6 && strncasecmp(name, "Status", 6) == 0) {
+		if (name_len == 6 && memcasecmp(name, "Status", 6) == 0) {
 			/* update message flags */
 			ctx->flags |= mbox_get_status_flags(value, value_len);
 		}
@@ -345,18 +346,18 @@
 			/* Let the local delivery agent help generate unique
 			   ID's but don't blindly trust this header alone as
 			   it could just as easily come from the remote. */
-			fixed = strncasecmp(name, "X-Delivery-ID:", 13) == 0;
+			fixed = memcasecmp(name, "X-Delivery-ID:", 13) == 0;
 		} else if (name_len == 8 &&
-			 strncasecmp(name, "X-Status", 8) == 0) {
+			   memcasecmp(name, "X-Status", 8) == 0) {
 			/* update message flags */
 			ctx->flags |= mbox_get_status_flags(value, value_len);
 		} else if (name_len == 10 &&
-			   strncasecmp(name, "X-Keywords", 10) == 0) {
+			   memcasecmp(name, "X-Keywords", 10) == 0) {
 			/* update custom message flags */
 			ctx->flags |= mbox_get_keyword_flags(value, value_len,
 							     ctx->custom_flags);
 		} else if (name_len == 10 &&
-			   strncasecmp(name, "X-IMAPbase", 10) == 0) {
+			   memcasecmp(name, "X-IMAPbase", 10) == 0) {
 			/* update list of custom message flags */
 			(void)mbox_parse_imapbase(value, value_len, ctx);
 		}
@@ -367,9 +368,10 @@
 		md5_update(&ctx->md5, value, value_len);
 }
 
-void mbox_keywords_parse(const char *value, size_t len,
+void mbox_keywords_parse(const unsigned char *value, size_t len,
 			 const char *custom_flags[MAIL_CUSTOM_FLAGS_COUNT],
-			 void (*func)(const char *, size_t, int, void *),
+			 void (*func)(const unsigned char *, size_t,
+				      int, void *),
 			 void *context)
 {
 	size_t custom_len[MAIL_CUSTOM_FLAGS_COUNT];
@@ -409,7 +411,7 @@
 		/* check if it's found */
 		for (i = 0; i < MAIL_CUSTOM_FLAGS_COUNT; i++) {
 			if (custom_len[i] == item_len &&
-			    strncasecmp(custom_flags[i], value, item_len) == 0)
+			    memcasecmp(custom_flags[i], value, item_len) == 0)
 				break;
 		}
 
@@ -484,8 +486,8 @@
 			if (msg[i] == '\n') {
 				msg += startpos;
 				i -= startpos;
-				return mbox_from_parse_date((const char *) msg,
-							    size) != (time_t)-1;
+				return mbox_from_parse_date(msg, size) !=
+					(time_t)-1;
 			}
 		}
 	}
--- a/src/lib-index/mbox/mbox-index.h	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-index/mbox/mbox-index.h	Sat Jan 04 19:26:29 2003 +0200
@@ -31,12 +31,13 @@
 			      IStream *input);
 void mbox_header_free_context(MboxHeaderContext *ctx);
 void mbox_header_func(MessagePart *part __attr_unused__,
-		      const char *name, size_t name_len,
-		      const char *value, size_t value_len,
+		      const unsigned char *name, size_t name_len,
+		      const unsigned char *value, size_t value_len,
 		      void *context);
-void mbox_keywords_parse(const char *value, size_t len,
+void mbox_keywords_parse(const unsigned char *value, size_t len,
 			 const char *custom_flags[MAIL_CUSTOM_FLAGS_COUNT],
-			 void (*func)(const char *, size_t, int, void *),
+			 void (*func)(const unsigned char *, size_t,
+				      int, void *),
 			 void *context);
 int mbox_skip_crlf(IStream *input);
 void mbox_skip_empty_lines(IStream *input);
@@ -55,7 +56,7 @@
 
 int mbox_index_append(MailIndex *index, IStream *input);
 
-time_t mbox_from_parse_date(const char *msg, size_t size);
+time_t mbox_from_parse_date(const unsigned char *msg, size_t size);
 const char *mbox_from_create(const char *sender, time_t time);
 
 int mbox_index_rewrite(MailIndex *index);
--- a/src/lib-index/mbox/mbox-rewrite.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-index/mbox/mbox-rewrite.c	Sat Jan 04 19:26:29 2003 +0200
@@ -196,7 +196,7 @@
 	return TRUE;
 }
 
-static const char *strip_chars(const char *value, size_t value_len,
+static const char *strip_chars(const unsigned char *value, size_t value_len,
 			       const char *list)
 {
 	/* @UNSAFE: leave only unknown flags, very likely none */
@@ -216,7 +216,7 @@
 	return ret;
 }
 
-static void update_stripped_custom_flags(const char *value, size_t len,
+static void update_stripped_custom_flags(const unsigned char *value, size_t len,
 					 int index, void *context)
 {
 	String *str = context;
@@ -229,7 +229,7 @@
 	}
 }
 
-static const char *strip_custom_flags(const char *value, size_t len,
+static const char *strip_custom_flags(const unsigned char *value, size_t len,
 				      MboxRewriteContext *ctx)
 {
 	String *str;
@@ -241,8 +241,8 @@
 }
 
 static void header_func(MessagePart *part __attr_unused__,
-			const char *name, size_t name_len,
-			const char *value, size_t value_len,
+			const unsigned char *name, size_t name_len,
+			const unsigned char *value, size_t value_len,
 			void *context)
 {
 	MboxRewriteContext *ctx = context;
@@ -252,25 +252,27 @@
 	if (ctx->failed)
 		return;
 
-	if (name_len == 6 && strncasecmp(name, "Status", 6) == 0) {
+	if (name_len == 6 && memcasecmp(name, "Status", 6) == 0) {
 		ctx->status_found = TRUE;
 		str = strip_chars(value, value_len, "RO");
 		(void)mbox_write_status(ctx, str);
-	} else if (name_len == 8 && strncasecmp(name, "X-Status", 8) == 0) {
+	} else if (name_len == 8 && memcasecmp(name, "X-Status", 8) == 0) {
 		ctx->xstatus_found = TRUE;
 		str = strip_chars(value, value_len, "ADFT");
 		(void)mbox_write_xstatus(ctx, str);
-	} else if (name_len == 10 && strncasecmp(name, "X-Keywords", 10) == 0) {
+	} else if (name_len == 10 && memcasecmp(name, "X-Keywords", 10) == 0) {
 		ctx->ximapbase_found = TRUE;
 		str = strip_custom_flags(value, value_len, ctx);
 		(void)mbox_write_xkeywords(ctx, str);
-	} else if (name_len == 10 && strncasecmp(name, "X-IMAPbase", 10) == 0) {
+	} else if (name_len == 10 && memcasecmp(name, "X-IMAPbase", 10) == 0) {
 		if (ctx->seq == 1) {
 			/* temporarily copy the value to make sure we
 			   don't overflow it */
+			const char *str;
+
 			t_push();
-			value = t_strndup(value, value_len);
-			ctx->uid_validity = strtoul(value, &end, 10);
+			str = t_strndup(value, value_len);
+			ctx->uid_validity = strtoul(str, &end, 10);
 			while (*end == ' ') end++;
 			ctx->uid_last = strtoul(end, &end, 10);
 			t_pop();
@@ -279,7 +281,7 @@
 			(void)mbox_write_ximapbase(ctx);
 		}
 	} else if (name_len == 14 &&
-		   strncasecmp(name, "Content-Length", 14) == 0) {
+		   memcasecmp(name, "Content-Length", 14) == 0) {
 		ctx->content_length_found = TRUE;
 		(void)mbox_write_content_length(ctx);
 	} else if (name_len > 0) {
--- a/src/lib-mail/message-body-search.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-mail/message-body-search.c	Sat Jan 04 19:26:29 2003 +0200
@@ -45,7 +45,7 @@
 	unsigned int found:1;
 } PartSearchContext;
 
-static void parse_content_type(const char *value, size_t value_len,
+static void parse_content_type(const unsigned char *value, size_t value_len,
 			       void *context)
 {
 	PartSearchContext *ctx = context;
@@ -58,38 +58,39 @@
 	}
 }
 
-static void parse_content_type_param(const char *name, size_t name_len,
-				     const char *value, size_t value_len,
-				     int value_quoted, void *context)
+static void
+parse_content_type_param(const unsigned char *name, size_t name_len,
+			 const unsigned char *value, size_t value_len,
+			 int value_quoted, void *context)
 {
 	PartSearchContext *ctx = context;
 
-	if (name_len == 7 && strncasecmp(name, "charset", 7) == 0 &&
+	if (name_len == 7 && memcasecmp(name, "charset", 7) == 0 &&
 	    ctx->content_charset == NULL) {
 		ctx->content_charset = i_strndup(value, value_len);
 		if (value_quoted) str_unescape(ctx->content_charset);
 	}
 }
 
-static void parse_content_encoding(const char *value, size_t value_len,
+static void parse_content_encoding(const unsigned char *value, size_t value_len,
 				   void *context)
 {
 	PartSearchContext *ctx = context;
 
 	switch (value_len) {
 	case 4:
-		if (strncasecmp(value, "7bit", 4) != 0 &&
-		    strncasecmp(value, "8bit", 4) != 0)
+		if (memcasecmp(value, "7bit", 4) != 0 &&
+		    memcasecmp(value, "8bit", 4) != 0)
 			ctx->content_unknown = TRUE;
 		break;
 	case 6:
-		if (strncasecmp(value, "base64", 6) == 0)
+		if (memcasecmp(value, "base64", 6) == 0)
 			ctx->content_base64 = TRUE;
-		else if (strncasecmp(value, "binary", 6) != 0)
+		else if (memcasecmp(value, "binary", 6) != 0)
 			ctx->content_unknown = TRUE;
 		break;
 	case 16:
-		if (strncasecmp(value, "quoted-printable", 16) == 0)
+		if (memcasecmp(value, "quoted-printable", 16) == 0)
 			ctx->content_qp = TRUE;
 		else
 			ctx->content_unknown = TRUE;
@@ -101,8 +102,9 @@
 }
 
 static void header_find(MessagePart *part __attr_unused__,
-			const char *name, size_t name_len,
-			const char *value, size_t value_len, void *context)
+			const unsigned char *name, size_t name_len,
+			const unsigned char *value, size_t value_len,
+			void *context)
 {
 	PartSearchContext *ctx = context;
 
@@ -114,13 +116,13 @@
 						   ctx->hdr_search_ctx);
 	}
 
-	if (name_len == 12 && strncasecmp(name, "Content-Type", 12) == 0) {
+	if (name_len == 12 && memcasecmp(name, "Content-Type", 12) == 0) {
 		message_content_parse_header(value, value_len,
 					     parse_content_type,
 					     parse_content_type_param,
 					     ctx);
 	} else if (name_len == 25 &&
-		   strncasecmp(name, "Content-Transfer-Encoding", 25) == 0) {
+		   memcasecmp(name, "Content-Transfer-Encoding", 25) == 0) {
 		message_content_parse_header(value, value_len,
 					     parse_content_encoding,
 					     NULL, ctx);
@@ -344,7 +346,8 @@
 
 	/* get the key uppercased */
 	key = charset_to_ucase_utf8_string(charset, unknown_charset,
-					   key, strlen(key), &key_len);
+					   (const unsigned char *) key,
+					   strlen(key), &key_len);
 	if (key == NULL)
 		return FALSE;
 
--- a/src/lib-mail/message-content-parser.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-mail/message-content-parser.c	Sat Jan 04 19:26:29 2003 +0200
@@ -5,7 +5,7 @@
 #include "rfc822-tokenize.h"
 #include "message-content-parser.h"
 
-void message_content_parse_header(const char *data, size_t size,
+void message_content_parse_header(const unsigned char *data, size_t size,
 				  ParseContentFunc func,
 				  ParseContentParamFunc param_func,
 				  void *context)
@@ -14,7 +14,7 @@
 	Rfc822TokenizeContext *ctx;
 	Rfc822Token token;
 	String *str;
-	const char *key, *value;
+	const unsigned char *key, *value;
 	size_t key_len, value_len;
 
 	ctx = rfc822_tokenize_init(data, size, NULL, NULL);
@@ -27,7 +27,7 @@
 	rfc822_tokenize_get_string(ctx, str, NULL, stop_tokens);
 
 	if (func != NULL)
-		func(str_c(str), str_len(str), context);
+		func(str_data(str), str_len(str), context);
 
 	t_pop();
 
--- a/src/lib-mail/message-content-parser.h	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-mail/message-content-parser.h	Sat Jan 04 19:26:29 2003 +0200
@@ -2,13 +2,15 @@
 #define __MESSAGE_CONTENT_PARSER_H
 
 /* NOTE: name and value aren't \0-terminated. */
-typedef void (*ParseContentFunc)(const char *value, size_t value_len,
+typedef void (*ParseContentFunc)(const unsigned char *value, size_t value_len,
 				 void *context);
-typedef void (*ParseContentParamFunc)(const char *name, size_t name_len,
-				      const char *value, size_t value_len,
+typedef void (*ParseContentParamFunc)(const unsigned char *name,
+				      size_t name_len,
+				      const unsigned char *value,
+				      size_t value_len,
 				      int value_quoted, void *context);
 
-void message_content_parse_header(const char *data, size_t size,
+void message_content_parse_header(const unsigned char *data, size_t size,
 				  ParseContentFunc func,
 				  ParseContentParamFunc param_func,
 				  void *context);
--- a/src/lib-mail/message-header-search.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-mail/message-header-search.c	Sat Jan 04 19:26:29 2003 +0200
@@ -36,21 +36,22 @@
 {
 	HeaderSearchContext *ctx;
 	size_t key_len;
-	const char *p;
+	const unsigned char *p;
 
 	ctx = p_new(pool, HeaderSearchContext, 1);
 	ctx->pool = pool;
 
 	/* get the key uppercased */
 	key = charset_to_ucase_utf8_string(charset, unknown_charset,
-					   key, strlen(key), &key_len);
+					   (const unsigned char *) key,
+					   strlen(key), &key_len);
 
 	if (key == NULL) {
 		/* invalid key */
 		return NULL;
 	}
 
-	ctx->key = p_strdup(pool, key);
+	ctx->key = (unsigned char *) p_strdup(pool, key);
 	ctx->key_len = key_len;
 	ctx->key_charset = p_strdup(pool, charset);
 	ctx->unknown_charset = charset == NULL;
@@ -104,7 +105,7 @@
 		/* unknown character set, or invalid data */
 	} else {
 		ctx->submatch = TRUE;
-		search_loop(utf8_data, utf8_size, ctx);
+		search_loop((const unsigned char *) utf8_data, utf8_size, ctx);
 		ctx->submatch = FALSE;
 	}
 }
--- a/src/lib-mail/message-parser.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-mail/message-parser.c	Sat Jan 04 19:26:29 2003 +0200
@@ -68,7 +68,7 @@
 	return part;
 }
 
-static void parse_content_type(const char *value, size_t value_len,
+static void parse_content_type(const unsigned char *value, size_t value_len,
 			       void *context)
 {
 	MessageParseContext *parse_ctx = context;
@@ -94,14 +94,15 @@
 	}
 }
 
-static void parse_content_type_param(const char *name, size_t name_len,
-				     const char *value, size_t value_len,
-				     int value_quoted, void *context)
+static void
+parse_content_type_param(const unsigned char *name, size_t name_len,
+			 const unsigned char *value, size_t value_len,
+			 int value_quoted, void *context)
 {
 	MessageParseContext *parse_ctx = context;
 
 	if ((parse_ctx->part->flags & MESSAGE_PART_FLAG_MULTIPART) == 0 ||
-	    name_len != 8 || strncasecmp(name, "boundary", 8) != 0)
+	    name_len != 8 || memcasecmp(name, "boundary", 8) != 0)
 		return;
 
 	if (parse_ctx->last_boundary == NULL) {
@@ -113,8 +114,8 @@
 }
 
 static void parse_header_field(MessagePart *part,
-			       const char *name, size_t name_len,
-			       const char *value, size_t value_len,
+			       const unsigned char *name, size_t name_len,
+			       const unsigned char *value, size_t value_len,
 			       void *context)
 {
 	MessageParseContext *parse_ctx = context;
@@ -125,7 +126,7 @@
 				parse_ctx->context);
 	}
 
-	if (name_len == 12 && strncasecmp(name, "Content-Type", 12) == 0) {
+	if (name_len == 12 && memcasecmp(name, "Content-Type", 12) == 0) {
 		/* we need to know the boundary */
 		message_content_parse_header(value, value_len,
 					     parse_content_type,
@@ -390,11 +391,9 @@
 					if (msg[i-1] == '\r') value_len--;
 
 					/* and finally call the function */
-					func(part,
-					     (const char *) msg + line_start,
-					     name_len,
-					     (const char *) msg + colon_pos,
-					     value_len, context);
+					func(part, msg + line_start, name_len,
+					     msg + colon_pos, value_len,
+					     context);
 				}
 
 				colon_pos = UINT_MAX;
@@ -430,16 +429,16 @@
 
 	if (func != NULL) {
 		/* "end of headers" notify */
-		func(part, "", 0, "", 0, context);
+		func(part, NULL, 0, NULL, 0, context);
 	}
 }
 
 static MessageBoundary *boundary_find(MessageBoundary *boundaries,
-				      const char *msg, size_t len)
+				      const unsigned char *msg, size_t len)
 {
 	while (boundaries != NULL) {
 		if (boundaries->len <= len &&
-		    strncmp(boundaries->boundary, msg, boundaries->len) == 0)
+		    memcmp(boundaries->boundary, msg, boundaries->len) == 0)
 			return boundaries;
 
 		boundaries = boundaries->next;
@@ -471,8 +470,8 @@
 			    msg[line_start+1] == '-') {
 				/* possible boundary */
 				boundary = boundary_find(boundaries,
-					(const char *) msg + line_start + 2,
-					i - line_start - 2);
+							 msg + line_start + 2,
+							 i - line_start - 2);
 				if (boundary != NULL)
 					break;
 			}
@@ -496,8 +495,8 @@
 			   70 chars without "--" or less. We allow
 			   a bit larger.. */
 			boundary = boundary_find(boundaries,
-					(const char *) msg + line_start + 2,
-					i - line_start - 2);
+						 msg + line_start + 2,
+						 i - line_start - 2);
 			if (boundary != NULL)
 				break;
 
--- a/src/lib-mail/message-parser.h	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-mail/message-parser.h	Sat Jan 04 19:26:29 2003 +0200
@@ -42,8 +42,8 @@
 /* NOTE: name and value aren't \0-terminated. Also called once at end of
    headers with name_len = value_len = 0. */
 typedef void (*MessageHeaderFunc)(MessagePart *part,
-				  const char *name, size_t name_len,
-				  const char *value, size_t value_len,
+				  const unsigned char *name, size_t name_len,
+				  const unsigned char *value, size_t value_len,
 				  void *context);
 
 /* func is called for each field in message header. */
--- a/src/lib-mail/rfc822-address.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-mail/rfc822-address.c	Sat Jan 04 19:26:29 2003 +0200
@@ -17,7 +17,8 @@
 	return addr;
 }
 
-Rfc822Address *rfc822_address_parse(Pool pool, const char *str)
+Rfc822Address *rfc822_address_parse(Pool pool, const unsigned char *data,
+				    size_t size)
 {
 	static const Rfc822Token stop_tokens_init[] =
 		{ ',', '@', '<', ':', TOKEN_LAST };
@@ -46,7 +47,7 @@
 	size_t len;
 	int ingroup, stop;
 
-	if (str == NULL || *str == '\0')
+	if (size == 0)
 		return NULL;
 
 	first_addr = NULL;
@@ -59,7 +60,7 @@
 	   ENVELOPE wants groups to be stored like (NIL, NIL, group, NIL),
 	   ..., (NIL, NIL, NIL, NIL)
 	*/
-	ctx = rfc822_tokenize_init(str, (size_t)-1, NULL, NULL);
+	ctx = rfc822_tokenize_init(data, size, NULL, NULL);
 	rfc822_tokenize_skip_comments(ctx, FALSE);
 
 	t_push();
--- a/src/lib-mail/rfc822-address.h	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-mail/rfc822-address.h	Sat Jan 04 19:26:29 2003 +0200
@@ -9,6 +9,7 @@
 	char *name, *route, *mailbox, *domain;
 };
 
-Rfc822Address *rfc822_address_parse(Pool pool, const char *str);
+Rfc822Address *rfc822_address_parse(Pool pool, const unsigned char *data,
+				    size_t size);
 
 #endif
--- a/src/lib-mail/rfc822-date.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-mail/rfc822-date.c	Sat Jan 04 19:26:29 2003 +0200
@@ -17,7 +17,7 @@
 	"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
 };
 
-static int parse_timezone(const char *str, size_t len)
+static int parse_timezone(const unsigned char *str, size_t len)
 {
 	int offset;
 	char chr;
@@ -87,7 +87,7 @@
 }
 
 static Rfc822Token next_token(Rfc822TokenizeContext *ctx,
-			      const char **value, size_t *value_len)
+			      const unsigned char **value, size_t *value_len)
 {
 	Rfc822Token token;
 
@@ -102,7 +102,7 @@
 {
 	struct tm tm;
 	Rfc822Token token;
-	const char *value;
+	const unsigned char *value;
 	size_t i, len;
 
 	/* [weekday_name "," ] dd month_name [yy]yy hh:mi[:ss] timezone */
@@ -135,7 +135,7 @@
 		return FALSE;
 
 	for (i = 0; i < 12; i++) {
-		if (strncasecmp(month_names[i], value, 3) == 0) {
+		if (memcasecmp(month_names[i], value, 3) == 0) {
 			tm.tm_mon = i;
 			break;
 		}
@@ -214,7 +214,8 @@
 	if (data == NULL || *data == '\0')
 		return FALSE;
 
-	ctx = rfc822_tokenize_init(data, (size_t)-1, NULL, NULL);
+	ctx = rfc822_tokenize_init((const unsigned char *) data, (size_t)-1,
+				   NULL, NULL);
 	ret = rfc822_parse_date_tokens(ctx, time, timezone_offset);
 	rfc822_tokenize_deinit(ctx);
 
--- a/src/lib-mail/rfc822-tokenize.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-mail/rfc822-tokenize.c	Sat Jan 04 19:26:29 2003 +0200
@@ -6,7 +6,7 @@
 #include "rfc822-tokenize.h"
 
 struct _Rfc822TokenizeContext {
-	const char *data;
+	const unsigned char *data;
 	size_t size;
 
 	Rfc822TokenizeErrorFunc error_func;
@@ -42,7 +42,7 @@
 
 
 Rfc822TokenizeContext *
-rfc822_tokenize_init(const char *data, size_t size,
+rfc822_tokenize_init(const unsigned char *data, size_t size,
 		     Rfc822TokenizeErrorFunc error_func, void *error_context)
 {
 	Rfc822TokenizeContext *ctx;
@@ -79,7 +79,7 @@
 Rfc822Token rfc822_tokenize_next(Rfc822TokenizeContext *ctx)
 {
 	int token, level, last_atom;
-	const char *data;
+	const unsigned char *data;
 	size_t i, size;
 
 	if (ctx->token == TOKEN_LAST)
@@ -275,8 +275,8 @@
 	return ctx->token;
 }
 
-const char *rfc822_tokenize_get_value(const Rfc822TokenizeContext *ctx,
-				      size_t *len)
+const unsigned char *
+rfc822_tokenize_get_value(const Rfc822TokenizeContext *ctx, size_t *len)
 {
 	i_assert(IS_TOKEN_STRING(ctx->token));
 
@@ -289,7 +289,7 @@
 				const Rfc822Token *stop_tokens)
 {
 	Rfc822Token token;
-	const char *value;
+	const unsigned char *value;
 	size_t len;
 	int i, token_str, last_str;
 
--- a/src/lib-mail/rfc822-tokenize.h	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-mail/rfc822-tokenize.h	Sat Jan 04 19:26:29 2003 +0200
@@ -29,14 +29,14 @@
 
    missing_char == '\0': unexpected character at str[pos]
    missing_char != '\0': missing character */
-typedef int (*Rfc822TokenizeErrorFunc)(const char *str, size_t pos,
+typedef int (*Rfc822TokenizeErrorFunc)(const unsigned char *str, size_t pos,
 				       char missing_char, void *context);
 
 /* Tokenize the string. Returns NULL if string is empty. Memory for
    returned array is allocated from data stack. You don't have to use
    the tokens_count, since last token is always 0. */
 Rfc822TokenizeContext *
-rfc822_tokenize_init(const char *data, size_t size,
+rfc822_tokenize_init(const unsigned char *data, size_t size,
 		     Rfc822TokenizeErrorFunc error_func, void *error_context);
 void rfc822_tokenize_deinit(Rfc822TokenizeContext *ctx);
 
@@ -54,8 +54,8 @@
 /* - not including enclosing "", () or []
    - '\' isn't expanded
    - [CR+]LF+LWSP (continued header) isn't removed */
-const char *rfc822_tokenize_get_value(const Rfc822TokenizeContext *ctx,
-				      size_t *len);
+const unsigned char *
+rfc822_tokenize_get_value(const Rfc822TokenizeContext *ctx, size_t *len);
 
 /* Read tokens as a string, all quoted strings will be unquoted.
    Reads until stop_token is found. */
--- a/src/lib-storage/index/index-fetch-section.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-storage/index/index-fetch-section.c	Sat Jan 04 19:26:29 2003 +0200
@@ -18,7 +18,7 @@
 
 	uoff_t skip, max_size;
 	const char *const *fields;
-	int (*match_func) (const char *const *, const char *, size_t);
+	int (*match_func) (const char *const *, const unsigned char *, size_t);
 } FetchHeaderFieldContext;
 
 /* For FETCH[HEADER.FIELDS*] we need to modify the header data before sending
@@ -97,9 +97,10 @@
 }
 
 static int header_match(const char *const *fields,
-			const char *name, size_t size)
+			const unsigned char *name, size_t size)
 {
-	const char *field, *name_start, *name_end;
+	const unsigned char *name_start, *name_end;
+	const char *field;
 
 	if (size == 0)
 		return FALSE;
@@ -131,25 +132,25 @@
 }
 
 static int header_match_not(const char *const *fields,
-			    const char *name, size_t size)
+			    const unsigned char *name, size_t size)
 {
 	return !header_match(fields, name, size);
 }
 
 static int header_match_mime(const char *const *fields __attr_unused__,
-			     const char *name, size_t size)
+			     const unsigned char *name, size_t size)
 {
-	if (size > 8 && strncasecmp(name, "Content-", 8) == 0)
+	if (size > 8 && memcasecmp(name, "Content-", 8) == 0)
 		return TRUE;
 
-	if (size == 12 && strncasecmp(name, "Mime-Version", 13) == 0)
+	if (size == 12 && memcasecmp(name, "Mime-Version", 12) == 0)
 		return TRUE;
 
 	return FALSE;
 }
 
 static int fetch_header_append(FetchHeaderFieldContext *ctx,
-			       const char *str, size_t size)
+			       const unsigned char *str, size_t size)
 {
 	if (ctx->skip > 0) {
 		if (ctx->skip >= size) {
@@ -179,13 +180,13 @@
 }
 
 static void fetch_header_field(MessagePart *part __attr_unused__,
-			       const char *name, size_t name_len,
-			       const char *value __attr_unused__,
+			       const unsigned char *name, size_t name_len,
+			       const unsigned char *value __attr_unused__,
 			       size_t value_len __attr_unused__,
 			       void *context)
 {
 	FetchHeaderFieldContext *ctx = context;
-	const char *field_start, *field_end, *cr, *p;
+	const unsigned char *field_start, *field_end, *cr, *p;
 
 	/* see if we want this field. */
 	if (!ctx->match_func(ctx->fields, name, name_len))
--- a/src/lib-storage/index/index-search.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-storage/index/index-search.c	Sat Jan 04 19:26:29 2003 +0200
@@ -43,7 +43,7 @@
 	MailSearchArg *args;
 	int custom_header;
 
-	const char *name, *value;
+	const unsigned char *name, *value;
 	size_t name_len, value_len;
 } SearchHeaderContext;
 
@@ -341,7 +341,6 @@
 	ImapEnvelopeField env_field;
         HeaderSearchContext *hdr_search_ctx;
 	const char *envelope, *field;
-	size_t size;
 	int ret;
 
 	switch (arg->type) {
@@ -417,9 +416,10 @@
 				break;
 			}
 
-			size = strlen(field);
-			ret = message_header_search(field, size,
-						    hdr_search_ctx) ? 1 : 0;
+			ret = message_header_search(
+						(const unsigned char *) field,
+						strlen(field),
+						hdr_search_ctx) ? 1 : 0;
 		}
 	}
 	t_pop();
@@ -457,35 +457,31 @@
 	case SEARCH_SENTSINCE:
 		/* date is handled differently than others */
 		if (ctx->name_len == 4 &&
-		    strncasecmp(ctx->name, "Date", 4) == 0) {
+		    memcasecmp(ctx->name, "Date", 4) == 0) {
 			search_sent(arg->type, arg->value.str,
 				    t_strndup(ctx->value, ctx->value_len));
 		}
 		return;
 
 	case SEARCH_FROM:
-		if (ctx->name_len != 4 ||
-		    strncasecmp(ctx->name, "From", 4) != 0)
+		if (ctx->name_len != 4 || memcasecmp(ctx->name, "From", 4) != 0)
 			return;
 		break;
 	case SEARCH_TO:
-		if (ctx->name_len != 2 ||
-		    strncasecmp(ctx->name, "To", 2) != 0)
+		if (ctx->name_len != 2 || memcasecmp(ctx->name, "To", 2) != 0)
 			return;
 		break;
 	case SEARCH_CC:
-		if (ctx->name_len != 2 ||
-		    strncasecmp(ctx->name, "Cc", 2) != 0)
+		if (ctx->name_len != 2 || memcasecmp(ctx->name, "Cc", 2) != 0)
 			return;
 		break;
 	case SEARCH_BCC:
-		if (ctx->name_len != 3 ||
-		    strncasecmp(ctx->name, "Bcc", 3) != 0)
+		if (ctx->name_len != 3 || memcasecmp(ctx->name, "Bcc", 3) != 0)
 			return;
 		break;
 	case SEARCH_SUBJECT:
 		if (ctx->name_len != 7 ||
-		    strncasecmp(ctx->name, "Subject", 7) != 0)
+		    memcasecmp(ctx->name, "Subject", 7) != 0)
 			return;
 		break;
 	case SEARCH_HEADER:
@@ -493,7 +489,7 @@
 
 		len = strlen(arg->hdr_field_name);
 		if (ctx->name_len != len ||
-		    strncasecmp(ctx->name, arg->hdr_field_name, len) != 0)
+		    memcasecmp(ctx->name, arg->hdr_field_name, len) != 0)
 			return;
 	case SEARCH_TEXT:
 		/* TEXT goes through all headers */
@@ -525,19 +521,19 @@
 }
 
 static void search_header(MessagePart *part __attr_unused__,
-			  const char *name, size_t name_len,
-			  const char *value, size_t value_len,
+			  const unsigned char *name, size_t name_len,
+			  const unsigned char *value, size_t value_len,
 			  void *context)
 {
 	SearchHeaderContext *ctx = context;
 
 	if ((name_len > 0 && ctx->custom_header) ||
-	    (name_len == 4 && strncasecmp(name, "Date", 4) == 0) ||
-	    (name_len == 4 && strncasecmp(name, "From", 4) == 0) ||
-	    (name_len == 2 && strncasecmp(name, "To", 2) == 0) ||
-	    (name_len == 2 && strncasecmp(name, "Cc", 2) == 0) ||
-	    (name_len == 3 && strncasecmp(name, "Bcc", 3) == 0) ||
-	    (name_len == 7 && strncasecmp(name, "Subject", 7) == 0)) {
+	    (name_len == 4 && memcasecmp(name, "Date", 4) == 0) ||
+	    (name_len == 4 && memcasecmp(name, "From", 4) == 0) ||
+	    (name_len == 2 && memcasecmp(name, "To", 2) == 0) ||
+	    (name_len == 2 && memcasecmp(name, "Cc", 2) == 0) ||
+	    (name_len == 3 && memcasecmp(name, "Bcc", 3) == 0) ||
+	    (name_len == 7 && memcasecmp(name, "Subject", 7) == 0)) {
 		ctx->name = name;
 		ctx->value = value;
 		ctx->name_len = name_len;
--- a/src/lib-storage/mail-sort.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib-storage/mail-sort.c	Sat Jan 04 19:26:29 2003 +0200
@@ -61,7 +61,7 @@
 
 static MailSortType
 mail_sort_get_common_mask(const MailSortType *input,
-			  const MailSortType **output)
+			  MailSortType **output)
 {
 	MailSortType mask = 0;
 
--- a/src/lib/imem.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib/imem.c	Sat Jan 04 19:26:29 2003 +0200
@@ -52,12 +52,12 @@
         return p_strdup_empty(default_pool, str);
 }
 
-char *i_strdup_until(const char *str, const char *end)
+char *i_strdup_until(const void *str, const void *end)
 {
 	return p_strdup_until(default_pool, str, end);
 }
 
-char *i_strndup(const char *str, size_t max_chars)
+char *i_strndup(const void *str, size_t max_chars)
 {
         return p_strndup(default_pool, str, max_chars);
 }
--- a/src/lib/imem.h	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib/imem.h	Sat Jan 04 19:26:29 2003 +0200
@@ -13,8 +13,8 @@
 /* string functions */
 char *i_strdup(const char *str);
 char *i_strdup_empty(const char *str); /* like i_strdup(), but if str == "", return NULL */
-char *i_strdup_until(const char *str, const char *end); /* *end isn't included */
-char *i_strndup(const char *str, size_t max_chars);
+char *i_strdup_until(const void *str, const void *end); /* *end isn't included */
+char *i_strndup(const void *str, size_t max_chars);
 char *i_strdup_printf(const char *format, ...) __attr_format__(1, 2);
 char *i_strdup_vprintf(const char *format, va_list args);
 
--- a/src/lib/istream-data.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib/istream-data.c	Sat Jan 04 19:26:29 2003 +0200
@@ -63,8 +63,7 @@
 	stream->istream.v_offset += count;
 }
 
-IStream *i_stream_create_from_data(Pool pool, const unsigned char *data,
-				   size_t size)
+IStream *i_stream_create_from_data(Pool pool, const void *data, size_t size)
 {
 	_IStream *stream;
 
--- a/src/lib/istream.h	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib/istream.h	Sat Jan 04 19:26:29 2003 +0200
@@ -16,8 +16,7 @@
 IStream *i_stream_create_mmap(int fd, Pool pool, size_t block_size,
 			      uoff_t start_offset, uoff_t v_size,
 			      int autoclose_fd);
-IStream *i_stream_create_from_data(Pool pool, const unsigned char *data,
-				   size_t size);
+IStream *i_stream_create_from_data(Pool pool, const void *data, size_t size);
 
 /* Reference counting. References start from 1, so calling i_stream_unref()
    destroys the stream if i_stream_ref() is never used. */
--- a/src/lib/str.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib/str.c	Sat Jan 04 19:26:29 2003 +0200
@@ -67,6 +67,11 @@
 	return buffer_get_data(str, NULL);
 }
 
+const unsigned char *str_data(const String *str)
+{
+	return buffer_get_data(str, NULL);
+}
+
 char *str_c_modifyable(String *str)
 {
 	if (!str_add_nul(str))
@@ -85,12 +90,12 @@
 	buffer_append(str, cstr, strlen(cstr));
 }
 
-void str_append_n(String *str, const char *cstr, size_t max_len)
+void str_append_n(String *str, const void *cstr, size_t max_len)
 {
 	size_t len;
 
 	len = 0;
-	while (len < max_len && cstr[len] != '\0')
+	while (len < max_len && ((const char *)cstr)[len] != '\0')
 		len++;
 
 	buffer_append(str, cstr, len);
--- a/src/lib/str.h	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib/str.h	Sat Jan 04 19:26:29 2003 +0200
@@ -5,12 +5,13 @@
 String *t_str_new(size_t initial_size);
 
 const char *str_c(String *str);
+const unsigned char *str_data(const String *str);
 char *str_c_modifyable(String *str);
 size_t str_len(const String *str);
 
 /* Append string/character */
 void str_append(String *str, const char *cstr);
-void str_append_n(String *str, const char *cstr, size_t max_len);
+void str_append_n(String *str, const void *cstr, size_t max_len);
 void str_append_c(String *str, char chr);
 void str_append_str(String *dest, const String *src);
 
--- a/src/lib/strescape.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib/strescape.c	Sat Jan 04 19:26:29 2003 +0200
@@ -51,20 +51,21 @@
 	return ret;
 }
 
-void str_append_unescaped(String *dest, const char *src, size_t src_size)
+void str_append_unescaped(String *dest, const void *src, size_t src_size)
 {
+	const unsigned char *src_c = src;
 	size_t start = 0, i = 0;
 
 	while (i < src_size) {
 		start = i;
 		for (; i < src_size; i++) {
-			if (src[i] == '\\')
+			if (src_c[i] == '\\')
 				break;
 		}
 
-		str_append_n(dest, src + start, i-start);
+		str_append_n(dest, src_c + start, i-start);
 
-		if (src[i] == '\\')
+		if (src_c[i] == '\\')
 			i++;
 		start = i;
 	}
--- a/src/lib/strescape.h	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib/strescape.h	Sat Jan 04 19:26:29 2003 +0200
@@ -7,7 +7,7 @@
 const char *str_escape(const char *str);
 
 /* remove all '\' characters, append to given string */
-void str_append_unescaped(String *dest, const char *src, size_t src_size);
+void str_append_unescaped(String *dest, const void *src, size_t src_size);
 
 /* remove all '\' characters */
 void str_unescape(char *str);
--- a/src/lib/strfuncs.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib/strfuncs.c	Sat Jan 04 19:26:29 2003 +0200
@@ -167,21 +167,21 @@
 	return p_strdup(pool, str);
 }
 
-char *p_strdup_until(Pool pool, const char *start, const char *end)
+char *p_strdup_until(Pool pool, const void *start, const void *end)
 {
 	size_t size;
 	char *mem;
 
-	i_assert(start <= end);
+	i_assert((const char *) start <= (const char *) end);
 
-	size = (size_t) (end-start);
+	size = (size_t) ((const char *) end - (const char *) start);
 
 	mem = p_malloc(pool, size + 1);
 	memcpy(mem, start, size);
 	return mem;
 }
 
-char *p_strndup(Pool pool, const char *str, size_t max_chars)
+char *p_strndup(Pool pool, const void *str, size_t max_chars)
 {
 	char *mem;
 	size_t len;
@@ -192,7 +192,7 @@
 		return NULL;
 
 	len = 0;
-	while (str[len] != '\0' && len < max_chars)
+	while (((const char *) str)[len] != '\0' && len < max_chars)
 		len++;
 
 	mem = pool->malloc(pool, len+1);
@@ -316,12 +316,12 @@
 	return p_strdup_empty(data_stack_pool, str);
 }
 
-const char *t_strdup_until(const char *start, const char *end)
+const char *t_strdup_until(const void *start, const void *end)
 {
 	return p_strdup_until(data_stack_pool, start, end);
 }
 
-const char *t_strndup(const char *str, size_t max_chars)
+const char *t_strndup(const void *str, size_t max_chars)
 {
 	return p_strndup(data_stack_pool, str, max_chars);
 }
@@ -462,6 +462,23 @@
         return str;
 }
 
+int memcasecmp(const void *p1, const void *p2, size_t size)
+{
+	const unsigned char *s1 = p1;
+	const unsigned char *s2 = p2;
+	int ret;
+
+	while (size > 0) {
+		ret = i_toupper(*s1) - i_toupper(*s2);
+		if (ret != 0)
+			return ret;
+
+		s1++; s2++; size--;
+	}
+
+        return 0;
+}
+
 const char **t_strsplit(const char *data, const char *separators)
 {
         const char **array;
--- a/src/lib/strfuncs.h	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/lib/strfuncs.h	Sat Jan 04 19:26:29 2003 +0200
@@ -14,8 +14,8 @@
 
 char *p_strdup(Pool pool, const char *str);
 char *p_strdup_empty(Pool pool, const char *str); /* return NULL if str = "" */
-char *p_strdup_until(Pool pool, const char *start, const char *end); /* *end isn't included */
-char *p_strndup(Pool pool, const char *str, size_t max_chars);
+char *p_strdup_until(Pool pool, const void *start, const void *end); /* *end isn't included */
+char *p_strndup(Pool pool, const void *str, size_t max_chars);
 char *p_strdup_printf(Pool pool, const char *format, ...) __attr_format__(2, 3);
 char *p_strdup_vprintf(Pool pool, const char *format, va_list args);
 char *p_strconcat(Pool pool, const char *str1, ...); /* NULL terminated */
@@ -24,8 +24,8 @@
 const char *t_strdup(const char *str);
 char *t_strdup_noconst(const char *str);
 const char *t_strdup_empty(const char *str); /* return NULL if str = "" */
-const char *t_strdup_until(const char *start, const char *end); /* *end isn't included */
-const char *t_strndup(const char *str, size_t max_chars);
+const char *t_strdup_until(const void *start, const void *end); /* *end isn't included */
+const char *t_strndup(const void *str, size_t max_chars);
 const char *t_strdup_printf(const char *format, ...) __attr_format__(1, 2);
 const char *t_strdup_vprintf(const char *format, va_list args);
 const char *t_strconcat(const char *str1, ...); /* NULL terminated */
@@ -50,6 +50,8 @@
 char *str_ucase(char *str);
 char *str_lcase(char *str);
 
+int memcasecmp(const void *p1, const void *p2, size_t size);
+
 /* seprators is an array of separator characters, not a separator string. */
 const char **t_strsplit(const char *data, const char *separators);
 
--- a/src/login/client-authenticate.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/login/client-authenticate.c	Sat Jan 04 19:26:29 2003 +0200
@@ -251,7 +251,8 @@
 	linelen = strlen(line);
 	buf = buffer_create_static_hard(data_stack_pool, linelen);
 
-	if (base64_decode(line, linelen, NULL, buf) <= 0) {
+	if (base64_decode((const unsigned char *) line, linelen,
+			  NULL, buf) <= 0) {
 		/* failed */
 		client_auth_abort(client, "NO Invalid base64 data");
 	} else if (client->auth_request == NULL) {
--- a/src/login/ssl-proxy-gnutls.c	Sat Jan 04 15:22:29 2003 +0200
+++ b/src/login/ssl-proxy-gnutls.c	Sat Jan 04 19:26:29 2003 +0200
@@ -458,7 +458,7 @@
 void ssl_proxy_init(void)
 {
 	const char *certfile, *keyfile, *paramfile;
-	char buf[4];
+	unsigned char buf[4];
 	int ret;
 
 	certfile = getenv("SSL_CERT_FILE");