PageRenderTime 54ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/fetchaddr.c

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