/* GNU Mailutils -- a suite of utilities for electronic mail
Copyright (C) 2002-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 . */
/* MH rmf command */
#include
#include
#include
#include
#include
#include
#include
#include
#include
static char prog_doc[] = N_("Remove a GNU MH folder");
int explicit_folder; /* Was the folder explicitly given */
int interactive; /* Ask for confirmation before deleting */
int recursive; /* Recursively process all the sub-directories */
static char *cur_folder_path; /* Full pathname of the current folder */
static char *folder_name; /* Name of the (topmost) folder to be
deleted */
static void
set_folder (struct mu_parseopt *po, struct mu_option *opt, char const *arg)
{
explicit_folder = 1;
folder_name = mu_strdup (arg);
}
static struct mu_option options[] = {
{ "folder", 0, N_("FOLDER"), MU_OPTION_DEFAULT,
N_("specify the folder to delete"),
mu_c_string, NULL, set_folder },
{ "interactive", 0, NULL, MU_OPTION_DEFAULT,
N_("interactive mode: ask for confirmation before removing each folder"),
mu_c_bool, &interactive },
{ "recursive", 0, NULL, MU_OPTION_DEFAULT,
N_("recursively delete all subfolders"),
mu_c_bool, &recursive },
MU_OPTION_END
};
static char *
current_folder_path (void)
{
mu_mailbox_t mbox = mh_open_folder (mh_current_folder (), MU_STREAM_RDWR);
mu_url_t url;
char *p;
mu_mailbox_get_url (mbox, &url);
p = (char*) mu_url_to_string (url);
if (strncmp (p, "mh:", 3) == 0)
p += 3;
return p;
}
static int
rmf (const char *name)
{
mu_mailbox_t mbox = NULL;
int rc;
rc = mu_mailbox_create_default (&mbox, name);
if (rc)
{
mu_error (_("cannot create mailbox %s: %s"),
name, strerror (rc));
return 1;
}
rc = mu_mailbox_remove (mbox);
mu_mailbox_destroy (&mbox);
if (rc)
{
mu_error (_("cannot remove %s: %s"), name, mu_strerror (rc));
return 1;
}
return 0;
}
/* Recursive rmf */
static int
recrmf (const char *name)
{
DIR *dir;
struct dirent *entry;
int failures = 0;
dir = opendir (name);
if (!dir)
{
mu_error (_("cannot scan folder %s: %s"), name, strerror (errno));
return 1;
}
if (interactive && !mh_getyn (_("Remove folder %s"), name))
exit (0);
while ((entry = readdir (dir)))
{
char *p;
struct stat st;
if (strcmp (entry->d_name, ".") == 0
|| strcmp (entry->d_name, "..") == 0)
continue;
p = mh_safe_make_file_name (name, entry->d_name);
if (stat (p, &st) < 0)
{
mu_diag_funcall (MU_DIAG_ERROR, "stat", p, errno);
}
else if (S_ISDIR (st.st_mode))
failures += recrmf (p);
free (p);
}
closedir (dir);
if (failures == 0)
failures += rmf (name);
else
printf ("%s: folder `%s' not removed\n",
mu_program_name, name);
return failures;
}
int
main (int argc, char **argv)
{
int status;
char *name;
mh_getopt (&argc, &argv, options, 0, NULL, prog_doc, NULL);
cur_folder_path = current_folder_path ();
if (!explicit_folder)
{
interactive = 1;
name = cur_folder_path;
}
else
name = mh_expand_name (NULL, folder_name, NAME_FOLDER);
if (recursive)
status = recrmf (name);
else
{
if (interactive && !mh_getyn (_("Remove folder %s"), name))
exit (0);
status = rmf (name);
}
if (status == 0)
{
if (cur_folder_path && strcmp (name, cur_folder_path) == 0)
{
mh_set_current_folder ("inbox");
mh_global_save_state ();
printf ("[+inbox now current]\n");
}
return 0;
}
return 1;
}