rfc2045tryboundary.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:2k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. #if HAVE_CONFIG_H
  6. #include "config.h"
  7. #endif
  8. #include "rfc2045.h"
  9. #if HAVE_UNISTD_H
  10. #include <unistd.h>
  11. #endif
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include       <string.h>
  15. #if    HAVE_STRINGS_H
  16. #include       <strings.h>
  17. #endif
  18. /* $Id: rfc2045tryboundary.c,v 1.6 1999/12/06 13:29:02 mrsam Exp $ */
  19. extern void rfc2045_add_buf( char **, size_t *, size_t *,
  20. const char *, size_t);
  21. static const char *boundary_chk_val;
  22. static size_t boundary_chk_val_len;
  23. static char *boundary_chk_buf;
  24. static size_t boundary_chk_bufsize, boundary_chk_buflen;
  25. static int boundary_chk_flag;
  26. static void boundary_chk_add(const char *p, size_t l)
  27. {
  28. if (boundary_chk_buflen < boundary_chk_val_len+20)
  29. rfc2045_add_buf( &boundary_chk_buf,
  30. &boundary_chk_bufsize,
  31. &boundary_chk_buflen, p, l);
  32. }
  33. static int boundary_chk(const char *p, size_t l, void *ptr)
  34. {
  35. static size_t i, j;
  36. for (j=i=0; i<l; i++)
  37. {
  38. if (p[i] == 'n')
  39. {
  40. boundary_chk_add(p+j, i-j);
  41. if (boundary_chk_buflen >= boundary_chk_val_len+2 &&
  42. boundary_chk_buf[0] == '-' &&
  43. boundary_chk_buf[1] == '-' &&
  44. strncasecmp(boundary_chk_val,
  45. boundary_chk_buf+2,
  46. boundary_chk_val_len) == 0)
  47. boundary_chk_flag=1;
  48. boundary_chk_buflen=0;
  49. j=i+1;
  50. }
  51. }
  52. boundary_chk_add(p+j, l-j);
  53. return (0);
  54. }
  55. static int try_boundary(struct rfc2045 *p, int fd)
  56. {
  57. int rc;
  58. char buf[512];
  59. int n, cnt;
  60. off_t ps;
  61. if (p->firstpart)
  62. {
  63. for (p=p->firstpart; p; p=p->next)
  64. if ((rc=try_boundary(p, fd)) != 0)
  65. return (rc);
  66. return (0);
  67. }
  68. if (p->content_transfer_encoding &&
  69. strcmp(p->content_transfer_encoding, "base64") == 0)
  70. return (0);
  71. boundary_chk_flag=0;
  72. boundary_chk_buflen=0;
  73. if (lseek(fd, p->startbody, SEEK_SET) == -1) return (-1);
  74. rfc2045_cdecode_start(p, boundary_chk, 0);
  75. ps=p->startbody;
  76. while (ps < p->endbody)
  77. {
  78. if (p->endbody - ps < sizeof(buf))
  79. cnt=p->endbody-ps;
  80. else cnt=sizeof(buf);
  81. n=read(fd, buf, cnt);
  82. if (n <= 0) return (-1);
  83. rfc2045_cdecode(p, buf, n);
  84. ps += n;
  85. if (boundary_chk_flag) break;
  86. }
  87. rfc2045_cdecode_end(p);
  88. if (boundary_chk_buflen)
  89. boundary_chk("n", 1, 0); /* Flush out partial line */
  90. return (boundary_chk_flag);
  91. }
  92. int rfc2045_try_boundary(struct rfc2045 *p, int fd, const char *boundary)
  93. {
  94. int n;
  95. boundary_chk_val_len=strlen(boundary_chk_val=boundary);
  96. boundary_chk_buf=0;
  97. boundary_chk_bufsize=0;
  98. n=try_boundary(p, fd);
  99. if (boundary_chk_buf) free(boundary_chk_buf);
  100. return (n);
  101. }