remove.c (2704B)
1 /* 2 * Copy me if you can. 3 * by 20h 4 */ 5 6 #include <unistd.h> 7 #include <stdio.h> 8 #include <stdlib.h> 9 #include <string.h> 10 11 #include "ind.h" 12 #include "arg.h" 13 #include "cfg.h" 14 #include "llist.h" 15 #include "folder.h" 16 #include "imap.h" 17 #include "remove.h" 18 19 void 20 removeusage(char *argv0) 21 { 22 die("usage: %s [-hqdre] [-c cfg] [-m folder] msgs\n", argv0); 23 } 24 25 int 26 removemain(int argc, char *argv[]) 27 { 28 config_t *cfg; 29 imap_t *imap; 30 int status; 31 char *user, *pass, *netspec, *selected, *dispose, *cfgn, *argv0; 32 llist_t *ids; 33 34 enum { 35 BEQUIET = 0x01, 36 DODISPOSE = 0x02, 37 DOEXPUNGE = 0x04, 38 DOREMOVE = 0x08, 39 40 NOARGS = 0x10 41 }; 42 43 status = 0; 44 selected = NULL; 45 cfgn = NULL; 46 47 ARGBEGIN(argv0) { 48 case 'c': 49 cfgn = EARGF(removeusage(argv0)); 50 break; 51 case 'd': 52 status |= DODISPOSE; 53 break; 54 case 'e': 55 status |= DOEXPUNGE; 56 break; 57 case 'm': 58 selected = EARGF(removeusage(argv0)); 59 break; 60 case 'q': 61 status |= BEQUIET; 62 break; 63 case 'r': 64 status &= ~DODISPOSE; 65 status |= DOREMOVE; 66 break; 67 default: 68 removeusage(argv0); 69 } ARGEND; 70 71 if (argc < 1 && !(status & DOEXPUNGE)) 72 removeusage(argv0); 73 74 cfg = config_init(cfgn); 75 user = config_checkgetstr(cfg, "imapuser"); 76 pass = config_checkgetstr(cfg, "imappass"); 77 netspec = config_checkgetstr(cfg, "imapnet"); 78 if (selected == NULL) { 79 selected = config_checkgetstr(cfg, "selected"); 80 } else { 81 selected = memdup(selected, strlen(selected)+1); 82 } 83 dispose = config_getstr(cfg, "dispose"); 84 if (dispose != NULL && strlen(dispose) > 0 && !(status & DOREMOVE)) 85 status |= DODISPOSE; 86 config_free(cfg); 87 88 imap = imap_new(netspec, user, pass); 89 free(user); 90 free(pass); 91 free(netspec); 92 93 if (imap_init(imap)) 94 imap_die(imap, "imap_init"); 95 if (imap_select(imap, selected)) 96 imap_die(imap, "imap_select"); 97 98 if (status & DOEXPUNGE) { 99 if (imap_expunge(imap)) 100 imap_die(imap, "imap_expungen"); 101 if (!(status & BEQUIET)) 102 printf("Ran expunge.\n"); 103 } else { 104 ids = imap_argv2ids(cfgn, selected, argc, argv); 105 user = imap_ids2str(ids); 106 if (status & DODISPOSE) { 107 if (dispose == NULL || strlen(dispose) < 1) { 108 fprintf(stderr, "Could not dispose, because " 109 "no 'dispose' configuration was " 110 "given.\n"); 111 } else { 112 if (imap_move(imap, ids, dispose)) 113 imap_die(imap, "imap_move"); 114 if (!(status & BEQUIET)) { 115 printf("%s disposed to %s from %s.\n", 116 user, dispose, selected); 117 } 118 } 119 } else { 120 if (imap_delete(imap, ids)) 121 imap_die(imap, "imap_delete"); 122 if (!(status & BEQUIET)) { 123 printf("%s removed from %s.\n", user, 124 selected); 125 } 126 } 127 free(user); 128 llist_efree(ids); 129 } 130 131 if (dispose != NULL) 132 free(dispose); 133 free(selected); 134 imap_close(imap); 135 imap_free(imap); 136 137 return 0; 138 } 139