remove.c - rohrpost - A commandline mail client to change the world as we see it.
(HTM) git clone git://r-36.net/rohrpost
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
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