#include #include #include #include #include extern const char *__progname; #include "seq.h" #include "folder.h" #include "system.h" #include "context.h" static int nfolders; static FOLDER **folders; static void get_folder_list(int ac, char **av) { int errs; errs = 0; nfolders = 0; folders = 0; for (ac--,av++;ac;ac--,av++) { FOLDER *f; char *ep; if ((**av == '+') && folder_lookup(1+*av,&f,&ep) && !*ep) { nfolders ++; folders = realloc(folders,nfolders*sizeof(FOLDER *)); folders[nfolders-1] = f; } else { fprintf(stderr,"%s: `%s': not a folder\n",__progname,*av); errs ++; } } if (errs) exit(1); if (nfolders == 0) { char *curfname; FOLDER *f; curfname = context_lookup("folder"); if (curfname == 0) { fprintf(stderr,"%s: no current folder\n",__progname); exit(1); } if (! folder_lookup(curfname,&f,0)) { fprintf(stderr,"%s: current folder name (%s) is invalid\n",__progname,curfname); exit(1); } nfolders = 1; folders = malloc(sizeof(FOLDER *)); *folders = f; } } static int seq_renumber(SEQ *s, void *mnvv) { if (seq_test(s,((int *)mnvv)[0])) { seq_remove(s,((int *)mnvv)[0]); seq_add(s,((int *)mnvv)[1]); } return(0); } static void pack_folder(FOLDER *f) { int nmsgs; int *msgs; char *mf; int i; SEQS *ss; int mnv[2]; if (folder_lock(f,FOLDER_WAIT|FOLDER_EXCLUSIVE) < 0) { fprintf(stderr,"%s: can't lock +%s: %s\n",__progname,folder_name(f),strerror(errno)); return; } nmsgs = folder_get_msgnos(f,0,-1,0); if (nmsgs < 1) { folder_unlock(f); return; } ss = seqs_open(f); msgs = malloc(nmsgs*2*sizeof(int)); mf = malloc(nmsgs); if (folder_get_msgnos(f,nmsgs,0,msgs) != nmsgs) { fprintf(stderr,"%s: folder phase error on +%s\n",__progname,folder_name(f)); exit(1); } for (i=0;i= 0) { fprintf(stderr,"%s: packing onto existing message in +%s?\n",__progname,folder_name(f)); punt2:; message_close(nm); message_free(om); message_free(nm); goto punt; } if (rename(message_path(om),message_path(nm)) < 0) { fprintf(stderr,"%s: can't rename %d to %d in +%s: %s\n",__progname,message_number(om),message_number(nm),folder_name(f),strerror(errno)); goto punt2; } mnv[0] = msgs[i]; mnv[1] = i + 1; seqs_forall(ss,&mnv[0],seq_renumber); message_free(om); message_free(nm); } } seqs_close(ss); folder_unlock(f); } static void pack_folders(void) { int fno; for (fno=0;fno