fixed maildir message filenames to comply with the maildir(5) specification.

fixed write_strip() and imap_fetch_message() to check the return code of
write() and fsync() to comply with maildir(5) spec.
This commit is contained in:
Michael Elkins 2001-10-03 00:01:18 +00:00
parent 4b102ee6ec
commit 6f647ae37b
2 changed files with 26 additions and 13 deletions

26
imap.c
View File

@ -820,12 +820,18 @@ write_strip (int fd, char *buf, size_t len)
{ {
size_t start = 0; size_t start = 0;
size_t end = 0; size_t end = 0;
int n;
while (start < len) while (start < len)
{ {
while (end < len && buf[end] != '\r') while (end < len && buf[end] != '\r')
end++; end++;
write (fd, buf + start, end - start); n = write (fd, buf + start, end - start);
if (n == -1)
{
perror ("write");
return -1;
}
end++; end++;
start = end; start = end;
} }
@ -910,7 +916,6 @@ imap_fetch_message (imap_t * imap, unsigned int uid, int fd)
return -1; return -1;
} }
bytes = strtol (arg + 1, 0, 10); bytes = strtol (arg + 1, 0, 10);
// printf ("receiving %d byte message\n", bytes);
/* dump whats left over in the input buffer */ /* dump whats left over in the input buffer */
n = imap->buf->bytes - imap->buf->offset; n = imap->buf->bytes - imap->buf->offset;
@ -924,12 +929,14 @@ imap_fetch_message (imap_t * imap, unsigned int uid, int fd)
/* ick. we have to strip out the \r\n line endings, so /* ick. we have to strip out the \r\n line endings, so
* i can't just dump the raw bytes to disk. * i can't just dump the raw bytes to disk.
*/ */
write_strip (fd, imap->buf->buf + imap->buf->offset, n); if (write_strip (fd, imap->buf->buf + imap->buf->offset, n))
{
/* write failed, message is not delivered */
return -1;
}
bytes -= n; bytes -= n;
// printf ("wrote %d buffered bytes\n", n);
/* mark that we used part of the buffer */ /* mark that we used part of the buffer */
imap->buf->offset += n; imap->buf->offset += n;
@ -942,8 +949,11 @@ imap_fetch_message (imap_t * imap, unsigned int uid, int fd)
n = socket_read (imap->sock, buf, n); n = socket_read (imap->sock, buf, n);
if (n > 0) if (n > 0)
{ {
// printf("imap_fetch_message:%d:read %d bytes\n", __LINE__, n); if (write_strip (fd, buf, n))
write_strip (fd, buf, n); {
/* write failed */
return -1;
}
bytes -= n; bytes -= n;
} }
else else
@ -953,8 +963,6 @@ imap_fetch_message (imap_t * imap, unsigned int uid, int fd)
} }
} }
// puts ("finished fetching msg");
buffer_gets (imap->buf, &cmd); buffer_gets (imap->buf, &cmd);
if (Verbose) if (Verbose)
puts (cmd); /* last part of line */ puts (cmd); /* last part of line */

13
sync.c
View File

@ -243,9 +243,9 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags,
for (;;) for (;;)
{ {
/* create new file */ /* create new file */
snprintf (path, sizeof (path), "%s/tmp/%s.%ld_%d.%d,U=%d%s", snprintf (path, sizeof (path), "%s/tmp/%ld_%d.%d.%s,U=%d%s",
mbox->path, Hostname, time (0), MaildirCount++, mbox->path, time (0), MaildirCount++, getpid (),
getpid (), cur->uid, suffix); Hostname, cur->uid, suffix);
if ((fd = open (path, O_WRONLY | O_CREAT | O_EXCL, 0600)) > 0) if ((fd = open (path, O_WRONLY | O_CREAT | O_EXCL, 0600)) > 0)
break; break;
@ -268,7 +268,12 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags,
ret = imap_fetch_message (imap, cur->uid, fd); ret = imap_fetch_message (imap, cur->uid, fd);
if (close (fd)) if (fsync (fd))
{
perror ("fsync");
close (fd);
}
else if (close (fd))
perror ("close"); perror ("close");
else if (!ret) else if (!ret)
{ {