copy.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
---
copy.c (2321B)
---
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 "inc.h"
18 #include "copy.h"
19
20 void
21 copyusage(char *argv0)
22 {
23 die("usage: %s [-hq] [-c cfg] [-m folder] folder msgs\n", argv0);
24 }
25
26 int
27 movemain(int argc, char *argv[])
28 {
29 argv[0] = "rpmv";
30 return copymain(argc, argv);
31 }
32
33 int
34 copymain(int argc, char *argv[])
35 {
36 config_t *cfg;
37 imap_t *imap;
38 int status;
39 char *user, *pass, *netspec, *selected, *folder, *cfgn, *argv0;
40 llist_t *ids;
41 inc_t *incs;
42
43 enum {
44 BEQUIET = 0x01,
45 DOMOVE = 0x02,
46
47 NOARGS = 0x04
48 };
49
50 selected = NULL;
51 cfgn = NULL;
52
53 status = 0;
54 if (argc > 0 && argv[0][2] == 'm')
55 status |= DOMOVE;
56
57 ARGBEGIN(argv0) {
58 case 'c':
59 cfgn = EARGF(copyusage(argv0));
60 break;
61 case 'm':
62 selected = EARGF(copyusage(argv0));
63 break;
64 case 'q':
65 status |= BEQUIET;
66 break;
67 case 'h':
68 default:
69 copyusage(argv0);
70 } ARGEND;
71
72 if (argc < 2)
73 copyusage(argv0);
74 folder = argv[0];
75 argv++;
76 argc--;
77
78 cfg = config_init(cfgn);
79 user = config_checkgetstr(cfg, "imapuser");
80 pass = config_checkgetstr(cfg, "imappass");
81 netspec = config_checkgetstr(cfg, "imapnet");
82 if (selected == NULL) {
83 selected = config_checkgetstr(cfg, "selected");
84 } else {
85 selected = memdups(selected);
86 }
87 config_free(cfg);
88
89 imap = imap_new(netspec, user, pass);
90 free(user);
91 free(pass);
92 free(netspec);
93
94 if (imap_init(imap))
95 imap_die(imap, "imap_init");
96 if (imap_select(imap, selected))
97 imap_die(imap, "imap_select");
98
99 ids = imap_argv2ids(cfgn, selected, argc, argv);
100 if (ids == NULL)
101 die("No msgids selected. Aborting.\n");
102 user = imap_ids2str(ids);
103
104 incs = inc_init(cfgn);
105 if (status & DOMOVE) {
106 if (imap_move(imap, ids, folder))
107 imap_die(imap, "imap_move");
108 if (!(status & BEQUIET))
109 printf("%s moved to %s.\n", user, folder);
110 imap_closefolder(imap);
111
112 inc_updatefolder(imap, selected, incs);
113 } else {
114 if (imap_copy(imap, ids, folder))
115 imap_die(imap, "imap_copy");
116 if (!(status & BEQUIET))
117 printf("%s copied to %s.\n", user, folder);
118 imap_closefolder(imap);
119 }
120 inc_updatefolder(imap, folder, incs);
121 inc_stop(incs);
122
123 free(user);
124 llist_efree(ids);
125 free(selected);
126 imap_free(imap);
127 return 0;
128 }
129