/* * history - handle a news history file * * Copyright (C) 1992/93/94 Stephen Hebditch . * All rights reserved. TQM Communications, BCM Box 225, London, WC1N 3XX. * * See README for more information and disclaimers * * Routines to open and close a C-News style history file and determine * whether or not a particular message id exists in the history file. * * $Id: history.c,v 1.9 1995/01/10 12:53:13 root Exp $ * * $Log: history.c,v $ * Revision 1.9 1995/01/10 12:53:13 root * Moved includes from slurp.h. * Added support for Gnu DBM. * Always return TRUE in check_id if no_history_flag is set. * * Revision 1.7 1993/06/07 11:07:14 root * If neither DBZ, DBM or NDBM are defined then don't carry out * any history file lookups. * * Revision 1.6 1993/04/22 18:07:11 root * No changes - put back in RCS after the RCS file went missing... * * Revision 1.4 1993/02/14 14:51:59 root * No changes. * * Revision 1.0 1992/09/92 * Initial coding. * */ #include "conf.h" /* POSIX headers */ #define _POSIX_SOURCE 1 #include #include #include #include #include #include #include #include /* Local headers */ #include "slurp.h" /* DBM / DBZ / GDBM / NDBM headers */ #if defined (DBM) #undef NULL #include #undef NULL #define NULL 0 #elif defined (DBZ) #include #elif defined (GDBM) #include static GDBM_FILE db; #elif defined (NDBM) #include static DBM *db = NULL; #endif /* * open_history - Open history file */ int open_history () { #if defined (DBM) || defined (DBZ) if (dbminit (HISTORY_FILE) < 0) return (1); #elif defined (GDBM) if ((db = gdbm_open (HISTORY_FILE, 4096, GDBM_READER, 0, 0)) == NULL) return (1); #elif defined (NDBM) if ((db = dbm_open (HISTORY_FILE, O_RDONLY, 0)) == NULL) return (1); #endif return (0); } /* * close_history - Close history file */ void close_history () { #if defined (DBM) || defined (DBZ) (void) dbmclose (); #elif defined (GDBM) gdbm_close (db); #elif defined (NDBM) dbm_close (db); #endif } /* * Determine if message id already exists in the history file */ int check_id (const char *message_id) { #if defined (DBM) || defined (DBZ) || defined (GDBM) || defined (NDBM) datum k, d; /* Now check for presence with dbm/ndbm */ k.dptr = (char *) message_id; k.dsize = strlen (message_id) + 1; if (no_history_flag) return (TRUE); #endif #if defined (DBM) || defined (DBZ) d = fetch (k); return (d.dptr == NULL); #elif defined (GDBM) d = gdbm_fetch (db, k); return (d.dptr == NULL); #elif defined (NDBM) d = dbm_fetch (db, k); return (d.dptr == NULL); #else return (TRUE); #endif } /* END-OF-FILE */