/*
**  NETLIBDEF.H
**
**  Definitions for use with NETLIB routines.
**
**  COPYRIGHT © 1993, 1997  MADGOAT SOFTWARE.  ALL RIGHTS RESERVED.
**
**  MODIFICATION HISTORY:
**
**  29-Sep-1993	    Madison 	Initial coding.
**  11-Mar-1997	    Madison 	DNS updates, courtesy Claudio Allocchio.
**  27-Nov-1997	    Madison 	Add NETLIB_M_FLUSH.
*/
#ifndef __NETLIBDEF_H_LOADED__
#define __NETLIBDEF_H_LOADED__

#define NETLIB_K_TYPE_STREAM	    	1
#define NETLIB_K_TYPE_DGRAM 	    	2

#define NETLIB_K_OPTION_REUSEADDR   0x04
#define NETLIB_K_OPTION_KEEPALIVE   0x08
#define NETLIB_K_OPTION_BROADCAST   0x20

#define NETLIB_K_OPTION_SNDBUF	    0x1001
#define NETLIB_K_OPTION_RCVBUF	    0x1002
#define NETLIB_K_OPTION_SNDLOWAT    0x1003
#define NETLIB_K_OPTION_RCVLOWAT    0x1004

#define NETLIB_K_LEVEL_SOCKET	    0xffff

#define NETLIB_K_AF_INET    	    	2

#define NETLIB_K_LOOKUP_DNS 	    	1
#define NETLIB_K_LOOKUP_HOST_TABLE  	2

#define NETLIB_K_SHUTDOWN_RECEIVER  	0
#define NETLIB_K_SHUTDOWN_SENDER    	1
#define NETLIB_K_SHUTDOWN_BOTH	    	2

#define NETLIB_M_ALLOW_LF   	    (1<<0)
#define NETLIB_M_FLUSH	    	    (1<<1)

#define NETLIB_M_DOMAIN_SEARCH	    (1<<0)
#define NETLIB_M_NO_RECURSION	    (1<<1)

#define NETLIB_K_DNS_TYPE_A 	  0x01
#define NETLIB_K_DNS_TYPE_NS	  0x02
#define NETLIB_K_DNS_TYPE_MD	  0x03
#define NETLIB_K_DNS_TYPE_MF	  0x04
#define NETLIB_K_DNS_TYPE_CNAME	  0x05
#define NETLIB_K_DNS_TYPE_SOA	  0x06
#define NETLIB_K_DNS_TYPE_MB	  0x07
#define NETLIB_K_DNS_TYPE_MG	  0x08
#define NETLIB_K_DNS_TYPE_MR	  0x09
#define NETLIB_K_DNS_TYPE_NULL	  0x0A
#define NETLIB_K_DNS_TYPE_WKS	  0x0B
#define NETLIB_K_DNS_TYPE_PTR	  0x0C
#define NETLIB_K_DNS_TYPE_HINFO	  0x0D
#define NETLIB_K_DNS_TYPE_MINFO	  0x0E
#define NETLIB_K_DNS_TYPE_MX	  0x0F
#define NETLIB_K_DNS_TYPE_TXT	  0x10
#define NETLIB_K_DNS_TYPE_RP      0x11
#define NETLIB_K_DNS_TYPE_AFSDB   0x12
#define NETLIB_K_DNS_TYPE_X25     0x13
#define NETLIB_K_DNS_TYPE_ISDN    0x14
#define NETLIB_K_DNS_TYPE_RT      0x15
#define NETLIB_K_DNS_TYPE_NSAP    0x16
#define NETLIB_K_DNS_TYPE_NSAP_PTR 0x17
#define NETLIB_K_DNS_TYPE_SIG     0x18
#define NETLIB_K_DNS_TYPE_KEY     0x19
#define NETLIB_K_DNS_TYPE_PX      0x1A
#define NETLIB_K_DNS_TYPE_GPOS    0x1B
#define NETLIB_K_DNS_TYPE_AAAA    0x1C
#define NETLIB_K_DNS_TYPE_LOC     0x1D

#define NETLIB_K_DNS_TYPE_UINFO   0x64
#define NETLIB_K_DNS_TYPE_UID     0x65
#define NETLIB_K_DNS_TYPE_GID     0x66
#define NETLIB_K_DNS_TYPE_UNSPEC  0x67

#define NETLIB_K_DNS_TYPE_AXFR    0xFC
#define NETLIB_K_DNS_TYPE_MAILB   0xFD
#define NETLIB_K_DNS_TYPE_MAILA   0xFE

#define NETLIB_K_DNS_QTYPE_ALL	      0xFF

#define NETLIB_K_DNS_CLASS_IN	  0x01
#define NETLIB_K_DNS_CLASS_CS	  0x02
#define NETLIB_K_DNS_CLASS_CH	  0x03
#define NETLIB_K_DNS_CLASS_HS	  0x04
#define NETLIB_K_DNS_QCLASS_ALL	  0xFF

#define NETLIB_K_DNS_OP_STDQ	  0
#define NETLIB_K_DNS_OP_INVQ	  1
#define NETLIB_K_DNS_OP_STATUS	  2

#define NETLIB_K_DNS_RC_SUCCESS	  0
#define NETLIB_K_DNS_RC_FMTERR	  1
#define NETLIB_K_DNS_RC_SRVFAIL	  2
#define NETLIB_K_DNS_RC_NAMERR	  3
#define NETLIB_K_DNS_RC_NOTIMP	  4
#define NETLIB_K_DNS_RC_REFUSE	  5

#ifdef __ALPHA
#pragma member_alignment save
#pragma nomember_alignment
#endif

#pragma nostandard
    struct NETLIB_DNS_HEADER {
    	unsigned short dns_w_queryid;
    	variant_union {
    	    unsigned short dns_w_flags;
    	    variant_struct {
    	    	unsigned int dns_v_recursion_desired    : 1;
    	    	unsigned int dns_v_truncated    	: 1;
    	    	unsigned int dns_v_authoritative	: 1;
    	    	unsigned int dns_v_opcode	    	: 4;
    	    	unsigned int dns_v_reply	    	: 1;
    	    	unsigned int dns_v_reply_code   	: 4;
    	    	unsigned int dns_v_xx_unsused_xx	: 3;
    	    	unsigned int dns_v_recursion_available  : 1;
    	    } dns_x_flags;
    	} dns_r_flags_overlay;
    	unsigned short dns_w_qdcount;
    	unsigned short dns_w_ancount;
    	unsigned short dns_w_nscount;
    	unsigned short dns_w_arcount;
    };
#pragma standard


    struct SOCKADDRDEF {
    	unsigned short sockaddr_w_family;
    	unsigned char  sockaddr_x_data[14];
    };

    struct INADDRDEF {
    	unsigned long inaddr_l_addr;
    };

    struct SINDEF {
    	unsigned short sin_w_family;
    	unsigned short sin_w_port;
    	struct INADDRDEF sin_x_addr;
    	unsigned char sin_x_mbz[8];
    };

    struct NETLIBIOSBDEF {
    	unsigned short iosb_w_status;
    	unsigned short iosb_w_count;
    	unsigned long  iosb_l_unused;
    };

#define NETLIB_S_MXRR_NAME  128
    struct MXRRDEF {
    	unsigned int mxrr_l_preference;
    	unsigned int mxrr_l_length;
    	char	     mxrr_t_name[NETLIB_S_MXRR_NAME];
    };

#ifdef __ALPHA
#pragma member_alignment restore
#endif

#define netlib_word_swap(x) ((((x)>>8)&0xff)|(((x)&0xff)<<8 ))
#define netlib_long_swap(x) ((((x)>>24)&0xff)|(((x)>>8)&0xff00)|(((x)&0xff00)<<8)|((x)<<24))

#ifndef __NETLIB_BUILD__

#ifdef __cplusplus
extern "C" {
#endif
    unsigned int netlib_socket(void **socket, ...);
    unsigned int netlib_server_setup(void **socket, void *sa, unsigned int *salen);
    unsigned int netlib_bind(void **socket, void *sa, unsigned int *salen, ...);
    unsigned int netlib_getsockname(void **socket, void *sa,
    	    	    unsigned int *sasize, unsigned int *salen, ...);
    unsigned int netlib_getpeername(void **socket, void *sa,
    	    	    unsigned int *sasize, unsigned int *salen, ...);
    unsigned int netlib_connect(void **socket, void *sa, unsigned int *salen, ...);
    unsigned int netlib_write(void **socket, void *bufdsc, ...);
    unsigned int netlib_writeline(void **socket, void *bufdsc, ...);
    unsigned int netlib_read(void **socket, void *bufdsc, ...);
    unsigned int netlib_readline(void **socket, void *bufdsc, ...);
    unsigned int netlib_shutdown(void **socket, ...);
    unsigned int netlib_close(void **socket, ...);
    unsigned int netlib_listen(void **socket, ...);
    unsigned int netlib_accept(void **socket, void **newsock, ...);
    unsigned int netlib_get_hostname(void *bufdsc, ...);
    unsigned int netlib_setsockopt(void **socket, unsigned int *level,
    	    	    unsigned int *option, void *value, unsigned int *vallen, ...);
    unsigned int netlib_getsockopt(void **socket, unsigned int *level,
    	    	    unsigned int *option, void *buffer, unsigned int *bufsize, ...);
    unsigned int netlib_name_to_address(void **socket, unsigned int *which, void *namdsc,
    	    	    void *addrlist, unsigned int *addrlistsize, ...);
    unsigned int netlib_address_to_name(void *socket, unsigned int *which, void *addr,
    	    	    unsigned int *addrsize, void *namdsc, ...);
    int netlib_dns_skipname(unsigned char *bufp, unsigned short *buflen);
    unsigned int netlib_dns_expandname(unsigned char *buf, unsigned short *buflen,
    	    	    unsigned char *bufp, void *namdsc, ...);
    unsigned int netlib_dns_query(void **socket, void *namdsc,
    	    	    unsigned int *class, unsigned int *type,
    	    	    unsigned char *buf, unsigned short *bufsize, ...);
    unsigned int netlib_strtoaddr(void *dsc, struct INADDRDEF *a);
    unsigned int netlib_addrtostr(struct INADDRDEF *a, void *dsc, ...);
    unsigned int netlib_connect_by_name(void **socket,
    	    	    void *dsc, unsigned short *port, ...);
    unsigned int netlib_dns_mx_lookup(void **socket, void *dsc,
    	    	    void *mxrr, unsigned int *mxrrsize, ...);
    unsigned int netlib_hton_long(unsigned int *value);
    unsigned int netlib_ntoh_long(unsigned int *value);
    unsigned short netlib_hton_word(unsigned short *value);
    unsigned short netlib_ntoh_word(unsigned short *value);
    unsigned int   netlib_version(void *dsc, ...);

#ifdef __cplusplus
}
#endif

#endif /* not __NETLIB_BUILD__ */
#endif /* __NETLIBDEF_H_LOADED__ */
