static void print_folders(void);
static int sfold(struct msgs *, char *);
static void readonly_folders(void);
+static int folder_pack(struct msgs **, int);
int
#ifdef LOCALE
setlocale(LC_ALL, "");
#endif
- invo_name = r1bindex(argv[0], '/');
+ invo_name = mhbasename(argv[0]);
/* read user profile/context */
context_read();
while ((cp = *argp++)) {
if (*cp == '-') {
switch (smatch(++cp, switches)) {
- case AMBIGSW:
- ambigsw(cp, switches);
- done(1);
- case UNKWNSW:
- adios(NULL, "-%s unknown", cp);
-
- case HELPSW:
- snprintf(buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name);
- print_help(buf, switches, 1);
- done(1);
- case VERSIONSW:
- print_version(invo_name);
- done(1);
-
- case ALLSW:
- all = 1;
- continue;
-
- case NALLSW:
- all = 0;
- continue;
-
- case CREATSW:
- fcreat = 1;
- continue;
- case NCREATSW:
- fcreat = -1;
- continue;
-
- case FASTSW:
- fshort++;
- continue;
- case NFASTSW:
- fshort = 0;
- continue;
-
- case HDRSW:
- fheader = 1;
- continue;
- case NHDRSW:
- fheader = -1;
- continue;
-
- case PACKSW:
- fpack++;
- continue;
- case NPACKSW:
- fpack = 0;
- continue;
-
- case VERBSW:
- fverb++;
- continue;
- case NVERBSW:
- fverb = 0;
- continue;
-
- case RECURSW:
- frecurse++;
- continue;
- case NRECRSW:
- frecurse = 0;
- continue;
-
- case TOTALSW:
- ftotal = 1;
- continue;
- case NTOTLSW:
- ftotal = -1;
- continue;
-
- case PRNTSW:
- printsw = 1;
- continue;
- case NPRNTSW:
- printsw = 0;
- continue;
-
- case LISTSW:
- listsw = 1;
- continue;
- case NLISTSW:
- listsw = 0;
- continue;
-
- case PUSHSW:
- pushsw = 1;
- listsw = 1;
- popsw = 0;
- continue;
- case POPSW:
- popsw = 1;
- listsw = 1;
- pushsw = 0;
- continue;
+ case AMBIGSW:
+ ambigsw(cp, switches);
+ done(1);
+ case UNKWNSW:
+ adios(NULL, "-%s unknown", cp);
+
+ case HELPSW:
+ snprintf(buf, sizeof(buf), "%s [+folder] [msg] [switches]", invo_name);
+ print_help(buf, switches, 1);
+ done(1);
+ case VERSIONSW:
+ print_version(invo_name);
+ done(1);
+
+ case ALLSW:
+ all = 1;
+ continue;
+
+ case NALLSW:
+ all = 0;
+ continue;
+
+ case CREATSW:
+ fcreat = 1;
+ continue;
+ case NCREATSW:
+ fcreat = -1;
+ continue;
+
+ case FASTSW:
+ fshort++;
+ continue;
+ case NFASTSW:
+ fshort = 0;
+ continue;
+
+ case HDRSW:
+ fheader = 1;
+ continue;
+ case NHDRSW:
+ fheader = -1;
+ continue;
+
+ case PACKSW:
+ fpack++;
+ continue;
+ case NPACKSW:
+ fpack = 0;
+ continue;
+
+ case VERBSW:
+ fverb++;
+ continue;
+ case NVERBSW:
+ fverb = 0;
+ continue;
+
+ case RECURSW:
+ frecurse++;
+ continue;
+ case NRECRSW:
+ frecurse = 0;
+ continue;
+
+ case TOTALSW:
+ ftotal = 1;
+ continue;
+ case NTOTLSW:
+ ftotal = -1;
+ continue;
+
+ case PRNTSW:
+ printsw = 1;
+ continue;
+ case NPRNTSW:
+ printsw = 0;
+ continue;
+
+ case LISTSW:
+ listsw = 1;
+ continue;
+ case NLISTSW:
+ listsw = 0;
+ continue;
+
+ case PUSHSW:
+ pushsw = 1;
+ listsw = 1;
+ popsw = 0;
+ continue;
+ case POPSW:
+ popsw = 1;
+ listsw = 1;
+ pushsw = 0;
+ continue;
}
}
if (*cp == '+' || *cp == '@') {
if (argfolder)
adios(NULL, "only one folder at a time!");
else
- argfolder = pluspath(cp);
+ argfolder = getcpy(expandfol(cp));
} else {
if (msg)
adios(NULL, "only one (current) message at a time!");
}
}
- if (!context_find("path"))
- free(path("./", TFOLDER));
- nmhdir = concat(m_maildir(""), "/", NULL);
+ nmhdir = concat(toabsdir("+"), "/", NULL);
/*
** If we aren't working with the folder stack
} else {
adios(NULL, "no other folder");
}
- for (cp = getcpy(getfolder(1)); *ap; ap++)
+ for (cp = getcpy(getcurfol()); *ap; ap++)
cp = add(*ap, add(" ", cp));
free(dp);
context_replace(stack, cp); /* update folder stack */
} else {
/* update folder stack */
context_replace(stack, (cp = context_find (stack)) ?
- concat(getfolder(1), " ", cp, NULL) :
- getcpy(getfolder(1)));
+ concat(getcurfol(), " ", cp, NULL) :
+ getcpy(getcurfol()));
}
}
free(dp);
}
if (pushsw || popsw) {
- cp = m_maildir(argfolder);
+ cp = toabsdir(argfolder);
if (access(cp, F_OK) == NOTOK)
adios(cp, "unable to find folder");
/* update current folder */
- context_replace(pfolder, argfolder);
+ context_replace(curfolder, argfolder);
context_save(); /* save the context file */
argfolder = NULL;
}
/* Listing the folder stack */
if (listsw) {
- printf("%s", argfolder ? argfolder : getfolder(1));
+ printf("%s", argfolder ? argfolder : getcurfol());
if ((cp = context_find(stack))) {
dp = getcpy(cp);
for (ap = brkstring(dp, " ", "\n"); *ap; ap++)
if (msg)
admonish(NULL, "no folder given for message %s", msg);
readonly_folders(); /* do any readonly folders */
- strncpy(folder, (cp = context_find(pfolder)) ?
+ strncpy(folder, (cp = context_find(curfolder)) ?
cp : "", sizeof(folder));
crawl_folders(".", get_folder_info_callback, NULL);
} else {
strncpy(folder, argfolder, sizeof(folder));
if (get_folder_info(argfolder, msg)) {
/* update current folder */
- context_replace(pfolder, argfolder);
+ context_replace(curfolder, argfolder);
context_save();
}
/*
NULL);
}
} else {
- strncpy(folder, argfolder ? argfolder : getfolder (1),
+ strncpy(folder, argfolder ? argfolder : getcurfol(),
sizeof(folder));
/*
** Check if folder exists. If not, then see if
** we should create it, or just exit.
*/
- create_folder(m_maildir(folder), fcreat, done);
+ create_folder(toabsdir(folder), fcreat, done);
if (get_folder_info(folder, msg) && argfolder) {
/* update current folder */
- context_replace(pfolder, argfolder);
+ context_replace(curfolder, argfolder);
}
}
}
/* Add `+' to end of name, if folder is current */
- if (strcmp(folder, fi[i].name))
+ if (strcmp(folder, fi[i].name)!=0)
snprintf(tmpname, sizeof(tmpname), "%s",
fi[i].name);
else
char atrcur[BUFSIZ];
register struct node *np;
- snprintf(atrcur, sizeof(atrcur), "atr-%s-", current);
+ snprintf(atrcur, sizeof(atrcur), "atr-%s-", seq_cur);
atrlen = strlen(atrcur);
for (np = m_defs; np; np = np->n_next)
- if (isprefix(atrcur, np->n_name)
- && !isprefix(nmhdir, np->n_name + atrlen))
+ if (strncmp(np->n_name, atrcur, atrlen)==0 &&
+ strncmp(np->n_name+atrlen, nmhdir, strlen(nmhdir))!=0)
+ /* Why do we exclude absolute path names? --meillo */
get_folder_info(np->n_name + atrlen, NULL);
}
+
+
+/*
+** pack (renumber) the messages in a folder
+** into a contiguous range from 1 to n.
+** Return -1 if error, else return 0.
+*/
+static int
+folder_pack(struct msgs **mpp, int verbose)
+{
+ int hole, msgnum, newcurrent = 0;
+ char newmsg[BUFSIZ], oldmsg[BUFSIZ];
+ struct msgs *mp;
+
+ mp = *mpp;
+
+ /*
+ ** Just return if folder is empty.
+ */
+ if (mp->nummsg == 0)
+ return 0;
+
+ /*
+ ** Make sure we have message status space allocated
+ ** for all numbers from 1 to current high message.
+ */
+ if (mp->lowoff > 1) {
+ if ((mp = folder_realloc(mp, 1, mp->hghmsg)))
+ *mpp = mp;
+ else {
+ advise(NULL, "unable to allocate folder storage");
+ return -1;
+ }
+ }
+
+ for (msgnum = mp->lowmsg, hole = 1; msgnum <= mp->hghmsg; msgnum++) {
+ if (does_exist(mp, msgnum)) {
+ if (msgnum != hole) {
+ strncpy(newmsg, m_name(hole), sizeof(newmsg));
+ strncpy(oldmsg, m_name(msgnum), sizeof(oldmsg));
+ if (verbose)
+ printf("message %s becomes %s\n", oldmsg, newmsg);
+
+ /*
+ ** Invoke the external refile hook for each
+ ** message being renamed. This is done
+ ** before the file is renamed so that the
+ ** old message file is around for the hook.
+ */
+
+ snprintf(oldmsg, sizeof (oldmsg), "%s/%d",
+ mp->foldpath, msgnum);
+ snprintf(newmsg, sizeof (newmsg), "%s/%d",
+ mp->foldpath, hole);
+ ext_hook("ref-hook", oldmsg, newmsg);
+
+ /* move the message file */
+ if (rename(oldmsg, newmsg) == -1) {
+ advise(newmsg, "unable to rename %s to", oldmsg);
+ return -1;
+ }
+
+ /* check if this is the current message */
+ if (msgnum == mp->curmsg)
+ newcurrent = hole;
+
+ /* copy the attribute flags for this message */
+ copy_msg_flags(mp, hole, msgnum);
+
+ if (msgnum == mp->lowsel)
+ mp->lowsel = hole;
+ if (msgnum == mp->hghsel)
+ mp->hghsel = hole;
+
+ /*
+ ** mark that sequence information has
+ ** been modified
+ */
+ mp->msgflags |= SEQMOD;
+ }
+ hole++;
+ }
+ }
+
+ /* record the new number for the high/low message */
+ mp->lowmsg = 1;
+ mp->hghmsg = hole - 1;
+
+ if (newcurrent)
+ seq_setcur(mp, newcurrent);
+
+ return 0;
+}