Edit an email or view it in an external editor.
56{
57 char buf[256] = { 0 };
58 int rc;
59 FILE *fp = NULL;
60 struct stat st = { 0 };
61 bool old_append = m->
append;
62
65
66
69
72 {
73 mutt_error(
_(
"could not create temporary folder: %s"), strerror(errno));
76 return -1;
77 }
78
80
86 int oerrno = errno;
87
90
91 if (rc == -1)
92 {
93 mutt_error(
_(
"could not write temporary mail folder: %s"), strerror(oerrno));
94 goto bail;
95 }
96
98 if (rc == -1)
99 {
101 goto bail;
102 }
103
104
105
106
107
108
109 if ((st.st_size != 0) && (truncate(
buf_string(fname), st.st_size - 1) == -1))
110 {
111 rc = -1;
112 mutt_error(
_(
"could not truncate temporary mail folder: %s"), strerror(errno));
113 goto bail;
114 }
115
117 {
118
120 if (rc == -1)
121 {
124
125
126 }
127 }
128
129
131 if (rc == -1)
132 {
134 goto bail;
135 }
136
137
139 if (
mtime == (time_t) -1)
140 {
141 rc = -1;
143 goto bail;
144 }
145
148
150 if (rc == -1)
151 {
153 goto bail;
154 }
155
156 if (st.st_size == 0)
157 {
159 rc = 1;
160 goto bail;
161 }
162
164 {
166 rc = 1;
167 goto bail;
168 }
169
171 {
172 mutt_message(
_(
"Message of read-only mailbox modified! Ignoring changes."));
173 rc = 1;
174 goto bail;
175 }
176
178 {
179
180 rc = 1;
181 goto bail;
182 }
183
185 if (!fp)
186 {
187 rc = -1;
188 mutt_error(
_(
"Can't open message file: %s"), strerror(errno));
189 goto bail;
190 }
191
193 {
194 rc = -1;
195
196 mutt_error(
_(
"Can't append to folder: %s"), strerror(errno));
197 goto bail;
198 }
201
202 if (fgets(buf,
sizeof(buf), fp) &&
is_from(buf, NULL, 0, NULL))
203 {
206 }
207 else
208 {
210 }
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)
260 {
262 }
263
265
267 return rc;
268}
static const char * buf_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.
void mutt_set_flag(struct Mailbox *m, struct Email *e, enum MessageType flag, bool bf, bool upd_mbox)
Set a flag on an email.
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.
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.
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
@ EVM_VIEW
View the message.
@ EVM_EDIT
Edit the message.
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.