1091{
1095
1096 struct Buffer *tempfile = NULL;
1097 char buf[32] = { 0 };
1098 int j;
1099 bool unlink_tempfile = false;
1100 bool need_sort = false;
1101 int first = -1;
1102 LOFF_T offset;
1103 struct stat st = { 0 };
1104 struct MUpdate *new_offset = NULL;
1105 struct MUpdate *old_offset = NULL;
1106 FILE *fp = NULL;
1107 struct Progress *progress = NULL;
1109
1110
1113 {
1115 need_sort = true;
1116 }
1117
1118
1119
1122 {
1124 mutt_error(
_(
"Fatal error! Could not reopen mailbox!"));
1125 goto fatal;
1126 }
1127
1129
1131 {
1134 goto bail;
1135 }
1136
1137
1140 {
1141
1142 rc = check;
1143 goto bail;
1144 }
1145 else if (check < 0)
1146 {
1147 goto fatal;
1148 }
1149
1150
1153 int fd = open(
buf_string(tempfile), O_WRONLY | O_EXCL | O_CREAT, 0600);
1154 if ((fd == -1) || !(fp = fdopen(fd, "w")))
1155 {
1156 if (fd != -1)
1157 {
1158 close(fd);
1159 unlink_tempfile = true;
1160 }
1162 goto bail;
1163 }
1164 unlink_tempfile = true;
1165
1166
1167
1168 int i = 0;
1171 i++)
1172 {
1173 }
1175 {
1176
1177
1178
1179 mutt_error(
_(
"sync: mbox modified, but no modified messages (report this bug)"));
1181 goto bail;
1182 }
1183
1184
1185 first = i;
1186
1188
1189
1190
1193
1194
1197
1199 {
1202 }
1203
1204 for (i = first, j = 0; i < m->
msg_count; i++)
1205 {
1207
1208
1209
1210 old_offset[i - first].
valid =
true;
1215
1217 {
1218 j++;
1219
1221 {
1223 {
1225 goto bail;
1226 }
1227 }
1228
1229
1230
1231
1232 new_offset[i - first].
hdr = ftello(fp) + offset;
1233
1238 if (rc2 != 0)
1239 {
1241 goto bail;
1242 }
1243
1244
1245
1246
1247
1248
1251
1253 {
1255 {
1257 goto bail;
1258 }
1259 }
1260 else
1261 {
1263 {
1265 goto bail;
1266 }
1267 }
1268 }
1269 }
1270
1272 {
1275 goto bail;
1276 }
1277
1278
1280 {
1282 goto bail;
1283 }
1284
1285 unlink_tempfile = false;
1286
1289 {
1296 goto fatal;
1297 }
1298
1300
1301 !fgets(buf,
sizeof(buf), adata->
fp) ||
1304 {
1307 i = -1;
1308 }
1309 else
1310 {
1312 {
1313 i = -1;
1314 }
1315 else
1316 {
1317
1318
1322
1323 if (ferror(adata->
fp))
1324 i = -1;
1325 }
1326 if (i >= 0)
1327 {
1328 m->
size = ftello(adata->
fp);
1329 if ((m->
size < 0) || (ftruncate(fileno(adata->
fp), m->
size) != 0))
1330 {
1331 i = -1;
1333 }
1334 }
1335 }
1336
1339
1341 {
1342
1343
1345
1357 goto fatal;
1358 }
1359
1360
1362
1363
1366 {
1368 }
1370 {
1374 mutt_error(
_(
"Fatal error! Could not reopen mailbox!"));
1377 goto fatal;
1378 }
1379
1380
1381 for (i = first, j = first; i < m->
msg_count; i++)
1382 {
1384 {
1389 }
1390 }
1396
1398 if (c_check_mbox_size)
1399 {
1403 }
1404
1406 return 0;
1407
1408bail:
1409
1411
1412 if (tempfile && unlink_tempfile)
1414
1415
1416 if ((first >= 0) && old_offset)
1417 {
1418 for (i = first; (i < m->
msg_count) && old_offset[i - first].
valid; i++)
1419 {
1425 }
1426 }
1427
1428
1430
1434
1437 {
1440 goto fatal;
1441 }
1442
1444 if (need_sort)
1445 {
1446
1447
1449 }
1450
1451fatal:
1454 return rc;
1455}
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.
@ MUTT_CM_UPDATE
Update structs on sync.
@ CH_UPDATE
Update the status and x-status fields?
@ CH_UPDATE_LEN
Update Lines: and Content-Length:
@ CH_FROM
Retain the "From " message separator?
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.
void mutt_sort_unsorted(struct Mailbox *m)
Sort emails by their disk order.
EmailSortType
Methods for sorting Emails.
@ EMAIL_SORT_UNSORTED
Sort by the order the messages appear in the mailbox.
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.
#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.
#define FREE(x)
Free memory and set the pointer to NULL.
#define MUTT_MEM_CALLOC(n, type)
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 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.
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()
long lines
Number of lines.
LOFF_T length
Total length.
bool valid
Is this entry valid?
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
char * username
User's login name.