stats.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
       ---
       stats.c (2694B)
       ---
            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 
           10 #include "ind.h"
           11 #include "arg.h"
           12 #include "cfg.h"
           13 #include "llist.h"
           14 #include "folder.h"
           15 #include "imap.h"
           16 #include "stats.h"
           17 
           18 void
           19 statsusage(char *argv0)
           20 {
           21         die("usage: %s [-haru] [-c cfg] [-m folder]\n", argv0);
           22 }
           23 
           24 int
           25 statsmain(int argc, char *argv[])
           26 {
           27         config_t *cfg;
           28         imap_t *imap;
           29         int cmsgs, crecent, cunseen, cfolders, domsgs, dorecent, dounseen;
           30         char *user, *pass, *netspec, *msgs, *recent, *unseen, *selected,
           31              *cfgn, *argv0;
           32         llist_t *folders, *ffolders, *statusl;
           33         llistelem_t *folder, *elem;
           34 
           35         domsgs = 0;
           36         dorecent = 0;
           37         dounseen = 0;
           38         selected = NULL;
           39         cfgn = NULL;
           40 
           41         ARGBEGIN(argv0) {
           42         case 'a':
           43                 domsgs = 1;
           44                 break;
           45         case 'c':
           46                 cfgn = EARGF(statsusage(argv0));
           47                 break;
           48         case 'm':
           49                 selected = EARGF(statsusage(argv0));
           50                 break;
           51         case 'r':
           52                 dorecent = 1;
           53                 break;
           54         case 'u':
           55                 dounseen = 1;
           56                 break;
           57         default:
           58                 statsusage(argv0);
           59         } ARGEND;
           60 
           61         cfg = config_init(cfgn);
           62         user = (config_checkget(cfg, "imapuser"))->data;
           63         pass = (config_checkget(cfg, "imappass"))->data;
           64         netspec = (config_checkget(cfg, "imapnet"))->data;
           65         imap = imap_new(netspec, user, pass);
           66         config_free(cfg);
           67 
           68         if (imap_init(imap))
           69                 imap_die(imap, "imap_init");
           70 
           71         folders = imap_listfolders(imap);
           72         if (folders == NULL)
           73                 imap_die(imap, "imap_subscribed");
           74 
           75         if (selected != NULL) {
           76                 folder = llist_get(folders, selected);
           77                 if (folder != NULL) {
           78                         ffolders = llist_new();
           79                         llist_add(ffolders, folder->key, folder->data,
           80                                         folder->datalen);
           81                 } else {
           82                         die("Could not find folder %s.\n", selected);
           83                 }
           84         } else {
           85                 ffolders = folders;
           86         }
           87 
           88         cmsgs = 0;
           89         crecent = 0;
           90         cunseen = 0;
           91         cfolders = ffolders->len;
           92         forllist(ffolders, folder) {
           93                 if (folder->key == NULL)
           94                         continue;
           95                 statusl = imap_status(imap, folder->key);
           96                 if (statusl == NULL)
           97                         continue;
           98 
           99                 msgs = "";
          100                 recent = "";
          101                 unseen = "";
          102                 elem = llist_ciget(statusl, "messages");
          103                 if (elem != NULL)
          104                         msgs = (char *)elem->data;
          105                 elem = llist_ciget(statusl, "recent");
          106                 if (elem != NULL)
          107                         recent = (char *)elem->data;
          108                 elem = llist_ciget(statusl, "unseen");
          109                 if (elem != NULL)
          110                         unseen = (char *)elem->data;
          111 
          112                 cmsgs += atoi(msgs);
          113                 crecent += atoi(recent);
          114                 cunseen += atoi(unseen);
          115         }
          116 
          117         if (domsgs)
          118                 printf("%d\n", cmsgs);
          119         if (dounseen)
          120                 printf("%d\n", cunseen);
          121         if (dorecent)
          122                 printf("%d\n", crecent);
          123 
          124         if (!domsgs && !dounseen && !dorecent) {
          125                 printf("%d folders containing %d messages, with %d unseen and %d "
          126                                 "recent messages.\n", cfolders, cmsgs, cunseen,
          127                                 crecent);
          128         }
          129         if (folder != NULL)
          130                 llist_free(ffolders);
          131         llist_free(folders);
          132 
          133         imap_close(imap);
          134         imap_free(imap);
          135         return 0;
          136 }
          137