Commit b7a718c6 b7a718c62dbe461728a7c4d758ca3ceb0fa4c260 by Alain Magloire

More update but still not functional.

1 parent 66dc09fd
......@@ -221,7 +221,7 @@ _lockfile_dotlock_ctor (struct _lockfile_dotlock *dotlock,
const char *filename)
{
mu_refcount_create (&dotlock->refcount);
if (dotlock->refcount)
if (dotlock->refcount == NULL)
return MU_ERROR_NO_MEMORY;
dotlock->fname = calloc (strlen (filename) + 5 /*strlen(".lock")*/ + 1, 1);
......
......@@ -284,9 +284,7 @@ _stream_stdio_open (stream_t stream, const char *filename, int port, int flags)
}
/* Map the flags to the system equivalent. */
if (flags & MU_STREAM_WRITE && flags & MU_STREAM_READ)
return EINVAL;
else if (flags & MU_STREAM_WRITE)
if ((flags & MU_STREAM_WRITE) && !(flags & MU_STREAM_READ))
flg = O_WRONLY;
else if (flags & MU_STREAM_RDWR)
flg = O_RDWR;
......
......@@ -65,10 +65,8 @@ extern int mbox_get_blines __P ((mbox_t, unsigned int, unsigned int *));
extern int mbox_get_size __P ((mbox_t, off_t *));
extern int mbox_save_attributes __P ((mbox_t));
extern int mbox_mark_deleted __P ((mbox_t, unsigned int));
extern int mbox_unmark_deleted __P ((mbox_t, unsigned int));
extern int mbox_expunge __P ((mbox_t, int));
extern int mbox_changed_on_disk __P ((mbox_t));
extern int mbox_has_newmail __P ((mbox_t));
extern int mbox_set_progress_cb
__P ((mbox_t, int (*) __P ((int, void *)), void *));
......
......@@ -89,7 +89,6 @@ struct _mbox_message
{
stream_t stream;
unsigned int lines;
unsigned int size;
off_t start;
off_t end;
} header, body;
......
......@@ -57,16 +57,16 @@ int
lockfile_touchlock (lockfile_t lockfile)
{
if (lockfile == NULL || lockfile->vtable == NULL
|| lockfile->vtable->lock == NULL)
|| lockfile->vtable->touchlock == NULL)
return MU_ERROR_NOT_SUPPORTED;
return lockfile->vtable->lock (lockfile);
return lockfile->vtable->touchlock (lockfile);
}
int
lockfile_unlock (lockfile_t lockfile)
{
if (lockfile == NULL || lockfile->vtable == NULL
|| lockfile->vtable->lock == NULL)
|| lockfile->vtable->unlock == NULL)
return MU_ERROR_NOT_SUPPORTED;
return lockfile->vtable->lock (lockfile);
return lockfile->vtable->unlock (lockfile);
}
......
......@@ -16,7 +16,7 @@ libmbox_la_SOURCES = \
mbox_bstream.c \
mbox_carrier.c \
mbox_cb.c \
mbox_changed.c \
mbox_newmail.c \
mbox_close.c \
mbox_create.c \
mbox_destroy.c \
......
......@@ -80,11 +80,11 @@
(buf[4] == ' ' || buf[4] == '\t'))
/* Save the uidvalidity:
+ if it is an empty mbox in the first message append
+ if for the first message the uidvalidity is not the same
from the mbox->uidvalidity.
+ if it is the first message append
and save_uidvalidity is set.
- strip X-IMAPBASE, X-UID, Content-Length and Status.
- strip X-IMAPBASE, X-UID
- add X-UID base on mbox->uidnext.
- mangle any leading "From " in the body to ">From "
......@@ -100,6 +100,8 @@ mbox_append_separator (mbox_t mbox, const char *sep)
{
char separator[256];
size_t len;
const char nl = '\n';
int status = 0;
if (sep == NULL)
{
......@@ -121,7 +123,14 @@ mbox_append_separator (mbox_t mbox, const char *sep)
len = strlen (sep);
/* Write the separator. */
return stream_write (mbox->carrier, sep, len, NULL);
status = stream_write (mbox->carrier, sep, len, NULL);
if (status != 0)
return status;
/* Add the trailing newline. */
if (len && sep[len - 1] != '\n')
status = stream_write (mbox->carrier, &nl, 1, NULL);
return status;
}
/* Assuming that the file is lock. */
......@@ -329,6 +338,7 @@ mbox_append_hb0 (mbox_t mbox, const char *sep, attribute_t attribute,
}
else
{
stream_flush (mbox->carrier);
lockfile_unlock (mbox->lockfile);
mbox->uidnext++;
}
......
......@@ -146,19 +146,6 @@ attribute_mbox_create (attribute_t *pattribute, mbox_t mbox,
{
struct _attribute_mbox *ma;
int status;
attribute_t attribute;
char buf[128];
/* Get the attribute from the status field. */
*buf = '\0';
status = mbox_header_get_value (mbox, msgno, "Status", buf, sizeof buf, 0);
if (status != 0)
return status;
status = attribute_status_create (&attribute, buf);
if (status != 0)
return status;
attribute_get_flags (attribute, &mbox->umessages[msgno - 1]->attr_flags);
attribute_destroy (&attribute);
ma = calloc (1, sizeof *ma);
if (ma == NULL)
......
......@@ -30,7 +30,7 @@ mbox_get_blines (mbox_t mbox, unsigned int msgno, unsigned int *plines)
if (mbox && msgno)
{
msgno--;
if (msgno >= mbox->messages_count)
if (msgno < mbox->messages_count)
lines = mbox->umessages[msgno]->body.lines;
}
if (plines)
......
......@@ -30,8 +30,9 @@ mbox_get_bsize (mbox_t mbox, unsigned int msgno, unsigned int *psize)
if (mbox && msgno)
{
msgno--;
if (msgno >= mbox->messages_count)
size = mbox->umessages[msgno]->body.size;
if (msgno < mbox->messages_count)
size = mbox->umessages[msgno]->body.end -
mbox->umessages[msgno]->body.start;
}
if (psize)
*psize = size;
......
......@@ -125,6 +125,7 @@ mbox_expunge (mbox_t mbox, int remove_deleted)
int tmp_fd;
char *tmp_name = NULL;
mbox_t tmp_mbox = NULL;
off_t tmp_size = 0;
size_t save_uidvalidity = 0; /* uidvalidity is save in the first message. */
if (mbox == NULL)
......@@ -196,18 +197,6 @@ mbox_expunge (mbox_t mbox, int remove_deleted)
return status;
}
/* _Must_ have and updated view of the size of the mailbox. */
status = mbox_changed_on_disk (mbox);
if (status != 0)
{
mbox_close (tmp_mbox);
mbox_destroy (&tmp_mbox);
remove (tmp_name);
free (tmp_name);
/* mu_error ("Failed to grab the lock\n"); */
return status;
}
/* Critical section, can not allowed signal here. */
sigemptyset (&signalset);
sigaddset (&signalset, SIGTERM);
......@@ -250,7 +239,8 @@ mbox_expunge (mbox_t mbox, int remove_deleted)
{
if (mbox_get_hstream (mbox, i + 1, &hstream) != 0
|| mbox_get_bstream (mbox, i + 1, &bstream) != 0
|| mbox_get_separator (mbox, i + 1, &sep) != 0)
|| mbox_get_separator (mbox, i + 1, &sep) != 0
|| mbox_get_attribute (mbox, i + 1, &attribute) != 0)
{
/* mu_error ("Error expunge:%d", __LINE__); */
goto bailout0;
......@@ -275,6 +265,13 @@ mbox_expunge (mbox_t mbox, int remove_deleted)
}
} /* for (;;) */
/* Get the real size of the mailbox. The size maintain in
the struct _mailbox { off_t size; } the one return in
mailbox_get_size() only return the size that mbox_scan()
is aware of not necessary the size of the file after
an append. */
stream_get_size (tmp_mbox->carrier, &tmp_size);
/* Caution: before ftruncate()ing the file see
- if we've receive new mails. Some programs may not respect the lock,
- or the lock was held for too long.
......@@ -289,11 +286,11 @@ mbox_expunge (mbox_t mbox, int remove_deleted)
if (len > 0)
{
stream_seek (mbox->carrier, mbox->size, MU_STREAM_WHENCE_SET);
stream_seek (tmp_mbox->carrier, tmp_mbox->size, MU_STREAM_WHENCE_SET);
stream_seek (tmp_mbox->carrier, tmp_size, MU_STREAM_WHENCE_SET);
while ((status = stream_read (mbox->carrier, buffer,
sizeof buffer, &n)) == 0 && n > 0)
{
status = stream_write (tmp_mbox->carrier, buffer, n, &n);
status = stream_write (tmp_mbox->carrier, buffer, n, NULL);
if (status != 0)
{
/* mu_error ("Error expunge:%d: %s", __LINE__,
......@@ -313,7 +310,7 @@ mbox_expunge (mbox_t mbox, int remove_deleted)
} /* End of precaution. */
/* Seek and rewrite it. */
if (total > 0)
if (tmp_size > 0)
{
char buffer [1024];
size_t n = 0;
......@@ -334,8 +331,9 @@ mbox_expunge (mbox_t mbox, int remove_deleted)
}
/* Flush/truncation. Need to flush before truncate. */
stream_get_size (tmp_mbox->carrier, &tmp_size);
stream_flush (mbox->carrier);
status = stream_truncate (mbox->carrier, tmp_mbox->size + marker);
status = stream_truncate (mbox->carrier, tmp_size + marker);
if (status != 0)
{
/* mu_error ("Error expunging:%d: %s\n", __LINE__,
......
......@@ -129,6 +129,7 @@ mbox_hcache_append (mbox_t mbox, unsigned int msgno, const char *name,
if (hc->values == NULL)
return MU_ERROR_NO_MEMORY;
}
hc->size = mbox->hcache.size;
for (i = 0; i < mbox->hcache.size; i++)
{
......@@ -150,8 +151,8 @@ mbox_hcache_append (mbox_t mbox, unsigned int msgno, const char *name,
strlen (hc->values[i]) + 1);
if (tmp)
{
strcat (hc->values[i], value);
hc->values[i] = tmp;
strcat (hc->values[i], value);
}
}
}
......
......@@ -30,7 +30,7 @@ mbox_get_hlines (mbox_t mbox, unsigned int msgno, unsigned int *plines)
if (mbox && msgno)
{
msgno--;
if (msgno >= mbox->messages_count)
if (msgno < mbox->messages_count)
lines = mbox->umessages[msgno]->header.lines;
}
if (plines)
......
......@@ -30,8 +30,9 @@ mbox_get_hsize (mbox_t mbox, unsigned int msgno, unsigned int *psize)
if (mbox && msgno)
{
msgno--;
if (msgno >= mbox->messages_count)
size = mbox->umessages[msgno]->header.size;
if (msgno < mbox->messages_count)
size = mbox->umessages[msgno]->header.end -
mbox->umessages[msgno]->header.start;
}
if (psize)
*psize = size;
......
......@@ -61,6 +61,39 @@
static int
mbox_parse_status (mbox_message_t mum, char *buf, size_t n)
{
char *s = memchr (buf, ':', n);
if (s)
{
s++;
for (; *s; s++)
{
switch (*s)
{
case 'r':
case 'R':
mum->attr_flags |= MU_ATTRIBUTE_READ;
break;
case 'O':
case 'o':
mum->attr_flags |= MU_ATTRIBUTE_SEEN;
break;
case 'a':
case 'A':
mum->attr_flags |= MU_ATTRIBUTE_ANSWERED;
break;
case 'd':
case 'D':
mum->attr_flags |= MU_ATTRIBUTE_DELETED;
break;
}
}
}
return 0;
}
static int
mbox_alloc_umessages (mbox_t mbox)
{
mbox_message_t mum;
......@@ -82,34 +115,11 @@ mbox_alloc_umessages (mbox_t mbox)
return MU_ERROR_NO_MEMORY;
}
}
if (mbox->messages_count)
msgno = mbox->messages_count - 1;
mum = mbox->umessages[msgno];
mum->from_ = 0;
if (mum->separator)
free (mum->separator);
mum->separator = 0;
mbox_hcache_free (mbox, msgno + 1);
if (mum->header.stream)
stream_destroy (&mum->header.stream);
mum->header.lines = 0;
mum->header.size = 0;
mum->header.start = 0;
mum->header.end = 0;
if (mum->body.stream)
stream_destroy (&mum->body.stream);
mum->body.lines = 0;
mum->body.size = 0;
mum->body.start = 0;
mum->body.end = 0;
mum->uid = 0;
mum->attr_flags = 0;
if (mum->attribute)
attribute_destroy (&mum->attribute);
return 0;
}
......@@ -138,6 +148,9 @@ mbox_scan (mbox_t mbox, unsigned int msgno, unsigned int *pcount, int do_notif)
int zn, isfrom = 0;
char *temp;
if (mbox == NULL)
return MU_ERROR_INVALID_PARAMETER;
/* Save the timestamp. */
status = stream_get_fd (mbox->carrier, &fd);
if (status == 0)
......@@ -155,6 +168,10 @@ mbox_scan (mbox_t mbox, unsigned int msgno, unsigned int *pcount, int do_notif)
status = MU_ERROR_IO;
}
/* Move along, move along nothing to see. */
if (!mbox_has_newmail (mbox) && mbox->size == file_size)
return 0;
/* Bailout early on error. */
if (status != 0)
return status;
......@@ -180,6 +197,7 @@ mbox_scan (mbox_t mbox, unsigned int msgno, unsigned int *pcount, int do_notif)
newline = 1;
errno = lines = inheader = inbody = 0;
mum = NULL;
status = stream_seek (mbox->carrier, total, MU_STREAM_WHENCE_SET);
if (status != 0)
......@@ -189,7 +207,7 @@ mbox_scan (mbox_t mbox, unsigned int msgno, unsigned int *pcount, int do_notif)
}
while ((status = stream_readline (mbox->carrier, buf, sizeof buf, &n)) == 0
&& n != 0)
&& n > 0)
{
int nl;
total += n;
......@@ -213,7 +231,7 @@ mbox_scan (mbox_t mbox, unsigned int msgno, unsigned int *pcount, int do_notif)
/* Signal the end of the previous body. */
if (mum && !mum->body.end)
{
mum->body.end = total - n - newline;
mum->body.end = total - n;
mum->body.lines = --lines - newline;
/* DISPATCH_ADD_MSG(mbox); */
if (do_notif)
......@@ -244,33 +262,7 @@ mbox_scan (mbox_t mbox, unsigned int msgno, unsigned int *pcount, int do_notif)
}
else if (ISSTATUS(buf))
{
char *s = memchr (buf, ':', n);
if (s)
{
s++;
for (; *s; s++)
{
switch (*s)
{
case 'r':
case 'R':
mum->attr_flags |= MU_ATTRIBUTE_READ;
break;
case 'O':
case 'o':
mum->attr_flags |= MU_ATTRIBUTE_SEEN;
break;
case 'a':
case 'A':
mum->attr_flags |= MU_ATTRIBUTE_ANSWERED;
break;
case 'd':
case 'D':
mum->attr_flags |= MU_ATTRIBUTE_DELETED;
break;
}
}
}
mbox_parse_status (mum, buf, n);
}
else if (ISX_IMAPBASE(buf))
{
......@@ -293,6 +285,8 @@ mbox_scan (mbox_t mbox, unsigned int msgno, unsigned int *pcount, int do_notif)
}
else if (sfield && (buf[0] == ' ' || buf[0] == '\t'))
{
if (buf[n - 1] == '\n')
buf[n - 1] = 0;
mbox_hcache_append (mbox, mbox->messages_count, sfield, buf);
}
else
......@@ -305,6 +299,8 @@ mbox_scan (mbox_t mbox, unsigned int msgno, unsigned int *pcount, int do_notif)
{
*s = '\0';
s++;
if (buf[n - 1] == '\n')
buf[n - 1] = 0;
mbox_hcache_append (mbox, mbox->messages_count, buf, s);
sfield = strdup (buf);
}
......@@ -318,6 +314,7 @@ mbox_scan (mbox_t mbox, unsigned int msgno, unsigned int *pcount, int do_notif)
if (mum && !mum->body.start)
{
mum->body.start = total - n + nl;
mum->header.end = total - n + nl;
mum->header.lines = lines;
lines = 0;
}
......
......@@ -25,6 +25,9 @@
#include <mailutils/error.h>
#include <mailutils/sys/mbox.h>
/* Each message starts with a line that contaings three of four fieds:
"From" SP evelope-sender SP date [SP moreinfo]
*/
int
mbox_get_separator (mbox_t mbox, unsigned int msgno, char **psep)
{
......@@ -65,9 +68,14 @@ mbox_get_separator (mbox_t mbox, unsigned int msgno, char **psep)
}
p = s ;
stream_readline (mbox->carrier, p + strlen (p), len, &n);
} while (n && p[n - 1] == '\n');
n = strlen (p);
} while (n && p[n - 1] != '\n');
if (n && p[n - 1] == '\n')
p[n - 1] = '\0';
*psep = strdup (p);
mbox->umessages[msgno]->separator = strdup (p);
free (p);
}
return 0;
......
......@@ -106,8 +106,12 @@ _stream_mbox_read (stream_t stream, void *buf, size_t buflen, size_t *pnread)
{
size_t n = min ((size_t)ln, buflen);
/* Position the file pointer. */
status = stream_seek (ms->mbox->carrier, ms->offset,
MU_STREAM_WHENCE_SET);
if (ms->is_header)
status = stream_seek (ms->mbox->carrier, umessage->header.start
+ ms->offset, MU_STREAM_WHENCE_SET);
else
status = stream_seek (ms->mbox->carrier, umessage->body.start
+ ms->offset, MU_STREAM_WHENCE_SET);
if (status == 0)
{
status = stream_read (ms->mbox->carrier, buf, n, &nread);
......@@ -149,8 +153,12 @@ _stream_mbox_readline (stream_t stream, char *buf, size_t buflen,
{
size_t n = min ((size_t)ln, buflen);
/* Position the stream. */
status = stream_seek (ms->mbox->carrier, ms->offset,
MU_STREAM_WHENCE_SET);
if (ms->is_header)
status = stream_seek (ms->mbox->carrier, umessage->header.start
+ ms->offset, MU_STREAM_WHENCE_SET);
else
status = stream_seek (ms->mbox->carrier, umessage->body.start
+ ms->offset, MU_STREAM_WHENCE_SET);
if (status == 0)
{
status = stream_readline (ms->mbox->carrier, buf, n, &nread);
......