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  |