#ifndef __XNS_RR_H
#define __XNS_RR_H

#include<sys/types.h>

// just types:
#define	T_S		16	// number of T_ses
#define	T_A		1	// host addr
#define	T_NS		2	// authoritative ns
#define	T_MD		3	// mail dest (obs)
#define	T_MF		4	// mail forw (obs)
#define	T_CNAME		5	// canonical name
#define	T_SOA		6	// start of authority
#define	T_MB		7	// mailbox dname (exp)
#define	T_MG		8	// mailgroup member (exp)
#define	T_MR		9	// mail rename dname (exp)
#define	T_NULL		10	// null rr
#define	T_WKS		11	// well known service description
#define	T_PTR		12	// dname pointer
#define	T_HINFO		13	// host info
#define	T_MINFO		14	// mailbox/maillist info
#define	T_MX		15	// mail exchange
#define	T_TXT		16	// text strings
#define	T_ZONE		251	// for internal zone file format - global zone defs
// qtypes
#define T_AXFR		252
#define T_MAILB		253	// MB/MG/MR
#define	T_MAILA		254	// mail agent RRs (obs)
#define	T_ALL		255

// RR classes:
#define	C_S		4	// number of C_ses
#define	C_IN		1
#define	C_CS		2	// obs
#define	C_CH		3
#define	C_HS		4
// qclasses
#define	C_ANY		255

// Definition of one RR
typedef struct {
  // network byte order!
  // every char * begins with it's length
  char *name;
  u_int16_t rrtype;
  u_int16_t rrclass;
  int32_t ttl;
  u_int16_t rdlength;
  char *rdata; // isn't real string - exception
  union {
    struct {
      char *mname;
      char *rname;
      u_int32_t *serial;
      int32_t *refresh;
      int32_t *retry;
      int32_t *expire;
      u_int32_t *minimum;
    } soa;
    struct {
      int16_t *preference;
      char *exchange;
    } mx;
  } e;
} rr_t;

extern int read_raw_rr(int, rr_t *); /* reads rr_t from file (fd) */
extern int dump_raw_rr(int, rr_t *); /* dumps rr_t into file (fd) */

extern void domain2labels(char *);
extern void labels2domain(char *);

#endif
