summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2003-03-20 15:04:11 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2003-03-20 15:04:11 +0000
commit5dc63a3383a4dcba2af001a48cb2a25adebe44c3 (patch)
tree379f6f9732aeaa6c2f74431dbddf06d128136119
parentd29500762537aab7fd984710a57326a89844e2e7 (diff)
downloadmailutils-5dc63a3383a4dcba2af001a48cb2a25adebe44c3.tar.gz
mailutils-5dc63a3383a4dcba2af001a48cb2a25adebe44c3.tar.bz2
Recognize mhn-compose-* profile components.
-rw-r--r--mh/mhn.c166
1 files changed, 132 insertions, 34 deletions
diff --git a/mh/mhn.c b/mh/mhn.c
index 6df6ff393..d7bd25218 100644
--- a/mh/mhn.c
+++ b/mh/mhn.c
@@ -595,6 +595,80 @@ _mhn_profile_get (char *prefix, char *type, char *subtype, char *defval)
}
char *
+mhn_compose_command (char *typestr, int *flags, char *file)
+{
+ char *p, *str;
+ char *type, *subtype, *typeargs;
+ struct obstack stk;
+
+ split_content (typestr, &type, &subtype);
+ str = _mhn_profile_get ("compose", type, subtype, NULL);
+ if (!str)
+ return NULL;
+
+ /* Expand macro-notations:
+ %a additional arguments
+ %f filename containing content
+ %F %f, and stdout is not redirected
+ %s subtype */
+
+ obstack_init (&stk);
+ for (p = str; *p && isspace (*p); p++)
+ ;
+
+ if (*p == '|')
+ p++;
+
+ for ( ; *p; p++)
+ {
+ if (*p == '%')
+ {
+ switch (*++p)
+ {
+ case 'a':
+ /* additional arguments */
+ obstack_grow (&stk, typeargs, strlen (typeargs));
+ break;
+
+ case 'F':
+ /* %f, and stdout is not redirected */
+ *flags |= MHN_STDIN;
+ /*FALLTHRU*/
+ case 'f':
+ obstack_grow (&stk, file, strlen (file));
+ break;
+
+ case 's':
+ /* subtype */
+ obstack_grow (&stk, subtype, strlen (subtype));
+ break;
+
+ default:
+ obstack_1grow (&stk, *p);
+ p++;
+ }
+ }
+ else
+ obstack_1grow (&stk, *p);
+ }
+ obstack_1grow (&stk, 0);
+
+ free (type);
+ free (subtype);
+
+ str = obstack_finish (&stk);
+ for (p = str; *p && isspace (*p); p++)
+ ;
+ if (!*p)
+ str = NULL;
+ else
+ str = strdup (str);
+
+ obstack_free (&stk, NULL);
+ return str;
+}
+
+char *
mhn_show_command (message_t msg, msg_part_t part, int *flags, char **tempfile)
{
char *p, *str, *tmp;
@@ -720,7 +794,7 @@ mhn_store_command (message_t msg, msg_part_t part, char *name)
message_get_header (msg, &hdr);
_get_content_type (hdr, &typestr, &typeargs);
split_content (typestr, &type, &subtype);
- str = _mhn_profile_get ("show", type, subtype, "%m%P.%s");
+ str = _mhn_profile_get ("store", type, subtype, "%m%P.%s");
/* Expand macro-notations:
%m message number
@@ -1056,25 +1130,33 @@ show_internal (message_t msg, msg_part_t part, char *encoding, stream_t out)
}
int
-exec_internal (message_t msg, msg_part_t part, char *encoding, char *cmd)
+mhn_exec (stream_t *str, char *cmd, int flags)
{
- int rc;
- stream_t tmp;
-
- rc = prog_stream_create (&tmp, cmd, MU_STREAM_WRITE);
+ int rc = prog_stream_create (str, cmd, MU_STREAM_WRITE);
if (rc)
{
mh_error (_("can't create proc stream (command %s): %s"),
cmd, mu_strerror (rc));
- return rc;
}
- rc = stream_open (tmp);
- if (rc)
+ else
{
- mh_error (_("can't open proc stream (command %s): %s"),
- cmd, mu_strerror (rc));
- return rc;
+ rc = stream_open (*str);
+ if (rc)
+ mh_error (_("can't open proc stream (command %s): %s"),
+ cmd, mu_strerror (rc));
}
+ return rc;
+}
+
+int
+exec_internal (message_t msg, msg_part_t part, char *encoding, char *cmd,
+ int flags)
+{
+ int rc;
+ stream_t tmp;
+
+ if ((rc = mhn_exec (&tmp, cmd, flags)))
+ return rc;
show_internal (msg, part, encoding, tmp);
stream_destroy (&tmp, stream_get_owner (tmp));
return rc;
@@ -1130,7 +1212,7 @@ mhn_run_command (message_t msg, msg_part_t part,
argcv_free (argc, argv);
}
else
- rc = exec_internal (msg, part, encoding, cmd);
+ rc = exec_internal (msg, part, encoding, cmd, flags);
return rc;
}
@@ -1190,7 +1272,7 @@ show_handler (message_t msg, msg_part_t part, char *type, char *encoding,
{
char *pager = mh_global_profile_get ("moreproc", getenv ("PAGER"));
if (pager)
- exec_internal (msg, part, encoding, pager);
+ exec_internal (msg, part, encoding, pager, 0);
else
show_internal (msg, part, encoding, out);
}
@@ -1870,15 +1952,32 @@ edit_mime (char *cmd, struct compose_env *env, message_t *msg, int level)
body_t body;
stream_t in, out = NULL, fstr;
char *encoding;
- char *p;
+ char *p, *typestr;
+ char *shell_cmd;
+ int flags;
if (!*msg)
message_create (msg, NULL);
message_get_header (*msg, &hdr);
rc = parse_type_command (&cmd, env, hdr);
+ if (rc)
+ return 1;
+
for (p = cmd + strlen (cmd) - 1; p > cmd && isspace (*p); p--)
;
- if (p == cmd)
+ p[1] = 0;
+
+ _get_content_type (hdr, &typestr, NULL);
+ shell_cmd = mhn_compose_command (typestr, &flags, cmd);
+ free (typestr);
+
+ /* Open the input stream, whatever it is */
+ if (shell_cmd)
+ {
+ if (mhn_exec (&in, cmd, flags))
+ return 1;
+ }
+ else if (p == cmd)
{
mh_error (_("%s:%lu: missing filename"),
input_file,
@@ -1886,25 +1985,25 @@ edit_mime (char *cmd, struct compose_env *env, message_t *msg, int level)
finish_msg (env, msg);
return 1;
}
- p[1] = 0;
-
- /* Open input stream */
- rc = file_stream_create (&in, cmd, MU_STREAM_READ);
- if (rc)
- {
- mh_error (_("can't create input stream (file %s): %s"),
- cmd, mu_strerror (rc));
- return rc;
- }
- rc = stream_open (in);
- if (rc)
+ else
{
- mh_error (_("can't open input stream (file %s): %s"),
- cmd, mu_strerror (rc));
- stream_destroy (&in, stream_get_owner (in));
- return rc;
+ rc = file_stream_create (&in, cmd, MU_STREAM_READ);
+ if (rc)
+ {
+ mh_error (_("can't create input stream (file %s): %s"),
+ cmd, mu_strerror (rc));
+ return rc;
+ }
+ rc = stream_open (in);
+ if (rc)
+ {
+ mh_error (_("can't open input stream (file %s): %s"),
+ cmd, mu_strerror (rc));
+ stream_destroy (&in, stream_get_owner (in));
+ return rc;
+ }
}
-
+
/* Create filter */
if (_get_hdr_value (hdr, MU_HEADER_CONTENT_TRANSFER_ENCODING, &encoding))
@@ -2183,7 +2282,6 @@ mhn_compose ()
rename (name, input_file);
free (name);
- free (input_file);
return 0;
}

Return to:

Send suggestions and report system problems to the System administrator.