static int feed_prefetch(mailmessage * msg_info) { struct generic_message_t * msg; int r; MMAPString * str; const char * text; int col; struct newsfeed * feed; struct newsfeed_item * item; int res; feed = get_feed_session(msg_info); item = newsfeed_get_item(feed, msg_info->msg_index); str = mmap_string_new(""); if (str == NULL) { res = MAIL_ERROR_MEMORY; goto err; } col = 0; r = mailimf_fields_write_mem(str, &col, msg_info->msg_fields); if (r != MAILIMF_NO_ERROR) { res = MAIL_ERROR_MEMORY; goto free_str; } if (mmap_string_append(str, "\r\n") == NULL) { res = MAIL_ERROR_MEMORY; goto free_str; } text = newsfeed_item_get_text(item); if (text == NULL) { /* if no content, fallback on summary */ text = newsfeed_item_get_summary(item); } if (mmap_string_append(str, text) == NULL) { res = MAIL_ERROR_MEMORY; goto free_str; } msg = msg_info->msg_data; msg->msg_message = str->str; msg->msg_length = str->len; mmap_string_ref(str); return MAIL_NO_ERROR; free_str: mmap_string_free(str); err: return res; }
static void display_sub_tree(MMAPString * prefix, struct mailmessage_tree * msg_tree, int level, int has_next, unsigned int * pcount) { carray * list; uint32_t cur; if (msg_tree->node_msg != NULL) { print_mail_info(prefix->str, msg_tree->node_msg); (* pcount) ++; } list = msg_tree->node_children; if (carray_count(list) != 0) { char old_prefix[2]; if (level > 1) { memcpy(old_prefix, prefix->str + prefix->len - 2, 2); if (has_next) memcpy(prefix->str + prefix->len - 2, "| ", 2); else memcpy(prefix->str + prefix->len - 2, " ", 2); } for(cur = 0 ; cur < carray_count(list) ; cur ++) { int sub_has_next; if (cur != carray_count(list) - 1) { if (level > 0) { if (mmap_string_append(prefix, "+-") == NULL) return; } sub_has_next = 1; } else { if (level > 0) { if (mmap_string_append(prefix, "\\-") == NULL) return; } sub_has_next = 0; } display_sub_tree(prefix, carray_get(list, cur), level + 1, sub_has_next, pcount); if (mmap_string_truncate(prefix, prefix->len - 2) == NULL) { return; } } if (level > 1) { memcpy(prefix->str + prefix->len - 2, old_prefix, 2); } } }
char * mailstream_read_multiline(mailstream * s, size_t size, MMAPString * stream_buffer, MMAPString * multiline_buffer, size_t progr_rate, progress_function * progr_fun, mailprogress_function * body_progr_fun, void * context) { size_t count; char * line; size_t last; if (mmap_string_assign(multiline_buffer, "") == NULL) return NULL; count = 0; last = 0; while ((line = mailstream_read_line_remove_eol(s, stream_buffer)) != NULL) { if (mailstream_is_end_multiline(line)) return multiline_buffer->str; if (line[0] == '.') { if (mmap_string_append(multiline_buffer, line + 1) == NULL) return NULL; } else { if (mmap_string_append(multiline_buffer, line) == NULL) return NULL; } if (mmap_string_append(multiline_buffer, "\r\n") == NULL) return NULL; count += strlen(line); if ((size != 0) && (progr_rate != 0) && (progr_fun != NULL)) if (count - last >= progr_rate) { if (progr_fun != NULL) { (* progr_fun)(count, size); } if (body_progr_fun != NULL) { body_progr_fun(count, size, context); } last = count; } } return NULL; }
MMAPString* mmap_string_assign (MMAPString *string, const char *rval) { mmap_string_truncate (string, 0); if (mmap_string_append (string, rval) == NULL) return NULL; return string; }
static int parse_response(mailsmtp * session, char * response) { char * message; int code; int cont = 0; code = strtol(response, &message, 10); if (* message == ' ') mmap_string_append(session->response_buffer, message + 1); else if (* message == '-') { cont = SMTP_STATUS_CONTINUE; mmap_string_append(session->response_buffer, message + 1); } else mmap_string_append(session->response_buffer, message); return code | cont; }
MMAPString* mmap_string_new (const char *init) { MMAPString *string; string = mmap_string_sized_new (init ? strlen (init) + 2 : 2); if (string == NULL) return NULL; if (init) mmap_string_append (string, init); return string; }
static void generate_key_from_mime_section(char * key, size_t size, struct mailmime * mime) { clistiter * cur; MMAPString * gstr; struct mailmime_section * part; int r; snprintf(key, size, "unvalid"); r = mailmime_get_section_id(mime, &part); if (r != MAILIMF_NO_ERROR) goto err; gstr = mmap_string_new("part"); if (gstr == NULL) goto free_section; for(cur = clist_begin(part->sec_list) ; cur != NULL ; cur = clist_next(cur)) { char s[20]; snprintf(s, 20, ".%u", * (uint32_t *) clist_content(cur)); if (mmap_string_append(gstr, s) == NULL) goto free_str; } snprintf(key, size, "%s", gstr->str); mmap_string_free(gstr); mailmime_section_free(part); return; free_str: mmap_string_free(gstr); free_section: mailmime_section_free(part); err:; }
char * maildriver_quote_mailbox(const char * mb) { MMAPString * gstr; char * str; gstr = mmap_string_new(""); if (gstr == NULL) return NULL; while (* mb != 0) { char hex[3]; if (((* mb >= 'a') && (* mb <= 'z')) || ((* mb >= 'A') && (* mb <= 'Z')) || ((* mb >= '0') && (* mb <= '9'))) mmap_string_append_c(gstr, * mb); else { if (mmap_string_append_c(gstr, '%') == NULL) goto free; snprintf(hex, 3, "%02x", (unsigned char) (* mb)); if (mmap_string_append(gstr, hex) == NULL) goto free; } mb ++; } str = strdup(gstr->str); if (str == NULL) goto free; mmap_string_free(gstr); return str; free: mmap_string_free(gstr); return NULL; }
LIBETPAN_EXPORT int mailmime_encoded_phrase_parse(const char * default_fromcode, const char * message, size_t length, size_t * indx, const char * tocode, char ** result) { MMAPString * gphrase; struct mailmime_encoded_word * word; int first; size_t cur_token; int r; int res; char * str; char * wordutf8; int type; cur_token = * indx; gphrase = mmap_string_new(""); if (gphrase == NULL) { res = MAILIMF_ERROR_MEMORY; goto err; } first = TRUE; type = TYPE_ERROR; /* XXX - removes a gcc warning */ while (1) { int has_fwd = 0; word = NULL; r = mailmime_encoded_word_parse(message, length, &cur_token, &word, &has_fwd); if (r == MAILIMF_NO_ERROR) { if ((!first) && has_fwd) { if (type != TYPE_ENCODED_WORD) { if (mmap_string_append_c(gphrase, ' ') == NULL) { mailmime_encoded_word_free(word); res = MAILIMF_ERROR_MEMORY; goto free; } } } type = TYPE_ENCODED_WORD; wordutf8 = NULL; r = charconv(tocode, word->wd_charset, word->wd_text, strlen(word->wd_text), &wordutf8); switch (r) { case MAIL_CHARCONV_ERROR_MEMORY: mailmime_encoded_word_free(word); res = MAILIMF_ERROR_MEMORY; goto free; case MAIL_CHARCONV_ERROR_UNKNOWN_CHARSET: r = charconv(tocode, "iso-8859-1", word->wd_text, strlen(word->wd_text), &wordutf8); break; case MAIL_CHARCONV_ERROR_CONV: mailmime_encoded_word_free(word); res = MAILIMF_ERROR_PARSE; goto free; } switch (r) { case MAIL_CHARCONV_ERROR_MEMORY: mailmime_encoded_word_free(word); res = MAILIMF_ERROR_MEMORY; goto free; case MAIL_CHARCONV_ERROR_CONV: mailmime_encoded_word_free(word); res = MAILIMF_ERROR_PARSE; goto free; } if (wordutf8 != NULL) { if (mmap_string_append(gphrase, wordutf8) == NULL) { mailmime_encoded_word_free(word); free(wordutf8); res = MAILIMF_ERROR_MEMORY; goto free; } free(wordutf8); } mailmime_encoded_word_free(word); first = FALSE; } else if (r == MAILIMF_ERROR_PARSE) { /* do nothing */ } else { res = r; goto free; } if (r == MAILIMF_ERROR_PARSE) { char * raw_word; raw_word = NULL; r = mailmime_non_encoded_word_parse(message, length, &cur_token, &raw_word, &has_fwd); if (r == MAILIMF_NO_ERROR) { if ((!first) && has_fwd) { if (mmap_string_append_c(gphrase, ' ') == NULL) { free(raw_word); res = MAILIMF_ERROR_MEMORY; goto free; } } type = TYPE_WORD; wordutf8 = NULL; r = charconv(tocode, default_fromcode, raw_word, strlen(raw_word), &wordutf8); switch (r) { case MAIL_CHARCONV_ERROR_MEMORY: free(raw_word); res = MAILIMF_ERROR_MEMORY; goto free; case MAIL_CHARCONV_ERROR_UNKNOWN_CHARSET: case MAIL_CHARCONV_ERROR_CONV: free(raw_word); res = MAILIMF_ERROR_PARSE; goto free; } if (mmap_string_append(gphrase, wordutf8) == NULL) { free(wordutf8); free(raw_word); res = MAILIMF_ERROR_MEMORY; goto free; } free(wordutf8); free(raw_word); first = FALSE; } else if (r == MAILIMF_ERROR_PARSE) { r = mailimf_fws_parse(message, length, &cur_token); if (r != MAILIMF_NO_ERROR) { break; } if (mmap_string_append_c(gphrase, ' ') == NULL) { res = MAILIMF_ERROR_MEMORY; goto free; } first = FALSE; break; } else { res = r; goto free; } } } if (first) { if (cur_token != length) { res = MAILIMF_ERROR_PARSE; goto free; } } str = strdup(gphrase->str); if (str == NULL) { res = MAILIMF_ERROR_MEMORY; goto free; } mmap_string_free(gphrase); * result = str; * indx = cur_token; return MAILIMF_NO_ERROR; free: mmap_string_free(gphrase); err: return res; }
static inline int quote_word(const char * display_charset, MMAPString * mmapstr, const char * word, size_t size) { const char * cur; size_t i; char hex[4]; int col; if (mmap_string_append(mmapstr, "=?") == NULL) return -1; if (mmap_string_append(mmapstr, display_charset) == NULL) return -1; if (mmap_string_append(mmapstr, "?Q?") == NULL) return -1; col = mmapstr->len; cur = word; for(i = 0 ; i < size ; i ++) { int do_quote_char; if (col + 2 /* size of "?=" */ + 3 /* max size of newly added character */ + 1 /* minimum column of string in a folded header */ >= MAX_IMF_LINE) { int old_pos; /* adds a concatened encoded word */ if (mmap_string_append(mmapstr, "?=") == NULL) return -1; if (mmap_string_append(mmapstr, " ") == NULL) return -1; old_pos = mmapstr->len; if (mmap_string_append(mmapstr, "=?") == NULL) return -1; if (mmap_string_append(mmapstr, display_charset) == NULL) return -1; if (mmap_string_append(mmapstr, "?Q?") == NULL) return -1; col = mmapstr->len - old_pos; } do_quote_char = 0; switch (* cur) { case ',': case ':': case '!': case '"': case '#': case '$': case '@': case '[': case '\\': case ']': case '^': case '`': case '{': case '|': case '}': case '~': case '=': case '?': case '_': do_quote_char = 1; break; default: if (((unsigned char) * cur) >= 128) do_quote_char = 1; break; } if (do_quote_char) { snprintf(hex, 4, "=%2.2X", (unsigned char) * cur); if (mmap_string_append(mmapstr, hex) == NULL) return -1; col += 3; } else { if (* cur == ' ') { if (mmap_string_append_c(mmapstr, '_') == NULL) return -1; } else { if (mmap_string_append_c(mmapstr, * cur) == NULL) return -1; } col += 3; } cur ++; } if (mmap_string_append(mmapstr, "?=") == NULL) return -1; return 0; }