1065{
1069
1070 struct Buffer *tempfile = NULL;
1071 char buf[32] = { 0 };
1072 int j;
1073 bool unlink_tempfile = false;
1074 bool need_sort = false;
1075 int first = -1;
1076 LOFF_T offset;
1077 struct stat st = { 0 };
1078 struct MUpdate *new_offset = NULL;
1079 struct MUpdate *old_offset = NULL;
1080 FILE *fp = NULL;
1081 struct Progress *progress = NULL;
1083
1084
1087 {
1089 need_sort = true;
1090 }
1091
1092
1093
1096 {
1098 mutt_error(
_(
"Fatal error! Could not reopen mailbox!"));
1099 goto fatal;
1100 }
1101
1103
1105 {
1108 goto bail;
1109 }
1110
1111
1114 {
1115
1116 rc = check;
1117 goto bail;
1118 }
1119 else if (check < 0)
1120 {
1121 goto fatal;
1122 }
1123
1124
1127 int fd = open(
buf_string(tempfile), O_WRONLY | O_EXCL | O_CREAT, 0600);
1128 if ((fd == -1) || !(fp = fdopen(fd, "w")))
1129 {
1130 if (fd != -1)
1131 {
1132 close(fd);
1133 unlink_tempfile = true;
1134 }
1136 goto bail;
1137 }
1138 unlink_tempfile = true;
1139
1140
1141
1142 int i = 0;
1145 i++)
1146 {
1147 }
1149 {
1150
1151
1152
1153 mutt_error(
_(
"sync: mbox modified, but no modified messages (report this bug)"));
1155 goto bail;
1156 }
1157
1158
1159 first = i;
1160
1162
1163
1164
1167
1168
1171
1173 {
1176 }
1177
1178 for (i = first, j = 0; i < m->
msg_count; i++)
1179 {
1181
1182
1183
1184 old_offset[i - first].
valid =
true;
1189
1191 {
1192 j++;
1193
1195 {
1197 {
1199 goto bail;
1200 }
1201 }
1202
1203
1204
1205
1206 new_offset[i - first].
hdr = ftello(fp) + offset;
1207
1212 if (rc2 != 0)
1213 {
1215 goto bail;
1216 }
1217
1218
1219
1220
1221
1222
1225
1227 {
1229 {
1231 goto bail;
1232 }
1233 }
1234 else
1235 {
1236 if (fputs(
"\n",
fp) == EOF)
1237 {
1239 goto bail;
1240 }
1241 }
1242 }
1243 }
1244
1246 {
1249 goto bail;
1250 }
1251
1252
1254 {
1256 goto bail;
1257 }
1258
1259 unlink_tempfile = false;
1260
1263 {
1270 goto fatal;
1271 }
1272
1274
1275 !fgets(buf,
sizeof(buf), adata->
fp) ||
1278 {
1281 i = -1;
1282 }
1283 else
1284 {
1286 {
1287 i = -1;
1288 }
1289 else
1290 {
1291
1292
1296
1297 if (ferror(adata->
fp))
1298 i = -1;
1299 }
1300 if (i >= 0)
1301 {
1302 m->
size = ftello(adata->
fp);
1303 if ((m->
size < 0) || (ftruncate(fileno(adata->
fp), m->
size) != 0))
1304 {
1305 i = -1;
1307 }
1308 }
1309 }
1310
1313
1315 {
1316
1317
1319
1331 goto fatal;
1332 }
1333
1334
1336
1337
1340 {
1342 }
1344 {
1348 mutt_error(
_(
"Fatal error! Could not reopen mailbox!"));
1351 goto fatal;
1352 }
1353
1354
1355 for (i = first, j = first; i < m->
msg_count; i++)
1356 {
1358 {
1363 }
1364 }
1370
1372 if (c_check_mbox_size)
1373 {
1377 }
1378
1380 return 0;
1381
1382bail:
1383
1385
1386 if (tempfile && unlink_tempfile)
1388
1389
1390 if ((first >= 0) && old_offset)
1391 {
1392 for (i = first; (i < m->
msg_count) && old_offset[i - first].valid; i++)
1393 {
1399 }
1400 }
1401
1402
1404
1408
1411 {
1414 goto fatal;
1415 }
1416
1418 if (need_sort)
1419 {
1420
1421
1423 }
1424
1425fatal:
1428 return rc;
1429}
int buf_printf(struct Buffer *buf, const char *fmt,...)
Format a string overwriting a Buffer.
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
const char * cs_subset_path(const struct ConfigSubset *sub, const char *name)
Get a path config item by name.
short cs_subset_sort(const struct ConfigSubset *sub, const char *name)
Get a sort config item by name.
int mutt_copy_message(FILE *fp_out, struct Email *e, struct Message *msg, CopyMessageFlags cmflags, CopyHeaderFlags chflags, int wraplen)
Copy a message from a Mailbox.
#define MUTT_CM_UPDATE
Update structs on sync.
#define CH_UPDATE
Update the status and x-status fields?
#define CH_FROM
Retain the "From " message separator?
#define CH_UPDATE_LEN
Update Lines: and Content-Length:
void mailbox_update(struct Mailbox *m)
Get the mailbox's current size.
void mailbox_changed(struct Mailbox *m, enum NotifyMailbox action)
Notify observers of a change to a Mailbox.
struct Mailbox * mailbox_find(const char *path)
Find the mailbox with a given path.
@ NT_MAILBOX_RESORT
Email list needs resorting.
@ NT_MAILBOX_UPDATE
Update internal tables.
@ MUTT_MMDF
'mmdf' Mailbox type
@ MUTT_MBOX
'mbox' Mailbox type
void mutt_body_free(struct Body **ptr)
Free a Body.
int mutt_file_copy_stream(FILE *fp_in, FILE *fp_out)
Copy the contents of one file into another.
bool mutt_file_seek(FILE *fp, LOFF_T offset, int whence)
Wrapper for fseeko with error handling.
#define mutt_file_fclose(FP)
#define mutt_file_fopen(PATH, MODE)
char * ShortHostname
Short version of the hostname.
char * Username
User's login name.
#define mutt_message(...)
#define mutt_debug(LEVEL,...)
static enum MxStatus mbox_mbox_check(struct Mailbox *m)
Check for new mail - Implements MxOps::mbox_check() -.
@ LL_DEBUG1
Log at debug level 1.
static int mbox_lock_mailbox(struct Mailbox *m, bool excl, bool retry)
Lock a mailbox.
static struct MboxAccountData * mbox_adata_get(struct Mailbox *m)
Get the private data associated with a Mailbox.
static FILE * mbox_open_readwrite(struct Mailbox *m)
Open an mbox read-write.
static FILE * mbox_open_readonly(struct Mailbox *m)
Open an mbox read-only.
static void mbox_unlock_mailbox(struct Mailbox *m)
Unlock a mailbox.
void mbox_reset_atime(struct Mailbox *m, struct stat *st)
Reset the access time on the mailbox file.
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
bool mutt_str_equal(const char *a, const char *b)
Compare two strings.
size_t mutt_str_startswith(const char *str, const char *prefix)
Check whether a string starts with a prefix.
void buf_pretty_mailbox(struct Buffer *buf)
Shorten a mailbox path using '~' or '='.
int mx_msg_close(struct Mailbox *m, struct Message **ptr)
Close a message.
void mx_fastclose_mailbox(struct Mailbox *m, bool keep_account)
Free up memory associated with the Mailbox.
struct Message * mx_msg_open(struct Mailbox *m, struct Email *e)
Return a stream pointer for a message.
@ MX_STATUS_REOPENED
Mailbox was reopened.
@ MX_STATUS_NEW_MAIL
New mail received in Mailbox.
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.
void mutt_sig_block(void)
Block signals during critical operations.
void mutt_sig_unblock(void)
Restore previously blocked signals.
SortType
Methods for sorting.
@ SORT_ORDER
Sort by the order the messages appear in the mailbox.
void mutt_sort_order(struct Mailbox *m)
Sort emails by their disk order.
void * adata
Private data (for Mailbox backends)
struct Body * parts
parts of a multipart or message/rfc822
LOFF_T offset
offset where the actual data begins
LOFF_T length
length (in bytes) of attachment
long hdr_offset
Offset in stream where the headers begin.
String manipulation buffer.
int lines
How many lines in the body of this message?
struct Body * body
List of MIME parts.
bool changed
Email has been edited.
LOFF_T offset
Where in the stream does this message begin?
bool attach_del
Has an attachment marked for deletion.
Store of new offsets, used by mutt_sync_mailbox()
bool has_new
Mailbox has new mail.
enum MailboxType type
Mailbox type.
off_t size
Size of the Mailbox.
Mbox-specific Account data -.
A local copy of an email.
FILE * fp
pointer to the message data