/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2010-2021 Free Software Foundation, Inc.
GNU Mailutils is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU Mailutils is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Mailutils. If not, see . */
#if defined(HAVE_CONFIG_H)
# include
#endif
#include
#include "mu.h"
char wicket_docstring[] = N_("scan wickets for matching URLs");
static char wicket_args_doc[] = N_("URL");
static char *wicket_file = "~/.mu-tickets";
static int wicket_verbose = 1;
static void
clear_wicket_verbose (struct mu_parseopt *po, struct mu_option *opt,
char const *arg)
{
wicket_verbose = 0;
}
static struct mu_option wicket_options[] = {
{ "file", 'f', N_("FILE"), MU_OPTION_DEFAULT,
N_("use FILE instead of ~/.mu-tickets"),
mu_c_string, &wicket_file },
{ "verbose", 'v', NULL, MU_OPTION_DEFAULT,
N_("increase output verbosity"),
mu_c_string, &wicket_verbose },
{ "quiet", 'q', NULL, MU_OPTION_DEFAULT,
N_("suppress any output"),
mu_c_string, NULL, clear_wicket_verbose },
{ NULL }
};
static int
wicket_match (mu_stream_t stream, const char *str)
{
int rc, ret;
mu_url_t u, url;
struct mu_locus_point loc;
int flags = MU_URL_PARSE_ALL;
if (wicket_verbose > 2)
flags &= ~MU_URL_PARSE_HIDEPASS;
rc = mu_url_create (&u, str);
if (rc)
{
mu_diag_funcall (MU_DIAG_ERROR, "mu_url_create", str, rc);
return 2;
}
rc = mu_stream_seek (stream, 0, MU_SEEK_SET, NULL);
if (rc)
{
mu_diag_funcall (MU_DIAG_ERROR, "mu_stream_seek", "0", rc);
return 2;
}
loc.mu_file = wicket_file;
loc.mu_line = 0;
rc = mu_wicket_stream_match_url (stream, &loc, u, flags, &url);
switch (rc)
{
case 0:
ret = 0;
if (wicket_verbose)
{
mu_printf ("%s: %s:%d", str, loc.mu_file, loc.mu_line);
if (wicket_verbose > 1)
mu_printf (": %s", mu_url_to_string (url));
mu_printf ("\n");
}
break;
case MU_ERR_NOENT:
if (wicket_verbose)
mu_printf ("%s: %s\n", str, _("not found"));
ret = 1;
break;
default:
mu_diag_funcall (MU_DIAG_ERROR, "mu_wicket_stream_match_url", str, rc);
ret = 2;
}
return ret;
}
int
main (int argc, char **argv)
{
mu_stream_t stream;
int rc, i, exit_code;
mu_action_getopt (&argc, &argv, wicket_options, wicket_docstring,
wicket_args_doc);
if (argc == 0)
{
mu_error (_("not enough arguments"));
return 1;
}
wicket_file = mu_tilde_expansion (wicket_file, MU_HIERARCHY_DELIMITER, NULL);
if (!wicket_file)
{
mu_diag_funcall (MU_DIAG_ERROR, "mu_tilde_expansion", wicket_file,
ENOMEM);
return 2;
}
rc = mu_file_stream_create (&stream, wicket_file, MU_STREAM_READ);
if (rc)
{
mu_error (_("cannot open input file %s: %s"), wicket_file,
mu_strerror (rc));
return 1;
}
exit_code = 0;
for (i = 0; i < argc; i++)
{
rc = wicket_match (stream, argv[i]);
if (rc)
{
if (exit_code < rc)
exit_code = rc;
if (!wicket_verbose)
break;
}
}
mu_stream_destroy (&stream);
return exit_code;
}