Edit an email or view it in an external editor.
57{
58 char buf[256] = { 0 };
59 int rc;
60 FILE *fp = NULL;
61 struct stat st = { 0 };
62 bool old_append = m->
append;
63
66
67
70
73 {
74 mutt_error(
_(
"could not create temporary folder: %s"), strerror(errno));
77 return -1;
78 }
79
81
87 int oerrno = errno;
88
91
92 if (rc == -1)
93 {
94 mutt_error(
_(
"could not write temporary mail folder: %s"), strerror(oerrno));
95 goto bail;
96 }
97
99 if (rc == -1)
100 {
102 goto bail;
103 }
104
105
106
107
108
109
111 {
112 rc = -1;
113 mutt_error(
_(
"could not truncate temporary mail folder: %s"), strerror(errno));
114 goto bail;
115 }
116
118 {
119
121 S_IWUSR | S_IWGRP | S_IWOTH, &st);
122 if (rc == -1)
123 {
126
127
128 }
129 }
130
131
133 if (rc == -1)
134 {
136 goto bail;
137 }
138
139
141 if (
mtime == (time_t) -1)
142 {
143 rc = -1;
145 goto bail;
146 }
147
150
152 if (rc == -1)
153 {
155 goto bail;
156 }
157
158 if (st.st_size == 0)
159 {
161 rc = 1;
162 goto bail;
163 }
164
166 {
168 rc = 1;
169 goto bail;
170 }
171
173 {
174 mutt_message(
_(
"Message of read-only mailbox modified! Ignoring changes."));
175 rc = 1;
176 goto bail;
177 }
178
180 {
181
182 rc = 1;
183 goto bail;
184 }
185
187 if (!fp)
188 {
189 rc = -1;
190 mutt_error(
_(
"Can't open message file: %s"), strerror(errno));
191 goto bail;
192 }
193
195 {
196 rc = -1;
197
198 mutt_error(
_(
"Can't append to folder: %s"), strerror(errno));
199 goto bail;
200 }
203
204 if (fgets(buf,
sizeof(buf), fp) &&
is_from(buf, NULL, 0, NULL))
205 {
208 }
209 else
211
212
213
214
215 bool o_read = e->
read;
222
223 if (!msg)
224 {
225 rc = -1;
226 mutt_error(
_(
"Can't append to folder: %s"), strerror(errno));
228 goto bail;
229 }
230
232 if (rc == 0)
233 {
234 fputc(
'\n', msg->
fp);
236 }
237
240
242
243bail:
245
246 if (rc >= 0)
248
249 if (rc == 0)
250 {
254
256 if (c_delete_untag)
258 }
259 else if (rc == -1)
261
263
265 return rc;
266}
static const char * mutt_buffer_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
const char * cs_subset_string(const struct ConfigSubset *sub, const char *name)
Get a string config item by name.
unsigned char cs_subset_enum(const struct ConfigSubset *sub, const char *name)
Get a enumeration config item by name.
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
int mutt_append_message(struct Mailbox *m_dst, struct Mailbox *m_src, struct Email *e, struct Message *msg, CopyMessageFlags cmflags, CopyHeaderFlags chflags)
Append a message.
int mutt_copy_hdr(FILE *fp_in, FILE *fp_out, LOFF_T off_start, LOFF_T off_end, CopyHeaderFlags chflags, const char *prefix, int wraplen)
Copy header from one file to another.
#define CH_NOSTATUS
Suppress the status and x-status fields.
#define CH_FROM
Retain the "From " message separator?
uint32_t CopyHeaderFlags
Flags for mutt_copy_header(), e.g. CH_UPDATE.
#define CH_FORCE_FROM
Give CH_FROM precedence over CH_WEED?
#define MUTT_CM_NO_FLAGS
No flags are set.
#define CH_NO_FLAGS
No flags are set.
#define CH_NOLEN
Don't write Content-Length: and Lines:
void mutt_edit_file(const char *editor, const char *file)
Let the user edit a file.
int mutt_file_copy_stream(FILE *fp_in, FILE *fp_out)
Copy the contents of one file into another.
int mutt_file_fclose(FILE **fp)
Close a FILE handle (and NULL the pointer)
time_t mutt_file_decrease_mtime(const char *fp, struct stat *st)
Decrease a file's modification time by 1 second.
int mutt_file_chmod_rm_stat(const char *path, mode_t mode, struct stat *st)
Remove permissions from a file.
bool is_from(const char *s, char *path, size_t pathlen, time_t *tp)
Is a string a 'From' header line?
#define mutt_message(...)
#define mutt_debug(LEVEL,...)
@ LL_DEBUG1
Log at debug level 1.
void mailbox_free(struct Mailbox **ptr)
Free a Mailbox.
@ MUTT_MMDF
'mmdf' Mailbox type
@ MUTT_MBOX
'mbox' Mailbox type
@ MUTT_READ
Messages that have been read.
@ MUTT_PURGE
Messages to be purged (bypass trash)
@ MUTT_TAG
Tagged messages.
@ MUTT_DELETE
Messages to be deleted.
#define mutt_buffer_mktemp(buf)
int mx_msg_close(struct Mailbox *m, struct Message **msg)
Close a message.
bool mx_mbox_open(struct Mailbox *m, OpenMailboxFlags flags)
Open a mailbox and parse it.
struct Message * mx_msg_open_new(struct Mailbox *m, const struct Email *e, MsgOpenFlags flags)
Open a new message.
int mx_msg_commit(struct Mailbox *m, struct Message *msg)
Commit a message to a folder - Wrapper for MxOps::msg_commit()
struct Mailbox * mx_path_resolve(const char *path)
Get a Mailbox for a path.
enum MxStatus mx_mbox_close(struct Mailbox *m)
Save changes and close mailbox.
uint8_t MsgOpenFlags
Flags for mx_msg_open_new(), e.g. MUTT_ADD_FROM.
#define MUTT_ADD_FROM
add a From_ line
#define MUTT_MSG_NO_FLAGS
No flags are set.
#define MUTT_NEWFOLDER
Create a new folder - same as MUTT_APPEND, but uses mutt_file_fopen() with mode "w" for mbox-style fo...
#define MUTT_APPEND
Open mailbox for appending messages.
#define MUTT_QUIET
Do not print any messages.
void mutt_buffer_pool_release(struct Buffer **pbuf)
Free a Buffer from the pool.
struct Buffer * mutt_buffer_pool_get(void)
Get a Buffer from the pool.
@ EVM_VIEW
View the message.
@ EVM_EDIT
Edit the message.
#define mutt_set_flag(m, e, flag, bf)
String manipulation buffer.
bool old
Email is seen, but unread.
struct timespec mtime
Time Mailbox was last changed.
bool append
Mailbox is opened in append mode.
enum MailboxType type
Mailbox type.
A local copy of an email.
FILE * fp
pointer to the message data
Container for Accounts, Notifications.
struct ConfigSubset * sub
Inherited config items.
int cs_subset_str_native_set(const struct ConfigSubset *sub, const char *name, intptr_t value, struct Buffer *err)
Natively set the value of a string config item.