-
-/*
- * rmf.c -- remove a folder
+/* rmf.c -- remove a folder
*
* This code is Copyright (c) 2002, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
*/
#include <h/mh.h>
+#include <h/utils.h>
+#include "../sbr/m_maildir.h"
+#include "../sbr/m_mktemp.h"
+
+#define RMF_SWITCHES \
+ X("interactive", 0, INTRSW) \
+ X("nointeractive", 0, NINTRSW) \
+ X("version", 0, VERSIONSW) \
+ X("help", 0, HELPSW) \
-static struct swit switches[] = {
-#define INTRSW 0
- { "interactive", 0 },
-#define NINTRSW 1
- { "nointeractive", 0 },
-#define VERSIONSW 2
- { "version", 0 },
-#define HELPSW 3
- { "help", 0 },
- { NULL, 0 }
-};
+#define X(sw, minchars, id) id,
+DEFINE_SWITCH_ENUM(RMF);
+#undef X
+
+#define X(sw, minchars, id) { sw, minchars, id },
+DEFINE_SWITCH_ARRAY(RMF, switches);
+#undef X
/*
* static prototypes
char *cp, *folder = NULL, newfolder[BUFSIZ];
char buf[BUFSIZ], **argp, **arguments;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
snprintf (buf, sizeof(buf), "%s [+folder] [switches]",
invo_name);
print_help (buf, switches, 1);
- done (1);
+ done (0);
case VERSIONSW:
print_version(invo_name);
- done (1);
+ done (0);
case INTRSW:
interactive = 1;
if (*cp == '+' || *cp == '@') {
if (folder)
adios (NULL, "only one folder at a time!");
- else
- folder = pluspath (cp);
+ folder = pluspath (cp);
} else {
adios (NULL, "usage: %s [+folder] [switches]", invo_name);
}
interactive = defolder;
if (strchr (folder, '/') && (*folder != '/') && (*folder != '.')) {
- for (cp = copy (folder, newfolder); cp > newfolder && *cp != '/'; cp--)
+ for (cp = stpcpy(newfolder, folder); cp > newfolder && *cp != '/'; cp--)
continue;
if (cp > newfolder)
*cp = '\0';
if (interactive) {
cp = concat ("Remove folder \"", folder, "\"? ", NULL);
- if (!getanswer (cp))
+ if (!read_yes_or_no_if_tty (cp))
done (0);
free (cp);
}
static int
rmf (char *folder)
{
- int i, j, others;
- register char *maildir;
+ int i, others;
+ char *maildir;
char cur[BUFSIZ];
- register struct dirent *dp;
- register DIR *dd;
+ struct dirent *dp;
+ DIR *dd;
switch (i = chdir (maildir = m_maildir (folder))) {
case OK:
if (access (".", W_OK) != NOTOK && access ("..", W_OK) != NOTOK)
- break; /* fall otherwise */
+ break;
+ /* FALLTHRU */
case NOTOK:
snprintf (cur, sizeof(cur), "atr-%s-%s",
printf ("[+%s de-referenced]\n", folder);
return OK;
}
- advise (NULL, "you have no profile entry for the %s folder +%s",
+ inform("you have no profile entry for the %s folder +%s",
i == NOTOK ? "unreadable" : "read-only", folder);
return NOTOK;
}
* Run the external delete hook program.
*/
- (void)ext_hook("del-hook", maildir, (char *)0);
+ (void)ext_hook("del-hook", maildir, NULL);
- j = strlen(BACKUP_PREFIX);
while ((dp = readdir (dd))) {
switch (dp->d_name[0]) {
case '.':
if (strcmp (dp->d_name, ".") == 0
|| strcmp (dp->d_name, "..") == 0)
- continue; /* else fall */
+ continue;
+ break;
case ',':
-#ifdef MHE
- case '+':
-#endif /* MHE */
-#ifdef UCI
- case '_':
- case '#':
-#endif /* UCI */
break;
default:
if (m_atoi (dp->d_name))
break;
if (strcmp (dp->d_name, LINK) == 0
- || strncmp (dp->d_name, BACKUP_PREFIX, j) == 0)
+ || has_prefix(dp->d_name, BACKUP_PREFIX))
break;
- admonish (NULL, "file \"%s/%s\" not deleted",
+ inform("file \"%s/%s\" not deleted, continuing...",
folder, dp->d_name);
others++;
continue;
}
- if (unlink (dp->d_name) == NOTOK) {
+ if (m_unlink (dp->d_name) == NOTOK) {
admonish (dp->d_name, "unable to unlink %s:", folder);
others++;
}
*/
rma (folder);
- chdir ("..");
+ if (chdir ("..") < 0) {
+ advise ("..", "chdir");
+ }
if (others == 0 && remdir (maildir))
return OK;
- advise (NULL, "folder +%s not removed", folder);
+ inform("folder +%s not removed", folder);
return NOTOK;
}
static void
rma (char *folder)
{
- register int alen, j, plen;
- register char *cp;
- register struct node *np, *pp;
+ int alen, j, plen;
+ char *cp;
+ struct node *np, *pp;
- alen = strlen ("atr-");
+ alen = LEN("atr-");
plen = strlen (cp = m_mailpath (folder)) + 1;
/*
&& *(np->n_name + j) == '-'
&& strcmp (cp, np->n_name + j + 1) == 0) {
if (!np->n_context)
- admonish (NULL, "bug: context_del(key=\"%s\")", np->n_name);
+ inform("bug: context_del(key=\"%s\"), continuing...",
+ np->n_name);
if (pp) {
pp->n_next = np->n_next;
np = pp;