This is mime.c in view mode; [Download] [Up]
/*******************************************************************************
* The Elm Mail System - $Revision: 5.8 $ $State: Exp $
*
* Copyright (c) 1988-1992 USENET Community Trust
* Copyright (c) 1986,1987 Dave Taylor
*******************************************************************************
* Bug reports, patches, comments, suggestions should be sent to:
*
* Syd Weinstein, Elm Coordinator
* elm@DSI.COM dsinc!elm
*
******************************************************************************
* $Log: mime.c,v $
* Revision 5.8 1992/12/11 01:45:04 syd
* remove sys/types.h include, it is now included by defs.h
* and this routine includes defs.h or indirectly includes defs.h
* From: Syd
*
* Revision 5.7 1992/11/26 00:46:13 syd
* changes to first change screen back (Raw off) and then issue final
* error message.
* From: Syd
*
* Revision 5.6 1992/11/22 01:22:48 syd
* According to the MIME BNF, quoted strings are allowed in the value portion
* of a parameter.
* From: chk@alias.com (C. Harald Koch)
*
* Revision 5.5 1992/11/07 16:21:56 syd
* There is no need to write out the MIME-Version header in subparts
* From: Klaus Steinberger <Klaus.Steinberger@Physik.Uni-Muenchen.DE>
*
* Revision 5.4 1992/10/30 21:10:39 syd
* it invokes metamail (the pseudo is because "text" isn't a legal Content-Type).
* in src/mime.c notplain() tries to check for text but fails because it should
* look for "text\n" not "text".
* From: Jan Djarv <Jan.Djarv@sa.erisoft.se>
*
* Revision 5.3 1992/10/25 01:47:45 syd
* fixed a bug were elm didn't call metamail on messages with a characterset,
* which could be displayed by elm itself, but message is encoded with QP
* or BASE64
* From: Klaus Steinberger <Klaus.Steinberger@Physik.Uni-Muenchen.DE>
*
* Revision 5.2 1992/10/24 13:44:41 syd
* There is now an additional elmrc option "displaycharset", which
* sets the charset supported on your terminal. This is to prevent
* elm from calling out to metamail too often.
* Plus a slight documentation update for MIME composition (added examples)
* From: Klaus Steinberger <Klaus.Steinberger@Physik.Uni-Muenchen.DE>
*
* Revision 5.1 1992/10/03 22:58:40 syd
* Initial checkin as of 2.4 Release at PL0
*
*
******************************************************************************/
#include "headers.h"
#include "s_elm.h"
#ifdef MIME
#include <errno.h>
#include <ctype.h>
#include <sys/stat.h>
int check_for_multipart(filedesc)
FILE *filedesc;
{
char buffer[SLEN];
int Multi_Part = FALSE;
char *ptr;
char *incptr;
char Include_Filename[SLEN];
char Expanded_Filename[SLEN];
while (mail_gets(buffer, SLEN, filedesc))
if (buffer[0] == '[') {
if (strncmp(buffer, MIME_INCLUDE, strlen(MIME_INCLUDE)) == 0) {
Multi_Part = TRUE;
if (Include_Part((FILE *)NULL, buffer, TRUE) == -1) {
return(-1);
}
}
}
rewind(filedesc);
return(Multi_Part);
}
Include_Part(dest, buffer, check)
FILE *dest;
char *buffer;
int check;
{
char *ptr;
char *incptr;
char Include_Filename[SLEN];
char Expanded_Filename[SLEN];
char tmp_fn[SLEN];
char *filename;
char Content_Type[SLEN];
char Encoding[SLEN];
char sh_buffer[SLEN];
char Encode_Flag[3];
int Enc_Type;
FILE *incfile;
struct stat file_status;
int line_len;
ptr = buffer + strlen(MIME_INCLUDE);
while ((*ptr != '\0') && (*ptr == ' '))
ptr++;
incptr = Include_Filename;
while ((*ptr != ' ') && (*ptr != ']') && (*ptr != '\0'))
*incptr++ = *ptr++;
*incptr = '\0';
while ((*ptr != '\0') && (*ptr == ' '))
ptr++;
incptr = Content_Type;
while ((*ptr != ' ') && (*ptr != ']') && (*ptr != '\0'))
*incptr++ = *ptr++;
*incptr = '\0';
while ((*ptr != '\0') && (*ptr == ' '))
ptr++;
incptr = Encoding;
while ((*ptr != ' ') && (*ptr != ']') && (*ptr != '\0'))
*incptr++ = *ptr++;
*incptr = '\0';
if (strlen(Include_Filename) == 0) {
Write_to_screen(catgets(elm_msg_cat, ElmSet, ElmNoIncludeFilename,
"\n\rNo Filename given, include line ignored\n\r"), 0);
sleep(2);
return(-1);
}
expand_env(Expanded_Filename, Include_Filename);
if (strlen(Content_Type) == 0) {
Write_to_screen(catgets(elm_msg_cat, ElmSet, ElmNoContentTypeGiven,
"\n\rNo Content-type given, include line ignored\n\r"), 0);
sleep(2);
return(-1);
}
Enc_Type = check_encoding(Encoding);
if (Enc_Type == ENCODING_ILLEGAL) {
Write_to_screen(catgets(elm_msg_cat, ElmSet, ElmEncodingIsIllegal,
"\n\rEncoding is illegal\n\r"), 0);
sleep(2);
return(-1);
}
if (can_open(Expanded_Filename, "r")) {
Write_to_screen(catgets(elm_msg_cat, ElmSet, ElmIncludeCannotAccess,
"\n\rInclude File can't be accessed\n\r"), 0);
sleep(2);
return(-1);
}
if (check) {
return(0);
}
if (Enc_Type == ENCODING_7BIT || Enc_Type == ENCODING_8BIT ||
Enc_Type == ENCODING_BINARY || Enc_Type == ENCODING_NONE ||
Enc_Type == ENCODING_EXPERIMENTAL) {
/* No explicit encoding, assume 7-BIT */
filename = Expanded_Filename;
} else {
sprintf(tmp_fn, "%semm.%d.%d", temp_dir, getpid(), getuid());
filename = tmp_fn;
if (Enc_Type == ENCODING_BASE64) {
strcpy(Encode_Flag, "-b");
} else if (Enc_Type == ENCODING_QUOTED) {
strcpy(Encode_Flag, "-q");
} else {
Write_to_screen(catgets(elm_msg_cat, ElmSet, ElmUnknownEncodingInInclude,
"\n\rUnknown Encoding, include line ignored\n\r"), 0);
sleep(2);
return(-1);
}
sprintf(sh_buffer, "mmencode %s %s >%s", Encode_Flag, Expanded_Filename,
tmp_fn);
(void) system_call(sh_buffer, 0);
}
if ((incfile = fopen(filename, "r")) != NULL) {
if (stat(filename, &file_status) != 0) {
Write_to_screen(catgets(elm_msg_cat, ElmSet, ElmCantStatIncludedFile,
"\n\rCan't stat included File,ignored\n\r"), 0);
sleep(2);
return(-1);
}
fprintf(dest, "%s %s\n", MIME_CONTENTTYPE, Content_Type);
fprintf(dest, "Content-Name: %s\n", Include_Filename);
fprintf(dest, "Content-Length: %d\n", file_status.st_size);
if (Enc_Type != ENCODING_NONE) {
fprintf(dest, "Content-Transfer-Encoding: %s\n", Encoding);
}
fprintf(dest, "\n");
while (line_len = fread(buffer, 1, sizeof(buffer), incfile)) {
if (fwrite(buffer, 1, line_len, dest) != line_len) {
MoveCursor(LINES, 0);
Raw(OFF);
Write_to_screen(catgets(elm_msg_cat, ElmSet, ElmWriteFailedCopyAcross,
"\nWrite failed in copy_message_across\n"), 0);
emergency_exit();
}
}
fclose(incfile);
if (filename == tmp_fn) {
unlink(tmp_fn);
}
} else {
MoveCursor(LINES, 0);
Raw(OFF);
Write_to_screen(catgets(elm_msg_cat, ElmSet, ElmCantOpenIncludedFile,
"\nCan't open included File\n"), 0);
emergency_exit();
}
return(0);
}
int check_encoding(Encoding)
char *Encoding;
{
if (strlen(Encoding) == 0) return (ENCODING_NONE);
if (strincmp(Encoding, ENC_NAME_7BIT, strlen(ENC_NAME_7BIT)) == 0)
return (ENCODING_7BIT);
if (strincmp(Encoding, ENC_NAME_8BIT, strlen(ENC_NAME_8BIT)) == 0)
return (ENCODING_8BIT);
if (strincmp(Encoding, ENC_NAME_BINARY, strlen(ENC_NAME_BINARY)) == 0)
return (ENCODING_BINARY);
if (strincmp(Encoding, ENC_NAME_QUOTED, strlen(ENC_NAME_QUOTED)) == 0)
return (ENCODING_QUOTED);
if (strincmp(Encoding, ENC_NAME_BASE64, strlen(ENC_NAME_BASE64)) == 0)
return (ENCODING_BASE64);
if (strincmp(Encoding, "x-", 2) == 0) return (ENCODING_EXPERIMENTAL);
return(ENCODING_ILLEGAL);
}
needs_mmdecode(s)
char *s;
{
char buf[SLEN];
char *t;
int EncType;
if (!s) return(1);
while (*s && isspace(*s)) ++s;
t = buf;
while (*s && !isspace(*s) && ((t-buf) < SLEN)) *t++ = *s++;
EncType = check_encoding(buf);
if ((EncType == ENCODING_NONE) ||
(EncType == ENCODING_7BIT) ||
(EncType == ENCODING_8BIT) ||
(EncType == ENCODING_BINARY)) {
/* We don't need to go out to mmdecode, return 0 */
return(0);
} else {
return(1);
}
}
notplain(s)
char *s;
{
char *t;
if (!s) return(1);
while (*s && isspace(*s)) ++s;
if (istrcmp(s, "text\n") == 0) {
/* old MIME spec, subtype now obligat, accept it as
"text/plain; charset=us-ascii" for compatibility
reason */
return(0);
}
if (strincmp(s, "text/plain", 10)) return(1);
t = (char *) index(s, ';');
while (t) {
++t;
while (*t && isspace(*t)) ++t;
if (!strincmp(t, "charset", 7)) {
s = (char *) index(t, '=');
if (s) {
++s;
while (*s && (isspace(*s) || *s == '\"')) ++s;
if (!strincmp(s, display_charset, strlen(display_charset)))
return(0);
if (!strincmp(s, "us-ascii", 8)) {
/* check if configured charset could
display us-ascii */
if(charset_ok(display_charset)) return(0);
}
}
return(1);
}
t = (char *) index(t, ';');
}
return(0); /* no charset, was text/plain */
}
int charset_ok(s)
char *s;
{
/* Return true if configured charset could display us-ascii too */
char buf[SLEN]; /* assumes sizeof(charset_compatlist) <= SLEN */
char *bp, *chset;
/* the "charset_compatlist[]" format is: */
/* charset charset charset ... */
bp = strcpy(buf, charset_compatlist);
while ((chset = strtok(bp, " \t\n")) != NULL) {
bp = NULL;
if (istrcmp(chset, s) == 0)
break;
}
/* see if we reached the end of the list without a match */
if (chset == NULL) {
return(FALSE);
}
return(TRUE);
}
#endif /* MIME */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.