summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2005-03-10 21:09:07 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2005-03-10 21:09:07 +0000
commita103f4b1198282f8f45400d60757ce3a420011d0 (patch)
tree83a967c8653b88b80f9c7fbeba769fb377077135
parent4d65d8c2e1db7d953683bdcaa3c3e29eecbe95f1 (diff)
downloadmailutils-a103f4b1198282f8f45400d60757ce3a420011d0.tar.gz
mailutils-a103f4b1198282f8f45400d60757ce3a420011d0.tar.bz2
Handle --no-ask and --no-interactive (-h)
options. Continue search for a matching entry when necessary. Implement 'test' and 'print' commands.
-rw-r--r--mimeview/mimeview.c278
1 files changed, 195 insertions, 83 deletions
diff --git a/mimeview/mimeview.c b/mimeview/mimeview.c
index 65641a191..01e350bdc 100644
--- a/mimeview/mimeview.c
+++ b/mimeview/mimeview.c
@@ -35,6 +35,11 @@ N_("\n\nDebug flags are:\n\
#define OPT_METAMAIL 256
static struct argp_option options[] = {
+ {"no-ask", 'a', N_("TYPE-LIST"), OPTION_ARG_OPTIONAL,
+ N_("Do not ask any questions before running an interpreter to view messages of given types. TYPE-LIST is a comma-separated list of MIME types. If TYPE-LIST is not given, do not ask any questions at all"), 0},
+ {"no-interactive", 'h', NULL, 0,
+ N_("Disable interactive mode"), 0 },
+ {"print", 0, NULL, OPTION_ALIAS, NULL, 0 },
{"debug", 'd', N_("FLAGS"), OPTION_ARG_OPTIONAL,
N_("Enable debugging output"), 0},
{"mimetypes", 't', N_("FILE"), 0,
@@ -50,7 +55,9 @@ int debug_level; /* Debugging level set by --debug option */
static int dry_run; /* Dry run mode */
static char *metamail; /* Name of metamail program, if requested */
static char *mimetypes_config = DEFAULT_CUPS_CONFDIR;
-
+static list_t no_ask_list; /* List of MIME types for which no questions
+ should be asked */
+static int interactive = -1;
char *mimeview_file; /* Name of the file to view */
FILE *mimeview_fp; /* Its descriptor */
@@ -62,6 +69,37 @@ FILE *mimeview_fp; /* Its descriptor */
"/etc/mail/mailcap:"\
"/usr/public/lib/mailcap"
+static void
+parse_typelist (const char *str)
+{
+ char *tmp = xstrdup (str);
+ char *p, *sp;
+
+ for (p = strtok_r (tmp, ",", &sp); p; p = strtok_r (NULL, ",", &sp))
+ list_append (no_ask_list, xstrdup (p));
+ free (tmp);
+}
+
+static int
+match_typelist (const char *type)
+{
+ int rc = 0;
+
+ if (no_ask_list)
+ {
+ iterator_t itr;
+ list_get_iterator (no_ask_list, &itr);
+ for (iterator_first (itr); !rc && !iterator_is_done (itr);
+ iterator_next (itr))
+ {
+ char *p;
+ iterator_current (itr, (void**)&p);
+ rc = fnmatch (p, type, FNM_CASEFOLD) == 0;
+ }
+ iterator_destroy (&itr);
+ }
+ return rc;
+}
static error_t
parse_opt (int key, char *arg, struct argp_state *state)
@@ -71,12 +109,20 @@ parse_opt (int key, char *arg, struct argp_state *state)
case ARGP_KEY_INIT:
mimetypes_lex_debug (0);
mimetypes_gram_debug (0);
+ if (interactive == -1)
+ interactive = isatty (fileno (stdin));
break;
case ARGP_KEY_FINI:
if (dry_run && !debug_level)
debug_level = 1;
break;
+
+ case 'a':
+ list_create (&no_ask_list);
+ parse_typelist (arg ? arg : "*");
+ setenv ("MM_NOASK", arg, 1); /* In case we are given --metamail option */
+ break;
case 'd':
if (!arg)
@@ -99,6 +145,10 @@ parse_opt (int key, char *arg, struct argp_state *state)
}
break;
+ case 'h':
+ interactive = 0;
+ break;
+
case 'n':
dry_run = 1;
break;
@@ -244,68 +294,25 @@ expand_string (char **pstr, const char *filename, const char *type)
}
static int
-find_entry (const char *file, const char *type,
- mu_mailcap_entry_t *pentry,
- mu_mailcap_t *pmc)
+confirm_action (const char *type, const char *str)
{
- mu_mailcap_t mailcap;
- int status;
- stream_t stream;
-
- DEBUG (2, (_("Trying %s...\n"), file));
- status = file_stream_create (&stream, file, MU_STREAM_READ);
- if (status)
- {
- mu_error ("cannot create file stream %s: %s",
- file, mu_strerror (status));
- return 0;
- }
+ char repl[128], *p;
+ int len;
- status = stream_open (stream);
- if (status)
- {
- stream_destroy (&stream, stream_get_owner (stream));
- if (status != ENOENT)
- mu_error ("cannot open file stream %s: %s",
- file, mu_strerror (status));
- return 0;
- }
+ if (!interactive || match_typelist (type))
+ return 1;
+
+ printf (_("Run `%s'?"), str);
+ fflush (stdout);
- status = mu_mailcap_create (&mailcap, stream);
- if (status == 0)
- {
- size_t i, count = 0;
-
- mu_mailcap_entries_count (mailcap, &count);
- for (i = 1; i <= count; i++)
- {
- mu_mailcap_entry_t entry;
- char buffer[256];
-
- if (mu_mailcap_get_entry (mailcap, i, &entry))
- continue;
-
- /* typefield. */
- mu_mailcap_entry_get_typefield (entry,
- buffer, sizeof (buffer), NULL);
-
- if (fnmatch (buffer, type, FNM_CASEFOLD) == 0)
- {
- DEBUG (2, (_("Found in %s\n"), file));
- /* FIXME: Run test entry, if any */
- *pmc = mailcap;
- *pentry = entry;
- return 1; /* We leave stream open! */
- }
- }
- mu_mailcap_destroy (&mailcap);
- }
- else
- {
- mu_error ("cannot create mailcap for %s: %s",
- file, mu_strerror (status));
- }
- return 0;
+ p = fgets (repl, sizeof repl, stdin);
+ if (!p)
+ return 0;
+ len = strlen (p);
+ if (len > 0 && p[len-1] == '\n')
+ p[len--] = 0;
+
+ return mu_true_answer_p (p);
}
static void
@@ -421,6 +428,30 @@ get_pager ()
return pager;
}
+static int
+run_test (mu_mailcap_entry_t entry, const char *type)
+{
+ size_t size;
+ int status = 0;
+
+ if (mu_mailcap_entry_get_test (entry, NULL, 0, &size) == 0)
+ {
+ int argc;
+ char **argv;
+ char *str = xmalloc (size + 1);
+ mu_mailcap_entry_get_test (entry, str, size + 1, NULL);
+
+ expand_string (&str, mimeview_file, type);
+ argcv_get (str, "", NULL, &argc, &argv);
+ free (str);
+
+ if (mu_spawnvp (argv[0], argv, &status))
+ status = 1;
+ argcv_free (argc, argv);
+ }
+ return status;
+}
+
int
run_mailcap (mu_mailcap_entry_t entry, const char *type)
{
@@ -436,10 +467,24 @@ run_mailcap (mu_mailcap_entry_t entry, const char *type)
if (debug_level > 1)
dump_mailcap_entry (entry);
- mu_mailcap_entry_get_viewcommand (entry, NULL, 0, &size);
- size++;
- view_command = xmalloc (size);
- mu_mailcap_entry_get_viewcommand (entry, view_command, size, NULL);
+ if (run_test (entry, type))
+ return -1;
+
+ if (interactive)
+ {
+ mu_mailcap_entry_get_viewcommand (entry, NULL, 0, &size);
+ size++;
+ view_command = xmalloc (size);
+ mu_mailcap_entry_get_viewcommand (entry, view_command, size, NULL);
+ }
+ else
+ {
+ if (mu_mailcap_entry_get_value (entry, "print", NULL, 0, &size))
+ return 1;
+ size++;
+ view_command = xmalloc (size);
+ mu_mailcap_entry_get_value (entry, "print", view_command, size, NULL);
+ }
/* NOTE: We don't create temporary file for %s, we just use
mimeview_file instead */
@@ -449,11 +494,15 @@ run_mailcap (mu_mailcap_entry_t entry, const char *type)
pfd = &fd;
DEBUG (0, (_("Executing %s...\n"), view_command));
- if (dry_run)
- return 0;
+ if (dry_run || !confirm_action (type, view_command))
+ {
+ free (view_command);
+ return 1;
+ }
flag = 0;
- if (mu_mailcap_entry_copiousoutput (entry, &flag) == 0 && flag)
+ if (interactive
+ && mu_mailcap_entry_copiousoutput (entry, &flag) == 0 && flag)
pager_pid = create_filter (get_pager (), -1, &outfd);
pid = create_filter (view_command, outfd, pfd);
@@ -483,6 +532,72 @@ run_mailcap (mu_mailcap_entry_t entry, const char *type)
print_exit_status (status);
}
free (view_command);
+ return 0;
+}
+
+static int
+find_entry (const char *file, const char *type)
+{
+ mu_mailcap_t mailcap;
+ int status;
+ stream_t stream;
+ int rc = 1;
+
+ DEBUG (2, (_("Trying %s...\n"), file));
+ status = file_stream_create (&stream, file, MU_STREAM_READ);
+ if (status)
+ {
+ mu_error ("cannot create file stream %s: %s",
+ file, mu_strerror (status));
+ return -1;
+ }
+
+ status = stream_open (stream);
+ if (status)
+ {
+ stream_destroy (&stream, stream_get_owner (stream));
+ if (status != ENOENT)
+ mu_error ("cannot open file stream %s: %s",
+ file, mu_strerror (status));
+ return -1;
+ }
+
+ status = mu_mailcap_create (&mailcap, stream);
+ if (status == 0)
+ {
+ size_t i, count = 0;
+
+ mu_mailcap_entries_count (mailcap, &count);
+ for (i = 1; i <= count; i++)
+ {
+ mu_mailcap_entry_t entry;
+ char buffer[256];
+
+ if (mu_mailcap_get_entry (mailcap, i, &entry))
+ continue;
+
+ /* typefield. */
+ mu_mailcap_entry_get_typefield (entry,
+ buffer, sizeof (buffer), NULL);
+
+ if (fnmatch (buffer, type, FNM_CASEFOLD) == 0)
+ {
+ DEBUG (2, (_("Found in %s\n"), file));
+ if (run_mailcap (entry, type) == 0)
+ {
+ rc = 0;
+ break;
+ }
+ }
+ }
+ mu_mailcap_destroy (&mailcap);
+ }
+ else
+ {
+ mu_error ("cannot create mailcap for %s: %s",
+ file, mu_strerror (status));
+ }
+ return rc;
}
void
@@ -490,8 +605,6 @@ display_file_mailcap (const char *type)
{
char *p, *sp;
char *mailcap_path;
- mu_mailcap_t mailcap = NULL;
- mu_mailcap_entry_t entry = NULL;
mailcap_path = getenv ("MAILCAP");
if (!mailcap_path)
@@ -506,12 +619,8 @@ display_file_mailcap (const char *type)
for (p = strtok_r (mailcap_path, ":", &sp); p; p = strtok_r (NULL, ":", &sp))
{
- if (find_entry (p, type, &entry, &mailcap))
- {
- run_mailcap (entry, type);
- mu_mailcap_destroy (&mailcap);
- break;
- }
+ if (find_entry (p, type) == 0)
+ break;
}
}
@@ -521,25 +630,28 @@ display_file (const char *type)
if (metamail)
{
int status;
- const char *argv[6];
-
+ const char *argv[7];
+
argv[0] = "metamail";
argv[1] = "-b";
- argv[2] = "-c";
- argv[3] = type;
- argv[4] = mimeview_file;
- argv[5] = NULL;
+
+ argv[2] = interactive ? "-p" : "-h";
+
+ argv[3] = "-c";
+ argv[4] = type;
+ argv[5] = mimeview_file;
+ argv[6] = NULL;
if (debug_level)
{
char *string;
- argcv_string (5, argv, &string);
+ argcv_string (6, argv, &string);
printf (_("Executing %s...\n"), string);
free (string);
}
if (!dry_run)
- mu_spawnvp (metamail, argv, &status);
+ mu_spawnvp (metamail, argv, &status);
}
else
display_file_mailcap (type);

Return to:

Send suggestions and report system problems to the System administrator.