www.pudn.com > DTMS.rar > DODELETE.C
#include "mail.h"
/* Delete the current record specified by the mail structure.
* This function is called by mail_delete() and mail_store(),
* after the record has been located by _mail_find(). */
int
_mail_dodelete(MAIL *mail)
{
int i;
char *ptr;
off_t freeptr, saveptr;
/* Set data buffer to all blanks */
for (ptr = mail->datbuf, i = 0; i < mail->datlen - 1; i++)
*ptr++ = ' ';
*ptr = 0; /* null terminate for _mail_writedat() */
/* Set key to blanks */
ptr = mail->idxbuf;
while (*ptr)
*ptr++ = ' ';
/* We have to lock the free list */
if (writew_lock(mail->idxfd, FREE_OFF, SEEK_SET, 1) < 0)
err_dump("writew_lock error");
/* Write the data record with all blanks */
_mail_writedat(mail, mail->datbuf, mail->datoff, SEEK_SET);
/* Read the free list pointer. Its value becomes the
chain ptr field of the deleted index record. This means
the deleted record becomes the head of the free list. */
freeptr = _mail_readptr(mail, FREE_OFF);
/* Save the contents of index record chain ptr,
before it's rewritten by _mail_writeidx(). */
saveptr = mail->ptrval;
/* Rewrite the index record. This also rewrites the length
of the index record, the data offset, and the data length,
none of which has changed, but that's OK. */
_mail_writeidx(mail,NULL, mail->idxoff, SEEK_SET, freeptr);
/* Write the new free list pointer */
_mail_writeptr(mail, FREE_OFF, mail->idxoff);
/* Rewrite the chain ptr that pointed to this record
being deleted. Recall that _mail_find() sets mail->ptroff
to point to this chain ptr. We set this chain ptr
to the contents of the deleted record's chain ptr,
saveptr, which can be either zero or nonzero. */
_mail_writeptr(mail, mail->ptroff, saveptr);
if (un_lock(mail->idxfd, FREE_OFF, SEEK_SET, 1) < 0)
err_dump("un_lock error");
return(0);
}