2021-10-11 18:37:13 -03:00

138 lines
4.3 KiB
C

/* @(#)nsdb.h 1.1 94/10/31 SMI */
/* Copyright (c) 1984 AT&T */
/* All Rights Reserved */
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
/* The copyright notice above does not evidence any */
/* actual or intended publication of such source code. */
/* #ident "@(#)libns:nsdb.h 1.4" */
/*****************************************************************
*
* nsdb.h contains structure and function definitions
* for the name server database. It should be included
* by any program that uses the database functions.
*
****************************************************************/
#ifndef RFS_SUCCESS
#define RFS_SUCCESS 1
#define RFS_FAILURE 0
#endif
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
/***** Defines *****/
#define NAMSIZ 15 /* directory name size + 1 */
#define MAXREC 100 /* maximum # of records in a domain */
#define NREC 10 /* number of records allocated at a time */
#define MAXNS 10 /* maximum # of ns records in a domain */
#define WHITESP "\t \n"
/***** Macros *****/
#define isauth(d,t) ((d->d_auth)&t) /* d is domain ptr, t is NS or SOA */
#define setauth(d,t) (d->d_auth=t) /* d is domain ptr, t is NS, SOA or 0 */
#define readdb(f) readfile(f,TRUE,FALSE)
#define merge(f,o) readfile(f,FALSE,o)
#define copystr(s) ((s)?(strcpy(malloc(strlen(s)+1),s)):NULL)
/***** Externs *****/
extern char Dname[]; /* domain name of this machine */
extern int Primary; /* TRUE or FALSE, is this ns primary */
extern struct address Addbuf; /* buffer for addr of current request */
extern struct address *Caddress; /* ptr to address of the current */
/* request, NULL if request is LOCAL */
/***** Structures *****/
struct rn {
char *rn_owner; /* full domain name of owner */
char *rn_desc; /* description of resource */
char *rn_path; /* pathname of resource */
long rn_flag; /* "permission" flag for res. */
};
struct domain {
long d_auth; /* TRUE if NS is authority for domain */
long d_size; /* # of records in d_rec */
struct res_rec **d_rec; /* resource records */
};
struct res_rec {
char rr_name[NAMSIZ]; /* resource, machine or domain name */
long rr_type; /* NS, SOA, RN, or DOM */
union rdata {
char *rd_data; /* data field */
struct rn *rd_rn; /* RN - resource data */
struct domain *rd_dom; /* DOM - domain */
} rr_rdata;
};
#define rr_data rr_rdata.rd_data
#define rr_ns rr_rdata.rd_data
#define rr_soa rr_rdata.rd_data
#define rr_a rr_rdata.rd_data
#define rr_dom rr_rdata.rd_dom
#define rr_dauth rr_rdata.rd_dom->d_auth
#define rr_dsize rr_rdata.rd_dom->d_size
#define rr_drec rr_rdata.rd_dom->d_rec
#define rr_rn rr_rdata.rd_rn
#define rr_owner rr_rdata.rd_rn->rn_owner
#define rr_desc rr_rdata.rd_rn->rn_desc
#define rr_path rr_rdata.rd_rn->rn_path
#define rr_flag rr_rdata.rd_rn->rn_flag
struct question { /* general query format in request */
char *q_name;
long q_type;
};
struct header {
long h_version;
long h_flags;
long h_opcode;
long h_rcode;
long h_qdcnt;
long h_ancnt;
long h_nscnt;
long h_arcnt;
char *h_dname;
};
struct request {
struct header *rq_head;
struct question **rq_qd; /* query records */
struct res_rec **rq_an; /* answer and add records */
struct res_rec **rq_ns; /* ns records for forwarding */
struct res_rec **rq_ar; /* additional records */
};
/***** Access Functions ************************************************
*
* char *filename; file name
* char *name; fully qualified name
* struct res_rec *res_rec; resource record
* struct res_rec **reslist; resource record list (NULL Terminated)
* char *domain; fully qualified domain name
* int type; record type (NS, SOA, ...)
*
***********************************************************************/
int writedb(/* filename */); /* write db as Master file */
int readfile(/* filename, clear */); /* read db in Master format */
struct res_rec **findrr(/* name, type */); /* find rrs that match name */
int addrr(/* name, res_rec */); /* add rr to db, name is key */
int remrr(/* name, res_rec */); /* remove rr, name is key */
struct res_rec **iquery(/* domain, type, name */); /* inverse query */
struct res_rec **findind(/* name */); /* find remote NS or SOA */
char *getctype(/* type */); /* translate type to string */
int gettype(/* type_name */); /* trans. type name to int */