.PP
If no formatting string is found,
.B mhstore
-will check to see
-if the content is application/octet-stream with parameter
-\*(lqtype=tar\*(rq. If so,
-.B mhstore
-will choose an appropriate
-filename. If the content is not application/octet-stream, then
-.B mhstore
will check to see if the content is a message. If
so,
.B mhstore
can not
locate every partial necessary to reassemble the message, it will
not store anything.
-RE
-.PP
-By using the
-.B \-auto
-switch,
-.B mhstore
-will automatically do the extraction for you:
-.PP
-.RS 5
-.nf
-% mhlist 5-8
- msg part type/subtype size description
- 5 message/partial 47K part 1 of 4
- 6 message/partial 47K part 2 of 4
- 7 message/partial 47K part 3 of 4
- 8 message/partial 18K part 4 of 4
-% mhstore 5-8
-reassembling partials 5,6,7,8 to folder inbox as message 9
-% mhlist 9
- msg part type/subtype size description
- 9 application/octet-stream 118K
- (extract with uncompress | tar xvpf -)
- type=tar
- conversions=compress
-% mhstore -auto 9
--- tar listing appears here as files are extracted
-.fi
.RE
-.PP
-As the second
-.B tar
-listing is generated, the files are extracted.
-A prudent user will never put
-.B \-auto
-in the profile.
-The correct procedure is to first use
-.B mhlist
-to find out what will be extracted. Then
-.B mhstore
-can be invoked with
-.B \-auto
-to perform the extraction.
.SS "External Access"
For contents of type message/external-body,
\fImhstore\fR supports these access-types:
static void store_single_message(CT);
static int store_switch(CT);
static int store_generic(CT);
-static int store_application(CT);
static int store_multi(CT);
static int store_partial(CT);
static int store_external(CT);
break;
case CT_APPLICATION:
- return store_application(ct);
- break;
-
case CT_TEXT:
case CT_AUDIO:
case CT_IMAGE:
/*
** Generic routine to store a MIME content.
-** (audio, video, image, text, message/rfc922)
+** (application, audio, video, image, text, message/rfc922)
*/
static int
/*
-** Store content of type "application"
-*/
-
-static int
-store_application(CT ct)
-{
- char **ap, **ep;
- CI ci = &ct->c_ctinfo;
-
- /* Check if the content specifies a filename */
- if (autosw)
- get_storeproc(ct);
-
- /*
- ** If storeproc is not defined, and the content is type
- ** "application/octet-stream", we also check for various
- ** attribute/value pairs which specify if this a tar file.
- */
- if (!ct->c_storeproc && ct->c_subtype == APPLICATION_OCTETS) {
- int tarP = 0, zP = 0, gzP = 0;
-
- for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) {
- /* check for "type=tar" attribute */
- if (!mh_strcasecmp(*ap, "type")) {
- if (mh_strcasecmp(*ep, "tar"))
- break;
-
- tarP = 1;
- continue;
- }
-
- /* check for "conversions=compress" attribute */
- if ((!mh_strcasecmp(*ap, "conversions") ||
- !mh_strcasecmp(*ap, "x-conversions"))
- && (!mh_strcasecmp(*ep, "compress") ||
- !mh_strcasecmp(*ep, "x-compress"))) {
- zP = 1;
- continue;
- }
- /* check for "conversions=gzip" attribute */
- if ((!mh_strcasecmp(*ap, "conversions") ||
- !mh_strcasecmp(*ap, "x-conversions"))
- && (!mh_strcasecmp(*ep, "gzip") ||
- !mh_strcasecmp(*ep, "x-gzip"))) {
- gzP = 1;
- continue;
- }
- }
-
- if (tarP) {
- ct->c_showproc = getcpy(zP ? "%euncompress | tar tvf -" : (gzP ? "%egzip -dc | tar tvf -" : "%etar tvf -"));
- if (!ct->c_storeproc) {
- if (autosw) {
- ct->c_storeproc = getcpy(zP ? "| uncompress | tar xvpf -" : (gzP ? "| gzip -dc | tar xvpf -" : "| tar xvpf -"));
- ct->c_umask = 0022;
- } else {
- ct->c_storeproc= getcpy(zP ? "%m%P.tar.Z" : (gzP ? "%m%P.tar.gz" : "%m%P.tar"));
- }
- }
- }
- }
-
- return store_content(ct, NULL);
-}
-
-
-/*
** Store the content of a multipart message
*/