/*
* Copyright (c) 1985 Corporation for Research and Educational Networking
* Copyright (c) 1988 University of Illinois Board of Trustees, Steven
*              Dorner, and Paul Pomes
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
*    must display the following acknowledgement:
*      This product includes software developed by the Corporation for
*      Research and Educational Networking (CREN), the University of
*      Illinois at Urbana, and their contributors.
* 4. Neither the name of CREN, the University nor the names of their
*    contributors may be used to endorse or promote products derived from
*    this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE TRUSTEES AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED.  IN NO EVENT SHALL THE TRUSTEES OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)$Id: qdb.h,v 1.1 1994/03/25 14:58:18 paul Exp $
*/

#ifndef QDB_H
#define QDB_H
#include "conf.h"
#define PTRTYPE long    /* type to use for record pointers */
#define PTRSIZE sizeof(PTRTYPE) /* size of a record pointer */

/*
* d_record sizes.  The total size should be DRECSIZE.  The number of bytes
* for data is found by subtracting the sizes of the other fields from this.
*/
#define NDCHARS (DRECSIZE - 2*PTRSIZE - 2*sizeof(long) - 2*sizeof(short))

/*
* d_ovrflo sizes.  The total size should be DOVRSIZE.  The number of bytes
* for data is found by subtracting the sizes of the other fields from this.
*/
#define NDOCHARS (DOVRSIZE - PTRSIZE)

/*
* iindex sizes.  The total size should be NICHARS.  The number of pointers
* available is dependent on the size of a pointer...
*/
#define NIPTRS  (NICHARS/PTRSIZE)
#define NOPTRS  (NOCHARS/PTRSIZE)       /* 1K index overflow blocks */

#define EMPTY    '\377'         /* delete signifies a once used but now empty
                                * node */
#define MAXTRIES 32
#define NHASH   32

/* structures for Nameserver database */

struct iindex
{
       union
       {
               char    ii_string[NICHARS];
               PTRTYPE ii_recptrs[NIPTRS];
       }       i_i;
};

#define i_string i_i.ii_string
#define i_recptrs i_i.ii_recptrs

struct d_record
{
       PTRTYPE d_ovrptr;               /* ptr to ovrflo block ( if any ) */
       PTRTYPE d_id;                   /* unique id */
       time_t  d_crdate;               /* date of creation */
       time_t  d_chdate;               /* date of last modification */
       unsigned short d_dead;          /* deleted entry */
       unsigned short d_datalen;       /* length of data that follows */
       char    d_data[NDCHARS];        /* various strings, variable length */
};
typedef struct d_record DREC;

struct d_ovrflo
{
       char    d_mdata[NDOCHARS];
       PTRTYPE d_nextptr;              /* ptr to next ovrflo block */
};
typedef struct d_ovrflo DOVR;

struct dirhead
{                               /* in block 0 of the .dir file */
       PTRTYPE nents;          /* number of entries in the .dir file */
       PTRTYPE next_id;        /* the next id capable of being issued */
       int     hashes[NHASH];  /* # of hashes to find index entries */
       int     nfree;          /* number of free entries in freelist,(not
                                * cur used) */
       int     freel[10];
};
#endif