.fi
.RE
.PP
-There are four kinds of directives:
+There are three kinds of directives:
\*(lqtype\*(rq,
-\*(lqexternal-type\*(rq,
\*(lqmessage\*(rq (#forw),
and \*(lqbegin\*(rq (#begin).
.PP
environment variable, instead of directly in your
user profile.
.PP
-.B "(2) The \*(lqexternal-type\*(rq directives
-are used to provide a MIME
-reference to a content, rather than enclosing the contents itself
-(for instance, by specifying an ftp site). Hence, instead of
-providing a filename as with the type directives, external-parameters
-are supplied. These look like regular parameters, so they must be
-separated accordingly. For example,
-.PP
-.RS 5
-.nf
-#@application/octet-stream; \\
- type=tar; \\
- conversions=compress \\
- [this is the nmh distribution] \\
- {application; filename="nmh.tar.gz"} \\
- name="nmh.tar.gz"; \\
- directory="/pub/nmh"; \\
- site="ftp.math.gatech.edu"; \\
- access-type=anon-ftp; \\
- mode="image"
-.fi
-.RE
-.PP
-You must give a description string to separate the content parameters
-from the external-parameters (although this string may be empty).
-This description string is specified by enclosing it within
-\*(lq[]\*(rq. A disposition string, to appear in a
-\*(lqContent-Disposition\*(rq header, may appear in the optional
-\*(lq{}\*(rq.
-.PP
-These parameters are of the form:
-.PP
-.RS 5
-.nf
-.ta \w'access-type= 'u
-access-type= usually \fIanon-ftp\fR or \fImail-server\fR
-name= filename
-permission= read-only or read-write
-site= hostname
-directory= directoryname (optional)
-mode= usually \fIascii\fR or \fIimage\fR (optional)
-size= number of octets
-server= mailbox
-subject= subject to send
-body= command to send for retrieval
-.fi
-.RE
-.PP
-.B "(3) The \*(lqmessage\*(rq directive (#forw)
+.B "(2) The \*(lqmessage\*(rq directive (#forw)
is used to specify a message or
group of messages to include. You may optionally specify the name of
the folder and which messages are to be forwarded. If a folder is not
approach is that the encapsulations are generated by placing an extra
newline at the end of the body of each message.
.PP
-.B "(4) The \*(lqbegin\*(rq directive
+.B "(3) The \*(lqbegin\*(rq directive
is used to create a multipart content.
When using the \*(lqbegin\*(rq directive, you must specify at least one
content between the begin and end pairs.
[ filename ]
EOL
- | "#@" type "/" subtype
- 0*(";" attribute "=" value)
- [ "(" comment ")" ]
- [ "<" id ">" ]
- [ "[" description "]" ]
- [ "{" disposition "}" ]
- external-parameters
- EOL
-
| "#forw"
[ "<" id ">" ]
[ "[" description "]" ]
static int
user_content(FILE *in, char *file, char *buf, CT *ctp)
{
- int extrnal, vrsn;
+ int vrsn;
unsigned char *cp;
char **ap;
char buffer[BUFSIZ];
** must be some type of explicit directive.
*/
- /* check if directive is external-type */
- extrnal = (buf[1] == '@');
+ if (buf[1] == '@') {
+ adios(NULL, "The #@ directive i.e. message/external-body "
+ "is not supported anymore.");
+ }
/* parse directive */
- if (get_ctinfo(buf + (extrnal ? 2 : 1), ct, 1) == NOTOK)
+ if (get_ctinfo(buf+1, ct, 1) == NOTOK)
done(1);
/* check directive against the list of MIME types */
** Check if the directive specified a valid type.
** This will happen if it was one of the following forms:
**
- ** #type/subtype (or)
- ** #@type/subtype
+ ** #type/subtype
*/
if (s2i->si_key) {
if (!ci->ci_subtype)
/* NOTREACHED */
case CT_MESSAGE:
- if (!mh_strcasecmp(ci->ci_subtype, "partial"))
+ if (!mh_strcasecmp(ci->ci_subtype, "partial") ||
+ !mh_strcasecmp(ci->ci_subtype,
+ "external-body")) {
adios(NULL, "sorry, \"#%s/%s\" isn't supported", ci->ci_type, ci->ci_subtype);
- if (!mh_strcasecmp(ci->ci_subtype, "external-body"))
- adios(NULL, "use \"#@type/subtype ... [] ...\" instead of \"#%s/%s\"", ci->ci_type, ci->ci_subtype);
+ }
use_forw:
adios(NULL, "use \"#forw [+folder] [msgs]\" instead of \"#%s/%s\"", ci->ci_type, ci->ci_subtype);
/* NOTREACHED */
break;
}
- /*
- ** #@type/subtype (external types directive)
- */
- if (extrnal) {
- struct exbody *e;
- CT p;
-
- if (!ci->ci_magic)
- adios(NULL, "need external information for \"#@%s/%s\"", ci->ci_type, ci->ci_subtype);
- p = ct;
-
- snprintf(buffer, sizeof(buffer), "message/external-body; %s", ci->ci_magic);
- free(ci->ci_magic);
- ci->ci_magic = NULL;
-
- /*
- ** Since we are using the current Content structure to
- ** hold information about the type of the external
- ** reference, we need to create another Content
- ** structure for the message/external-body to wrap
- ** it in.
- */
- if ((ct = (CT) calloc(1, sizeof(*ct))) == NULL)
- adios(NULL, "out of memory");
- *ctp = ct;
- ci = &ct->c_ctinfo;
- if (get_ctinfo(buffer, ct, 0) == NOTOK)
- done(1);
- ct->c_type = CT_MESSAGE;
- ct->c_subtype = MESSAGE_EXTERNAL;
-
- if ((e = (struct exbody *)
- calloc(1, sizeof(*e))) == NULL)
- adios(NULL, "out of memory");
- ct->c_ctparams = (void *) e;
-
- e->eb_parent = ct;
- e->eb_content = p;
- p->c_ctexbody = e;
-
- if (params_external(ct, 1) == NOTOK)
- done(1);
-
- return OK;
- }
-
/* Handle [file] argument */
if (ci->ci_magic) {
/* check if specifies command to execute */
return OK;
}
- if (extrnal)
- adios(NULL, "external definition not allowed for \"#%s\"",
- ci->ci_type);
-
/*
** Message directive
** #forw [+folder] [msgs]
checkebcdic = 0;
checklinelen = 0;
checklinespace = 0;
-
- /* don't check anything for message/external */
- if (ct->c_subtype == MESSAGE_EXTERNAL)
- checkboundary = 0;
- else
- checkboundary = 1;
+ checkboundary = 1;
break;
case CT_AUDIO:
static int
build_headers(CT ct)
{
- int cc, mailbody, len;
+ int cc, len;
char **ap, **ep;
char *np, *vp, buffer[BUFSIZ];
CI ci = &ct->c_ctinfo;
len = strlen(TYPE_FIELD) + strlen(ci->ci_type) +
strlen(ci->ci_subtype) + 3;
- mailbody = ct->c_type == CT_MESSAGE &&
- ct->c_subtype == MESSAGE_EXTERNAL &&
- ((struct exbody *) ct->c_ctparams)->eb_body;
-
/*
** Append the attribute/value pairs to
** the end of the Content-Type line.
*/
for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) {
- if (mailbody && !mh_strcasecmp(*ap, "body"))
- continue;
-
vp = add(";", vp);
len++;
skip_headers:
/*
- ** If this is the internal content structure for a
- ** "message/external", then we are done with the
- ** headers (since it has no body).
- */
- if (ct->c_ctexbody)
- return OK;
-
- /*
** output the Content-Transfer-Encoding
*/
switch (ct->c_encoding) {
}
break;
- case CT_MESSAGE:
- if (ct->c_subtype == MESSAGE_EXTERNAL) {
- struct exbody *e;
-
- e = (struct exbody *) ct->c_ctparams;
- build_headers(e->eb_content);
- }
- break;
-
default:
/* Nothing to do */
break;