595 |
} |
} |
596 |
|
|
597 |
char * |
char * |
598 |
|
mhn_compose_command (char *typestr, int *flags, char *file) |
599 |
|
{ |
600 |
|
char *p, *str; |
601 |
|
char *type, *subtype, *typeargs; |
602 |
|
struct obstack stk; |
603 |
|
|
604 |
|
split_content (typestr, &type, &subtype); |
605 |
|
str = _mhn_profile_get ("compose", type, subtype, NULL); |
606 |
|
if (!str) |
607 |
|
return NULL; |
608 |
|
|
609 |
|
/* Expand macro-notations: |
610 |
|
%a additional arguments |
611 |
|
%f filename containing content |
612 |
|
%F %f, and stdout is not redirected |
613 |
|
%s subtype */ |
614 |
|
|
615 |
|
obstack_init (&stk); |
616 |
|
for (p = str; *p && isspace (*p); p++) |
617 |
|
; |
618 |
|
|
619 |
|
if (*p == '|') |
620 |
|
p++; |
621 |
|
|
622 |
|
for ( ; *p; p++) |
623 |
|
{ |
624 |
|
if (*p == '%') |
625 |
|
{ |
626 |
|
switch (*++p) |
627 |
|
{ |
628 |
|
case 'a': |
629 |
|
/* additional arguments */ |
630 |
|
obstack_grow (&stk, typeargs, strlen (typeargs)); |
631 |
|
break; |
632 |
|
|
633 |
|
case 'F': |
634 |
|
/* %f, and stdout is not redirected */ |
635 |
|
*flags |= MHN_STDIN; |
636 |
|
/*FALLTHRU*/ |
637 |
|
case 'f': |
638 |
|
obstack_grow (&stk, file, strlen (file)); |
639 |
|
break; |
640 |
|
|
641 |
|
case 's': |
642 |
|
/* subtype */ |
643 |
|
obstack_grow (&stk, subtype, strlen (subtype)); |
644 |
|
break; |
645 |
|
|
646 |
|
default: |
647 |
|
obstack_1grow (&stk, *p); |
648 |
|
p++; |
649 |
|
} |
650 |
|
} |
651 |
|
else |
652 |
|
obstack_1grow (&stk, *p); |
653 |
|
} |
654 |
|
obstack_1grow (&stk, 0); |
655 |
|
|
656 |
|
free (type); |
657 |
|
free (subtype); |
658 |
|
|
659 |
|
str = obstack_finish (&stk); |
660 |
|
for (p = str; *p && isspace (*p); p++) |
661 |
|
; |
662 |
|
if (!*p) |
663 |
|
str = NULL; |
664 |
|
else |
665 |
|
str = strdup (str); |
666 |
|
|
667 |
|
obstack_free (&stk, NULL); |
668 |
|
return str; |
669 |
|
} |
670 |
|
|
671 |
|
char * |
672 |
mhn_show_command (message_t msg, msg_part_t part, int *flags, char **tempfile) |
mhn_show_command (message_t msg, msg_part_t part, int *flags, char **tempfile) |
673 |
{ |
{ |
674 |
char *p, *str, *tmp; |
char *p, *str, *tmp; |
794 |
message_get_header (msg, &hdr); |
message_get_header (msg, &hdr); |
795 |
_get_content_type (hdr, &typestr, &typeargs); |
_get_content_type (hdr, &typestr, &typeargs); |
796 |
split_content (typestr, &type, &subtype); |
split_content (typestr, &type, &subtype); |
797 |
str = _mhn_profile_get ("show", type, subtype, "%m%P.%s"); |
str = _mhn_profile_get ("store", type, subtype, "%m%P.%s"); |
798 |
|
|
799 |
/* Expand macro-notations: |
/* Expand macro-notations: |
800 |
%m message number |
%m message number |
1130 |
} |
} |
1131 |
|
|
1132 |
int |
int |
1133 |
exec_internal (message_t msg, msg_part_t part, char *encoding, char *cmd) |
mhn_exec (stream_t *str, char *cmd, int flags) |
1134 |
{ |
{ |
1135 |
int rc; |
int rc = prog_stream_create (str, cmd, MU_STREAM_WRITE); |
|
stream_t tmp; |
|
|
|
|
|
rc = prog_stream_create (&tmp, cmd, MU_STREAM_WRITE); |
|
1136 |
if (rc) |
if (rc) |
1137 |
{ |
{ |
1138 |
mh_error (_("can't create proc stream (command %s): %s"), |
mh_error (_("can't create proc stream (command %s): %s"), |
1139 |
cmd, mu_strerror (rc)); |
cmd, mu_strerror (rc)); |
|
return rc; |
|
1140 |
} |
} |
1141 |
rc = stream_open (tmp); |
else |
|
if (rc) |
|
1142 |
{ |
{ |
1143 |
mh_error (_("can't open proc stream (command %s): %s"), |
rc = stream_open (*str); |
1144 |
cmd, mu_strerror (rc)); |
if (rc) |
1145 |
return rc; |
mh_error (_("can't open proc stream (command %s): %s"), |
1146 |
|
cmd, mu_strerror (rc)); |
1147 |
} |
} |
1148 |
|
return rc; |
1149 |
|
} |
1150 |
|
|
1151 |
|
int |
1152 |
|
exec_internal (message_t msg, msg_part_t part, char *encoding, char *cmd, |
1153 |
|
int flags) |
1154 |
|
{ |
1155 |
|
int rc; |
1156 |
|
stream_t tmp; |
1157 |
|
|
1158 |
|
if ((rc = mhn_exec (&tmp, cmd, flags))) |
1159 |
|
return rc; |
1160 |
show_internal (msg, part, encoding, tmp); |
show_internal (msg, part, encoding, tmp); |
1161 |
stream_destroy (&tmp, stream_get_owner (tmp)); |
stream_destroy (&tmp, stream_get_owner (tmp)); |
1162 |
return rc; |
return rc; |
1212 |
argcv_free (argc, argv); |
argcv_free (argc, argv); |
1213 |
} |
} |
1214 |
else |
else |
1215 |
rc = exec_internal (msg, part, encoding, cmd); |
rc = exec_internal (msg, part, encoding, cmd, flags); |
1216 |
|
|
1217 |
return rc; |
return rc; |
1218 |
} |
} |
1272 |
{ |
{ |
1273 |
char *pager = mh_global_profile_get ("moreproc", getenv ("PAGER")); |
char *pager = mh_global_profile_get ("moreproc", getenv ("PAGER")); |
1274 |
if (pager) |
if (pager) |
1275 |
exec_internal (msg, part, encoding, pager); |
exec_internal (msg, part, encoding, pager, 0); |
1276 |
else |
else |
1277 |
show_internal (msg, part, encoding, out); |
show_internal (msg, part, encoding, out); |
1278 |
} |
} |
1952 |
body_t body; |
body_t body; |
1953 |
stream_t in, out = NULL, fstr; |
stream_t in, out = NULL, fstr; |
1954 |
char *encoding; |
char *encoding; |
1955 |
char *p; |
char *p, *typestr; |
1956 |
|
char *shell_cmd; |
1957 |
|
int flags; |
1958 |
|
|
1959 |
if (!*msg) |
if (!*msg) |
1960 |
message_create (msg, NULL); |
message_create (msg, NULL); |
1961 |
message_get_header (*msg, &hdr); |
message_get_header (*msg, &hdr); |
1962 |
rc = parse_type_command (&cmd, env, hdr); |
rc = parse_type_command (&cmd, env, hdr); |
1963 |
|
if (rc) |
1964 |
|
return 1; |
1965 |
|
|
1966 |
for (p = cmd + strlen (cmd) - 1; p > cmd && isspace (*p); p--) |
for (p = cmd + strlen (cmd) - 1; p > cmd && isspace (*p); p--) |
1967 |
; |
; |
1968 |
if (p == cmd) |
p[1] = 0; |
1969 |
|
|
1970 |
|
_get_content_type (hdr, &typestr, NULL); |
1971 |
|
shell_cmd = mhn_compose_command (typestr, &flags, cmd); |
1972 |
|
free (typestr); |
1973 |
|
|
1974 |
|
/* Open the input stream, whatever it is */ |
1975 |
|
if (shell_cmd) |
1976 |
|
{ |
1977 |
|
if (mhn_exec (&in, cmd, flags)) |
1978 |
|
return 1; |
1979 |
|
} |
1980 |
|
else if (p == cmd) |
1981 |
{ |
{ |
1982 |
mh_error (_("%s:%lu: missing filename"), |
mh_error (_("%s:%lu: missing filename"), |
1983 |
input_file, |
input_file, |
1985 |
finish_msg (env, msg); |
finish_msg (env, msg); |
1986 |
return 1; |
return 1; |
1987 |
} |
} |
1988 |
p[1] = 0; |
else |
|
|
|
|
/* 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) |
|
1989 |
{ |
{ |
1990 |
mh_error (_("can't open input stream (file %s): %s"), |
rc = file_stream_create (&in, cmd, MU_STREAM_READ); |
1991 |
cmd, mu_strerror (rc)); |
if (rc) |
1992 |
stream_destroy (&in, stream_get_owner (in)); |
{ |
1993 |
return rc; |
mh_error (_("can't create input stream (file %s): %s"), |
1994 |
|
cmd, mu_strerror (rc)); |
1995 |
|
return rc; |
1996 |
|
} |
1997 |
|
rc = stream_open (in); |
1998 |
|
if (rc) |
1999 |
|
{ |
2000 |
|
mh_error (_("can't open input stream (file %s): %s"), |
2001 |
|
cmd, mu_strerror (rc)); |
2002 |
|
stream_destroy (&in, stream_get_owner (in)); |
2003 |
|
return rc; |
2004 |
|
} |
2005 |
} |
} |
2006 |
|
|
2007 |
/* Create filter */ |
/* Create filter */ |
2008 |
|
|
2009 |
if (_get_hdr_value (hdr, MU_HEADER_CONTENT_TRANSFER_ENCODING, &encoding)) |
if (_get_hdr_value (hdr, MU_HEADER_CONTENT_TRANSFER_ENCODING, &encoding)) |
2282 |
rename (name, input_file); |
rename (name, input_file); |
2283 |
|
|
2284 |
free (name); |
free (name); |
|
free (input_file); |
|
2285 |
|
|
2286 |
return 0; |
return 0; |
2287 |
} |
} |