jaromail

a commandline tool to easily and privately handle your e-mail
git clone git://parazyd.org/jaromail.git
Log | Files | Refs | Submodules | README

fetchaddr.c (5936B)


      1 /*
      2  *  Copyright (C) 1998-2000  Thomas Roessler <roessler@guug.de>
      3  *  Copyright (C) 2000       Roland Rosenfeld <roland@spinnaker.de>
      4  *  Copyright (C) 2012-2015  Denis Roio <jaromil@dyne.org>
      5  *
      6  *  This program is free software; you can redistribute it and/or
      7  *  modify it under the terms of the GNU General Public License as
      8  *  published by the Free Software Foundation; either version 3 of the
      9  *  License, or (at your option) any later version.
     10  *
     11  *  This program is distributed in the hope that it will be useful,
     12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14  *  General Public License for more details.
     15  *
     16  *  You should have received a copy of the GNU General Public License
     17  *  along with this program; if not, write to the Free Software
     18  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
     19  *  02110-1301,, USA.
     20  *
     21  */
     22 
     23 #include <stdio.h>
     24 #include <stdlib.h>
     25 #include <string.h>
     26 #include <time.h>
     27 
     28 #include "helpers.h"
     29 #include "rfc822.h"
     30 #include "rfc2047.h"
     31 
     32 #define MAXHDRS 41
     33 #define HAVE_ICONV 1
     34 
     35 struct header
     36 {
     37   char *tag;
     38   char *value;
     39   size_t len;
     40   size_t taglen;
     41 };
     42 
     43 struct header hdr[MAXHDRS] =
     44   {
     45     { "to:",		NULL, 0,  3 },
     46     { "from:",		NULL, 0,  5 },
     47     { "cc:",		NULL, 0,  3 },
     48     { "resent-from:",	NULL, 0, 12 },
     49     { "resent-to:",	NULL, 0, 10 },
     50     { NULL, 		NULL, 0,  0 }
     51   };
     52 
     53 void chop(struct header *cur)
     54 {
     55   if(cur->len && cur->value[cur->len - 1] == '\n')
     56     cur->value[--cur->len] = '\0';
     57 }
     58 
     59 char print_email_only = 0;
     60 
     61 int writeout(struct header *h, const char *datefmt,
     62              unsigned char create_real_name)
     63 {
     64   int rv = 0;
     65   ADDRESS *addr, *p;
     66   time_t timep;
     67   char timebuf[256];
     68   char *c;
     69 
     70   if(!h->value)
     71     return 0;
     72 
     73   addr = rfc822_parse_adrlist(NULL, h->value);
     74   time(&timep);
     75 
     76   rfc2047_decode_adrlist(addr);
     77   for(p = addr; p; p = p->next)
     78     {
     79       if(create_real_name == 1
     80          && (!p->personal || !*p->personal)
     81          && p->mailbox)
     82         {
     83           if(p->personal)
     84             FREE(p->personal);
     85           p->personal = safe_strdup(p->mailbox);
     86           c=strchr(p->personal, '@');
     87           if (c)
     88             *c='\0';
     89         }
     90       if(!p->group && p->mailbox && *p->mailbox && p->personal)
     91         {
     92           if(p->personal && strlen(p->personal) > 30)
     93             strcpy(p->personal + 27, "...");
     94 
     95           if ((c=strchr(p->mailbox,'@')))
     96             for(c++; *c; c++)
     97               *c=tolower(*c);
     98 
     99           strftime(timebuf, sizeof(timebuf), datefmt, localtime(&timep));
    100 
    101           if(print_email_only == 1) {
    102             printf("%s\n", p->mailbox);
    103           } else {
    104             printf("%s,%s\n", p->mailbox,
    105                    p->personal && *p->personal ? p->personal : " ");
    106           }
    107           rv = 1;
    108         }
    109     }
    110 
    111   rfc822_free_address(&addr);
    112 
    113   return rv;
    114 }
    115 
    116 int main(int argc, char* argv[])
    117 {
    118   char buff[2048];
    119   char *t;
    120   int i, rv;
    121   int partial = 0;
    122   struct header *cur_hdr = NULL;
    123   char *datefmt = NULL;
    124   char *headerlist = NULL;
    125   char *fieldname, *next;
    126   char create_real_name = 0;
    127 #ifdef HAVE_ICONV
    128   const char **charsetptr = &Charset;
    129 #endif
    130 
    131   /* process command line arguments: */
    132   if (argc > 1) {
    133     i = 1;
    134     while (i < argc) {
    135       if (!strcmp (argv[i], "-d") && i+1 < argc) {
    136         datefmt = argv[++i];
    137       } else if (!strcmp (argv[i], "-x") && i+1 < argc) {
    138         headerlist = argv[++i];
    139 #ifdef HAVE_ICONV
    140       } else if (!strcmp (argv[i], "-c") && i+1 < argc) {
    141         *charsetptr = argv[++i];
    142 #endif
    143       } else if (!strcmp (argv[i], "-a")) {
    144         create_real_name = 1;
    145       } else if (!strcmp (argv[i], "-e")) {
    146         print_email_only = 1;
    147       } else {
    148         fprintf (stderr, "%s: `%s' wrong parameter\n", argv[0], argv[i]);
    149       }
    150       i++;
    151     }
    152   }
    153 
    154   if (!datefmt)
    155     datefmt = safe_strdup("%Y-%m-%d %H:%M");
    156 
    157   if (headerlist && strlen (headerlist) > 0 ) {
    158     fieldname = headerlist;
    159     i = 0;
    160     while ( i < MAXHDRS-1 && (next = strchr (fieldname, ':'))) {
    161       hdr[i].tag = safe_malloc (next - fieldname + 2);
    162       strncpy (hdr[i].tag, fieldname, next - fieldname);
    163       hdr[i].tag[next - fieldname] = ':';
    164       hdr[i].tag[next - fieldname + 1] = '\0';
    165       hdr[i].taglen = next - fieldname + 1;
    166       fieldname = next+1;
    167       i++;
    168     }
    169 
    170     if (i < MAXHDRS-1 && *fieldname != '\0') {
    171       hdr[i].tag = safe_malloc (strlen (fieldname) + 2);
    172       strncpy (hdr[i].tag, fieldname, strlen (fieldname));
    173       hdr[i].tag[strlen (fieldname)] = ':';
    174       hdr[i].tag[strlen (fieldname) + 1] = '\0';
    175       hdr[i].taglen = strlen (fieldname) + 1;
    176       i++;
    177     }
    178 
    179     hdr[i].tag = NULL;	/* end of hdr list */
    180   }
    181 
    182   while(fgets(buff, sizeof(buff), stdin))
    183     {
    184 
    185       if(!partial && *buff == '\n')
    186         break;
    187 
    188       if(cur_hdr && (partial || *buff == ' ' || *buff == '\t'))
    189         {
    190           size_t nl = cur_hdr->len + strlen(buff);
    191 
    192           safe_realloc((void **) &cur_hdr->value, nl + 1);
    193           strcpy(cur_hdr->value + cur_hdr->len, buff);
    194           cur_hdr->len = nl;
    195           chop(cur_hdr);
    196         }
    197       else if(!partial && *buff != ' ' && *buff != '\t')
    198         {
    199           cur_hdr = NULL;
    200 
    201           for(i = 0; hdr[i].tag; i++)
    202             {
    203               if(!strncasecmp(buff, hdr[i].tag, hdr[i].taglen))
    204                 {
    205                   cur_hdr = &hdr[i];
    206                   break;
    207                 }
    208             }
    209 
    210           if(cur_hdr)
    211             {
    212               safe_free(&cur_hdr->value);
    213               cur_hdr->value = safe_strdup(buff + cur_hdr->taglen);
    214               cur_hdr->len = strlen(cur_hdr->value);
    215               chop(cur_hdr);
    216             }
    217         }
    218 
    219       if(!(t = strchr(buff, '\n')))
    220         partial = 1;
    221       else
    222         partial = 0;
    223     }
    224 
    225   for(rv = 0, i = 0; hdr[i].tag; i++)
    226     {
    227       if(hdr[i].value)
    228         rv = writeout(&hdr[i], datefmt, create_real_name) || rv;
    229     }
    230 
    231   return (rv ? 0 : 1);
    232 
    233 }