#include #include #include #include #include #include extern const char *__progname; #include "seq.h" #include "folder.h" #include "system.h" #include "msgarg.h" #include "profile.h" #include "context.h" #include "message.h" static int pflag = 0; static int fflag = 0; static int uflag = 0; static int nseqs = 0; static char **seqs; #define UNKNOWN 0 #define MOVE_MSG_MSG 1 #define MOVE_MSGS_FOLDER 2 static int opmode = UNKNOWN; static FOLDER *tofolder; static MESSAGE *frommsg = 0; static int nargs; static char **argstr; static ARG *args; static FOLDER *curfolder; static FOLDER *msgfolder; static const char *rmbak; static int rmbak_len; static void add_seq(const char *s) { int i; for (i=0;i 1) && !strcmp(*av,"-s")) { add_seq(av[1]); ac --; av ++; continue; } break; } nargs = 0; args = malloc(ac*sizeof(ARG)); argstr = malloc(ac*sizeof(char *)); errs = 0; for (;ac;ac--,av++) { arg = *av; if (! msgarg_parse(arg,args+nargs,0)) { fprintf(stderr,"%s: invalid argument `%s'\n",__progname,arg); errs ++; } else { argstr[nargs] = arg; nargs ++; } } if (errs) exit(1); if (uflag) { const char *useq; useq = profile_lookup(system_get_profile(),"unseen-sequence"); if (useq) { int nus; const char **usv; int i; ws_split(useq,&nus,&usv); for (i=0;i rmblen) { free(rmbuf); rmblen = l + 8; rmbuf = malloc(rmblen); } bcopy(p,rmbuf,lc-p); sprintf(rmbuf+(lc-p),rmbak,lc); rv = rename(p,rmbuf); } if (rv < 0) return(-1); l = message_number(m); folder_deleted_messages(msgfolder,&l,1); return(0); } static void incoming_message(MESSAGE *m) { SEQS *ss; int j; ss = seqs_open(message_folder(m)); if (ss) { for (j=0;j= 0) { if (! fflag) { fprintf(stderr,"%s: %d already exists in +%s\n",__progname,message_number(m),folder_name(message_folder(m))); exit(1); } if (delete_it(m) < 0) { fprintf(stderr,"%s: can't remove %d from +%s: %s\n",__progname,message_number(m),folder_name(message_folder(m)),strerror(errno)); exit(1); } } /* Always link(), never rename(); want error if target exists! */ if (link(message_path(frommsg),message_path(m)) < 0) { fprintf(stderr,"%s: can't link %d in +%s to %d in +%s: %s\n",__progname,message_number(frommsg),folder_name(message_folder(frommsg)),message_number(m),folder_name(message_folder(m)),strerror(errno)); exit(1); } if (! pflag) { if (unlink(message_path(frommsg)) < 0) { fprintf(stderr,"%s: can't remove %d from +%s: %s\n",__progname,message_number(frommsg),folder_name(message_folder(frommsg)),strerror(errno)); exit(1); } d = message_number(frommsg); folder_deleted_messages(message_folder(frommsg),&d,1); } incoming_message(m); message_free(m); fromfolder = message_folder(frommsg); message_free(frommsg); folder_unlock(fromfolder); } else { folder_lock(msgfolder,FOLDER_WAIT|FOLDER_SHARED); frommsg = message_make(msgfolder,vec[0]); } return; } for (i=0;i 0) { fprintf(stderr,"%s: {rmbak} includes multiple %%s escapes\n",__progname); exit(1); } nstr ++; rmbak_len -= 2; break; case '\0': fprintf(stderr,"%s: {rmbak} includes %% at end of string\n",__progname); exit(1); break; default: fprintf(stderr,"%s: {rmbak} includes unknown escape %%%c\n",__progname,*cp); exit(1); break; } } } static void usage(void) { fprintf(stderr,"Usage: %s [-p] [-f] message message\n",__progname); fprintf(stderr," %s [-p] message [message...] +folder\n",__progname); } static void process_args(void) { int a; char *s; if (nargs < 2) { usage(); exit(1); } if ((nargs > 2) || (args[1].type == AT_NOMSG)) { opmode = MOVE_MSGS_FOLDER; nargs --; if (!args[nargs].folder || (args[nargs].type != AT_NOMSG)) { fprintf(stderr,"%s: when moving multiple messages, last arg must be folder reference\n",__progname); usage(); exit(1); } folder_lookup(args[nargs].folder,&tofolder,0); if (folder_lock(tofolder,FOLDER_WAIT|FOLDER_EXCLUSIVE) < 0) { fprintf(stderr,"%s: %s: can't lock +%s: %s\n",__progname,argstr[a],folder_name(tofolder),strerror(errno)); exit(1); } } else { opmode = MOVE_MSG_MSG; } system_lock(SYS_SHARED|SYS_WAIT|SYS_FAILEXIT); if (! pflag) { rmbak = profile_lookup(system_get_profile(),"rmbak"); check_rmbak(); } s = context_lookup("folder"); if (s) { folder_lookup(s,&curfolder,0); free(s); } else { curfolder = 0; } for (a=0;a