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 }