/* $XConsortium: Xdmcp.h,v 1.9 95/06/07 18:30:59 gildea Exp $ */
/*
 * Copyright 1989 Network Computing Devices, Inc., Mountain View, California.
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose and without fee is hereby granted, provided
 * that the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of N.C.D. not be used in advertising or
 * publicity pertaining to distribution of the software without specific,
 * written prior permission.  N.C.D. makes no representations about the
 * suitability of this software for any purpose.  It is provided "as is"
 * without express or implied warranty.
 *
 */

#ifndef _XDMCP_H_
#define _XDMCP_H_
#define XDM_PROTOCOL_VERSION	1
#define XDM_UDP_PORT		177
#define XDM_MAX_MSGLEN		8192
#define XDM_MIN_RTX		2
#define XDM_MAX_RTX		32
#define XDM_RTX_LIMIT		7
#define XDM_KA_RTX_LIMIT	4
#define XDM_DEF_DORMANCY	(3 * 60)	/* 3 minutes */
#define XDM_MAX_DORMANCY	(24 * 60 * 60)	/* 24 hours */

typedef enum {
    BROADCAST_QUERY = 1, QUERY, INDIRECT_QUERY, FORWARD_QUERY,
    WILLING, UNWILLING, REQUEST, ACCEPT, DECLINE, MANAGE, REFUSE, 
    FAILED, KEEPALIVE, ALIVE 
} xdmOpCode;

typedef enum {
    XDM_QUERY, XDM_BROADCAST, XDM_INDIRECT, XDM_COLLECT_QUERY,
    XDM_COLLECT_BROADCAST_QUERY, XDM_COLLECT_INDIRECT_QUERY,
    XDM_START_CONNECTION, XDM_AWAIT_REQUEST_RESPONSE,
    XDM_AWAIT_MANAGE_RESPONSE, XDM_MANAGE, XDM_RUN_SESSION, XDM_OFF,
    XDM_AWAIT_USER_INPUT, XDM_KEEPALIVE, XDM_AWAIT_ALIVE_RESPONSE
} xdmcp_states;

#ifdef NOTDEF
/* table of hosts */

#define XDM_MAX_STR_LEN 21
#define XDM_MAX_HOSTS 20
struct xdm_host_table {
  struct sockaddr_in sockaddr;
  char name[XDM_MAX_STR_LEN];
  char status[XDM_MAX_STR_LEN];
};
#endif /* NOTDEF */

typedef CARD8	*CARD8Ptr;
typedef CARD16	*CARD16Ptr;
typedef CARD32	*CARD32Ptr;

typedef struct _ARRAY8 {
    CARD16	length;
    CARD8Ptr	data;
} ARRAY8, *ARRAY8Ptr;

typedef struct _ARRAY16 {
    CARD8	length;
    CARD16Ptr	data;
} ARRAY16, *ARRAY16Ptr;

typedef struct _ARRAY32 {
    CARD8	length;
    CARD32Ptr	data;
} ARRAY32, *ARRAY32Ptr;

typedef struct _ARRAYofARRAY8 {
    CARD8	length;
    ARRAY8Ptr	data;
} ARRAYofARRAY8, *ARRAYofARRAY8Ptr;

typedef struct _XdmcpHeader {
    CARD16  version, opcode, length;
} XdmcpHeader, *XdmcpHeaderPtr;

typedef struct _XdmcpBuffer {
    BYTE    *data;
    int	    size;		/* size of buffer pointed by to data */
    int	    pointer;		/* current index into data */
    int	    count;		/* bytes read from network into data */
} XdmcpBuffer, *XdmcpBufferPtr;

typedef struct _XdmAuthKey {
    BYTE    data[8];
} XdmAuthKeyRec, *XdmAuthKeyPtr;


/* implementation-independent network address structure.
   Equiv to sockaddr* for sockets and netbuf* for STREAMS. */

typedef char *XdmcpNetaddr;


extern int XdmcpWriteCARD8(),		XdmcpWriteCARD16();
extern int XdmcpWriteCARD32();
extern int XdmcpWriteARRAY8(),		XdmcpWriteARRAY16();
extern int XdmcpWriteARRAY32(),		XdmcpWriteARRAYofARRAY8();
extern int XdmcpWriteHeader(),		XdmcpFlush();

extern int XdmcpReadCARD8(),		XdmcpReadCARD16();
extern int XdmcpReadCARD32();
extern int XdmcpReadARRAY8(),		XdmcpReadARRAY16();
extern int XdmcpReadARRAY32(),		XdmcpReadARRAYofARRAY8();
extern int XdmcpReadHeader(),		XdmcpFill();

extern int  XdmcpReadRemaining();

extern void XdmcpDisposeARRAY8(),	XdmcpDisposeARRAY16();
extern void XdmcpDisposeARRAY32(),	XdmcpDisposeARRAYofARRAY8();

extern int XdmcpCopyARRAY8();

extern int XdmcpARRAY8Equal();

#ifdef HASXDMAUTH
extern void XdmcpGenerateKey();
extern void XdmcpIncrementKey();
extern void XdmcpDecrementKey();
extern void XdmcpWrap();
extern void XdmcpUnwrap();
#endif

#ifndef TRUE
#define TRUE	1
#define FALSE	0
#endif

#if !defined(Xalloc) && !defined(xalloc) && !defined(Xrealloc)
extern long *Xalloc (), *Xrealloc ();
extern void Xfree();
#endif

#endif /* _XDMCP_H_ */
