#define AUTOSW 0
{ "auto", 0 },
#define NAUTOSW 1
- { "noauto", 0 },
+ { "noauto", 2 },
#define FILESW 2 /* interface from show */
{ "file file", 0 },
#define PARTSW 3
#define TYPESW 4
{ "type content", 0 },
#define VERSIONSW 5
- { "version", 0 },
+ { "Version", 0 },
#define HELPSW 6
{ "help", 0 },
#define DEBUGSW 7
*/
static void pipeser(int);
-int autosw = 0;
+int autosw = 1;
/*
** Cache of current directory. This must be
static int output_content_file(CT, int);
static int output_content_folder(char *, char *);
static int parse_format_string(CT, char *, char *, int, char *);
-static void get_storeproc(CT);
static int copy_some_headers(FILE *, CT);
static void store_all_messages(CT *);
done=freects_done;
-#ifdef LOCALE
setlocale(LC_ALL, "");
-#endif
invo_name = mhbasename(argv[0]);
/* read user profile/context */
** Check for the directory in which to
** store any contents.
*/
- if (autosw)
- dir = getcpy(cwd);
if ((cp = context_find(nmhstorage)) && *cp)
dir = getcpy(cp);
else
** Generic routine to store a MIME content.
** (application, audio, video, image, text, message/rfc922)
*/
-
static int
store_generic(CT ct)
{
+ char **ap, **vp, *cp;
+ CI ci = &ct->c_ctinfo;
+
/*
- ** Check if the content specifies a filename.
+ ** Check if the content specifies a filename in its MIME parameters.
** Don't bother with this for type "message"
- ** (only "message/rfc822" will use store_generic).
+ ** (only the "message" subtype "rfc822" will use store_generic).
*/
- if (autosw && ct->c_type != CT_MESSAGE)
- get_storeproc(ct);
+ if (autosw && ct->c_type != CT_MESSAGE) {
+ /*
+ ** Check the attribute/value pairs, for the attribute "name".
+ ** If found, take the basename, do a few sanity checks and
+ ** copy the value into c_storeproc.
+ */
+ for (ap = ci->ci_attrs, vp = ci->ci_values; *ap; ap++,vp++) {
+ if (mh_strcasecmp(*ap, "name")!=0) {
+ continue;
+ }
+ cp = mhbasename(*vp);
+ if (*cp && *cp!='.' && *cp!='|' && *cp!='!' &&
+ !strchr(cp, '%')) {
+ /* filename looks good: use it */
+ ct->c_storeproc = getcpy(cp);
+ }
+ break;
+ }
+ }
return store_content(ct, NULL);
}
/*
-** Store content from a message of type "message/external".
+** Show how to retrieve content of type "message/external".
*/
-
static int
store_external(CT ct)
{
- int result = NOTOK;
- struct exbody *e = (struct exbody *) ct->c_ctparams;
- CT p = e->eb_content;
-
- if (!type_ok(p, 1))
- return OK;
-
- /*
- ** Check if the parameters for the external body
- ** specified a filename.
- */
- if (autosw) {
- char *cp;
+ char **ap, **ep;
+ char *msg;
+ FILE *fp;
+ char buf[BUFSIZ];
- if ((cp = e->eb_name) && *cp != '/' && *cp != '.' &&
- *cp != '|' && *cp != '!' && !strchr(cp, '%')) {
- if (!ct->c_storeproc)
- ct->c_storeproc = getcpy(cp);
- if (!p->c_storeproc)
- p->c_storeproc = getcpy(cp);
+ msg = add("You need to fetch the contents yourself:", NULL);
+ ap = ct->c_ctinfo.ci_attrs;
+ ep = ct->c_ctinfo.ci_values;
+ for (; *ap; ap++, ep++) {
+ msg = add(concat("\n\t", *ap, ": ", *ep, NULL), msg);
+ }
+ if (!(fp = fopen(ct->c_file, "r"))) {
+ adios(ct->c_file, "unable to open");
+ }
+ fseek(fp, ct->c_begin, SEEK_SET);
+ while (!feof(fp) && ftell(fp) < ct->c_end) {
+ if (!fgets(buf, sizeof buf, fp)) {
+ adios(ct->c_file, "unable to read");
}
+ *strchr(buf, '\n') = '\0';
+ msg = add(concat("\n\t", buf, NULL), msg);
}
-
- /*
- ** Since we will let the Content structure for the
- ** external body substitute for the current content,
- ** we temporarily change its partno (number inside
- ** multipart), so everything looks right.
- */
- p->c_partno = ct->c_partno;
-
- /* we probably need to check if content is really there */
- result = store_switch(p);
-
- p->c_partno = NULL;
- return result;
+ fclose(fp);
+ advise(NULL, msg);
+ return OK;
}
** 4) Else if content is "message", use "+" (current folder)
** 5) Else use string "%m%P.%s".
*/
- if ((cp = ct->c_storeproc) == NULL || *cp == '\0') {
+ if (!(cp = ct->c_storeproc) || !*cp) {
CI ci = &ct->c_ctinfo;
snprintf(buffer, sizeof(buffer), "%s-store-%s/%s",
FILE *fp;
/*
- ** If the pathname is absolute, make sure
- ** all the relevant directories exist.
+ ** If the pathname contains directories, make sure
+ ** all of them exist.
*/
if (strchr(ct->c_storage, '/') && make_intermediates(ct->c_storage)
== NOTOK)
/*
-** Check if the content specifies a filename
-** in its MIME parameters.
-*/
-
-static void
-get_storeproc(CT ct)
-{
- char **ap, **ep, *cp;
- CI ci = &ct->c_ctinfo;
-
- /*
- ** If the storeproc has already been defined,
- ** we just return (for instance, if this content
- ** is part of a "message/external".
- */
- if (ct->c_storeproc)
- return;
-
- /*
- ** Check the attribute/value pairs, for the attribute "name".
- ** If found, do a few sanity checks and copy the value into
- ** the storeproc.
- */
- for (ap = ci->ci_attrs, ep = ci->ci_values; *ap; ap++, ep++) {
- if (!mh_strcasecmp(*ap, "name") && *(cp = *ep) != '/' &&
- *cp != '.' && *cp != '|' && *cp != '!' &&
- !strchr(cp, '%')) {
- ct->c_storeproc = getcpy(cp);
- return;
- }
- }
-}
-
-
-/*
** Copy some of the header fields of the initial message/partial
** message into the header of the reassembled message.
*/