for (cur = mlist; cur != NULL; cur = cur->next) {
msginfo = (MsgInfo *)cur->data;
- procmsg_msginfo_free(msginfo);
+ procmsg_msginfo_free(&msginfo);
}
g_slist_free(mlist);
}
gchar *procmsg_get_message_file_path(MsgInfo *msginfo)
{
- gchar *file;
-
cm_return_val_if_fail(msginfo != NULL, NULL);
- if (msginfo->plaintext_file)
- file = g_strdup(msginfo->plaintext_file);
- else {
- file = folder_item_fetch_msg(msginfo->folder, msginfo->msgnum);
- }
-
- return file;
+ return folder_item_fetch_msg(msginfo->folder, msginfo->msgnum);
}
gchar *procmsg_get_message_file(MsgInfo *msginfo)
for (cur = file_list; cur != NULL; cur = cur->next) {
fileinfo = (MsgFileInfo *)cur->data;
- procmsg_msginfo_free(fileinfo->msginfo);
+ procmsg_msginfo_free(&(fileinfo->msginfo));
g_free(fileinfo->file);
g_free(fileinfo->flags);
g_free(fileinfo);
if (!msginfo) return FALSE;
path = folder_item_get_path(msginfo->folder);
- change_dir(path);
ret = !folder_item_is_msg_changed(msginfo->folder, msginfo);
g_free(path);
for (cur = mlist ; cur != NULL ; cur = cur->next) {
MsgInfo * msginfo = (MsgInfo *) cur->data;
if (MSG_IS_LOCKED(msginfo->flags)) {
- procmsg_msginfo_free(msginfo);
+ procmsg_msginfo_free(&msginfo);
continue;
}
if (msginfo->total_size != 0 &&
msginfo->size != (off_t)msginfo->total_size)
partial_mark_for_delete(msginfo);
- procmsg_msginfo_free(msginfo);
+ procmsg_msginfo_free(&msginfo);
}
g_slist_free(mlist);
folder_item_remove_all_msg(trash);
cur = cur->next;
}
- if (orig || g_slist_length(orig)) {
+ if (orig && g_slist_length(orig)) {
if (!last_account && nothing_to_sort) {
/* can't find an account for the rest of the list */
cur = orig;
if (procmsg_send_message_queue_full(file,
!procmsg_is_last_for_account(queue, msginfo, elem),
errstr, queue, msginfo->msgnum, &queued_removed) < 0) {
- g_warning("Sending queued message %d failed.\n",
+ g_warning("Sending queued message %d failed.",
msginfo->msgnum);
err++;
} else {
/* FIXME: supposedly if only one message is locked, and queue
* is being flushed, the following free says something like
* "freeing msg ## in folder (nil)". */
- procmsg_msginfo_free(msginfo);
+ procmsg_msginfo_free(&msginfo);
}
g_slist_free(sorted_list);
break;
}
}
- while (fgets(buf, sizeof(buf), fp) != NULL)
- fputs(buf, outfp);
+ while (fgets(buf, sizeof(buf), fp) != NULL) {
+ if (fputs(buf, outfp) == EOF) {
+ FILE_OP_ERROR(out, "fputs");
+ fclose(outfp);
+ fclose(fp);
+ return -1;
+ }
+ }
fclose(outfp);
fclose(fp);
return 0;
}
-static gint procmsg_save_to_outbox(FolderItem *outbox, const gchar *file,
+gint procmsg_save_to_outbox(FolderItem *outbox, const gchar *file,
gboolean is_queued)
{
gint num;
folder_item_scan(outbox);
if ((num = folder_item_add_msg(outbox, tmp, &flag, TRUE)) < 0) {
- g_warning("can't save message\n");
+ g_warning("can't save message");
claws_unlink(tmp);
return -1;
}
folder_item_scan(outbox);
if ((num = folder_item_add_msg
(outbox, file, &flag, FALSE)) < 0) {
- g_warning("can't save message\n");
+ g_warning("can't save message");
return -1;
}
}
tmp_msginfo = procmsg_msginfo_get_full_info(msginfo); /* refcnt++ */
if (msginfo != NULL) {
procmsg_msginfo_unset_flags(msginfo, ~0, 0);
- procmsg_msginfo_free(msginfo); /* refcnt-- */
+ procmsg_msginfo_free(&msginfo); /* refcnt-- */
/* tmp_msginfo == msginfo */
if (tmp_msginfo && msginfo->extradata &&
(msginfo->extradata->dispositionnotificationto ||
msginfo->extradata->returnreceiptto)) {
procmsg_msginfo_set_flags(msginfo, MSG_RETRCPT_SENT, 0);
}
- procmsg_msginfo_free(tmp_msginfo); /* refcnt-- */
+ procmsg_msginfo_free(&tmp_msginfo); /* refcnt-- */
}
return 0;
}
-void procmsg_print_message(MsgInfo *msginfo, const gchar *cmdline)
-{
- static const gchar *def_cmd = "lpr %s";
- static guint id = 0;
- gchar *prtmp;
- FILE *tmpfp, *prfp;
- gchar buf[1024];
- gchar *p;
- int r;
-
- cm_return_if_fail(msginfo);
-
- if (procmime_msginfo_is_encrypted(msginfo))
- tmpfp = procmime_get_first_encrypted_text_content(msginfo);
- else
- tmpfp = procmime_get_first_text_content(msginfo);
- if (tmpfp == NULL) {
- g_warning("Can't get text part\n");
- return;
- }
-
- prtmp = g_strdup_printf("%s%cprinttmp.%08x",
- get_mime_tmp_dir(), G_DIR_SEPARATOR, id++);
-
- if ((prfp = g_fopen(prtmp, "wb")) == NULL) {
- FILE_OP_ERROR(prtmp, "fopen");
- g_free(prtmp);
- fclose(tmpfp);
- return;
- }
-
- if (msginfo->date) { r = fprintf(prfp, "Date: %s\n", msginfo->date); if (r < 0) goto fpferr; }
- if (msginfo->from) { r = fprintf(prfp, "From: %s\n", msginfo->from); if (r < 0) goto fpferr; }
- if (msginfo->to) { r = fprintf(prfp, "To: %s\n", msginfo->to); if (r < 0) goto fpferr; }
- if (msginfo->cc) { r = fprintf(prfp, "Cc: %s\n", msginfo->cc); if (r < 0) goto fpferr; }
- if (msginfo->newsgroups) {
- r = fprintf(prfp, "Newsgroups: %s\n", msginfo->newsgroups); if (r < 0) goto fpferr;
- }
- if (msginfo->subject) { r = fprintf(prfp, "Subject: %s\n", msginfo->subject); if (r < 0) goto fpferr; }
- if (fputc('\n', prfp) == EOF) goto fpferr;
-
- while (fgets(buf, sizeof(buf), tmpfp) != NULL) {
- r = fputs(buf, prfp);
- if (r == EOF) goto fpferr;
- }
-
- fclose(prfp);
- fclose(tmpfp);
-
- if (cmdline && (p = strchr(cmdline, '%')) && *(p + 1) == 's' &&
- !strchr(p + 2, '%'))
- g_snprintf(buf, sizeof(buf) - 1, cmdline, prtmp);
- else {
- if (cmdline)
- g_warning("Print command-line is invalid: '%s'\n",
- cmdline);
- g_snprintf(buf, sizeof(buf) - 1, def_cmd, prtmp);
- }
-
- g_free(prtmp);
-
- g_strchomp(buf);
- if (buf[strlen(buf) - 1] != '&')
- strncat(buf, "&", sizeof(buf) - strlen(buf) - 1);
- if (system(buf) == -1)
- g_warning("system(%s) failed.", buf);
- return;
-fpferr:
- FILE_OP_ERROR(prtmp, "fprintf/fputc/fputs");
- g_free(prtmp);
- fclose(tmpfp);
- fclose(prfp);
-}
-
MsgInfo *procmsg_msginfo_new_ref(MsgInfo *msginfo)
{
msginfo->refcnt++;
MEMBDUP(extradata->list_help);
MEMBDUP(extradata->list_archive);
MEMBDUP(extradata->list_owner);
+ MEMBDUP(extradata->resent_from);
}
refs = msginfo->references;
if (msginfo == NULL) return NULL;
if (!file || !is_file_exist(file)) {
- g_warning("procmsg_msginfo_get_full_info_from_file(): can't get message file.\n");
+ g_warning("procmsg_msginfo_get_full_info_from_file(): can't get message file.");
return NULL;
}
if (!msginfo->extradata->account_login && full_msginfo->extradata->account_login)
msginfo->extradata->account_login = g_strdup
(full_msginfo->extradata->account_login);
+ if (!msginfo->extradata->resent_from && full_msginfo->extradata->resent_from)
+ msginfo->extradata->resent_from = g_strdup
+ (full_msginfo->extradata->resent_from);
}
- procmsg_msginfo_free(full_msginfo);
+ procmsg_msginfo_free(&full_msginfo);
return procmsg_msginfo_new_ref(msginfo);
}
file = procmsg_get_message_file(msginfo);
}
if (!file || !is_file_exist(file)) {
- g_warning("procmsg_msginfo_get_full_info(): can't get message file.\n");
+ g_warning("procmsg_msginfo_get_full_info(): can't get message file.");
return NULL;
}
return full_msginfo;
}
-void procmsg_msginfo_free(MsgInfo *msginfo)
+#define FREENULL(n) { g_free(n); n = NULL; }
+void procmsg_msginfo_free(MsgInfo **msginfo_ptr)
{
+ MsgInfo *msginfo = *msginfo_ptr;
+
if (msginfo == NULL) return;
msginfo->refcnt--;
folder_item_update(msginfo->to_folder, F_ITEM_UPDATE_MSGCNT);
}
- g_free(msginfo->fromspace);
+ FREENULL(msginfo->fromspace);
- g_free(msginfo->fromname);
+ FREENULL(msginfo->fromname);
- g_free(msginfo->date);
- g_free(msginfo->from);
- g_free(msginfo->to);
- g_free(msginfo->cc);
- g_free(msginfo->newsgroups);
- g_free(msginfo->subject);
- g_free(msginfo->msgid);
- g_free(msginfo->inreplyto);
- g_free(msginfo->xref);
+ FREENULL(msginfo->date);
+ FREENULL(msginfo->from);
+ FREENULL(msginfo->to);
+ FREENULL(msginfo->cc);
+ FREENULL(msginfo->newsgroups);
+ FREENULL(msginfo->subject);
+ FREENULL(msginfo->msgid);
+ FREENULL(msginfo->inreplyto);
+ FREENULL(msginfo->xref);
if (msginfo->extradata) {
if (msginfo->extradata->avatars) {
(GFunc)procmsg_msginfoavatar_free,
NULL);
g_slist_free(msginfo->extradata->avatars);
+ msginfo->extradata->avatars = NULL;
}
- g_free(msginfo->extradata->returnreceiptto);
- g_free(msginfo->extradata->dispositionnotificationto);
- g_free(msginfo->extradata->list_post);
- g_free(msginfo->extradata->list_subscribe);
- g_free(msginfo->extradata->list_unsubscribe);
- g_free(msginfo->extradata->list_help);
- g_free(msginfo->extradata->list_archive);
- g_free(msginfo->extradata->list_owner);
- g_free(msginfo->extradata->partial_recv);
- g_free(msginfo->extradata->account_server);
- g_free(msginfo->extradata->account_login);
- g_free(msginfo->extradata);
+ FREENULL(msginfo->extradata->returnreceiptto);
+ FREENULL(msginfo->extradata->dispositionnotificationto);
+ FREENULL(msginfo->extradata->list_post);
+ FREENULL(msginfo->extradata->list_subscribe);
+ FREENULL(msginfo->extradata->list_unsubscribe);
+ FREENULL(msginfo->extradata->list_help);
+ FREENULL(msginfo->extradata->list_archive);
+ FREENULL(msginfo->extradata->list_owner);
+ FREENULL(msginfo->extradata->partial_recv);
+ FREENULL(msginfo->extradata->account_server);
+ FREENULL(msginfo->extradata->account_login);
+ FREENULL(msginfo->extradata->resent_from);
+ FREENULL(msginfo->extradata);
}
slist_free_strings_full(msginfo->references);
+ msginfo->references = NULL;
g_slist_free(msginfo->tags);
+ msginfo->tags = NULL;
- g_free(msginfo->plaintext_file);
+ FREENULL(msginfo->plaintext_file);
- g_free(msginfo);
+ FREENULL(msginfo);
}
+#undef FREENULL
guint procmsg_msginfo_memusage(MsgInfo *msginfo)
{
memusage += strlen(msginfo->extradata->account_server);
if (msginfo->extradata->account_login)
memusage += strlen(msginfo->extradata->account_login);
+ if (msginfo->extradata->resent_from)
+ memusage += strlen(msginfo->extradata->resent_from);
if (msginfo->extradata->list_post)
memusage += strlen(msginfo->extradata->list_post);
static gint procmsg_send_message_queue_full(const gchar *file, gboolean keep_session, gchar **errstr,
FolderItem *queue, gint msgnum, gboolean *queued_removed)
{
- static HeaderEntry qentry[] = {{"S:", NULL, FALSE},
+ static HeaderEntry qentry[] = {
+ {"S:", NULL, FALSE}, /* 0 */
{"SSV:", NULL, FALSE},
{"R:", NULL, FALSE},
{"NG:", NULL, FALSE},
{"MAID:", NULL, FALSE},
- {"NAID:", NULL, FALSE},
+ {"NAID:", NULL, FALSE}, /* 5 */
{"SCF:", NULL, FALSE},
{"RMID:", NULL, FALSE},
{"FMID:", NULL, FALSE},
{"X-Claws-Privacy-System:", NULL, FALSE},
- {"X-Claws-Encrypt:", NULL, FALSE},
+ {"X-Claws-Encrypt:", NULL, FALSE}, /* 10 */
{"X-Claws-Encrypt-Data:", NULL, FALSE},
{"X-Claws-End-Special-Headers:", NULL, FALSE},
{"X-Sylpheed-Privacy-System:", NULL, FALSE},
{"X-Sylpheed-Encrypt:", NULL, FALSE},
- {"X-Sylpheed-Encrypt-Data:", NULL, FALSE},
+ {"X-Sylpheed-Encrypt-Data:", NULL, FALSE}, /* 15 */
{"X-Sylpheed-End-Special-Headers:", NULL, FALSE},
{NULL, NULL, FALSE}};
FILE *fp;
gchar *savecopyfolder = NULL;
gchar *replymessageid = NULL;
gchar *fwdmessageid = NULL;
- gchar *privacy_system = NULL;
- gboolean encrypt = FALSE;
- gchar *encrypt_data = NULL;
gchar buf[BUFFSIZE];
gint hnum;
PrefsAccount *mailac = NULL, *newsac = NULL;
- gboolean save_clear_text = TRUE;
- gchar *tmp_enc_file = NULL;
+ gboolean encrypt = FALSE;
+ FolderItem *outbox;
cm_return_val_if_fail(file != NULL, -1);
if (fwdmessageid == NULL)
fwdmessageid = g_strdup(p);
break;
- case Q_PRIVACY_SYSTEM:
- case Q_PRIVACY_SYSTEM_OLD:
- if (privacy_system == NULL)
- privacy_system = g_strdup(p);
- break;
case Q_ENCRYPT:
case Q_ENCRYPT_OLD:
if (p[0] == '1')
encrypt = TRUE;
break;
- case Q_ENCRYPT_DATA:
- case Q_ENCRYPT_DATA_OLD:
- if (encrypt_data == NULL)
- encrypt_data = g_strdup(p);
- break;
case Q_CLAWS_HDRS:
case Q_CLAWS_HDRS_OLD:
/* end of special headers reached */
}
send_mail:
filepos = ftell(fp);
-
- if (encrypt) {
- MimeInfo *mimeinfo;
-
- if (mailac && mailac->save_encrypted_as_clear_text
- && !mailac->encrypt_to_self)
- save_clear_text = TRUE;
- else
- save_clear_text = FALSE;
-
- fclose(fp);
- fp = NULL;
-
- mimeinfo = procmime_scan_queue_file(file);
- if (!privacy_encrypt(privacy_system, mimeinfo, encrypt_data)
- || (fp = my_tmpfile()) == NULL
- || procmime_write_mimeinfo(mimeinfo, fp) < 0) {
- if (fp)
- fclose(fp);
- procmime_mimeinfo_free_all(mimeinfo);
- g_free(from);
- g_free(smtpserver);
- slist_free_strings_full(to_list);
- slist_free_strings_full(newsgroup_list);
- g_free(savecopyfolder);
- g_free(replymessageid);
- g_free(fwdmessageid);
- g_free(privacy_system);
- g_free(encrypt_data);
- if (errstr) {
- if (*errstr) g_free(*errstr);
- *errstr = g_strdup_printf(_("Couldn't encrypt the email: %s"),
- privacy_get_error());
- }
- return -1;
+ if (filepos < 0) {
+ FILE_OP_ERROR(file, "ftell");
+ if (errstr) {
+ if (*errstr) g_free(*errstr);
+ *errstr = g_strdup_printf(_("Couldn't open file %s."), file);
}
-
- rewind(fp);
- if (!save_clear_text) {
- gchar *content = NULL;
- FILE *tmpfp = get_tmpfile_in_dir(get_mime_tmp_dir(), &tmp_enc_file);
- if (tmpfp) {
- fclose(tmpfp);
-
- content = file_read_stream_to_str(fp);
- rewind(fp);
-
- str_write_to_file(content, tmp_enc_file);
- g_free(content);
- } else {
- g_warning("couldn't get tempfile\n");
- }
- }
-
- procmime_mimeinfo_free_all(mimeinfo);
-
- filepos = 0;
- }
+ return -1;
+ }
if (to_list) {
debug_print("Sending message by mail\n");
mailac = account_find_from_smtp_server(from, smtpserver);
if (!mailac) {
g_warning("Account not found. "
- "Using current account...\n");
+ "Using current account...");
mailac = cur_account;
}
}
} else {
PrefsAccount tmp_ac;
- g_warning("Account not found.\n");
+ g_warning("Account not found.");
memset(&tmp_ac, 0, sizeof(PrefsAccount));
tmp_ac.address = from;
mailval = -1;
}
- fseek(fp, filepos, SEEK_SET);
+ if (fseek(fp, filepos, SEEK_SET) < 0) {
+ FILE_OP_ERROR(file, "fseek");
+ mailval = -1;
+ }
+
if (newsgroup_list && newsac && (mailval == 0)) {
Folder *folder;
gchar *tmp = NULL;
} else {
if (change_file_mode_rw(tmpfp, tmp) < 0) {
FILE_OP_ERROR(tmp, "chmod");
- g_warning("can't change file mode\n");
+ g_warning("can't change file mode");
}
while ((newsval == 0) && fgets(buf, sizeof(buf), fp) != NULL) {
/* save message to outbox */
if (mailval == 0 && newsval == 0 && savecopyfolder) {
- FolderItem *outbox;
-
debug_print("saving sent message...\n");
- outbox = folder_find_item_from_identifier(savecopyfolder);
- if (!outbox)
- outbox = folder_get_default_outbox();
-
- if (save_clear_text || tmp_enc_file == NULL) {
+ if (!encrypt || !mailac->save_encrypted_as_clear_text) {
+ outbox = folder_find_item_from_identifier(savecopyfolder);
+ if (!outbox)
+ outbox = folder_get_default_outbox();
+
+ /* Mail was not saved to outbox before encrypting, save it now. */
gboolean saved = FALSE;
*queued_removed = FALSE;
if (queue && msgnum > 0) {
debug_print("copied queued mail %d to sent folder\n", msgnum);
saved = TRUE;
}
- procmsg_msginfo_free(queued_mail);
+ procmsg_msginfo_free(&queued_mail);
}
if (!saved) {
- debug_print("resaving clear text queued mail to sent folder\n");
+ debug_print("resaving queued mail to sent folder\n");
procmsg_save_to_outbox(outbox, file, TRUE);
}
- } else {
- debug_print("saving encrpyted queued mail to sent folder\n");
- procmsg_save_to_outbox(outbox, tmp_enc_file, FALSE);
}
}
- if (tmp_enc_file != NULL) {
- claws_unlink(tmp_enc_file);
- free(tmp_enc_file);
- tmp_enc_file = NULL;
- }
-
if (replymessageid != NULL || fwdmessageid != NULL) {
gchar **tokens;
FolderItem *item;
if ((msginfo != NULL) &&
(msginfo->msgid != NULL) &&
(strcmp(msginfo->msgid, tokens[2]) != 0)) {
- procmsg_msginfo_free(msginfo);
+ procmsg_msginfo_free(&msginfo);
msginfo = NULL;
}
} else {
procmsg_msginfo_set_flags(msginfo, MSG_FORWARDED, 0);
}
- procmsg_msginfo_free(msginfo);
+ procmsg_msginfo_free(&msginfo);
}
}
g_strfreev(tokens);
g_free(savecopyfolder);
g_free(replymessageid);
g_free(fwdmessageid);
- g_free(privacy_system);
- g_free(encrypt_data);
return (newsval != 0 ? newsval : mailval);
}
tmp = folder_item_get_msginfo_by_msgid(info->folder,
info->inreplyto);
if (tmp && (tmp->flags.perm_flags & perm_flags)) {
- procmsg_msginfo_free(tmp);
+ procmsg_msginfo_free(&tmp);
return TRUE;
} else if (tmp != NULL) {
gboolean result;
result = procmsg_msg_has_flagged_parent_real(
tmp, perm_flags, parentmsgs);
}
- procmsg_msginfo_free(tmp);
+ procmsg_msginfo_free(&tmp);
return result;
} else {
return FALSE;
for (cur = all; cur != NULL; cur = g_slist_next(cur)) {
/* this will not free the used pointers
created with procmsg_msginfo_new_ref */
- procmsg_msginfo_free((MsgInfo *)cur->data);
+ procmsg_msginfo_free((MsgInfo **)&(cur->data));
}
}
g_slist_free(all);
info->folder->unreadmarked_msgs--;
folder_item_update(info->folder, F_ITEM_UPDATE_MSGCNT);
}
- procmsg_msginfo_free(tmp);
+ procmsg_msginfo_free(&tmp);
}
g_slist_free(children);
}