scan_content(CT ct)
{
int len;
- int check8bit = 0, contains8bit = 0; /* check if contains 8bit data */
- int checklinelen = 0, linelen = 0; /* check for long lines */
- int checkboundary = 0, boundaryclash = 0; /* check if clashes with multipart boundary */
- int checklinespace = 0, linespace = 0; /* check if any line ends with space */
+ int check8bit = 0, contains8bit = 0;
+ int checklinelen = 0, linelen = 0;
+ int checkboundary = 0, boundaryclash = 0;
+ int checklinespace = 0, linespace = 0; /* trailing whitespace */
unsigned char *cp = NULL, buffer[BUFSIZ];
struct text *t = NULL;
FILE *in = NULL;
}
break;
- case CT_APPLICATION:
- check8bit = 1;
- checklinelen = 1;
- checklinespace = 1;
- checkboundary = 1;
- break;
-
case CT_MESSAGE:
check8bit = 0;
checklinelen = 0;
checkboundary = 1;
break;
+ case CT_APPLICATION:
case CT_AUDIO:
case CT_IMAGE:
case CT_VIDEO:
- /*
- ** Don't check anything for these types,
- ** since we are forcing use of base64.
- */
check8bit = 0;
checklinelen = 0;
checklinespace = 0;
len = strlen(prefix);
while (fgets(buffer, sizeof(buffer) - 1, in)) {
- /*
- ** Check for 8bit data.
- */
if (check8bit) {
for (cp = buffer; *cp; cp++) {
if (!isascii(*cp)) {
}
}
- /*
- ** Check line length.
- */
if (checklinelen && (strlen(buffer) > CPERLIN + 1)) {
linelen = 1;
checklinelen = 0; /* no need to keep checking */
}
- /*
- ** Check if line ends with a space.
- */
if (checklinespace &&
(cp = buffer + strlen(buffer) - 2) >
buffer && isspace(*cp)) {
ct->c_encoding = CE_7BIT;
break;
- case CT_APPLICATION:
- /* For application type, use base64, except when postscript */
- if (contains8bit || linelen || linespace)
- ct->c_encoding = (ct->c_subtype ==
- APPLICATION_POSTSCRIPT) ?
- CE_QUOTED : CE_BASE64;
- else
- ct->c_encoding = CE_7BIT;
- break;
-
case CT_MESSAGE:
ct->c_encoding = CE_7BIT;
break;
+ case CT_APPLICATION:
case CT_AUDIO:
case CT_IMAGE:
case CT_VIDEO:
- /* For audio, image, and video contents, just use base64 */
+ /*
+ ** Forcing use of base64, because these types likely
+ ** contain binary data and NUL bytes. Don't care about
+ ** files that would be clean.
+ */
ct->c_encoding = CE_BASE64;
break;
}