/******************************************************************************
 * This file is part of a software distribution, which is furnished under the *
 * terms of a license.  Use of this software  by any means is subject to this *
 * license  and  signifies  the  acceptance of  the  licensing  terms  stated *
 * therein. Please see  the file LICENSE in the  top-level directory  of this *
 * software  distribution  for detailed copyright  disclaimers  and licensing *
 * terms.                                                                     *
 ******************************************************************************
 * Copryight (c) by Andreas S. Wetzel - All rights reserved.                  *
 ******************************************************************************/

/* $Id: if_telnet.h,v 1.2 2001/03/19 14:54:06 mickey Exp $ */

#ifndef __IF_TELNET_H__
#define __IF_TELNET_H__

#include <arpa/telnet.h>

/*-------------------------------------------*
 | Yuck! SunOS seems to be a bit out of date |
 | with its options in <arpa/telnet.h>       |
 *-------------------------------------------*/

#ifndef ABORT
  #define ABORT 238
#endif
#ifndef SUSP
  #define SUSP 237
#endif
#ifndef xEOF
  #define xEOF 236
#endif

#ifndef TELOPT_NAWS
  #define TELOPT_NAWS 31
#endif
#ifndef TELOPT_NEW_ENVIRON
  #define TELOPT_NEW_ENVIRON 39
#endif

/*----------------------------------------------*
 | Some makros to deal with TELNET option names |
 *----------------------------------------------*/

#define	NTOPTS		(1+TELOPT_NEW_ENVIRON)
#define	TOPT_FIRST	TELOPT_BINARY
#define	TOPT_LAST	TELOPT_NEW_ENVIRON
#define	TOPT_OK(x)	((unsigned int)(x) <= TOPT_LAST)
#define	TOPT(x)		topts[(x)-TOPT_FIRST]

/*-----------------------------------*
 | Operating states of tel_filter(); |
 *-----------------------------------*/

#define	MODE_DATA	0x00
#define	MODE_IAC	0x01
#define MODE_WILL	0x02
#define MODE_WONT	0x04
#define MODE_DO		0x08
#define MODE_DONT	0x10
#define MODE_SB		0x20
#define MODE_SE		0x40

/*---------------------------*
 | Telnet option state masks | 
 *---------------------------*/

#define STATE_DO	0x01
#define WANT_STATE_DO	0x02
#define STATE_WILL	0x04
#define	WANT_STATE_WILL	0x08

/*--------------------------------*
 | Makros to deal with suboptions |
 *--------------------------------*/

#define	SUB_BUFSIZE			256

#define	SUB_CLEAR()			(sub_bufptr = &subopt_buf[0])
#define	SUB_STORE(c)			if(sub_bufptr < (u_char *)(subopt_buf + SUB_BUFSIZE)) \
						{ *sub_bufptr++ = (u_char) c; }
#define	SUB_FLUSH()			{sub_endptr = sub_bufptr; SUB_CLEAR(); }
#define SUB_GET()			((*sub_bufptr++) & 0xff)
#define	SUB_EOF()			(sub_bufptr >= sub_endptr)
#define	SUB_LEN()			(sub_endptr - sub_bufptr) 

/*----------------------------------*
 | Macros to check&set option state |
 *----------------------------------*/

#define	MY_STATE_DO			STATE_DO
#define	MY_STATE_WILL			STATE_WILL
#define	MY_WANT_STATE_DO		WANT_STATE_DO
#define	MY_WANT_STATE_WILL		WANT_STATE_WILL

#define	HIS_STATE_DO			STATE_WILL
#define	HIS_STATE_WILL			STATE_DO
#define	HIS_WANT_STATE_DO		WANT_STATE_WILL
#define	HIS_WANT_STATE_WILL		WANT_STATE_DO

#define	my_state_is_do(opt)		(tel_option[opt] & STATE_DO)
#define	my_state_is_will(opt)		(tel_option[opt] & STATE_WILL)
#define	my_want_state_is_do(opt)	(tel_option[opt] & WANT_STATE_DO)
#define	my_want_state_is_will(opt)	(tel_option[opt] & WANT_STATE_WILL)

#define	his_state_is_do			my_state_is_will
#define	his_state_is_will		my_state_is_do
#define	his_want_state_is_do		my_want_state_is_will
#define	his_want_state_is_will		my_want_state_is_do

#define my_state_is_dont(opt)		(!my_state_is_do(opt))
#define	my_state_is_wont(opt)		(!my_state_is_will(opt))
#define	my_want_state_is_dont(opt)	(!my_want_state_is_do(opt))
#define	my_want_state_is_wont(opt)	(!my_want_state_is_will(opt))

#define his_state_is_dont		my_state_is_wont
#define	his_state_is_wont		my_state_is_dont
#define	his_want_state_is_dont		my_want_state_is_wont
#define	his_want_state_is_wont		my_want_state_is_dont

#define	set_my_state_do(opt)		(tel_option[opt] |= STATE_DO)
#define	set_my_state_will(opt)		(tel_option[opt] |= STATE_WILL)
#define	set_my_want_state_do(opt)	(tel_option[opt] |= WANT_STATE_DO)
#define	set_my_want_state_will(opt)	(tel_option[opt] |= WANT_STATE_WILL)

#define	set_his_state_do		set_my_state_will
#define	set_his_state_will		set_my_state_do
#define	set_his_want_state_do		set_my_want_state_will
#define	set_his_want_state_will		set_my_want_state_do

#define	set_my_state_dont(opt)		(tel_option[opt] &= ~STATE_DO)
#define set_my_state_wont(opt)		(tel_option[opt] &= ~STATE_WILL)
#define	set_my_want_state_dont(opt)	(tel_option[opt] &= ~WANT_STATE_DO)
#define	set_my_want_state_wont(opt)	(tel_option[opt] &= ~WANT_STATE_WILL)

#define	set_his_state_dont		set_my_state_wont
#define set_his_state_wont		set_my_state_dont
#define	set_his_want_state_dont		set_my_want_state_wont
#define	set_his_want_state_wont		set_my_want_state_dont

#define	my_will_wont_differs(opt)	((tel_option[opt] + STATE_WILL) & WANT_STATE_WILL)
#define	my_do_dont_differs(opt)		((tel_option[opt] + STATE_DO) & WANT_STATE_DO)

#define	his_will_wont_differs		my_do_dont_differs
#define	his_do_dont_differs		my_will_wont_differs

#endif /* __IF_TELNET_H__ */


syntax highlighted by Code2HTML, v. 0.9.1