00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef _MM_H_INCLUDED
00036 #define _MM_H_INCLUDED
00037
00038 #include <sys/types.h>
00039 #include <assert.h>
00040 #include "mm_queue.h"
00041 #include "mm_mem.h"
00042
00043 #define MM_MIME_LINELEN 998
00044 #define MM_BASE64_LINELEN 76
00045
00046 TAILQ_HEAD(mm_mimeheaders, mm_mimeheader);
00047 TAILQ_HEAD(mm_mimeparts, mm_mimepart);
00048 TAILQ_HEAD(mm_params, mm_param);
00049 SLIST_HEAD(mm_codecs, mm_codec);
00050 SLIST_HEAD(mm_warnings, mm_warning);
00051
00052
00053
00054
00055 enum mm_parsemodes
00056 {
00058 MM_PARSE_LOOSE = 0,
00060 MM_PARSE_STRICT
00061 };
00062
00063
00064
00065
00066 enum mm_parseflags
00067 {
00068 MM_PARSE_NONE = (1L << 0),
00069 MM_PARSE_STRIPCOMMENTS = (1L << 1)
00070 };
00071
00072
00073
00074
00075 enum mm_encoding
00076 {
00077 MM_ENCODING_NONE = 0,
00078 MM_ENCODING_BASE64,
00079 MM_ENCODING_QUOTEDPRINTABLE,
00080 MM_ENCODING_UNKNOWN
00081 };
00082
00083
00084
00085
00086 enum mm_messagetype
00087 {
00089 MM_MSGTYPE_FLAT = 0,
00091 MM_MSGTYPE_MULTIPART
00092 };
00093
00094
00095
00096
00097 enum mm_errors
00098 {
00099 MM_ERROR_NONE = 0,
00100 MM_ERROR_UNDEF,
00101 MM_ERROR_ERRNO,
00102 MM_ERROR_PARSE,
00103 MM_ERROR_MIME,
00104 MM_ERROR_CODEC,
00105 MM_ERROR_PROGRAM
00106 };
00107
00108 enum mm_warning_ids
00109 {
00110 MM_WARN_NONE = 0,
00111 MM_WARN_PARSE,
00112 MM_WARN_MIME,
00113 MM_WARN_CODEC
00114 };
00115
00116 enum mm_addressfields {
00117 MM_ADDR_TO = 0,
00118 MM_ADDR_CC,
00119 MM_ADDR_BCC,
00120 MM_ADDR_FROM,
00121 MM_ADDR_SENDER,
00122 MM_ADDR_REPLY_TO
00123 };
00124
00125 enum mm_flatten_flags {
00126 MM_FLATTEN_NONE = 0,
00127 MM_FLATTEN_SKIPENVELOPE = (1L << 1),
00128 MM_FLATTEN_OPAQUE = (1L << 2),
00129 MM_FLATTEN_NOPREAMBLE = (1L << 3)
00130 };
00131
00132
00133
00134
00135 struct mm_error_data
00136 {
00137 int error_id;
00138 int error_where;
00139 int lineno;
00140 char error_msg[128];
00141 };
00142
00143 extern int mm_errno;
00144 extern struct mm_error_data mm_error;
00145
00146 enum mm_warning_code
00147 {
00148 MM_WARNING_NONE = 0,
00149 MM_WARNING_INVHDR,
00150 };
00151
00152
00153
00154
00155 struct mm_warning
00156 {
00157 enum mm_warning_code warning;
00158 u_int32_t lineno;
00159 SLIST_ENTRY(mm_warning) next;
00160 };
00161
00162
00163
00164
00165 struct mm_codec
00166 {
00167 enum mm_encoding id;
00168 char *encoding;
00169
00170 char *(*encoder)(char *, u_int32_t);
00171 char *(*decoder)(char *);
00172
00173 SLIST_ENTRY(mm_codec) next;
00174 };
00175
00176
00177
00178
00179 struct mm_mimeheader
00180 {
00181 char *name;
00182 char *value;
00183
00184 TAILQ_ENTRY(mm_mimeheader) next;
00185 };
00186
00187
00188
00189
00190 struct mm_param
00191 {
00192 char *name;
00193 char *value;
00194
00195 TAILQ_ENTRY(mm_param) next;
00196 };
00197
00198
00199
00200
00201 struct mm_content
00202 {
00203 char *maintype;
00204 char *subtype;
00205
00206 struct mm_params params;
00207
00208 char *encstring;
00209 enum mm_encoding encoding;
00210 };
00211
00212
00213
00214
00215 struct mm_mimepart
00216 {
00217 struct mm_mimeheaders headers;
00218
00219 size_t opaque_length;
00220 char *opaque_body;
00221
00222 size_t length;
00223 char *body;
00224
00225 struct mm_content *type;
00226
00227 char *disposition_type;
00228 char *filename;
00229 char *creation_date;
00230 char *modification_date;
00231 char *read_date;
00232 char *disposition_size;
00233
00234 TAILQ_ENTRY(mm_mimepart) next;
00235 };
00236
00237
00238
00239
00240 struct mm_context
00241 {
00242 struct mm_mimeparts parts;
00243 enum mm_messagetype messagetype;
00244 struct mm_warnings warnings;
00245 struct mm_codecs codecs;
00246 char *boundary;
00247 char *preamble;
00248 size_t max_message_size;
00249 };
00250
00251 typedef struct mm_context MM_CTX;
00252 typedef struct mm_context mm_ctx_t;
00253
00254 char *mm_unquote(const char *);
00255 char *mm_uncomment(const char *);
00256 char *mm_stripchars(char *, char *);
00257 char *mm_addchars(char *, char *, u_int16_t);
00258 int mm_gendate(char **);
00259 void mm_striptrailing(char **, const char *);
00260 int mm_mimeutil_genboundary(char *, size_t, char **);
00261
00262 int mm_library_init(void);
00263 int mm_library_isinitialized(void);
00264
00265 int mm_parse_mem(MM_CTX *, const char *, int, int);
00266 int mm_parse_file(MM_CTX *, const char *, int, int);
00267
00268 MM_CTX *mm_context_new(void);
00269 void mm_context_free(MM_CTX *);
00270 int mm_context_attachpart(MM_CTX *, struct mm_mimepart *);
00271 int mm_context_deletepart(MM_CTX *, int, int);
00272 int mm_context_countparts(MM_CTX *);
00273 struct mm_mimepart *mm_context_getpart(MM_CTX *, int);
00274 int mm_context_iscomposite(MM_CTX *);
00275 int mm_context_haswarnings(MM_CTX *);
00276 int mm_context_flatten(MM_CTX *, char **, size_t *, int);
00277
00278 int mm_envelope_getheaders(MM_CTX *, char **, size_t *);
00279 int mm_envelope_setheader(MM_CTX *, const char *, const char *, ...);
00280
00281 struct mm_mimeheader *mm_mimeheader_new(void);
00282 void mm_mimeheader_free(struct mm_mimeheader *);
00283 struct mm_mimeheader *mm_mimeheader_generate(const char *, const char *);
00284 int mm_mimeheader_uncomment(struct mm_mimeheader *);
00285 int mm_mimeheader_uncommentbyname(struct mm_mimepart *, const char *);
00286 int mm_mimeheader_uncommentall(struct mm_mimepart *);
00287 int mm_mimeheader_tostring(struct mm_mimeheader *);
00288
00289 struct mm_mimepart *mm_mimepart_new(void);
00290 void mm_mimepart_free(struct mm_mimepart *);
00291 int mm_mimepart_attachheader(struct mm_mimepart *, struct mm_mimeheader *);
00292 int mm_mimepart_countheaders(struct mm_mimepart *part);
00293 int mm_mimepart_countheaderbyname(struct mm_mimepart *, const char *);
00294 struct mm_mimeheader *mm_mimepart_getheaderbyname(struct mm_mimepart *, const char *, int);
00295 const char *mm_mimepart_getheadervalue(struct mm_mimepart *, const char *, int);
00296 int mm_mimepart_headers_start(struct mm_mimepart *, struct mm_mimeheader **);
00297 struct mm_mimeheader *mm_mimepart_headers_next(struct mm_mimepart *, struct mm_mimeheader **);
00298 char *mm_mimepart_decode(struct mm_mimepart *);
00299 struct mm_content *mm_mimepart_gettype(struct mm_mimepart *);
00300 size_t mm_mimepart_getlength(struct mm_mimepart *);
00301 char *mm_mimepart_getbody(struct mm_mimepart *, int);
00302 void mm_mimepart_attachcontenttype(struct mm_mimepart *, struct mm_content *);
00303 int mm_mimepart_setdefaultcontenttype(struct mm_mimepart *, int);
00304 int mm_mimepart_flatten(struct mm_mimepart *, char **, size_t *, int);
00305 struct mm_mimepart *mm_mimepart_fromfile(const char *);
00306
00307 struct mm_content *mm_content_new(void);
00308 void mm_content_free(struct mm_content *);
00309 int mm_content_attachparam(struct mm_content *, struct mm_param *);
00310 struct mm_content *mm_content_parse(const char *, int);
00311 char *mm_content_getparambyname(struct mm_content *, const char *);
00312 struct mm_param *mm_content_getparamobjbyname(struct mm_content *, const char *);
00313 int mm_content_setmaintype(struct mm_content *, char *, int);
00314 int mm_content_setsubtype(struct mm_content *, char *, int);
00315 int mm_content_settype(struct mm_content *, const char *, ...);
00316 char *mm_content_getmaintype(struct mm_content *);
00317 char *mm_content_getsubtype(struct mm_content *);
00318 char *mm_content_gettype(struct mm_content *);
00319 int mm_content_iscomposite(struct mm_content *);
00320 int mm_content_isvalidencoding(const char *);
00321 int mm_content_setencoding(struct mm_content *, const char *);
00322 char *mm_content_paramstostring(struct mm_content *);
00323 char *mm_content_tostring(struct mm_content *);
00324
00325 struct mm_param *mm_param_new(void);
00326 void mm_param_free(struct mm_param *);
00327
00328 char *mm_flatten_mimepart(struct mm_mimepart *);
00329 char *mm_flatten_context(MM_CTX *);
00330
00331 int mm_codec_isregistered(const char *);
00332 int mm_codec_hasdecoder(const char *);
00333 int mm_codec_hasencoder(const char *);
00334 int mm_codec_register(const char *, char *(*encoder)(char *, u_int32_t), char *(*decoder)(char *));
00335 int mm_codec_unregister(const char *);
00336 int mm_codec_unregisterall(void);
00337 void mm_codec_registerdefaultcodecs(void);
00338
00339 char *mm_base64_decode(char *);
00340 char *mm_base64_encode(char *, u_int32_t);
00341
00342 void mm_error_init(void);
00343 void mm_error_setmsg(const char *, ...);
00344 void mm_error_setlineno(int lineno);
00345 char *mm_error_string(void);
00346 int mm_error_lineno(void);
00347
00348 void mm_warning_add(MM_CTX *, int, const char *, ...);
00349 struct mm_warning *mm_warning_next(MM_CTX *, struct mm_warning **);
00350
00351 #ifndef HAVE_STRLCPY
00352 size_t strlcpy(char *, const char *, size_t);
00353 #endif
00354 #ifndef HAVE_STRLCAT
00355 size_t strlcat(char *, const char *, size_t);
00356 #endif
00357
00358 #define MM_ISINIT() do { \
00359 assert(mm_library_isinitialized() == 1); \
00360 } while (0);
00361
00362 #endif