#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 nargs; static char **argstr; static ARG *args; static FOLDER *curfolder; static FOLDER *msgfolder; static const char *rmbak; static int rmbak_len; static void crack_arglist(int ac, char **av) { char *arg; int errs; nargs = 0; args = malloc((ac-1)*sizeof(ARG)); argstr = malloc((ac-1)*sizeof(char *)); errs = 0; for (ac--,av++;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); } static int delete_it(MESSAGE *m) { static char *rmbuf = 0; static int rmblen = 0; const char *p; const char *lc; int l; if (rmbak == 0) return(unlink(message_path(m))); p = message_path(m); lc = rindex(p,'/'); if (lc) lc++; else lc = p; l = (lc-p) + rmbak_len + strlen(lc) + 1; if (l > rmblen) { free(rmbuf); rmblen = l + 8; rmbuf = malloc(rmblen); } bcopy(p,rmbuf,lc-p); sprintf(rmbuf+(lc-p),rmbak,lc); return(rename(p,rmbuf)); } static void do_messages(int *vec, int nv, void *cookie __attribute__((__unused__))) { MESSAGE *m; int i; 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 process_args(void) { int a; char *s; system_lock(SYS_SHARED|SYS_WAIT|SYS_FAILEXIT); 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; } if (nargs == 0) { args = malloc(sizeof(ARG)); args->folder = 0; args->type = AT_SINGLE; args->u.n = MA_CUR; nargs = 1; } for (a=0;a