add.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
       ---
       add.c (2363B)
       ---
            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 <time.h>
           10 #include <strings.h>
           11 #include <sys/types.h>
           12 #include <sys/wait.h>
           13 #include <signal.h>
           14 #include <string.h>
           15 
           16 #include "ind.h"
           17 #include "arg.h"
           18 #include "cfg.h"
           19 #include "llist.h"
           20 #include "imap.h"
           21 #include "flag.h"
           22 #include "inc.h"
           23 
           24 void
           25 addusage(char *argv0)
           26 {
           27         die("usage: %s [-qh] [-c cfg] [-m folder] [-d datetime] [-f flags]"
           28                         " [file]\n", argv0);
           29 }
           30 
           31 int
           32 addmain(int argc, char *argv[])
           33 {
           34         config_t *cfg;
           35         imap_t *imap;
           36         char *user, *pass, *netspec, *folder, *flags, *tdate, *filec, *cfgn, *argv0;
           37         int filelen, status;
           38         llist_t *flagl;
           39         inc_t *incs;
           40 
           41         folder = NULL;
           42         flags = NULL;
           43         tdate = NULL;
           44         status = 0;
           45         cfgn = NULL;
           46 
           47         enum {
           48                 BEQUIET = 0x01,
           49 
           50                 NOARGS = 0x02
           51         };
           52 
           53         ARGBEGIN(argv0) {
           54         case 'c':
           55                 cfgn = EARGF(addusage(argv0));
           56                 break;
           57         case 'd':
           58                 tdate = EARGF(addusage(argv0));
           59                 break;
           60         case 'f':
           61                 flags = EARGF(addusage(argv0));
           62                 break;
           63         case 'm':
           64                 folder = EARGF(addusage(argv0));
           65                 break;
           66         case 'q':
           67                 status |= BEQUIET;
           68                 break;
           69         default:
           70                 addusage(argv0);
           71         } ARGEND;
           72 
           73         filelen = 0;
           74         if (argc < 1) {
           75                 filec = readtoeoffd(0, &filelen);
           76                 if (filec == NULL)
           77                         edie("readtoeoffd");
           78         } else {
           79                 filec = readfile(argv[0], &filelen);
           80         }
           81 
           82         if (filec == NULL || filelen < 1)
           83                 die("Given file or input was too short or invalid.\n");
           84 
           85         flagl = NULL;
           86         if (flags != NULL) {
           87                 flagl = flag_sanitize(flags);
           88                 if (flagl == NULL)
           89                         die("Flag parameter seems to be invalid.\n");
           90         }
           91 
           92         cfg = config_init(cfgn);
           93 
           94         user = config_checkgetstr(cfg, "imapuser");
           95         pass = config_checkgetstr(cfg, "imappass");
           96         netspec = config_checkgetstr(cfg, "imapnet");
           97         if (folder == NULL) {
           98                 folder = config_checkgetstr(cfg, "selected");
           99         } else {
          100                 folder = memdups(folder);
          101         }
          102         config_free(cfg);
          103 
          104         imap = imap_new(netspec, user, pass);
          105         free(user);
          106         free(pass);
          107         free(netspec);
          108 
          109         if (imap_init(imap))
          110                 imap_die(imap, "imap_init");
          111 
          112         if (imap_append(imap, folder, flagl, tdate, filec))
          113                 imap_die(imap, "imap_append");
          114 
          115         incs = inc_init(cfgn);
          116         inc_updatefolder(imap, folder, incs);
          117         if (!(status & BEQUIET)) {
          118                 free(filec);
          119                 filec = inc_getstatuselem(incs, folder, "messages");
          120                 printf("%s\n", filec);
          121         }
          122         inc_stop(incs);
          123 
          124         if (flagl != NULL)
          125                 llist_free(flagl);
          126         free(filec);
          127         free(folder);
          128         imap_close(imap);
          129         imap_free(imap);
          130         return 0;
          131 }
          132