1 | /*************************************** 2 | $Revision: 1.6 $ 3 | 4 | mm - MIME Parser module. Functions to parse a mail message, 5 | find if it is MIME-encapsulated, and return the parts of 6 | the message which are supported by the UP module. 7 | 8 | Status: NOT COMPLETE, NOT REVUED, NOT TESTED 9 | 10 | Design and implementation by: Daniele Arena 11 | 12 | ******************/ /****************** 13 | Copyright (c) 2000 RIPE NCC 14 | 15 | All Rights Reserved 16 | 17 | Permission to use, copy, modify, and distribute this software and its 18 | documentation for any purpose and without fee is hereby granted, 19 | provided that the above copyright notice appear in all copies and that 20 | both that copyright notice and this permission notice appear in 21 | supporting documentation, and that the name of the author not be 22 | used in advertising or publicity pertaining to distribution of the 23 | software without specific, written prior permission. 24 | 25 | THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 26 | ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS; IN NO EVENT SHALL 27 | AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY 28 | DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 29 | AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 30 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 31 | ***************************************/ 32 | 33 | 34 | /* Included headers: */ 35 | 36 | /* These come from c-client */ 37 | #include "mail.h" 38 | #include "osdep.h" 39 | #include "misc.h" 40 | /*#include "rfc822.h"*/ 41 | /*#include "smtp.h"*/ 42 | /*#include "nntp.h"*/ 43 | 44 | 45 | /* Local #defines */ 46 | 47 | #define NO_DEBUG 0 48 | #define DO_DEBUG 1 49 | #define DEFAULT_DEBUG DO_DEBUG 50 | #define TEMPDIR "/tmp" 51 | #define FILENAMELEN 1024 52 | #define GLOBALPREFIX "mime" 53 | 54 | /* String sizes */ 55 | #define STR_S 63 56 | #define STR_M 255 57 | #define STR_L 1023 58 | #define STR_XL 4095 59 | #define STR_XXL 16383 60 | 61 | 62 | /* Structure definition */ 63 | 64 | typedef struct MM_body_section *sectptr; 65 | 66 | typedef struct MM_body_section { 67 | char *number; 68 | char *type; 69 | unsigned long size; 70 | char *mime_headers; 71 | char *contents; 72 | short supported; 73 | sectptr next; 74 | } MM_b_section; 75 | 76 | typedef struct MM_body_section_list { 77 | int size; 78 | MM_b_section *head; 79 | MM_b_section *tail; 80 | } MM_bs_list; 81 | 82 | 83 | typedef struct MM_extracted_mimepart *partptr; 84 | 85 | typedef struct MM_extracted_mimepart { 86 | char *number; 87 | char *type; 88 | char *file; 89 | short supported; 90 | partptr next; 91 | } MM_xmp; 92 | 93 | typedef struct MM_extracted_mimepart_list { 94 | int size; 95 | MM_xmp *head; 96 | MM_xmp *tail; 97 | } MM_xmp_list; 98 | 99 | 100 | typedef struct MM_mail_header { 101 | char *from; 102 | char *subject; 103 | char *date; 104 | char *message_id; 105 | char *reply_to; 106 | char *cc; 107 | } MM_header; 108 | 109 | 110 | #ifdef __cplusplus 111 | extern "C" { 112 | #endif 113 | 114 | 115 | /* Function definition */ 116 | 117 | /* API functions */ 118 | int MM_decode (char *mail_file, MM_header *mail_header, MM_xmp_list *part_list, long mesgno, long debug); 119 | void MM_store (char *destination_file, long debug); 120 | void MM_cleanup (MM_xmp_list *part_list, long debug); 121 | 122 | /* Internal support functions */ 123 | int mm (MAILSTREAM *stream, MM_header *hdr, MM_xmp_list *part_list, long mesgno, long debug); 124 | void get_body_info (BODY *body,char *pfx,long i, MM_bs_list *sect_list, long debug); 125 | void status (MAILSTREAM *stream); 126 | void MM_bs_list_init (MM_bs_list *section_list); 127 | void MM_bs_list_ins_last (MM_bs_list *section_list, MM_b_section *newsection); 128 | void MM_xmp_list_init (MM_xmp_list *part_list); 129 | void MM_xmp_list_ins_last (MM_xmp_list *part_list, MM_xmp *newpart); 130 | char *get_header_line (MAILSTREAM *stream, long mesgno, STRINGLIST *cur, char *hdr_title); 131 | void write_file (char *filename, char *text, size_t text_size); 132 | void read_file (char *filename); 133 | void put_in_file (char *fileprefix, char *extension, char *text, size_t text_size); 134 | static int perform_regex_test(const char *pattern, char *string); 135 | 136 | #ifdef __cplusplus 137 | } 138 | #endif 139 | 140 |