Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
libinnhist(3)		   InterNetNews Documentation		   libinnhist(3)

NAME
     his - routines for managing INN history

SYNOPSIS
	 #include <inn/history.h>

	 struct history;
	 struct token;

	 struct histstats {
	     int hitpos;
	     int hitneg;
	     int misses;
	     int dne;
	 };

	 #define HIS_RDONLY ...
	 #define HIS_RDWR ...
	 #define HIS_CREAT ...
	 #define HIS_ONDISK ...
	 #define HIS_INCORE ...
	 #define HIS_MMAP ...

	 enum {
	     HISCTLG_PATH,
	     HISCTLS_PATH,
	     HISCTLS_SYNCCOUNT,
	     HISCTLS_NPAIRS,
	     HISCTLS_IGNOREOLD,
	     HISCTLS_STATINTERVAL
	 };

	 struct history *HISopen(const char *path, const char *method,
				 int flags);

	 bool HISclose(struct history *history);

	 bool HISsync(struct history *history);

	 void HISsetcache(struct history *history, size_t size);

	 bool HISlookup(struct history *history, const char *key,
			time_t *arrived, time_t *posted, time_t *expires,
			TOKEN *token);

	 bool HIScheck(struct history *history, const char *key);

	 bool HISwrite(struct history *history, const char *key,
		       time_t arrived, time_t posted, time_t expires,
		       const TOKEN *token);

	 bool HISremember(struct history *history, const char *key,
			  time_t arrived, time_t posted);

	 bool HISreplace(struct history *history, const char *key,
			 time_t arrived, time_t posted, time_t expires,
			 const TOKEN *token);

	 bool HISexpire(struct history *history, const char *path,
			const char *reason, bool writing, void *cookie,
			time_t threshold,
			bool (*exists)(void *cookie, time_t arrived,
				       time_t posted, time_t expires,
				       const TOKEN *token));

	 bool HISwalk(struct history *history, const char *reason,
		      void *cookie,
		      bool (*callback)(void *cookie, const HASH *hash,
				       time_t arrived, time_t posted,
				       time_t expires,
				       const TOKEN *token));

	 struct histstats HISstats(struct history *history);

	 const char *HISerror(struct history *history);

	 bool HISctl(struct history *history, int request, void *val);

DESCRIPTION
     These  functions provide access to the INN history database.  They maintain
     key/value pairs in an opaque database whilst providing for expiry	of  out-
     dated information.

     The history structure is an opaque handle returned from HISopen.

     The  HISopen  function  opens the history file designated by path using the
     mode flags using the specified method.  flags may be HIS_RDONLY to indicate
     that read-only access to the history database is desired, or  HIS_RDWR  for
     read/write  access.  History methods are defined at build time; the history
     method currently available is "hisv6".  On success a newly initialised his-
     tory handle is returned, or NULL on failure.

     HIS_ONDISK, HIS_INCORE and HIS_MMAP may be logically  ORed  into  flags  to
     provide a hint to the underlying history manager as to how it should handle
     its  data files; HIS_ONDISK indicates that the caller would like as much of
     the data to be kept on disk (and out of memory), HIS_INCORE indicates  that
     the  data	files  should be kept in main memory where possible and HIS_MMAP
     that the files  should  be  mmap()ed  into  the  processes  address  space.
     HIS_INCORE  is  typically used where a mass rebuild of the history database
     is being performed; the underlying history  manager  may  assume  that  the
     caller will call HISsync() to sync the data files to disk.

     The  HIS_CREAT  flag  indicates  that  the  history database should be ini-
     tialised as new; if any options which affect creation of the database  need
     to  be set an anonymous history handle should be created by calling HISopen
     with path set to NULL, any options set  using  HISctl,  then  the	database
     opened by calling HISctl with HISCTLS_PATH.

     The  HISclose  function  closes  the handle history and deallocates any re-
     sources associated with it.  It returns false on failure or  true	on  suc-
     cess.

     The  HISsync  function synchronises any outstanding transactions associated
     with history to disk.

     HISsetcache associates a cache used for speeding up HIScheck with	history.
     The cache will occupy approximately size bytes.

     HISlookup	retrieves a token from history based on the passed key (normally
     the Message-ID).  If no entry with an associated token can be  found,  HIS-
     lookup will return false.	If a token is found arrived, expires, and posted
     are  filled  in with the message arrival, expiry, and posting times respec-
     tively (or zero, if the time component is not available),	in  addition  to
     token being set to the retrieved token and a function return value of true.
     Any  of  arrived,	expires, posted, or token may be NULL in which case that
     component is not returned to  the	caller,  without  affecting  the  return
     value.

     HIScheck  checks the database history for key (normally the Message-ID); if
     key has previously been set  via  HISwrite,  HIScheck  returns  true,  else
     false.

     HISwrite  writes  a  new entry to the database history associated with key.
     arrived, posted, and expired specify the arrival, posting, and expiry  time
     respectively;  posted  and  expired  may be specified as <= 0 in which case
     that component shall be treated as absent in the database.  token is  asso-
     ciated  with the specified key.  HISwrite returns true on success, or false
     on failure.  The behaviour when key is not unique with respect to	the  ex-
     isting entries in history is unspecified.

     HISremember writes a new entry to the database history associated with key,
     merely  remembering  that this key has been seen, together with its arrival
     time arrived and also its posting time posted, if known.	(Otherwise,  its
     posting  time  may be specified as <= 0 in case it is absent.)  HISremember
     returns true on success, or false on failure.  The behaviour  when  key  is
     not unique with respect to the existing entries in history is unspecified.

     HISreplace  replaces  an existing entry in the database history, associated
     with key.	arrived, posted, expired specify the arrival, posting and expiry
     time respectively; posted and expired may be specified as	<=  0  in  which
     case  that  component shall be treated as absent in the database.	token is
     associated with the specified key; if NULL then the history database merely
     remembers that this key has been seen,  together  with  its  arrival  time.
     HISreplace returns true on success, or false on failure.

     HISexpire	expires the history database associated with history, creating a
     new, replacement, database in the same location if path is NULL, or in path
     if not NULL; if path is not NULL then the replacement of  the  old  history
     database  with  the  new  one is assumed to be performed out of band by the
     caller.  The writing flag is normally passed as true, if you  wish  to  in-
     hibit  writing of the new database (and so merely see the callbacks), writ-
     ing may be set false.

     If the underlying history mechanism needs to pause the server,  the  reason
     string  is used as the argument to the `ctlinnd pause' command, and as such
     the server should be reserved by the caller prior to calling HISexpire;  if
     the  caller  wishes  to  inhibit  pausing	of the server, passing NULL will
     achieve this.  If reason is not NULL, then on successful return from HISex-
     pire the server will be left paused and the caller should unpause it.

     The history database is scanned and entries with an associated storage  to-
     ken are passed to the discrimination function exists.

     If  exists()  returns false it indicates that stored entity associated with
     token is no longer available (or no longer required), and therefore the as-
     sociated history entry may be expired once  it  meets  the  threshold  con-
     straint.  If exists() returns true the entry is kept as-is in the newly ex-
     pired history database.

     The exists function is passed the arrival, posting and expiry times, in ad-
     dition  to  the  token associated with the entry.	Note that posting and/or
     expiry may be zero, but that the token will never be NULL (such entries are
     handled solely via the threshold mechanism).  The storage token  passed  to
     the  discrimination  function  may  be updated if required (for example, as
     might be needed by a hierarchical storage management implementation).

     Entries in the database with a posting time less than threshold with no to-
     ken associated with them are deleted from the database.  In case the  post-
     ing time is unknown, the arrival time is used instead.

     The  parameter  cookie is passed to the discrimination function, and may be
     used for any purpose required by the caller.

     If the discrimination function attempts to access the  underlying	database
     (for read or write) during the callback, the behaviour is unspecified.

     HISwalk  provides an iteration function for the specified history database.
     For every entry in the history database, callback is invoked,  passing  the
     cookie,  the  message-ID hash, arrival, posting, and expiry times, in addi-
     tion to the token associated with the entry.  If the entry has  no  storage
     token  (a remembered message-ID), token is NULL.  If the callback() returns
     false the iteration is aborted and HISwalk returns  false	to  the  caller.
     Malformed history lines are silently skipped.

     To  process the entire database in the presence of a running server, reason
     may be passed; if this argument is not NULL, it is used as an  an	argument
     to  the  `ctlinnd	(reserve|pause|go)' commands.  If reason is NULL and the
     server is running, the behaviour of HISwalk is undefined.

     If the callback function attempts to access the underlying database  during
     the callback, the behaviour is unspecified.

     HISstats  returns statistics on the history cache mechanism; given a handle
     history, the return value is a struct histstats detailing:

     "hitpos"
	 The number of times an item was found directly in the cache  and  known
	 to exist in the underlying history manager.

     "hitneg"
	 The  number  of times an item was found directly in the cache and known
	 not to exist in the underlying history manager.

     "misses"
	 The number of times an item was not found directly in the cache, but on
	 retrieval from the underlying history manager was found to exist.

     "dne"
	 The number of times an item was not found directly in the cache, but on
	 retrieval from the underlying history manager was found not to exist.

     Note that the history cache is only checked by HIScheck and  only	affected
     by  HIScheck,  HISwrite,  HISremember  and HISreplace.  Following a call to
     HISstats the history statistics associated with history are cleared.

     HISerror returns a string describing the most recent error associated  with
     history;  the format and content of these strings is history manager depen-
     dent.  Note that on setting an error, the history API will  call  the  warn
     function from libinn(3).

     HISctl provides a control interface to the underlying history manager.  The
     request  argument determines the type of the request and the meaning of the
     val argument.  The values for request are:

     "HISCTLG_PATH" (const char **)
	 Get the base file path which the history handle represents.  val should
	 be a pointer to a location of type const char *.  The result  must  not
	 later be passed to free(3).

     "HISCTLS_PATH" (const char *)
	 Set  the base file path which this history handle should use; typically
	 this  is  used  after	an  anonymous  handle  has  been  created  using
	 HISopen(NULL,	...).	val  should  be a value of type const char * and
	 will be copied before being stored internally.

     "HISCTLS_SYNCCOUNT" (size_t *)
	 Set an upper bound on how many history operations  may  be  pending  in
	 core  before  being synced to permanent storage; 0 indicates unlimited.
	 val should be a pointer to a value of type size_t and will not be modi-
	 fied by the call.

     "HISCTLS_NPAIRS" (size_t *)
	 Set a hint to the to the underlying history manager as to how many  en-
	 tries	there  are  expected  to be in the history database; 0 indicates
	 that an automatic or default sizing should be made.  val  should  be  a
	 pointer to a value of type size_t and will not be modified by the call.

     "HISCTLS_IGNOREOLD" (bool *)
	 Instruct  the	underlying  history  manager to ignore existing database
	 when creating new ones; typically this option may be set to true if the
	 administrator believes that the existing history  database  is  corrupt
	 and  that  ignoring it may help.  val should be a pointer to a value of
	 type bool and will not be modified by the call.

     "HISCTLS_STATINTERVAL" (time_t *)
	 For the history v6 and tagged hash managers, set the interval, in  sec-
	 onds, between stat(2)s of the history files checking for replaced files
	 (as  happens  during expire); this option is typically used by nnrpd(8)
	 like applications.  val should be a pointer to a value of  type  time_t
	 and will not be modified by the call.

HISTORY
     Written by Alex Kiernan <alexk@demon.net> for InterNetNews 2.4.0.

INN 2.8.0			   2026-05-23			   libinnhist(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=libinnhist&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help