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