www.pudn.com > DTMS.rar > MAIL.H


#include	
#include		/* open() & mail_open() mode */
#include			/* open() & mail_open() flags */
#include			/* NULL */
#include	
#include	"ourhdr.h"
#include	"pass.h"

		/* flags for mail_store() */

#define  TMPMSGFILE  "message" 
#define ANYIDX 		0                 /*any index(writew_lock(mail->idxfd,*/
#define	FREEIDX 	1		 /* free index*/ 
#define	REALIDX 	2		 /* not free index*/
		/* magic numbers */
#define	IDXLEN_SZ	   4	/* #ascii chars for length of index record */
#define	IDXLEN_MIN	   6	/* key, sep, start, sep, length, newline */
#define	IDXLEN_MAX	1024	/* arbitrary */
#define	SEP		'|'	/* separator character in index record */
#define	DATLEN_MIN	   2	/* data byte, newline */
#define	DATLEN_MAX	1024	/* arbitrary */

		/* following definitions are for hash chains and free list chain
		   in index file */
#define	PTR_SZ		   6	/* size of ptr field in hash chain */
#define	PTR_MAX   999999	/* max offset (file size) = 10**PTR_SZ - 1 */
#define	NHASH_DEF	 137	/* default hash table size */
#define	FREE_OFF	   0	/* offset of ptr to free list in index file */
#define	HASH_OFF  PTR_SZ	/* offset of hash table in index file */

char *hint;/*const for message hint*/
/*struct message **msgpp;point to the content of the message for client to get message*/

typedef struct {	/* our internal structure */
  int	idxfd;	/* fd for index file */
  int	datfd;	/* fd for data file */
  int	oflag;	/* flags for open()/mail_open(): O_xxx */
  char  *keybuf;
  char	*idxbuf;/* malloc'ed buffer for index record */
  char	*datbuf;/* malloc'ed buffer for data record*/
  char	*name;	/* name mail was opened under */
  off_t	idxoff;	/* offset in index file of index record */
				/* actual key is at (idxoff + PTR_SZ + IDXLEN_SZ) */
  size_t idxlen;/* length of index record */
				/* excludes IDXLEN_SZ bytes at front of index record */
				/* includes newline at end of index record */
  off_t	datoff;	/* offset in data file of data record */
  size_t datlen;/* length of data record */
				/* includes newline at end */
  off_t	ptrval;	/* contents of chain ptr in index record */
  off_t	ptroff;	/* offset of chain ptr that points to this index record */
  off_t	chainoff;/* offset of hash chain for this index record */
  off_t	hashoff;/* offset in index file of hash table */
  int	nhash;	/* current hash table size */
  long	cnt_delok;	/* delete OK */
  long	cnt_delerr;	/* delete error */
  long	cnt_fetchok;/* fetch OK */
  long	cnt_fetcherr;/* fetch error */
  long	cnt_nextrec;/* nextrec */
 /* long	cnt_stor1;	 store: mail_INSERT, no empty, appended */
 /*long	cnt_stor2;	 store: mail_INSERT, found empty, reused */
 /*long	cnt_stor3;	 store: mail_REPLACE, diff data len, appended */
 /*long	cnt_stor4;	 store: mail_REPLACE, same data len, overwrote */
 /*long	cnt_storerr; store error */

} MAIL;

typedef	unsigned long	hash_t;	/* hash values */

			/* user-callable functions */
MAIL	*mail_open(const char *, int, int);
void	 mail_close(MAIL *);
char	*mail_fetch(MAIL *, struct message *);
int	 mail_store(MAIL *, struct message *);
int	 mail_delete(MAIL *, const char *);
void	 mail_rewind(MAIL *);
char	*mail_nextrec(MAIL *, char *);
void	 mail_stats(MAIL *);

			/* internal functions */
MAIL		*_mail_alloc(int);
int		 _mail_checkfree(MAIL *);
int		 _mail_dodelete(MAIL *);
int		 _mail_emptykey(char *);
int		 _mail_find(MAIL *, const char *, int);
int		 _mail_findfree(MAIL *, int, int);
int		 _mail_free(MAIL *);
hash_t	 _mail_hash(MAIL *, const char *);
char	*_mail_nextkey(MAIL *);
char	*_mail_readdat(MAIL *);
off_t	 _mail_readidx(MAIL *, off_t,int);
off_t	 _mail_readptr(MAIL *, off_t);
void	 _mail_writedat(MAIL *, const char *, off_t, int);
void	 _mail_writeidx(MAIL *, struct message *, off_t, int, off_t);
void	 _mail_writeptr(MAIL *, off_t, off_t);
void     _mail_gethint(struct message*); 

#include	"interface.h"