flag.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
       ---
       flag.c (4459B)
       ---
            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 <strings.h>
           10 #include <string.h>
           11 
           12 #include "ind.h"
           13 #include "arg.h"
           14 #include "cfg.h"
           15 #include "llist.h"
           16 #include "folder.h"
           17 #include "imap.h"
           18 #include "flag.h"
           19 
           20 llist_t *
           21 flag_sanitize(char *flags)
           22 {
           23         llist_t *aflags, *rflags;
           24         llistelem_t *flag;
           25 
           26         aflags = llist_splitstr(flags, " ,");
           27         if (aflags == NULL)
           28                 return NULL;
           29 
           30         rflags = llist_new();
           31         forllist(aflags, flag) {
           32                 if (!strcasecmp(flag->key, "seen"))
           33                         llist_add(rflags, "\\Seen", NULL, 0);
           34                 else if (!strcasecmp(flag->key, "answered"))
           35                         llist_add(rflags, "\\Answered", NULL, 0);
           36                 else if (!strcasecmp(flag->key, "flagged"))
           37                         llist_add(rflags, "\\Flagged", NULL, 0);
           38                 else if (!strcasecmp(flag->key, "deleted"))
           39                         llist_add(rflags, "\\Deleted", NULL, 0);
           40                 else if (!strcasecmp(flag->key, "draft"))
           41                         llist_add(rflags, "\\Draft", NULL, 0);
           42                 else if (!strcasecmp(flag->key, "recent"))
           43                         llist_add(rflags, "\\Recent", NULL, 0);
           44                 else
           45                         continue;
           46         }
           47         llist_free(aflags);
           48         if (rflags->len < 1) {
           49                 llist_free(rflags);
           50                 return NULL;
           51         }
           52 
           53         return rflags;
           54 }
           55 
           56 void
           57 flagsyntax(void)
           58 {
           59         fprintf(stderr, "The 'flag' parameter should be an enclosed argument, "
           60                         "consisting of space separated flags.\n"
           61                         "\n"
           62                         "The flags will be converted in the following way:\n"
           63                         "\t'seen' -> '\\Seen'\n"
           64                         "\t'answered' -> '\\Answered'\n"
           65                         "\t'flagged' -> '\\Flagged'\n"
           66                         "\t'deleted' -> '\\Deleted'\n"
           67                         "\t'draft' -> '\\Draft'\n"
           68                         "\t'recent' -> '\\Recent'\n"
           69                         "\n"
           70                         "Example: ... inc -d \"seen flagged\" 10\n");
           71         exit(1);
           72 }
           73 
           74 void
           75 flagusage(char *argv0)
           76 {
           77         die("usage: %s [-fhu] [-c cfg] [-m folder] [[-s|-d] flag] [msgs]\n"
           78                 "Use -f for displaying the flag syntax.\n", argv0);
           79 }
           80 
           81 int
           82 flagmain(int argc, char *argv[])
           83 {
           84         config_t *cfg;
           85         imap_t *imap;
           86         int status;
           87         char *user, *pass, *netspec, *selected, *cfgn, *argv0;
           88         llist_t *ids, *flagl, *flagrl, *flagel;
           89         llistelem_t *elem;
           90 
           91         enum {
           92                 BEQUIET = 0x01,
           93                 DOSET = 0x02,
           94                 DODELETE = 0x04,
           95                 SETSEEN = 0x08,
           96 
           97                 NOARGS = 0x10
           98         };
           99 
          100         status = 0;
          101         flagl = NULL;
          102         selected = NULL;
          103         cfgn = NULL;
          104 
          105         ARGBEGIN(argv0) {
          106         case 'c':
          107                 cfgn = EARGF(flagusage(argv0));
          108                 break;
          109         case 'd':
          110                 status |= DODELETE;
          111                 break;
          112         case 'f':
          113                 flagsyntax();
          114                 break;
          115         case 'm':
          116                 selected = EARGF(flagusage(argv0));
          117                 break;
          118         case 'q':
          119                 status |= BEQUIET;
          120                 break;
          121         case 's':
          122                 status |= DOSET;
          123                 break;
          124         case 'u':
          125                 status |= SETSEEN;
          126                 break;
          127         default:
          128                 flagusage(argv0);
          129         } ARGEND;
          130 
          131         if (argc < 1 && !(status & SETSEEN))
          132                 flagusage(argv0);
          133 
          134         if (status & DOSET || status & DODELETE) {
          135                 flagl = flag_sanitize(argv[0]);
          136                 if (flagl == NULL)
          137                         flagsyntax();
          138                 argc--;
          139                 argv = &argv[1];
          140         }
          141         if (argc < 1 && !(status & SETSEEN))
          142                 flagusage(argv0);
          143 
          144         cfg = config_init(cfgn);
          145         user = config_checkgetstr(cfg, "imapuser");
          146         pass = config_checkgetstr(cfg, "imappass");
          147         netspec = config_checkgetstr(cfg, "imapnet");
          148         if (selected == NULL) {
          149                 selected = config_checkgetstr(cfg, "selected");
          150         } else {
          151                 selected = memdups(selected);
          152         }
          153         config_free(cfg);
          154 
          155         if (status & SETSEEN) {
          156                 if (argc == 0) {
          157                         argc = 1;
          158                         argv = (char *[]){ "u", NULL };
          159                 }
          160 
          161                 flagl = flag_sanitize("seen");
          162                 if (flagl == NULL)
          163                         flagsyntax();
          164                 status |= DOSET;
          165         }
          166 
          167         ids = imap_argv2ids(cfgn, selected, argc, argv);
          168         if (ids == NULL)
          169                 die("No msgids selected. Aborting.\n");
          170 
          171         imap = imap_new(netspec, user, pass);
          172         free(user);
          173         free(pass);
          174         free(netspec);
          175 
          176         if (imap_init(imap))
          177                 imap_die(imap, "imap_init");
          178         if (imap_select(imap, selected))
          179                 imap_die(imap, "imap_select");
          180 
          181         if (flagl != NULL) {
          182                 pass = llist_joinstr(flagl, " ");
          183         } else {
          184                 pass = NULL;
          185         }
          186 
          187         if (status & DOSET) {
          188                 if (imap_setflags(imap, ids, flagl))
          189                         imap_die(imap, "imap_setflags");
          190         } else if (status & DODELETE) {
          191                 if (imap_delflags(imap, ids, flagl))
          192                         imap_die(imap, "imap_delflags");
          193         }
          194 
          195         flagrl = imap_getflags(imap, ids);
          196         if (flagrl == NULL)
          197                 imap_die(imap, "imap_getflags");
          198         llist_free(ids);
          199 
          200         printf("ID\tFlags\n");
          201 
          202         forllist(flagrl, elem) {
          203                 flagel = (llist_t *)elem->data;
          204                 user = llist_joinstr((llist_t *)flagel->last->data,
          205                                 " ");
          206                 if (user == NULL)
          207                         user = memdup("", 1);
          208                 printf("%s\t%s\n", (char *)flagel->first->data, user);
          209                 free(user);
          210                 user = NULL;
          211         }
          212         llist_efree(flagrl);
          213 
          214         if (flagl != NULL)
          215                 llist_free(flagl);
          216         if (user != NULL)
          217                 free(user);
          218         if (pass != NULL)
          219                 free(pass);
          220         free(selected);
          221         imap_close(imap);
          222         imap_free(imap);
          223 
          224         return 0;
          225 }
          226