Move the telnetd with encryption to src/secure
This needs tidying up and having makefiles sorted out later. Reviewed by: Geoff Rehmet
This commit is contained in:
parent
54df3c12f9
commit
daf079cb54
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor-crypto/eBones/dist/; revision=2050
37
eBones/libexec/telnetd/Makefile
Normal file
37
eBones/libexec/telnetd/Makefile
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# @(#)Makefile 8.2 (Berkeley) 12/15/93
|
||||||
|
|
||||||
|
PROG= telnetd
|
||||||
|
CFLAGS+=-DLINEMODE -DKLUDGELINEMODE -DUSE_TERMIO -DDIAGNOSTICS
|
||||||
|
CFLAGS+=-DOLD_ENVIRON -DENV_HACK
|
||||||
|
CFLAGS+=-I${.CURDIR}/../../lib
|
||||||
|
#CFLAGS+=-DAUTHENTICATION -DENCRYPTION
|
||||||
|
SRCS= authenc.c global.c slc.c state.c sys_term.c telnetd.c \
|
||||||
|
termstat.c utility.c
|
||||||
|
DPADD= ${LIBUTIL} ${LIBTERM}
|
||||||
|
LDADD= -lutil -ltermcap -ltelnet
|
||||||
|
#LDADD+= -lkrb -ldes
|
||||||
|
MAN8= telnetd.8
|
||||||
|
|
||||||
|
# These are the sources that have encryption stuff in them.
|
||||||
|
CRYPT_SRC= authenc.c ext.h state.c telnetd.c termstat.c
|
||||||
|
CRYPT_SRC+= utility.c Makefile
|
||||||
|
NOCRYPT_DIR=${.CURDIR}/Nocrypt
|
||||||
|
|
||||||
|
.include <bsd.prog.mk>
|
||||||
|
|
||||||
|
nocrypt:
|
||||||
|
#ifdef ENCRYPTION
|
||||||
|
@for i in ${CRYPT_SRC}; do \
|
||||||
|
if [ ! -d ${NOCRYPT_DIR} ]; then \
|
||||||
|
echo Creating subdirectory ${NOCRYPT_DIR}; \
|
||||||
|
mkdir ${NOCRYPT_DIR}; \
|
||||||
|
fi; \
|
||||||
|
echo ${NOCRYPT_DIR}/$$i; \
|
||||||
|
unifdef -UENCRYPTION ${.CURDIR}/$$i | \
|
||||||
|
sed "s/ || defined(ENCRYPTION)//" > ${NOCRYPT_DIR}/$$i; \
|
||||||
|
done
|
||||||
|
|
||||||
|
placeholder:
|
||||||
|
#else /* ENCRYPTION */
|
||||||
|
@echo "Encryption code already removed."
|
||||||
|
#endif /* ENCRYPTION */
|
91
eBones/libexec/telnetd/authenc.c
Normal file
91
eBones/libexec/telnetd/authenc.c
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 1991, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)authenc.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#if defined(AUTHENTICATION) || defined(ENCRYPTION)
|
||||||
|
#include "telnetd.h"
|
||||||
|
#include <libtelnet/misc.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
net_write(str, len)
|
||||||
|
unsigned char *str;
|
||||||
|
int len;
|
||||||
|
{
|
||||||
|
if (nfrontp + len < netobuf + BUFSIZ) {
|
||||||
|
bcopy((void *)str, (void *)nfrontp, len);
|
||||||
|
nfrontp += len;
|
||||||
|
return(len);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
net_encrypt()
|
||||||
|
{
|
||||||
|
#ifdef ENCRYPTION
|
||||||
|
char *s = (nclearto > nbackp) ? nclearto : nbackp;
|
||||||
|
if (s < nfrontp && encrypt_output) {
|
||||||
|
(*encrypt_output)((unsigned char *)s, nfrontp - s);
|
||||||
|
}
|
||||||
|
nclearto = nfrontp;
|
||||||
|
#endif /* ENCRYPTION */
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
telnet_spin()
|
||||||
|
{
|
||||||
|
ttloop();
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
telnet_getenv(val)
|
||||||
|
char *val;
|
||||||
|
{
|
||||||
|
extern char *getenv();
|
||||||
|
return(getenv(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
telnet_gets(prompt, result, length, echo)
|
||||||
|
char *prompt;
|
||||||
|
char *result;
|
||||||
|
int length;
|
||||||
|
int echo;
|
||||||
|
{
|
||||||
|
return((char *)0);
|
||||||
|
}
|
||||||
|
#endif /* defined(AUTHENTICATION) || defined(ENCRYPTION) */
|
296
eBones/libexec/telnetd/defs.h
Normal file
296
eBones/libexec/telnetd/defs.h
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)defs.h 8.1 (Berkeley) 6/4/93
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Telnet server defines
|
||||||
|
*/
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
#ifndef BSD
|
||||||
|
# define BSD 43
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CRAY) && !defined(LINEMODE)
|
||||||
|
# define SYSV_TERMIO
|
||||||
|
# define LINEMODE
|
||||||
|
# define KLUDGELINEMODE
|
||||||
|
# define DIAGNOSTICS
|
||||||
|
# if defined(UNICOS50) && !defined(UNICOS5)
|
||||||
|
# define UNICOS5
|
||||||
|
# endif
|
||||||
|
# if !defined(UNICOS5)
|
||||||
|
# define BFTPDAEMON
|
||||||
|
# define HAS_IP_TOS
|
||||||
|
# endif
|
||||||
|
#endif /* CRAY */
|
||||||
|
#if defined(UNICOS5) && !defined(NO_SETSID)
|
||||||
|
# define NO_SETSID
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PRINTOPTIONS) && defined(DIAGNOSTICS)
|
||||||
|
#define TELOPTS
|
||||||
|
#define TELCMDS
|
||||||
|
#define SLC_NAMES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SYSV_TERMIO) && !defined(USE_TERMIO)
|
||||||
|
# define USE_TERMIO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#ifndef CRAY
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#endif /* CRAY */
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/file.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#ifndef FILIO_H
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#else
|
||||||
|
#include <sys/filio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#include <arpa/telnet.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifdef __STDC__
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#ifndef LOG_DAEMON
|
||||||
|
#define LOG_DAEMON 0
|
||||||
|
#endif
|
||||||
|
#ifndef LOG_ODELAY
|
||||||
|
#define LOG_ODELAY 0
|
||||||
|
#endif
|
||||||
|
#include <ctype.h>
|
||||||
|
#ifndef NO_STRING_H
|
||||||
|
#include <string.h>
|
||||||
|
#else
|
||||||
|
#include <strings.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef USE_TERMIO
|
||||||
|
#include <sgtty.h>
|
||||||
|
#else
|
||||||
|
# ifdef SYSV_TERMIO
|
||||||
|
# include <termio.h>
|
||||||
|
# else
|
||||||
|
# include <termios.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if !defined(USE_TERMIO) || defined(NO_CC_T)
|
||||||
|
typedef unsigned char cc_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __STDC__
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _POSIX_VDISABLE
|
||||||
|
# ifdef VDISABLE
|
||||||
|
# define _POSIX_VDISABLE VDISABLE
|
||||||
|
# else
|
||||||
|
# define _POSIX_VDISABLE ((unsigned char)'\377')
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CRAY
|
||||||
|
# ifdef CRAY1
|
||||||
|
# include <sys/pty.h>
|
||||||
|
# ifndef FD_ZERO
|
||||||
|
# include <sys/select.h>
|
||||||
|
# endif /* FD_ZERO */
|
||||||
|
# endif /* CRAY1 */
|
||||||
|
|
||||||
|
#include <memory.h>
|
||||||
|
#endif /* CRAY */
|
||||||
|
|
||||||
|
#ifdef __hpux
|
||||||
|
#include <sys/ptyio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(TIOCSCTTY) && defined(TCSETCTTY)
|
||||||
|
# define TIOCSCTTY TCSETCTTY
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FD_SET
|
||||||
|
#ifndef HAVE_fd_set
|
||||||
|
typedef struct fd_set { int fds_bits[1]; } fd_set;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FD_SET(n, p) ((p)->fds_bits[0] |= (1<<(n)))
|
||||||
|
#define FD_CLR(n, p) ((p)->fds_bits[0] &= ~(1<<(n)))
|
||||||
|
#define FD_ISSET(n, p) ((p)->fds_bits[0] & (1<<(n)))
|
||||||
|
#define FD_ZERO(p) ((p)->fds_bits[0] = 0)
|
||||||
|
#endif /* FD_SET */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* I/O data buffers defines
|
||||||
|
*/
|
||||||
|
#define NETSLOP 64
|
||||||
|
#ifdef CRAY
|
||||||
|
#undef BUFSIZ
|
||||||
|
#define BUFSIZ 2048
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define NIACCUM(c) { *netip++ = c; \
|
||||||
|
ncc++; \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clock manipulations */
|
||||||
|
#define settimer(x) (clocks.x = ++clocks.system)
|
||||||
|
#define sequenceIs(x,y) (clocks.x < clocks.y)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Linemode support states, in decreasing order of importance
|
||||||
|
*/
|
||||||
|
#define REAL_LINEMODE 0x04
|
||||||
|
#define KLUDGE_OK 0x03
|
||||||
|
#define NO_AUTOKLUDGE 0x02
|
||||||
|
#define KLUDGE_LINEMODE 0x01
|
||||||
|
#define NO_LINEMODE 0x00
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structures of information for each special character function.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
unsigned char flag; /* the flags for this function */
|
||||||
|
cc_t val; /* the value of the special character */
|
||||||
|
} slcent, *Slcent;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
slcent defset; /* the default settings */
|
||||||
|
slcent current; /* the current settings */
|
||||||
|
cc_t *sptr; /* a pointer to the char in */
|
||||||
|
/* system data structures */
|
||||||
|
} slcfun, *Slcfun;
|
||||||
|
|
||||||
|
#ifdef DIAGNOSTICS
|
||||||
|
/*
|
||||||
|
* Diagnostics capabilities
|
||||||
|
*/
|
||||||
|
#define TD_REPORT 0x01 /* Report operations to client */
|
||||||
|
#define TD_EXERCISE 0x02 /* Exercise client's implementation */
|
||||||
|
#define TD_NETDATA 0x04 /* Display received data stream */
|
||||||
|
#define TD_PTYDATA 0x08 /* Display data passed to pty */
|
||||||
|
#define TD_OPTIONS 0x10 /* Report just telnet options */
|
||||||
|
#endif /* DIAGNOSTICS */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We keep track of each side of the option negotiation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MY_STATE_WILL 0x01
|
||||||
|
#define MY_WANT_STATE_WILL 0x02
|
||||||
|
#define MY_STATE_DO 0x04
|
||||||
|
#define MY_WANT_STATE_DO 0x08
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macros to check the current state of things
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define my_state_is_do(opt) (options[opt]&MY_STATE_DO)
|
||||||
|
#define my_state_is_will(opt) (options[opt]&MY_STATE_WILL)
|
||||||
|
#define my_want_state_is_do(opt) (options[opt]&MY_WANT_STATE_DO)
|
||||||
|
#define my_want_state_is_will(opt) (options[opt]&MY_WANT_STATE_WILL)
|
||||||
|
|
||||||
|
#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 set_my_state_do(opt) (options[opt] |= MY_STATE_DO)
|
||||||
|
#define set_my_state_will(opt) (options[opt] |= MY_STATE_WILL)
|
||||||
|
#define set_my_want_state_do(opt) (options[opt] |= MY_WANT_STATE_DO)
|
||||||
|
#define set_my_want_state_will(opt) (options[opt] |= MY_WANT_STATE_WILL)
|
||||||
|
|
||||||
|
#define set_my_state_dont(opt) (options[opt] &= ~MY_STATE_DO)
|
||||||
|
#define set_my_state_wont(opt) (options[opt] &= ~MY_STATE_WILL)
|
||||||
|
#define set_my_want_state_dont(opt) (options[opt] &= ~MY_WANT_STATE_DO)
|
||||||
|
#define set_my_want_state_wont(opt) (options[opt] &= ~MY_WANT_STATE_WILL)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tricky code here. What we want to know is if the MY_STATE_WILL
|
||||||
|
* and MY_WANT_STATE_WILL bits have the same value. Since the two
|
||||||
|
* bits are adjacent, a little arithmatic will show that by adding
|
||||||
|
* in the lower bit, the upper bit will be set if the two bits were
|
||||||
|
* different, and clear if they were the same.
|
||||||
|
*/
|
||||||
|
#define my_will_wont_is_changing(opt) \
|
||||||
|
((options[opt]+MY_STATE_WILL) & MY_WANT_STATE_WILL)
|
||||||
|
|
||||||
|
#define my_do_dont_is_changing(opt) \
|
||||||
|
((options[opt]+MY_STATE_DO) & MY_WANT_STATE_DO)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make everything symetrical
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HIS_STATE_WILL MY_STATE_DO
|
||||||
|
#define HIS_WANT_STATE_WILL MY_WANT_STATE_DO
|
||||||
|
#define HIS_STATE_DO MY_STATE_WILL
|
||||||
|
#define HIS_WANT_STATE_DO MY_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 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_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_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 his_will_wont_is_changing my_do_dont_is_changing
|
||||||
|
#define his_do_dont_is_changing my_will_wont_is_changing
|
240
eBones/libexec/telnetd/ext.h
Normal file
240
eBones/libexec/telnetd/ext.h
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)ext.h 8.2 (Berkeley) 12/15/93
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Telnet server variable declarations
|
||||||
|
*/
|
||||||
|
extern char options[256];
|
||||||
|
extern char do_dont_resp[256];
|
||||||
|
extern char will_wont_resp[256];
|
||||||
|
extern int linemode; /* linemode on/off */
|
||||||
|
#ifdef LINEMODE
|
||||||
|
extern int uselinemode; /* what linemode to use (on/off) */
|
||||||
|
extern int editmode; /* edit modes in use */
|
||||||
|
extern int useeditmode; /* edit modes to use */
|
||||||
|
extern int alwayslinemode; /* command line option */
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
extern int lmodetype; /* Client support for linemode */
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
extern int flowmode; /* current flow control state */
|
||||||
|
extern int restartany; /* restart output on any character state */
|
||||||
|
#ifdef DIAGNOSTICS
|
||||||
|
extern int diagnostic; /* telnet diagnostic capabilities */
|
||||||
|
#endif /* DIAGNOSTICS */
|
||||||
|
#ifdef BFTPDAEMON
|
||||||
|
extern int bftpd; /* behave as bftp daemon */
|
||||||
|
#endif /* BFTPDAEMON */
|
||||||
|
#if defined(SecurID)
|
||||||
|
extern int require_SecurID;
|
||||||
|
#endif
|
||||||
|
#if defined(AUTHENTICATION)
|
||||||
|
extern int auth_level;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern slcfun slctab[NSLC + 1]; /* slc mapping table */
|
||||||
|
|
||||||
|
char *terminaltype;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* I/O data buffers, pointers, and counters.
|
||||||
|
*/
|
||||||
|
extern char ptyobuf[BUFSIZ+NETSLOP], *pfrontp, *pbackp;
|
||||||
|
|
||||||
|
extern char netibuf[BUFSIZ], *netip;
|
||||||
|
|
||||||
|
extern char netobuf[BUFSIZ+NETSLOP], *nfrontp, *nbackp;
|
||||||
|
extern char *neturg; /* one past last bye of urgent data */
|
||||||
|
|
||||||
|
extern int pcc, ncc;
|
||||||
|
|
||||||
|
#if defined(CRAY2) && defined(UNICOS5)
|
||||||
|
extern int unpcc; /* characters left unprocessed by CRAY-2 terminal routine */
|
||||||
|
extern char *unptyip; /* pointer to remaining characters in buffer */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern int pty, net;
|
||||||
|
extern char *line;
|
||||||
|
extern int SYNCHing; /* we are in TELNET SYNCH mode */
|
||||||
|
|
||||||
|
#ifndef P
|
||||||
|
# ifdef __STDC__
|
||||||
|
# define P(x) x
|
||||||
|
# else
|
||||||
|
# define P(x) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void
|
||||||
|
_termstat P((void)),
|
||||||
|
add_slc P((int, int, int)),
|
||||||
|
check_slc P((void)),
|
||||||
|
change_slc P((int, int, int)),
|
||||||
|
cleanup P((int)),
|
||||||
|
clientstat P((int, int, int)),
|
||||||
|
copy_termbuf P((char *, int)),
|
||||||
|
deferslc P((void)),
|
||||||
|
defer_terminit P((void)),
|
||||||
|
do_opt_slc P((unsigned char *, int)),
|
||||||
|
doeof P((void)),
|
||||||
|
dooption P((int)),
|
||||||
|
dontoption P((int)),
|
||||||
|
edithost P((char *, char *)),
|
||||||
|
fatal P((int, char *)),
|
||||||
|
fatalperror P((int, char *)),
|
||||||
|
get_slc_defaults P((void)),
|
||||||
|
init_env P((void)),
|
||||||
|
init_termbuf P((void)),
|
||||||
|
interrupt P((void)),
|
||||||
|
localstat P((void)),
|
||||||
|
flowstat P((void)),
|
||||||
|
netclear P((void)),
|
||||||
|
netflush P((void)),
|
||||||
|
#ifdef DIAGNOSTICS
|
||||||
|
printoption P((char *, int)),
|
||||||
|
printdata P((char *, char *, int)),
|
||||||
|
printsub P((int, unsigned char *, int)),
|
||||||
|
#endif
|
||||||
|
ptyflush P((void)),
|
||||||
|
putchr P((int)),
|
||||||
|
putf P((char *, char *)),
|
||||||
|
recv_ayt P((void)),
|
||||||
|
send_do P((int, int)),
|
||||||
|
send_dont P((int, int)),
|
||||||
|
send_slc P((void)),
|
||||||
|
send_status P((void)),
|
||||||
|
send_will P((int, int)),
|
||||||
|
send_wont P((int, int)),
|
||||||
|
sendbrk P((void)),
|
||||||
|
sendsusp P((void)),
|
||||||
|
set_termbuf P((void)),
|
||||||
|
start_login P((char *, int, char *)),
|
||||||
|
start_slc P((int)),
|
||||||
|
#if defined(AUTHENTICATION)
|
||||||
|
start_slave P((char *)),
|
||||||
|
#else
|
||||||
|
start_slave P((char *, int, char *)),
|
||||||
|
#endif
|
||||||
|
suboption P((void)),
|
||||||
|
telrcv P((void)),
|
||||||
|
ttloop P((void)),
|
||||||
|
tty_binaryin P((int)),
|
||||||
|
tty_binaryout P((int));
|
||||||
|
|
||||||
|
extern int
|
||||||
|
end_slc P((unsigned char **)),
|
||||||
|
getnpty P((void)),
|
||||||
|
#ifndef convex
|
||||||
|
getpty P((int *)),
|
||||||
|
#endif
|
||||||
|
login_tty P((int)),
|
||||||
|
spcset P((int, cc_t *, cc_t **)),
|
||||||
|
stilloob P((int)),
|
||||||
|
terminit P((void)),
|
||||||
|
termstat P((void)),
|
||||||
|
tty_flowmode P((void)),
|
||||||
|
tty_restartany P((void)),
|
||||||
|
tty_isbinaryin P((void)),
|
||||||
|
tty_isbinaryout P((void)),
|
||||||
|
tty_iscrnl P((void)),
|
||||||
|
tty_isecho P((void)),
|
||||||
|
tty_isediting P((void)),
|
||||||
|
tty_islitecho P((void)),
|
||||||
|
tty_isnewmap P((void)),
|
||||||
|
tty_israw P((void)),
|
||||||
|
tty_issofttab P((void)),
|
||||||
|
tty_istrapsig P((void)),
|
||||||
|
tty_linemode P((void));
|
||||||
|
|
||||||
|
extern void
|
||||||
|
tty_rspeed P((int)),
|
||||||
|
tty_setecho P((int)),
|
||||||
|
tty_setedit P((int)),
|
||||||
|
tty_setlinemode P((int)),
|
||||||
|
tty_setlitecho P((int)),
|
||||||
|
tty_setsig P((int)),
|
||||||
|
tty_setsofttab P((int)),
|
||||||
|
tty_tspeed P((int)),
|
||||||
|
willoption P((int)),
|
||||||
|
wontoption P((int)),
|
||||||
|
writenet P((unsigned char *, int));
|
||||||
|
|
||||||
|
#ifdef ENCRYPTION
|
||||||
|
extern void (*encrypt_output) P((unsigned char *, int));
|
||||||
|
extern int (*decrypt_input) P((int));
|
||||||
|
extern char *nclearto;
|
||||||
|
#endif /* ENCRYPTION */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following are some clocks used to decide how to interpret
|
||||||
|
* the relationship between various variables.
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern struct {
|
||||||
|
int
|
||||||
|
system, /* what the current time is */
|
||||||
|
echotoggle, /* last time user entered echo character */
|
||||||
|
modenegotiated, /* last time operating mode negotiated */
|
||||||
|
didnetreceive, /* last time we read data from network */
|
||||||
|
ttypesubopt, /* ttype subopt is received */
|
||||||
|
tspeedsubopt, /* tspeed subopt is received */
|
||||||
|
environsubopt, /* environ subopt is received */
|
||||||
|
oenvironsubopt, /* old environ subopt is received */
|
||||||
|
xdisplocsubopt, /* xdisploc subopt is received */
|
||||||
|
baseline, /* time started to do timed action */
|
||||||
|
gotDM; /* when did we last see a data mark */
|
||||||
|
} clocks;
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(CRAY2) && defined(UNICOS5)
|
||||||
|
extern int needtermstat;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DEFAULT_IM
|
||||||
|
# ifdef CRAY
|
||||||
|
# define DEFAULT_IM "\r\n\r\nCray UNICOS (%h) (%t)\r\n\r\r\n\r"
|
||||||
|
# else
|
||||||
|
# ifdef sun
|
||||||
|
# define DEFAULT_IM "\r\n\r\nSunOS UNIX (%h) (%t)\r\n\r\r\n\r"
|
||||||
|
# else
|
||||||
|
# ifdef ultrix
|
||||||
|
# define DEFAULT_IM "\r\n\r\nULTRIX (%h) (%t)\r\n\r\r\n\r"
|
||||||
|
# else
|
||||||
|
# define DEFAULT_IM "\r\n\r\n4.4 BSD UNIX (%h) (%t)\r\n\r\r\n\r"
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
48
eBones/libexec/telnetd/global.c
Normal file
48
eBones/libexec/telnetd/global.c
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)global.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate global variables. We do this
|
||||||
|
* by including the header file that defines
|
||||||
|
* them all as externs, but first we define
|
||||||
|
* the keyword "extern" to be nothing, so that
|
||||||
|
* we will actually allocate the space.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "defs.h"
|
||||||
|
#define extern
|
||||||
|
#include "ext.h"
|
55
eBones/libexec/telnetd/pathnames.h
Normal file
55
eBones/libexec/telnetd/pathnames.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)pathnames.h 8.1 (Berkeley) 6/4/93
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if BSD > 43
|
||||||
|
|
||||||
|
# include <paths.h>
|
||||||
|
|
||||||
|
# ifndef _PATH_LOGIN
|
||||||
|
# define _PATH_LOGIN "/usr/bin/login"
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
# define _PATH_TTY "/dev/tty"
|
||||||
|
# ifndef _PATH_LOGIN
|
||||||
|
# define _PATH_LOGIN "/bin/login"
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BFTPDAEMON
|
||||||
|
#define BFTPPATH "/usr/ucb/bftp"
|
||||||
|
#endif /* BFTPDAEMON */
|
493
eBones/libexec/telnetd/slc.c
Normal file
493
eBones/libexec/telnetd/slc.c
Normal file
@ -0,0 +1,493 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)slc.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "telnetd.h"
|
||||||
|
|
||||||
|
#ifdef LINEMODE
|
||||||
|
/*
|
||||||
|
* local varibles
|
||||||
|
*/
|
||||||
|
static unsigned char *def_slcbuf = (unsigned char *)0;
|
||||||
|
static int def_slclen = 0;
|
||||||
|
static int slcchange; /* change to slc is requested */
|
||||||
|
static unsigned char *slcptr; /* pointer into slc buffer */
|
||||||
|
static unsigned char slcbuf[NSLC*6]; /* buffer for slc negotiation */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* send_slc
|
||||||
|
*
|
||||||
|
* Write out the current special characters to the client.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
send_slc()
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send out list of triplets of special characters
|
||||||
|
* to client. We only send info on the characters
|
||||||
|
* that are currently supported.
|
||||||
|
*/
|
||||||
|
for (i = 1; i <= NSLC; i++) {
|
||||||
|
if ((slctab[i].defset.flag & SLC_LEVELBITS) == SLC_NOSUPPORT)
|
||||||
|
continue;
|
||||||
|
add_slc((unsigned char)i, slctab[i].current.flag,
|
||||||
|
slctab[i].current.val);
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end of send_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* default_slc
|
||||||
|
*
|
||||||
|
* Set pty special characters to all the defaults.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
default_slc()
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
for (i = 1; i <= NSLC; i++) {
|
||||||
|
slctab[i].current.val = slctab[i].defset.val;
|
||||||
|
if (slctab[i].current.val == (cc_t)(_POSIX_VDISABLE))
|
||||||
|
slctab[i].current.flag = SLC_NOSUPPORT;
|
||||||
|
else
|
||||||
|
slctab[i].current.flag = slctab[i].defset.flag;
|
||||||
|
if (slctab[i].sptr) {
|
||||||
|
*(slctab[i].sptr) = slctab[i].defset.val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
slcchange = 1;
|
||||||
|
|
||||||
|
} /* end of default_slc */
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* get_slc_defaults
|
||||||
|
*
|
||||||
|
* Initialize the slc mapping table.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
get_slc_defaults()
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
init_termbuf();
|
||||||
|
|
||||||
|
for (i = 1; i <= NSLC; i++) {
|
||||||
|
slctab[i].defset.flag =
|
||||||
|
spcset(i, &slctab[i].defset.val, &slctab[i].sptr);
|
||||||
|
slctab[i].current.flag = SLC_NOSUPPORT;
|
||||||
|
slctab[i].current.val = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end of get_slc_defaults */
|
||||||
|
|
||||||
|
#ifdef LINEMODE
|
||||||
|
/*
|
||||||
|
* add_slc
|
||||||
|
*
|
||||||
|
* Add an slc triplet to the slc buffer.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
add_slc(func, flag, val)
|
||||||
|
register char func, flag;
|
||||||
|
register cc_t val;
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((*slcptr++ = (unsigned char)func) == 0xff)
|
||||||
|
*slcptr++ = 0xff;
|
||||||
|
|
||||||
|
if ((*slcptr++ = (unsigned char)flag) == 0xff)
|
||||||
|
*slcptr++ = 0xff;
|
||||||
|
|
||||||
|
if ((*slcptr++ = (unsigned char)val) == 0xff)
|
||||||
|
*slcptr++ = 0xff;
|
||||||
|
|
||||||
|
} /* end of add_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* start_slc
|
||||||
|
*
|
||||||
|
* Get ready to process incoming slc's and respond to them.
|
||||||
|
*
|
||||||
|
* The parameter getit is non-zero if it is necessary to grab a copy
|
||||||
|
* of the terminal control structures.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
start_slc(getit)
|
||||||
|
register int getit;
|
||||||
|
{
|
||||||
|
|
||||||
|
slcchange = 0;
|
||||||
|
if (getit)
|
||||||
|
init_termbuf();
|
||||||
|
(void) sprintf((char *)slcbuf, "%c%c%c%c",
|
||||||
|
IAC, SB, TELOPT_LINEMODE, LM_SLC);
|
||||||
|
slcptr = slcbuf + 4;
|
||||||
|
|
||||||
|
} /* end of start_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* end_slc
|
||||||
|
*
|
||||||
|
* Finish up the slc negotiation. If something to send, then send it.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
end_slc(bufp)
|
||||||
|
register unsigned char **bufp;
|
||||||
|
{
|
||||||
|
register int len;
|
||||||
|
void netflush();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If a change has occured, store the new terminal control
|
||||||
|
* structures back to the terminal driver.
|
||||||
|
*/
|
||||||
|
if (slcchange) {
|
||||||
|
set_termbuf();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the pty state has not yet been fully processed and there is a
|
||||||
|
* deferred slc request from the client, then do not send any
|
||||||
|
* sort of slc negotiation now. We will respond to the client's
|
||||||
|
* request very soon.
|
||||||
|
*/
|
||||||
|
if (def_slcbuf && (terminit() == 0)) {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (slcptr > (slcbuf + 4)) {
|
||||||
|
if (bufp) {
|
||||||
|
*bufp = &slcbuf[4];
|
||||||
|
return(slcptr - slcbuf - 4);
|
||||||
|
} else {
|
||||||
|
(void) sprintf((char *)slcptr, "%c%c", IAC, SE);
|
||||||
|
slcptr += 2;
|
||||||
|
len = slcptr - slcbuf;
|
||||||
|
writenet(slcbuf, len);
|
||||||
|
netflush(); /* force it out immediately */
|
||||||
|
DIAG(TD_OPTIONS, printsub('>', slcbuf+2, len-2););
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
} /* end of end_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* process_slc
|
||||||
|
*
|
||||||
|
* Figure out what to do about the client's slc
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
process_slc(func, flag, val)
|
||||||
|
register unsigned char func, flag;
|
||||||
|
register cc_t val;
|
||||||
|
{
|
||||||
|
register int hislevel, mylevel, ack;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ensure that we know something about this function
|
||||||
|
*/
|
||||||
|
if (func > NSLC) {
|
||||||
|
add_slc(func, SLC_NOSUPPORT, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Process the special case requests of 0 SLC_DEFAULT 0
|
||||||
|
* and 0 SLC_VARIABLE 0. Be a little forgiving here, don't
|
||||||
|
* worry about whether the value is actually 0 or not.
|
||||||
|
*/
|
||||||
|
if (func == 0) {
|
||||||
|
if ((flag = flag & SLC_LEVELBITS) == SLC_DEFAULT) {
|
||||||
|
default_slc();
|
||||||
|
send_slc();
|
||||||
|
} else if (flag == SLC_VARIABLE) {
|
||||||
|
send_slc();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Appears to be a function that we know something about. So
|
||||||
|
* get on with it and see what we know.
|
||||||
|
*/
|
||||||
|
|
||||||
|
hislevel = flag & SLC_LEVELBITS;
|
||||||
|
mylevel = slctab[func].current.flag & SLC_LEVELBITS;
|
||||||
|
ack = flag & SLC_ACK;
|
||||||
|
/*
|
||||||
|
* ignore the command if:
|
||||||
|
* the function value and level are the same as what we already have;
|
||||||
|
* or the level is the same and the ack bit is set
|
||||||
|
*/
|
||||||
|
if (hislevel == mylevel && (val == slctab[func].current.val || ack)) {
|
||||||
|
return;
|
||||||
|
} else if (ack) {
|
||||||
|
/*
|
||||||
|
* If we get here, we got an ack, but the levels don't match.
|
||||||
|
* This shouldn't happen. If it does, it is probably because
|
||||||
|
* we have sent two requests to set a variable without getting
|
||||||
|
* a response between them, and this is the first response.
|
||||||
|
* So, ignore it, and wait for the next response.
|
||||||
|
*/
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
change_slc(func, flag, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end of process_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* change_slc
|
||||||
|
*
|
||||||
|
* Process a request to change one of our special characters.
|
||||||
|
* Compare client's request with what we are capable of supporting.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
change_slc(func, flag, val)
|
||||||
|
register char func, flag;
|
||||||
|
register cc_t val;
|
||||||
|
{
|
||||||
|
register int hislevel, mylevel;
|
||||||
|
|
||||||
|
hislevel = flag & SLC_LEVELBITS;
|
||||||
|
mylevel = slctab[func].defset.flag & SLC_LEVELBITS;
|
||||||
|
/*
|
||||||
|
* If client is setting a function to NOSUPPORT
|
||||||
|
* or DEFAULT, then we can easily and directly
|
||||||
|
* accomodate the request.
|
||||||
|
*/
|
||||||
|
if (hislevel == SLC_NOSUPPORT) {
|
||||||
|
slctab[func].current.flag = flag;
|
||||||
|
slctab[func].current.val = (cc_t)_POSIX_VDISABLE;
|
||||||
|
flag |= SLC_ACK;
|
||||||
|
add_slc(func, flag, val);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (hislevel == SLC_DEFAULT) {
|
||||||
|
/*
|
||||||
|
* Special case here. If client tells us to use
|
||||||
|
* the default on a function we don't support, then
|
||||||
|
* return NOSUPPORT instead of what we may have as a
|
||||||
|
* default level of DEFAULT.
|
||||||
|
*/
|
||||||
|
if (mylevel == SLC_DEFAULT) {
|
||||||
|
slctab[func].current.flag = SLC_NOSUPPORT;
|
||||||
|
} else {
|
||||||
|
slctab[func].current.flag = slctab[func].defset.flag;
|
||||||
|
}
|
||||||
|
slctab[func].current.val = slctab[func].defset.val;
|
||||||
|
add_slc(func, slctab[func].current.flag,
|
||||||
|
slctab[func].current.val);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Client wants us to change to a new value or he
|
||||||
|
* is telling us that he can't change to our value.
|
||||||
|
* Some of the slc's we support and can change,
|
||||||
|
* some we do support but can't change,
|
||||||
|
* and others we don't support at all.
|
||||||
|
* If we can change it then we have a pointer to
|
||||||
|
* the place to put the new value, so change it,
|
||||||
|
* otherwise, continue the negotiation.
|
||||||
|
*/
|
||||||
|
if (slctab[func].sptr) {
|
||||||
|
/*
|
||||||
|
* We can change this one.
|
||||||
|
*/
|
||||||
|
slctab[func].current.val = val;
|
||||||
|
*(slctab[func].sptr) = val;
|
||||||
|
slctab[func].current.flag = flag;
|
||||||
|
flag |= SLC_ACK;
|
||||||
|
slcchange = 1;
|
||||||
|
add_slc(func, flag, val);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* It is not possible for us to support this
|
||||||
|
* request as he asks.
|
||||||
|
*
|
||||||
|
* If our level is DEFAULT, then just ack whatever was
|
||||||
|
* sent.
|
||||||
|
*
|
||||||
|
* If he can't change and we can't change,
|
||||||
|
* then degenerate to NOSUPPORT.
|
||||||
|
*
|
||||||
|
* Otherwise we send our level back to him, (CANTCHANGE
|
||||||
|
* or NOSUPPORT) and if CANTCHANGE, send
|
||||||
|
* our value as well.
|
||||||
|
*/
|
||||||
|
if (mylevel == SLC_DEFAULT) {
|
||||||
|
slctab[func].current.flag = flag;
|
||||||
|
slctab[func].current.val = val;
|
||||||
|
flag |= SLC_ACK;
|
||||||
|
} else if (hislevel == SLC_CANTCHANGE &&
|
||||||
|
mylevel == SLC_CANTCHANGE) {
|
||||||
|
flag &= ~SLC_LEVELBITS;
|
||||||
|
flag |= SLC_NOSUPPORT;
|
||||||
|
slctab[func].current.flag = flag;
|
||||||
|
} else {
|
||||||
|
flag &= ~SLC_LEVELBITS;
|
||||||
|
flag |= mylevel;
|
||||||
|
slctab[func].current.flag = flag;
|
||||||
|
if (mylevel == SLC_CANTCHANGE) {
|
||||||
|
slctab[func].current.val =
|
||||||
|
slctab[func].defset.val;
|
||||||
|
val = slctab[func].current.val;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
add_slc(func, flag, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end of change_slc */
|
||||||
|
|
||||||
|
#if defined(USE_TERMIO) && (VEOF == VMIN)
|
||||||
|
cc_t oldeofc = '\004';
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check_slc
|
||||||
|
*
|
||||||
|
* Check the special characters in use and notify the client if any have
|
||||||
|
* changed. Only those characters that are capable of being changed are
|
||||||
|
* likely to have changed. If a local change occurs, kick the support level
|
||||||
|
* and flags up to the defaults.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
check_slc()
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
for (i = 1; i <= NSLC; i++) {
|
||||||
|
#if defined(USE_TERMIO) && (VEOF == VMIN)
|
||||||
|
/*
|
||||||
|
* In a perfect world this would be a neat little
|
||||||
|
* function. But in this world, we should not notify
|
||||||
|
* client of changes to the VEOF char when
|
||||||
|
* ICANON is off, because it is not representing
|
||||||
|
* a special character.
|
||||||
|
*/
|
||||||
|
if (i == SLC_EOF) {
|
||||||
|
if (!tty_isediting())
|
||||||
|
continue;
|
||||||
|
else if (slctab[i].sptr)
|
||||||
|
oldeofc = *(slctab[i].sptr);
|
||||||
|
}
|
||||||
|
#endif /* defined(USE_TERMIO) && defined(SYSV_TERMIO) */
|
||||||
|
if (slctab[i].sptr &&
|
||||||
|
(*(slctab[i].sptr) != slctab[i].current.val)) {
|
||||||
|
slctab[i].current.val = *(slctab[i].sptr);
|
||||||
|
if (*(slctab[i].sptr) == (cc_t)_POSIX_VDISABLE)
|
||||||
|
slctab[i].current.flag = SLC_NOSUPPORT;
|
||||||
|
else
|
||||||
|
slctab[i].current.flag = slctab[i].defset.flag;
|
||||||
|
add_slc((unsigned char)i, slctab[i].current.flag,
|
||||||
|
slctab[i].current.val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* check_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* do_opt_slc
|
||||||
|
*
|
||||||
|
* Process an slc option buffer. Defer processing of incoming slc's
|
||||||
|
* until after the terminal state has been processed. Save the first slc
|
||||||
|
* request that comes along, but discard all others.
|
||||||
|
*
|
||||||
|
* ptr points to the beginning of the buffer, len is the length.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
do_opt_slc(ptr, len)
|
||||||
|
register unsigned char *ptr;
|
||||||
|
register int len;
|
||||||
|
{
|
||||||
|
register unsigned char func, flag;
|
||||||
|
cc_t val;
|
||||||
|
register unsigned char *end = ptr + len;
|
||||||
|
|
||||||
|
if (terminit()) { /* go ahead */
|
||||||
|
while (ptr < end) {
|
||||||
|
func = *ptr++;
|
||||||
|
if (ptr >= end) break;
|
||||||
|
flag = *ptr++;
|
||||||
|
if (ptr >= end) break;
|
||||||
|
val = (cc_t)*ptr++;
|
||||||
|
|
||||||
|
process_slc(func, flag, val);
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* save this slc buffer if it is the first, otherwise dump
|
||||||
|
* it.
|
||||||
|
*/
|
||||||
|
if (def_slcbuf == (unsigned char *)0) {
|
||||||
|
def_slclen = len;
|
||||||
|
def_slcbuf = (unsigned char *)malloc((unsigned)len);
|
||||||
|
if (def_slcbuf == (unsigned char *)0)
|
||||||
|
return; /* too bad */
|
||||||
|
bcopy(ptr, def_slcbuf, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end of do_opt_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* deferslc
|
||||||
|
*
|
||||||
|
* Do slc stuff that was deferred.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
deferslc()
|
||||||
|
{
|
||||||
|
if (def_slcbuf) {
|
||||||
|
start_slc(1);
|
||||||
|
do_opt_slc(def_slcbuf, def_slclen);
|
||||||
|
(void) end_slc(0);
|
||||||
|
free(def_slcbuf);
|
||||||
|
def_slcbuf = (unsigned char *)0;
|
||||||
|
def_slclen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end of deferslc */
|
||||||
|
|
||||||
|
#endif /* LINEMODE */
|
1620
eBones/libexec/telnetd/state.c
Normal file
1620
eBones/libexec/telnetd/state.c
Normal file
File diff suppressed because it is too large
Load Diff
2135
eBones/libexec/telnetd/sys_term.c
Normal file
2135
eBones/libexec/telnetd/sys_term.c
Normal file
File diff suppressed because it is too large
Load Diff
605
eBones/libexec/telnetd/telnetd.8
Normal file
605
eBones/libexec/telnetd/telnetd.8
Normal file
@ -0,0 +1,605 @@
|
|||||||
|
.\" Copyright (c) 1983, 1993
|
||||||
|
.\" The Regents of the University of California. All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" Redistribution and use in source and binary forms, with or without
|
||||||
|
.\" modification, are permitted provided that the following conditions
|
||||||
|
.\" are met:
|
||||||
|
.\" 1. Redistributions of source code must retain the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer.
|
||||||
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer in the
|
||||||
|
.\" documentation and/or other materials provided with the distribution.
|
||||||
|
.\" 3. All advertising materials mentioning features or use of this software
|
||||||
|
.\" must display the following acknowledgement:
|
||||||
|
.\" This product includes software developed by the University of
|
||||||
|
.\" California, Berkeley and its contributors.
|
||||||
|
.\" 4. Neither the name of the University nor the names of its contributors
|
||||||
|
.\" may be used to endorse or promote products derived from this software
|
||||||
|
.\" without specific prior written permission.
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
.\" SUCH DAMAGE.
|
||||||
|
.\"
|
||||||
|
.\" @(#)telnetd.8 8.3 (Berkeley) 3/1/94
|
||||||
|
.\"
|
||||||
|
.Dd March 1, 1994
|
||||||
|
.Dt TELNETD 8
|
||||||
|
.Os BSD 4.2
|
||||||
|
.Sh NAME
|
||||||
|
.Nm telnetd
|
||||||
|
.Nd DARPA
|
||||||
|
.Tn TELNET
|
||||||
|
protocol server
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Nm /usr/libexec/telnetd
|
||||||
|
.Op Fl BUhlkns
|
||||||
|
.Op Fl D Ar debugmode
|
||||||
|
.Op Fl I Ns Ar initid
|
||||||
|
.Op Fl S Ar tos
|
||||||
|
.Op Fl X Ar authtype
|
||||||
|
.Op Fl a Ar authmode
|
||||||
|
.Op Fl edebug
|
||||||
|
.Op Fl r Ns Ar lowpty-highpty
|
||||||
|
.Op Fl u Ar len
|
||||||
|
.Op Fl debug Op Ar port
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
The
|
||||||
|
.Nm telnetd
|
||||||
|
command is a server which supports the
|
||||||
|
.Tn DARPA
|
||||||
|
standard
|
||||||
|
.Tn TELNET
|
||||||
|
virtual terminal protocol.
|
||||||
|
.Nm Telnetd
|
||||||
|
is normally invoked by the internet server (see
|
||||||
|
.Xr inetd 8 )
|
||||||
|
for requests to connect to the
|
||||||
|
.Tn TELNET
|
||||||
|
port as indicated by the
|
||||||
|
.Pa /etc/services
|
||||||
|
file (see
|
||||||
|
.Xr services 5 ) .
|
||||||
|
The
|
||||||
|
.Fl debug
|
||||||
|
option may be used to start up
|
||||||
|
.Nm telnetd
|
||||||
|
manually, instead of through
|
||||||
|
.Xr inetd 8 .
|
||||||
|
If started up this way,
|
||||||
|
.Ar port
|
||||||
|
may be specified to run
|
||||||
|
.Nm telnetd
|
||||||
|
on an alternate
|
||||||
|
.Tn TCP
|
||||||
|
port number.
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Nm telnetd
|
||||||
|
command accepts the following options:
|
||||||
|
.Bl -tag -width "-a authmode"
|
||||||
|
.It Fl a Ar authmode
|
||||||
|
This option may be used for specifying what mode should
|
||||||
|
be used for authentication.
|
||||||
|
Note that this option is only useful if
|
||||||
|
.Nm telnetd
|
||||||
|
has been compiled with support for the
|
||||||
|
.Dv AUTHENTICATION
|
||||||
|
option.
|
||||||
|
There are several valid values for
|
||||||
|
.Ar authmode:
|
||||||
|
.Bl -tag -width debug
|
||||||
|
.It debug
|
||||||
|
Turns on authentication debugging code.
|
||||||
|
.It user
|
||||||
|
Only allow connections when the remote user
|
||||||
|
can provide valid authentication information
|
||||||
|
to identify the remote user,
|
||||||
|
and is allowed access to the specified account
|
||||||
|
without providing a password.
|
||||||
|
.It valid
|
||||||
|
Only allow connections when the remote user
|
||||||
|
can provide valid authentication information
|
||||||
|
to identify the remote user.
|
||||||
|
The
|
||||||
|
.Xr login 1
|
||||||
|
command will provide any additional user verification
|
||||||
|
needed if the remote user is not allowed automatic
|
||||||
|
access to the specified account.
|
||||||
|
.It other
|
||||||
|
Only allow connections that supply some authentication information.
|
||||||
|
This option is currently not supported
|
||||||
|
by any of the existing authentication mechanisms,
|
||||||
|
and is thus the same as specifying
|
||||||
|
.Fl a
|
||||||
|
.Cm valid .
|
||||||
|
.It none
|
||||||
|
This is the default state.
|
||||||
|
Authentication information is not required.
|
||||||
|
If no or insufficient authentication information
|
||||||
|
is provided, then the
|
||||||
|
.Xr login 1
|
||||||
|
program will provide the necessary user
|
||||||
|
verification.
|
||||||
|
.It off
|
||||||
|
This disables the authentication code.
|
||||||
|
All user verification will happen through the
|
||||||
|
.Xr login 1
|
||||||
|
program.
|
||||||
|
.El
|
||||||
|
.It Fl B
|
||||||
|
Specifies bftp server mode. In this mode,
|
||||||
|
.Nm telnetd
|
||||||
|
causes login to start a
|
||||||
|
.Xr bftp 1
|
||||||
|
session rather than the user's
|
||||||
|
normal shell. In bftp daemon mode normal
|
||||||
|
logins are not supported, and it must be used
|
||||||
|
on a port other than the normal
|
||||||
|
.Tn TELNET
|
||||||
|
port.
|
||||||
|
.It Fl D Ar debugmode
|
||||||
|
This option may be used for debugging purposes.
|
||||||
|
This allows
|
||||||
|
.Nm telnetd
|
||||||
|
to print out debugging information
|
||||||
|
to the connection, allowing the user to see what
|
||||||
|
.Nm telnetd
|
||||||
|
is doing.
|
||||||
|
There are several possible values for
|
||||||
|
.Ar debugmode:
|
||||||
|
.Bl -tag -width exercise
|
||||||
|
.It Cm options
|
||||||
|
Prints information about the negotiation of
|
||||||
|
.Tn TELNET
|
||||||
|
options.
|
||||||
|
.It Cm report
|
||||||
|
Prints the
|
||||||
|
.Cm options
|
||||||
|
information, plus some additional information
|
||||||
|
about what processing is going on.
|
||||||
|
.It Cm netdata
|
||||||
|
Displays the data stream received by
|
||||||
|
.Nm telnetd.
|
||||||
|
.It Cm ptydata
|
||||||
|
Displays data written to the pty.
|
||||||
|
.It Cm exercise
|
||||||
|
Has not been implemented yet.
|
||||||
|
.El
|
||||||
|
.It Fl debug
|
||||||
|
Enables debugging on each socket created by
|
||||||
|
.Nm telnetd
|
||||||
|
(see
|
||||||
|
.Dv SO_DEBUG
|
||||||
|
in
|
||||||
|
.Xr socket 2 ) .
|
||||||
|
.It Fl edebug
|
||||||
|
If
|
||||||
|
.Nm telnetd
|
||||||
|
has been compiled with support for data encryption, then the
|
||||||
|
.Fl edebug
|
||||||
|
option may be used to enable encryption debugging code.
|
||||||
|
.It Fl h
|
||||||
|
Disables the printing of host-specific information before
|
||||||
|
login has been completed.
|
||||||
|
.It Fl I Ar initid
|
||||||
|
This option is only applicable to
|
||||||
|
.Tn UNICOS
|
||||||
|
systems prior to 7.0.
|
||||||
|
It specifies the
|
||||||
|
.Dv ID
|
||||||
|
from
|
||||||
|
.Pa /etc/inittab
|
||||||
|
to use when init starts login sessions. The default
|
||||||
|
.Dv ID
|
||||||
|
is
|
||||||
|
.Dv fe.
|
||||||
|
.It Fl k
|
||||||
|
This option is only useful if
|
||||||
|
.Nm telnetd
|
||||||
|
has been compiled with both linemode and kludge linemode
|
||||||
|
support. If the
|
||||||
|
.Fl k
|
||||||
|
option is specified, then if the remote client does not
|
||||||
|
support the
|
||||||
|
.Dv LINEMODE
|
||||||
|
option, then
|
||||||
|
.Nm telnetd
|
||||||
|
will operate in character at a time mode.
|
||||||
|
It will still support kludge linemode, but will only
|
||||||
|
go into kludge linemode if the remote client requests
|
||||||
|
it.
|
||||||
|
(This is done by by the client sending
|
||||||
|
.Dv DONT SUPPRESS-GO-AHEAD
|
||||||
|
and
|
||||||
|
.Dv DONT ECHO . )
|
||||||
|
The
|
||||||
|
.Fl k
|
||||||
|
option is most useful when there are remote clients
|
||||||
|
that do not support kludge linemode, but pass the heuristic
|
||||||
|
(if they respond with
|
||||||
|
.Dv WILL TIMING-MARK
|
||||||
|
in response to a
|
||||||
|
.Dv DO TIMING-MARK)
|
||||||
|
for kludge linemode support.
|
||||||
|
.It Fl l
|
||||||
|
Specifies line mode. Tries to force clients to use line-
|
||||||
|
at-a-time mode.
|
||||||
|
If the
|
||||||
|
.Dv LINEMODE
|
||||||
|
option is not supported, it will go
|
||||||
|
into kludge linemode.
|
||||||
|
.It Fl n
|
||||||
|
Disable
|
||||||
|
.Dv TCP
|
||||||
|
keep-alives. Normally
|
||||||
|
.Nm telnetd
|
||||||
|
enables the
|
||||||
|
.Tn TCP
|
||||||
|
keep-alive mechanism to probe connections that
|
||||||
|
have been idle for some period of time to determine
|
||||||
|
if the client is still there, so that idle connections
|
||||||
|
from machines that have crashed or can no longer
|
||||||
|
be reached may be cleaned up.
|
||||||
|
.It Fl r Ar lowpty-highpty
|
||||||
|
This option is only enabled when
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled for
|
||||||
|
.Dv UNICOS.
|
||||||
|
It specifies an inclusive range of pseudo-terminal devices to
|
||||||
|
use. If the system has sysconf variable
|
||||||
|
.Dv _SC_CRAY_NPTY
|
||||||
|
configured, the default pty search range is 0 to
|
||||||
|
.Dv _SC_CRAY_NPTY;
|
||||||
|
otherwise, the default range is 0 to 128. Either
|
||||||
|
.Ar lowpty
|
||||||
|
or
|
||||||
|
.Ar highpty
|
||||||
|
may be omitted to allow changing
|
||||||
|
either end of the search range. If
|
||||||
|
.Ar lowpty
|
||||||
|
is omitted, the - character is still required so that
|
||||||
|
.Nm telnetd
|
||||||
|
can differentiate
|
||||||
|
.Ar highpty
|
||||||
|
from
|
||||||
|
.Ar lowpty .
|
||||||
|
.It Fl s
|
||||||
|
This option is only enabled if
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled with support for
|
||||||
|
.Tn SecurID
|
||||||
|
cards.
|
||||||
|
It causes the
|
||||||
|
.Fl s
|
||||||
|
option to be passed on to
|
||||||
|
.Xr login 1 ,
|
||||||
|
and thus is only useful if
|
||||||
|
.Xr login 1
|
||||||
|
supports the
|
||||||
|
.Fl s
|
||||||
|
flag to indicate that only
|
||||||
|
.Tn SecurID
|
||||||
|
validated logins are allowed, and is
|
||||||
|
usually useful for controlling remote logins
|
||||||
|
from outside of a firewall.
|
||||||
|
.It Fl S Ar tos
|
||||||
|
.It Fl u Ar len
|
||||||
|
This option is used to specify the size of the field
|
||||||
|
in the
|
||||||
|
.Dv utmp
|
||||||
|
structure that holds the remote host name.
|
||||||
|
If the resolved host name is longer than
|
||||||
|
.Ar len ,
|
||||||
|
the dotted decimal value will be used instead.
|
||||||
|
This allows hosts with very long host names that
|
||||||
|
overflow this field to still be uniquely identified.
|
||||||
|
Specifying
|
||||||
|
.Fl u0
|
||||||
|
indicates that only dotted decimal addresses
|
||||||
|
should be put into the
|
||||||
|
.Pa utmp
|
||||||
|
file.
|
||||||
|
.It Fl U
|
||||||
|
This option causes
|
||||||
|
.Nm telnetd
|
||||||
|
to refuse connections from addresses that
|
||||||
|
cannot be mapped back into a symbolic name
|
||||||
|
via the
|
||||||
|
.Xr gethostbyaddr 3
|
||||||
|
routine.
|
||||||
|
.It Fl X Ar authtype
|
||||||
|
This option is only valid if
|
||||||
|
.Nm telnetd
|
||||||
|
has been built with support for the authentication option.
|
||||||
|
It disables the use of
|
||||||
|
.Ar authtype
|
||||||
|
authentication, and
|
||||||
|
can be used to temporarily disable
|
||||||
|
a specific authentication type without having to recompile
|
||||||
|
.Nm telnetd .
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
.Nm Telnetd
|
||||||
|
operates by allocating a pseudo-terminal device (see
|
||||||
|
.Xr pty 4 )
|
||||||
|
for a client, then creating a login process which has
|
||||||
|
the slave side of the pseudo-terminal as
|
||||||
|
.Dv stdin ,
|
||||||
|
.Dv stdout
|
||||||
|
and
|
||||||
|
.Dv stderr .
|
||||||
|
.Nm Telnetd
|
||||||
|
manipulates the master side of the pseudo-terminal,
|
||||||
|
implementing the
|
||||||
|
.Tn TELNET
|
||||||
|
protocol and passing characters
|
||||||
|
between the remote client and the login process.
|
||||||
|
.Pp
|
||||||
|
When a
|
||||||
|
.Tn TELNET
|
||||||
|
session is started up,
|
||||||
|
.Nm telnetd
|
||||||
|
sends
|
||||||
|
.Tn TELNET
|
||||||
|
options to the client side indicating
|
||||||
|
a willingness to do the
|
||||||
|
following
|
||||||
|
.Tn TELNET
|
||||||
|
options, which are described in more detail below:
|
||||||
|
.Bd -literal -offset indent
|
||||||
|
DO AUTHENTICATION
|
||||||
|
WILL ENCRYPT
|
||||||
|
DO TERMINAL TYPE
|
||||||
|
DO TSPEED
|
||||||
|
DO XDISPLOC
|
||||||
|
DO NEW-ENVIRON
|
||||||
|
DO ENVIRON
|
||||||
|
WILL SUPPRESS GO AHEAD
|
||||||
|
DO ECHO
|
||||||
|
DO LINEMODE
|
||||||
|
DO NAWS
|
||||||
|
WILL STATUS
|
||||||
|
DO LFLOW
|
||||||
|
DO TIMING-MARK
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
|
The pseudo-terminal allocated to the client is configured
|
||||||
|
to operate in \*(lqcooked\*(rq mode, and with
|
||||||
|
.Dv XTABS and
|
||||||
|
.Dv CRMOD
|
||||||
|
enabled (see
|
||||||
|
.Xr tty 4 ) .
|
||||||
|
.Pp
|
||||||
|
.Nm Telnetd
|
||||||
|
has support for enabling locally the following
|
||||||
|
.Tn TELNET
|
||||||
|
options:
|
||||||
|
.Bl -tag -width "DO AUTHENTICATION"
|
||||||
|
.It "WILL ECHO"
|
||||||
|
When the
|
||||||
|
.Dv LINEMODE
|
||||||
|
option is enabled, a
|
||||||
|
.Dv WILL ECHO
|
||||||
|
or
|
||||||
|
.Dv WONT ECHO
|
||||||
|
will be sent to the client to indicate the
|
||||||
|
current state of terminal echoing.
|
||||||
|
When terminal echo is not desired, a
|
||||||
|
.Dv WILL ECHO
|
||||||
|
is sent to indicate that
|
||||||
|
.Tn telnetd
|
||||||
|
will take care of echoing any data that needs to be
|
||||||
|
echoed to the terminal, and then nothing is echoed.
|
||||||
|
When terminal echo is desired, a
|
||||||
|
.Dv WONT ECHO
|
||||||
|
is sent to indicate that
|
||||||
|
.Tn telnetd
|
||||||
|
will not be doing any terminal echoing, so the
|
||||||
|
client should do any terminal echoing that is needed.
|
||||||
|
.It "WILL BINARY"
|
||||||
|
Indicates that the client is willing to send a
|
||||||
|
8 bits of data, rather than the normal 7 bits
|
||||||
|
of the Network Virtual Terminal.
|
||||||
|
.It "WILL SGA"
|
||||||
|
Indicates that it will not be sending
|
||||||
|
.Dv IAC GA,
|
||||||
|
go ahead, commands.
|
||||||
|
.It "WILL STATUS"
|
||||||
|
Indicates a willingness to send the client, upon
|
||||||
|
request, of the current status of all
|
||||||
|
.Tn TELNET
|
||||||
|
options.
|
||||||
|
.It "WILL TIMING-MARK"
|
||||||
|
Whenever a
|
||||||
|
.Dv DO TIMING-MARK
|
||||||
|
command is received, it is always responded
|
||||||
|
to with a
|
||||||
|
.Dv WILL TIMING-MARK
|
||||||
|
.It "WILL LOGOUT"
|
||||||
|
When a
|
||||||
|
.Dv DO LOGOUT
|
||||||
|
is received, a
|
||||||
|
.Dv WILL LOGOUT
|
||||||
|
is sent in response, and the
|
||||||
|
.Tn TELNET
|
||||||
|
session is shut down.
|
||||||
|
.It "WILL ENCRYPT"
|
||||||
|
Only sent if
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled with support for data encryption, and
|
||||||
|
indicates a willingness to decrypt
|
||||||
|
the data stream.
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
.Nm Telnetd
|
||||||
|
has support for enabling remotely the following
|
||||||
|
.Tn TELNET
|
||||||
|
options:
|
||||||
|
.Bl -tag -width "DO AUTHENTICATION"
|
||||||
|
.It "DO BINARY"
|
||||||
|
Sent to indicate that
|
||||||
|
.Tn telnetd
|
||||||
|
is willing to receive an 8 bit data stream.
|
||||||
|
.It "DO LFLOW"
|
||||||
|
Requests that the client handle flow control
|
||||||
|
characters remotely.
|
||||||
|
.It "DO ECHO"
|
||||||
|
This is not really supported, but is sent to identify a 4.2BSD
|
||||||
|
.Xr telnet 1
|
||||||
|
client, which will improperly respond with
|
||||||
|
.Dv WILL ECHO.
|
||||||
|
If a
|
||||||
|
.Dv WILL ECHO
|
||||||
|
is received, a
|
||||||
|
.Dv DONT ECHO
|
||||||
|
will be sent in response.
|
||||||
|
.It "DO TERMINAL-TYPE"
|
||||||
|
Indicates a desire to be able to request the
|
||||||
|
name of the type of terminal that is attached
|
||||||
|
to the client side of the connection.
|
||||||
|
.It "DO SGA"
|
||||||
|
Indicates that it does not need to receive
|
||||||
|
.Dv IAC GA,
|
||||||
|
the go ahead command.
|
||||||
|
.It "DO NAWS"
|
||||||
|
Requests that the client inform the server when
|
||||||
|
the window (display) size changes.
|
||||||
|
.It "DO TERMINAL-SPEED"
|
||||||
|
Indicates a desire to be able to request information
|
||||||
|
about the speed of the serial line to which
|
||||||
|
the client is attached.
|
||||||
|
.It "DO XDISPLOC"
|
||||||
|
Indicates a desire to be able to request the name
|
||||||
|
of the X windows display that is associated with
|
||||||
|
the telnet client.
|
||||||
|
.It "DO NEW-ENVIRON"
|
||||||
|
Indicates a desire to be able to request environment
|
||||||
|
variable information, as described in RFC 1572.
|
||||||
|
.It "DO ENVIRON"
|
||||||
|
Indicates a desire to be able to request environment
|
||||||
|
variable information, as described in RFC 1408.
|
||||||
|
.It "DO LINEMODE"
|
||||||
|
Only sent if
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled with support for linemode, and
|
||||||
|
requests that the client do line by line processing.
|
||||||
|
.It "DO TIMING-MARK"
|
||||||
|
Only sent if
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled with support for both linemode and
|
||||||
|
kludge linemode, and the client responded with
|
||||||
|
.Dv WONT LINEMODE.
|
||||||
|
If the client responds with
|
||||||
|
.Dv WILL TM,
|
||||||
|
the it is assumed that the client supports
|
||||||
|
kludge linemode.
|
||||||
|
Note that the
|
||||||
|
.Op Fl k
|
||||||
|
option can be used to disable this.
|
||||||
|
.It "DO AUTHENTICATION"
|
||||||
|
Only sent if
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled with support for authentication, and
|
||||||
|
indicates a willingness to receive authentication
|
||||||
|
information for automatic login.
|
||||||
|
.It "DO ENCRYPT"
|
||||||
|
Only sent if
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled with support for data encryption, and
|
||||||
|
indicates a willingness to decrypt
|
||||||
|
the data stream.
|
||||||
|
.Sh ENVIRONMENT
|
||||||
|
.Sh FILES
|
||||||
|
.Pa /etc/services
|
||||||
|
.br
|
||||||
|
.Pa /etc/inittab
|
||||||
|
(UNICOS systems only)
|
||||||
|
.br
|
||||||
|
.Pa /etc/iptos
|
||||||
|
(if supported)
|
||||||
|
.br
|
||||||
|
.Pa /usr/ucb/bftp
|
||||||
|
(if supported)
|
||||||
|
.Sh "SEE ALSO"
|
||||||
|
.Xr telnet 1 ,
|
||||||
|
.Xr login 1 ,
|
||||||
|
.Xr bftp 1
|
||||||
|
(if supported)
|
||||||
|
.Sh STANDARDS
|
||||||
|
.Bl -tag -compact -width RFC-1572
|
||||||
|
.It Cm RFC-854
|
||||||
|
.Tn TELNET
|
||||||
|
PROTOCOL SPECIFICATION
|
||||||
|
.It Cm RFC-855
|
||||||
|
TELNET OPTION SPECIFICATIONS
|
||||||
|
.It Cm RFC-856
|
||||||
|
TELNET BINARY TRANSMISSION
|
||||||
|
.It Cm RFC-857
|
||||||
|
TELNET ECHO OPTION
|
||||||
|
.It Cm RFC-858
|
||||||
|
TELNET SUPPRESS GO AHEAD OPTION
|
||||||
|
.It Cm RFC-859
|
||||||
|
TELNET STATUS OPTION
|
||||||
|
.It Cm RFC-860
|
||||||
|
TELNET TIMING MARK OPTION
|
||||||
|
.It Cm RFC-861
|
||||||
|
TELNET EXTENDED OPTIONS - LIST OPTION
|
||||||
|
.It Cm RFC-885
|
||||||
|
TELNET END OF RECORD OPTION
|
||||||
|
.It Cm RFC-1073
|
||||||
|
Telnet Window Size Option
|
||||||
|
.It Cm RFC-1079
|
||||||
|
Telnet Terminal Speed Option
|
||||||
|
.It Cm RFC-1091
|
||||||
|
Telnet Terminal-Type Option
|
||||||
|
.It Cm RFC-1096
|
||||||
|
Telnet X Display Location Option
|
||||||
|
.It Cm RFC-1123
|
||||||
|
Requirements for Internet Hosts -- Application and Support
|
||||||
|
.It Cm RFC-1184
|
||||||
|
Telnet Linemode Option
|
||||||
|
.It Cm RFC-1372
|
||||||
|
Telnet Remote Flow Control Option
|
||||||
|
.It Cm RFC-1416
|
||||||
|
Telnet Authentication Option
|
||||||
|
.It Cm RFC-1411
|
||||||
|
Telnet Authentication: Kerberos Version 4
|
||||||
|
.It Cm RFC-1412
|
||||||
|
Telnet Authentication: SPX
|
||||||
|
.It Cm RFC-1571
|
||||||
|
Telnet Environment Option Interoperability Issues
|
||||||
|
.It Cm RFC-1572
|
||||||
|
Telnet Environment Option
|
||||||
|
.Sh BUGS
|
||||||
|
Some
|
||||||
|
.Tn TELNET
|
||||||
|
commands are only partially implemented.
|
||||||
|
.Pp
|
||||||
|
Because of bugs in the original 4.2 BSD
|
||||||
|
.Xr telnet 1 ,
|
||||||
|
.Nm telnetd
|
||||||
|
performs some dubious protocol exchanges to try to discover if the remote
|
||||||
|
client is, in fact, a 4.2 BSD
|
||||||
|
.Xr telnet 1 .
|
||||||
|
.Pp
|
||||||
|
Binary mode
|
||||||
|
has no common interpretation except between similar operating systems
|
||||||
|
(Unix in this case).
|
||||||
|
.Pp
|
||||||
|
The terminal type name received from the remote client is converted to
|
||||||
|
lower case.
|
||||||
|
.Pp
|
||||||
|
.Nm Telnetd
|
||||||
|
never sends
|
||||||
|
.Tn TELNET
|
||||||
|
.Dv IAC GA
|
||||||
|
(go ahead) commands.
|
1582
eBones/libexec/telnetd/telnetd.c
Normal file
1582
eBones/libexec/telnetd/telnetd.c
Normal file
File diff suppressed because it is too large
Load Diff
49
eBones/libexec/telnetd/telnetd.h
Normal file
49
eBones/libexec/telnetd/telnetd.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)telnetd.h 8.1 (Berkeley) 6/4/93
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "defs.h"
|
||||||
|
#include "ext.h"
|
||||||
|
|
||||||
|
#ifdef DIAGNOSTICS
|
||||||
|
#define DIAG(a,b) if (diagnostic & (a)) b
|
||||||
|
#else
|
||||||
|
#define DIAG(a,b)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* other external variables */
|
||||||
|
extern char **environ;
|
||||||
|
extern int errno;
|
||||||
|
|
660
eBones/libexec/telnetd/termstat.c
Normal file
660
eBones/libexec/telnetd/termstat.c
Normal file
@ -0,0 +1,660 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)termstat.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "telnetd.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* local variables
|
||||||
|
*/
|
||||||
|
int def_tspeed = -1, def_rspeed = -1;
|
||||||
|
#ifdef TIOCSWINSZ
|
||||||
|
int def_row = 0, def_col = 0;
|
||||||
|
#endif
|
||||||
|
#ifdef LINEMODE
|
||||||
|
static int _terminit = 0;
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
|
||||||
|
#if defined(CRAY2) && defined(UNICOS5)
|
||||||
|
int newmap = 1; /* nonzero if \n maps to ^M^J */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LINEMODE
|
||||||
|
/*
|
||||||
|
* localstat
|
||||||
|
*
|
||||||
|
* This function handles all management of linemode.
|
||||||
|
*
|
||||||
|
* Linemode allows the client to do the local editing of data
|
||||||
|
* and send only complete lines to the server. Linemode state is
|
||||||
|
* based on the state of the pty driver. If the pty is set for
|
||||||
|
* external processing, then we can use linemode. Further, if we
|
||||||
|
* can use real linemode, then we can look at the edit control bits
|
||||||
|
* in the pty to determine what editing the client should do.
|
||||||
|
*
|
||||||
|
* Linemode support uses the following state flags to keep track of
|
||||||
|
* current and desired linemode state.
|
||||||
|
* alwayslinemode : true if -l was specified on the telnetd
|
||||||
|
* command line. It means to have linemode on as much as
|
||||||
|
* possible.
|
||||||
|
*
|
||||||
|
* lmodetype: signifies whether the client can
|
||||||
|
* handle real linemode, or if use of kludgeomatic linemode
|
||||||
|
* is preferred. It will be set to one of the following:
|
||||||
|
* REAL_LINEMODE : use linemode option
|
||||||
|
* NO_KLUDGE : don't initiate kludge linemode.
|
||||||
|
* KLUDGE_LINEMODE : use kludge linemode
|
||||||
|
* NO_LINEMODE : client is ignorant of linemode
|
||||||
|
*
|
||||||
|
* linemode, uselinemode : linemode is true if linemode
|
||||||
|
* is currently on, uselinemode is the state that we wish
|
||||||
|
* to be in. If another function wishes to turn linemode
|
||||||
|
* on or off, it sets or clears uselinemode.
|
||||||
|
*
|
||||||
|
* editmode, useeditmode : like linemode/uselinemode, but
|
||||||
|
* these contain the edit mode states (edit and trapsig).
|
||||||
|
*
|
||||||
|
* The state variables correspond to some of the state information
|
||||||
|
* in the pty.
|
||||||
|
* linemode:
|
||||||
|
* In real linemode, this corresponds to whether the pty
|
||||||
|
* expects external processing of incoming data.
|
||||||
|
* In kludge linemode, this more closely corresponds to the
|
||||||
|
* whether normal processing is on or not. (ICANON in
|
||||||
|
* system V, or COOKED mode in BSD.)
|
||||||
|
* If the -l option was specified (alwayslinemode), then
|
||||||
|
* an attempt is made to force external processing on at
|
||||||
|
* all times.
|
||||||
|
*
|
||||||
|
* The following heuristics are applied to determine linemode
|
||||||
|
* handling within the server.
|
||||||
|
* 1) Early on in starting up the server, an attempt is made
|
||||||
|
* to negotiate the linemode option. If this succeeds
|
||||||
|
* then lmodetype is set to REAL_LINEMODE and all linemode
|
||||||
|
* processing occurs in the context of the linemode option.
|
||||||
|
* 2) If the attempt to negotiate the linemode option failed,
|
||||||
|
* and the "-k" (don't initiate kludge linemode) isn't set,
|
||||||
|
* then we try to use kludge linemode. We test for this
|
||||||
|
* capability by sending "do Timing Mark". If a positive
|
||||||
|
* response comes back, then we assume that the client
|
||||||
|
* understands kludge linemode (ech!) and the
|
||||||
|
* lmodetype flag is set to KLUDGE_LINEMODE.
|
||||||
|
* 3) Otherwise, linemode is not supported at all and
|
||||||
|
* lmodetype remains set to NO_LINEMODE (which happens
|
||||||
|
* to be 0 for convenience).
|
||||||
|
* 4) At any time a command arrives that implies a higher
|
||||||
|
* state of linemode support in the client, we move to that
|
||||||
|
* linemode support.
|
||||||
|
*
|
||||||
|
* A short explanation of kludge linemode is in order here.
|
||||||
|
* 1) The heuristic to determine support for kludge linemode
|
||||||
|
* is to send a do timing mark. We assume that a client
|
||||||
|
* that supports timing marks also supports kludge linemode.
|
||||||
|
* A risky proposition at best.
|
||||||
|
* 2) Further negotiation of linemode is done by changing the
|
||||||
|
* the server's state regarding SGA. If server will SGA,
|
||||||
|
* then linemode is off, if server won't SGA, then linemode
|
||||||
|
* is on.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
localstat()
|
||||||
|
{
|
||||||
|
void netflush();
|
||||||
|
int need_will_echo = 0;
|
||||||
|
|
||||||
|
#if defined(CRAY2) && defined(UNICOS5)
|
||||||
|
/*
|
||||||
|
* Keep track of that ol' CR/NL mapping while we're in the
|
||||||
|
* neighborhood.
|
||||||
|
*/
|
||||||
|
newmap = tty_isnewmap();
|
||||||
|
#endif /* defined(CRAY2) && defined(UNICOS5) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for state of BINARY options.
|
||||||
|
*/
|
||||||
|
if (tty_isbinaryin()) {
|
||||||
|
if (his_want_state_is_wont(TELOPT_BINARY))
|
||||||
|
send_do(TELOPT_BINARY, 1);
|
||||||
|
} else {
|
||||||
|
if (his_want_state_is_will(TELOPT_BINARY))
|
||||||
|
send_dont(TELOPT_BINARY, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tty_isbinaryout()) {
|
||||||
|
if (my_want_state_is_wont(TELOPT_BINARY))
|
||||||
|
send_will(TELOPT_BINARY, 1);
|
||||||
|
} else {
|
||||||
|
if (my_want_state_is_will(TELOPT_BINARY))
|
||||||
|
send_wont(TELOPT_BINARY, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for changes to flow control if client supports it.
|
||||||
|
*/
|
||||||
|
flowstat();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check linemode on/off state
|
||||||
|
*/
|
||||||
|
uselinemode = tty_linemode();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If alwayslinemode is on, and pty is changing to turn it off, then
|
||||||
|
* force linemode back on.
|
||||||
|
*/
|
||||||
|
if (alwayslinemode && linemode && !uselinemode) {
|
||||||
|
uselinemode = 1;
|
||||||
|
tty_setlinemode(uselinemode);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef ENCRYPTION
|
||||||
|
/*
|
||||||
|
* If the terminal is not echoing, but editing is enabled,
|
||||||
|
* something like password input is going to happen, so
|
||||||
|
* if we the other side is not currently sending encrypted
|
||||||
|
* data, ask the other side to start encrypting.
|
||||||
|
*/
|
||||||
|
if (his_state_is_will(TELOPT_ENCRYPT)) {
|
||||||
|
static int enc_passwd = 0;
|
||||||
|
if (uselinemode && !tty_isecho() && tty_isediting()
|
||||||
|
&& (enc_passwd == 0) && !decrypt_input) {
|
||||||
|
encrypt_send_request_start();
|
||||||
|
enc_passwd = 1;
|
||||||
|
} else if (enc_passwd) {
|
||||||
|
encrypt_send_request_end();
|
||||||
|
enc_passwd = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* ENCRYPTION */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do echo mode handling as soon as we know what the
|
||||||
|
* linemode is going to be.
|
||||||
|
* If the pty has echo turned off, then tell the client that
|
||||||
|
* the server will echo. If echo is on, then the server
|
||||||
|
* will echo if in character mode, but in linemode the
|
||||||
|
* client should do local echoing. The state machine will
|
||||||
|
* not send anything if it is unnecessary, so don't worry
|
||||||
|
* about that here.
|
||||||
|
*
|
||||||
|
* If we need to send the WILL ECHO (because echo is off),
|
||||||
|
* then delay that until after we have changed the MODE.
|
||||||
|
* This way, when the user is turning off both editing
|
||||||
|
* and echo, the client will get editing turned off first.
|
||||||
|
* This keeps the client from going into encryption mode
|
||||||
|
* and then right back out if it is doing auto-encryption
|
||||||
|
* when passwords are being typed.
|
||||||
|
*/
|
||||||
|
if (uselinemode) {
|
||||||
|
if (tty_isecho())
|
||||||
|
send_wont(TELOPT_ECHO, 1);
|
||||||
|
else
|
||||||
|
need_will_echo = 1;
|
||||||
|
#ifdef KLUDGELINEMODE
|
||||||
|
if (lmodetype == KLUDGE_OK)
|
||||||
|
lmodetype = KLUDGE_LINEMODE;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If linemode is being turned off, send appropriate
|
||||||
|
* command and then we're all done.
|
||||||
|
*/
|
||||||
|
if (!uselinemode && linemode) {
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
if (lmodetype == REAL_LINEMODE) {
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
send_dont(TELOPT_LINEMODE, 1);
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
} else if (lmodetype == KLUDGE_LINEMODE)
|
||||||
|
send_will(TELOPT_SGA, 1);
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
send_will(TELOPT_ECHO, 1);
|
||||||
|
linemode = uselinemode;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
/*
|
||||||
|
* If using real linemode check edit modes for possible later use.
|
||||||
|
* If we are in kludge linemode, do the SGA negotiation.
|
||||||
|
*/
|
||||||
|
if (lmodetype == REAL_LINEMODE) {
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
useeditmode = 0;
|
||||||
|
if (tty_isediting())
|
||||||
|
useeditmode |= MODE_EDIT;
|
||||||
|
if (tty_istrapsig())
|
||||||
|
useeditmode |= MODE_TRAPSIG;
|
||||||
|
if (tty_issofttab())
|
||||||
|
useeditmode |= MODE_SOFT_TAB;
|
||||||
|
if (tty_islitecho())
|
||||||
|
useeditmode |= MODE_LIT_ECHO;
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
} else if (lmodetype == KLUDGE_LINEMODE) {
|
||||||
|
if (tty_isediting() && uselinemode)
|
||||||
|
send_wont(TELOPT_SGA, 1);
|
||||||
|
else
|
||||||
|
send_will(TELOPT_SGA, 1);
|
||||||
|
}
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Negotiate linemode on if pty state has changed to turn it on.
|
||||||
|
* Send appropriate command and send along edit mode, then all done.
|
||||||
|
*/
|
||||||
|
if (uselinemode && !linemode) {
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
if (lmodetype == KLUDGE_LINEMODE) {
|
||||||
|
send_wont(TELOPT_SGA, 1);
|
||||||
|
} else if (lmodetype == REAL_LINEMODE) {
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
send_do(TELOPT_LINEMODE, 1);
|
||||||
|
/* send along edit modes */
|
||||||
|
(void) sprintf(nfrontp, "%c%c%c%c%c%c%c", IAC, SB,
|
||||||
|
TELOPT_LINEMODE, LM_MODE, useeditmode,
|
||||||
|
IAC, SE);
|
||||||
|
nfrontp += 7;
|
||||||
|
editmode = useeditmode;
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
}
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
linemode = uselinemode;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
/*
|
||||||
|
* None of what follows is of any value if not using
|
||||||
|
* real linemode.
|
||||||
|
*/
|
||||||
|
if (lmodetype < REAL_LINEMODE)
|
||||||
|
goto done;
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
|
||||||
|
if (linemode && his_state_is_will(TELOPT_LINEMODE)) {
|
||||||
|
/*
|
||||||
|
* If edit mode changed, send edit mode.
|
||||||
|
*/
|
||||||
|
if (useeditmode != editmode) {
|
||||||
|
/*
|
||||||
|
* Send along appropriate edit mode mask.
|
||||||
|
*/
|
||||||
|
(void) sprintf(nfrontp, "%c%c%c%c%c%c%c", IAC, SB,
|
||||||
|
TELOPT_LINEMODE, LM_MODE, useeditmode,
|
||||||
|
IAC, SE);
|
||||||
|
nfrontp += 7;
|
||||||
|
editmode = useeditmode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for changes to special characters in use.
|
||||||
|
*/
|
||||||
|
start_slc(0);
|
||||||
|
check_slc();
|
||||||
|
(void) end_slc(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (need_will_echo)
|
||||||
|
send_will(TELOPT_ECHO, 1);
|
||||||
|
/*
|
||||||
|
* Some things should be deferred until after the pty state has
|
||||||
|
* been set by the local process. Do those things that have been
|
||||||
|
* deferred now. This only happens once.
|
||||||
|
*/
|
||||||
|
if (_terminit == 0) {
|
||||||
|
_terminit = 1;
|
||||||
|
defer_terminit();
|
||||||
|
}
|
||||||
|
|
||||||
|
netflush();
|
||||||
|
set_termbuf();
|
||||||
|
return;
|
||||||
|
|
||||||
|
} /* end of localstat */
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* flowstat
|
||||||
|
*
|
||||||
|
* Check for changes to flow control
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
flowstat()
|
||||||
|
{
|
||||||
|
if (his_state_is_will(TELOPT_LFLOW)) {
|
||||||
|
if (tty_flowmode() != flowmode) {
|
||||||
|
flowmode = tty_flowmode();
|
||||||
|
(void) sprintf(nfrontp, "%c%c%c%c%c%c",
|
||||||
|
IAC, SB, TELOPT_LFLOW,
|
||||||
|
flowmode ? LFLOW_ON : LFLOW_OFF,
|
||||||
|
IAC, SE);
|
||||||
|
nfrontp += 6;
|
||||||
|
}
|
||||||
|
if (tty_restartany() != restartany) {
|
||||||
|
restartany = tty_restartany();
|
||||||
|
(void) sprintf(nfrontp, "%c%c%c%c%c%c",
|
||||||
|
IAC, SB, TELOPT_LFLOW,
|
||||||
|
restartany ? LFLOW_RESTART_ANY
|
||||||
|
: LFLOW_RESTART_XON,
|
||||||
|
IAC, SE);
|
||||||
|
nfrontp += 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* clientstat
|
||||||
|
*
|
||||||
|
* Process linemode related requests from the client.
|
||||||
|
* Client can request a change to only one of linemode, editmode or slc's
|
||||||
|
* at a time, and if using kludge linemode, then only linemode may be
|
||||||
|
* affected.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
clientstat(code, parm1, parm2)
|
||||||
|
register int code, parm1, parm2;
|
||||||
|
{
|
||||||
|
void netflush();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get a copy of terminal characteristics.
|
||||||
|
*/
|
||||||
|
init_termbuf();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Process request from client. code tells what it is.
|
||||||
|
*/
|
||||||
|
switch (code) {
|
||||||
|
#ifdef LINEMODE
|
||||||
|
case TELOPT_LINEMODE:
|
||||||
|
/*
|
||||||
|
* Don't do anything unless client is asking us to change
|
||||||
|
* modes.
|
||||||
|
*/
|
||||||
|
uselinemode = (parm1 == WILL);
|
||||||
|
if (uselinemode != linemode) {
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
/*
|
||||||
|
* If using kludge linemode, make sure that
|
||||||
|
* we can do what the client asks.
|
||||||
|
* We can not turn off linemode if alwayslinemode
|
||||||
|
* and the ICANON bit is set.
|
||||||
|
*/
|
||||||
|
if (lmodetype == KLUDGE_LINEMODE) {
|
||||||
|
if (alwayslinemode && tty_isediting()) {
|
||||||
|
uselinemode = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Quit now if we can't do it.
|
||||||
|
*/
|
||||||
|
if (uselinemode == linemode)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If using real linemode and linemode is being
|
||||||
|
* turned on, send along the edit mode mask.
|
||||||
|
*/
|
||||||
|
if (lmodetype == REAL_LINEMODE && uselinemode)
|
||||||
|
# else /* KLUDGELINEMODE */
|
||||||
|
if (uselinemode)
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
{
|
||||||
|
useeditmode = 0;
|
||||||
|
if (tty_isediting())
|
||||||
|
useeditmode |= MODE_EDIT;
|
||||||
|
if (tty_istrapsig)
|
||||||
|
useeditmode |= MODE_TRAPSIG;
|
||||||
|
if (tty_issofttab())
|
||||||
|
useeditmode |= MODE_SOFT_TAB;
|
||||||
|
if (tty_islitecho())
|
||||||
|
useeditmode |= MODE_LIT_ECHO;
|
||||||
|
(void) sprintf(nfrontp, "%c%c%c%c%c%c%c", IAC,
|
||||||
|
SB, TELOPT_LINEMODE, LM_MODE,
|
||||||
|
useeditmode, IAC, SE);
|
||||||
|
nfrontp += 7;
|
||||||
|
editmode = useeditmode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
tty_setlinemode(uselinemode);
|
||||||
|
|
||||||
|
linemode = uselinemode;
|
||||||
|
|
||||||
|
if (!linemode)
|
||||||
|
send_will(TELOPT_ECHO, 1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LM_MODE:
|
||||||
|
{
|
||||||
|
register int ack, changed;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Client has sent along a mode mask. If it agrees with
|
||||||
|
* what we are currently doing, ignore it; if not, it could
|
||||||
|
* be viewed as a request to change. Note that the server
|
||||||
|
* will change to the modes in an ack if it is different from
|
||||||
|
* what we currently have, but we will not ack the ack.
|
||||||
|
*/
|
||||||
|
useeditmode &= MODE_MASK;
|
||||||
|
ack = (useeditmode & MODE_ACK);
|
||||||
|
useeditmode &= ~MODE_ACK;
|
||||||
|
|
||||||
|
if (changed = (useeditmode ^ editmode)) {
|
||||||
|
/*
|
||||||
|
* This check is for a timing problem. If the
|
||||||
|
* state of the tty has changed (due to the user
|
||||||
|
* application) we need to process that info
|
||||||
|
* before we write in the state contained in the
|
||||||
|
* ack!!! This gets out the new MODE request,
|
||||||
|
* and when the ack to that command comes back
|
||||||
|
* we'll set it and be in the right mode.
|
||||||
|
*/
|
||||||
|
if (ack)
|
||||||
|
localstat();
|
||||||
|
if (changed & MODE_EDIT)
|
||||||
|
tty_setedit(useeditmode & MODE_EDIT);
|
||||||
|
|
||||||
|
if (changed & MODE_TRAPSIG)
|
||||||
|
tty_setsig(useeditmode & MODE_TRAPSIG);
|
||||||
|
|
||||||
|
if (changed & MODE_SOFT_TAB)
|
||||||
|
tty_setsofttab(useeditmode & MODE_SOFT_TAB);
|
||||||
|
|
||||||
|
if (changed & MODE_LIT_ECHO)
|
||||||
|
tty_setlitecho(useeditmode & MODE_LIT_ECHO);
|
||||||
|
|
||||||
|
set_termbuf();
|
||||||
|
|
||||||
|
if (!ack) {
|
||||||
|
(void) sprintf(nfrontp, "%c%c%c%c%c%c%c", IAC,
|
||||||
|
SB, TELOPT_LINEMODE, LM_MODE,
|
||||||
|
useeditmode|MODE_ACK,
|
||||||
|
IAC, SE);
|
||||||
|
nfrontp += 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
editmode = useeditmode;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
} /* end of case LM_MODE */
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
|
||||||
|
case TELOPT_NAWS:
|
||||||
|
#ifdef TIOCSWINSZ
|
||||||
|
{
|
||||||
|
struct winsize ws;
|
||||||
|
|
||||||
|
def_col = parm1;
|
||||||
|
def_row = parm2;
|
||||||
|
#ifdef LINEMODE
|
||||||
|
/*
|
||||||
|
* Defer changing window size until after terminal is
|
||||||
|
* initialized.
|
||||||
|
*/
|
||||||
|
if (terminit() == 0)
|
||||||
|
return;
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Change window size as requested by client.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ws.ws_col = parm1;
|
||||||
|
ws.ws_row = parm2;
|
||||||
|
(void) ioctl(pty, TIOCSWINSZ, (char *)&ws);
|
||||||
|
}
|
||||||
|
#endif /* TIOCSWINSZ */
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TELOPT_TSPEED:
|
||||||
|
{
|
||||||
|
def_tspeed = parm1;
|
||||||
|
def_rspeed = parm2;
|
||||||
|
#ifdef LINEMODE
|
||||||
|
/*
|
||||||
|
* Defer changing the terminal speed.
|
||||||
|
*/
|
||||||
|
if (terminit() == 0)
|
||||||
|
return;
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
/*
|
||||||
|
* Change terminal speed as requested by client.
|
||||||
|
* We set the receive speed first, so that if we can't
|
||||||
|
* store seperate receive and transmit speeds, the transmit
|
||||||
|
* speed will take precedence.
|
||||||
|
*/
|
||||||
|
tty_rspeed(parm2);
|
||||||
|
tty_tspeed(parm1);
|
||||||
|
set_termbuf();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
} /* end of case TELOPT_TSPEED */
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* What? */
|
||||||
|
break;
|
||||||
|
} /* end of switch */
|
||||||
|
|
||||||
|
#if defined(CRAY2) && defined(UNICOS5)
|
||||||
|
/*
|
||||||
|
* Just in case of the likely event that we changed the pty state.
|
||||||
|
*/
|
||||||
|
rcv_ioctl();
|
||||||
|
#endif /* defined(CRAY2) && defined(UNICOS5) */
|
||||||
|
|
||||||
|
netflush();
|
||||||
|
|
||||||
|
} /* end of clientstat */
|
||||||
|
|
||||||
|
#if defined(CRAY2) && defined(UNICOS5)
|
||||||
|
void
|
||||||
|
termstat()
|
||||||
|
{
|
||||||
|
needtermstat = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_termstat()
|
||||||
|
{
|
||||||
|
needtermstat = 0;
|
||||||
|
init_termbuf();
|
||||||
|
localstat();
|
||||||
|
rcv_ioctl();
|
||||||
|
}
|
||||||
|
#endif /* defined(CRAY2) && defined(UNICOS5) */
|
||||||
|
|
||||||
|
#ifdef LINEMODE
|
||||||
|
/*
|
||||||
|
* defer_terminit
|
||||||
|
*
|
||||||
|
* Some things should not be done until after the login process has started
|
||||||
|
* and all the pty modes are set to what they are supposed to be. This
|
||||||
|
* function is called when the pty state has been processed for the first time.
|
||||||
|
* It calls other functions that do things that were deferred in each module.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
defer_terminit()
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
* local stuff that got deferred.
|
||||||
|
*/
|
||||||
|
if (def_tspeed != -1) {
|
||||||
|
clientstat(TELOPT_TSPEED, def_tspeed, def_rspeed);
|
||||||
|
def_tspeed = def_rspeed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef TIOCSWINSZ
|
||||||
|
if (def_col || def_row) {
|
||||||
|
struct winsize ws;
|
||||||
|
|
||||||
|
bzero((char *)&ws, sizeof(ws));
|
||||||
|
ws.ws_col = def_col;
|
||||||
|
ws.ws_row = def_row;
|
||||||
|
(void) ioctl(pty, TIOCSWINSZ, (char *)&ws);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The only other module that currently defers anything.
|
||||||
|
*/
|
||||||
|
deferslc();
|
||||||
|
|
||||||
|
} /* end of defer_terminit */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* terminit
|
||||||
|
*
|
||||||
|
* Returns true if the pty state has been processed yet.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
terminit()
|
||||||
|
{
|
||||||
|
return(_terminit);
|
||||||
|
|
||||||
|
} /* end of terminit */
|
||||||
|
#endif /* LINEMODE */
|
1192
eBones/libexec/telnetd/utility.c
Normal file
1192
eBones/libexec/telnetd/utility.c
Normal file
File diff suppressed because it is too large
Load Diff
37
secure/libexec/telnetd/Makefile
Normal file
37
secure/libexec/telnetd/Makefile
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# @(#)Makefile 8.2 (Berkeley) 12/15/93
|
||||||
|
|
||||||
|
PROG= telnetd
|
||||||
|
CFLAGS+=-DLINEMODE -DKLUDGELINEMODE -DUSE_TERMIO -DDIAGNOSTICS
|
||||||
|
CFLAGS+=-DOLD_ENVIRON -DENV_HACK
|
||||||
|
CFLAGS+=-I${.CURDIR}/../../lib
|
||||||
|
#CFLAGS+=-DAUTHENTICATION -DENCRYPTION
|
||||||
|
SRCS= authenc.c global.c slc.c state.c sys_term.c telnetd.c \
|
||||||
|
termstat.c utility.c
|
||||||
|
DPADD= ${LIBUTIL} ${LIBTERM}
|
||||||
|
LDADD= -lutil -ltermcap -ltelnet
|
||||||
|
#LDADD+= -lkrb -ldes
|
||||||
|
MAN8= telnetd.8
|
||||||
|
|
||||||
|
# These are the sources that have encryption stuff in them.
|
||||||
|
CRYPT_SRC= authenc.c ext.h state.c telnetd.c termstat.c
|
||||||
|
CRYPT_SRC+= utility.c Makefile
|
||||||
|
NOCRYPT_DIR=${.CURDIR}/Nocrypt
|
||||||
|
|
||||||
|
.include <bsd.prog.mk>
|
||||||
|
|
||||||
|
nocrypt:
|
||||||
|
#ifdef ENCRYPTION
|
||||||
|
@for i in ${CRYPT_SRC}; do \
|
||||||
|
if [ ! -d ${NOCRYPT_DIR} ]; then \
|
||||||
|
echo Creating subdirectory ${NOCRYPT_DIR}; \
|
||||||
|
mkdir ${NOCRYPT_DIR}; \
|
||||||
|
fi; \
|
||||||
|
echo ${NOCRYPT_DIR}/$$i; \
|
||||||
|
unifdef -UENCRYPTION ${.CURDIR}/$$i | \
|
||||||
|
sed "s/ || defined(ENCRYPTION)//" > ${NOCRYPT_DIR}/$$i; \
|
||||||
|
done
|
||||||
|
|
||||||
|
placeholder:
|
||||||
|
#else /* ENCRYPTION */
|
||||||
|
@echo "Encryption code already removed."
|
||||||
|
#endif /* ENCRYPTION */
|
91
secure/libexec/telnetd/authenc.c
Normal file
91
secure/libexec/telnetd/authenc.c
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 1991, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)authenc.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#if defined(AUTHENTICATION) || defined(ENCRYPTION)
|
||||||
|
#include "telnetd.h"
|
||||||
|
#include <libtelnet/misc.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
net_write(str, len)
|
||||||
|
unsigned char *str;
|
||||||
|
int len;
|
||||||
|
{
|
||||||
|
if (nfrontp + len < netobuf + BUFSIZ) {
|
||||||
|
bcopy((void *)str, (void *)nfrontp, len);
|
||||||
|
nfrontp += len;
|
||||||
|
return(len);
|
||||||
|
}
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
net_encrypt()
|
||||||
|
{
|
||||||
|
#ifdef ENCRYPTION
|
||||||
|
char *s = (nclearto > nbackp) ? nclearto : nbackp;
|
||||||
|
if (s < nfrontp && encrypt_output) {
|
||||||
|
(*encrypt_output)((unsigned char *)s, nfrontp - s);
|
||||||
|
}
|
||||||
|
nclearto = nfrontp;
|
||||||
|
#endif /* ENCRYPTION */
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
telnet_spin()
|
||||||
|
{
|
||||||
|
ttloop();
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
telnet_getenv(val)
|
||||||
|
char *val;
|
||||||
|
{
|
||||||
|
extern char *getenv();
|
||||||
|
return(getenv(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
telnet_gets(prompt, result, length, echo)
|
||||||
|
char *prompt;
|
||||||
|
char *result;
|
||||||
|
int length;
|
||||||
|
int echo;
|
||||||
|
{
|
||||||
|
return((char *)0);
|
||||||
|
}
|
||||||
|
#endif /* defined(AUTHENTICATION) || defined(ENCRYPTION) */
|
296
secure/libexec/telnetd/defs.h
Normal file
296
secure/libexec/telnetd/defs.h
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)defs.h 8.1 (Berkeley) 6/4/93
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Telnet server defines
|
||||||
|
*/
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
#ifndef BSD
|
||||||
|
# define BSD 43
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CRAY) && !defined(LINEMODE)
|
||||||
|
# define SYSV_TERMIO
|
||||||
|
# define LINEMODE
|
||||||
|
# define KLUDGELINEMODE
|
||||||
|
# define DIAGNOSTICS
|
||||||
|
# if defined(UNICOS50) && !defined(UNICOS5)
|
||||||
|
# define UNICOS5
|
||||||
|
# endif
|
||||||
|
# if !defined(UNICOS5)
|
||||||
|
# define BFTPDAEMON
|
||||||
|
# define HAS_IP_TOS
|
||||||
|
# endif
|
||||||
|
#endif /* CRAY */
|
||||||
|
#if defined(UNICOS5) && !defined(NO_SETSID)
|
||||||
|
# define NO_SETSID
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PRINTOPTIONS) && defined(DIAGNOSTICS)
|
||||||
|
#define TELOPTS
|
||||||
|
#define TELCMDS
|
||||||
|
#define SLC_NAMES
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SYSV_TERMIO) && !defined(USE_TERMIO)
|
||||||
|
# define USE_TERMIO
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#ifndef CRAY
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#endif /* CRAY */
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/file.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#ifndef FILIO_H
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#else
|
||||||
|
#include <sys/filio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
|
#include <arpa/telnet.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#ifdef __STDC__
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#ifndef LOG_DAEMON
|
||||||
|
#define LOG_DAEMON 0
|
||||||
|
#endif
|
||||||
|
#ifndef LOG_ODELAY
|
||||||
|
#define LOG_ODELAY 0
|
||||||
|
#endif
|
||||||
|
#include <ctype.h>
|
||||||
|
#ifndef NO_STRING_H
|
||||||
|
#include <string.h>
|
||||||
|
#else
|
||||||
|
#include <strings.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef USE_TERMIO
|
||||||
|
#include <sgtty.h>
|
||||||
|
#else
|
||||||
|
# ifdef SYSV_TERMIO
|
||||||
|
# include <termio.h>
|
||||||
|
# else
|
||||||
|
# include <termios.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if !defined(USE_TERMIO) || defined(NO_CC_T)
|
||||||
|
typedef unsigned char cc_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __STDC__
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _POSIX_VDISABLE
|
||||||
|
# ifdef VDISABLE
|
||||||
|
# define _POSIX_VDISABLE VDISABLE
|
||||||
|
# else
|
||||||
|
# define _POSIX_VDISABLE ((unsigned char)'\377')
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CRAY
|
||||||
|
# ifdef CRAY1
|
||||||
|
# include <sys/pty.h>
|
||||||
|
# ifndef FD_ZERO
|
||||||
|
# include <sys/select.h>
|
||||||
|
# endif /* FD_ZERO */
|
||||||
|
# endif /* CRAY1 */
|
||||||
|
|
||||||
|
#include <memory.h>
|
||||||
|
#endif /* CRAY */
|
||||||
|
|
||||||
|
#ifdef __hpux
|
||||||
|
#include <sys/ptyio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(TIOCSCTTY) && defined(TCSETCTTY)
|
||||||
|
# define TIOCSCTTY TCSETCTTY
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FD_SET
|
||||||
|
#ifndef HAVE_fd_set
|
||||||
|
typedef struct fd_set { int fds_bits[1]; } fd_set;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FD_SET(n, p) ((p)->fds_bits[0] |= (1<<(n)))
|
||||||
|
#define FD_CLR(n, p) ((p)->fds_bits[0] &= ~(1<<(n)))
|
||||||
|
#define FD_ISSET(n, p) ((p)->fds_bits[0] & (1<<(n)))
|
||||||
|
#define FD_ZERO(p) ((p)->fds_bits[0] = 0)
|
||||||
|
#endif /* FD_SET */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* I/O data buffers defines
|
||||||
|
*/
|
||||||
|
#define NETSLOP 64
|
||||||
|
#ifdef CRAY
|
||||||
|
#undef BUFSIZ
|
||||||
|
#define BUFSIZ 2048
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define NIACCUM(c) { *netip++ = c; \
|
||||||
|
ncc++; \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clock manipulations */
|
||||||
|
#define settimer(x) (clocks.x = ++clocks.system)
|
||||||
|
#define sequenceIs(x,y) (clocks.x < clocks.y)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Linemode support states, in decreasing order of importance
|
||||||
|
*/
|
||||||
|
#define REAL_LINEMODE 0x04
|
||||||
|
#define KLUDGE_OK 0x03
|
||||||
|
#define NO_AUTOKLUDGE 0x02
|
||||||
|
#define KLUDGE_LINEMODE 0x01
|
||||||
|
#define NO_LINEMODE 0x00
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structures of information for each special character function.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
unsigned char flag; /* the flags for this function */
|
||||||
|
cc_t val; /* the value of the special character */
|
||||||
|
} slcent, *Slcent;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
slcent defset; /* the default settings */
|
||||||
|
slcent current; /* the current settings */
|
||||||
|
cc_t *sptr; /* a pointer to the char in */
|
||||||
|
/* system data structures */
|
||||||
|
} slcfun, *Slcfun;
|
||||||
|
|
||||||
|
#ifdef DIAGNOSTICS
|
||||||
|
/*
|
||||||
|
* Diagnostics capabilities
|
||||||
|
*/
|
||||||
|
#define TD_REPORT 0x01 /* Report operations to client */
|
||||||
|
#define TD_EXERCISE 0x02 /* Exercise client's implementation */
|
||||||
|
#define TD_NETDATA 0x04 /* Display received data stream */
|
||||||
|
#define TD_PTYDATA 0x08 /* Display data passed to pty */
|
||||||
|
#define TD_OPTIONS 0x10 /* Report just telnet options */
|
||||||
|
#endif /* DIAGNOSTICS */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We keep track of each side of the option negotiation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MY_STATE_WILL 0x01
|
||||||
|
#define MY_WANT_STATE_WILL 0x02
|
||||||
|
#define MY_STATE_DO 0x04
|
||||||
|
#define MY_WANT_STATE_DO 0x08
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macros to check the current state of things
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define my_state_is_do(opt) (options[opt]&MY_STATE_DO)
|
||||||
|
#define my_state_is_will(opt) (options[opt]&MY_STATE_WILL)
|
||||||
|
#define my_want_state_is_do(opt) (options[opt]&MY_WANT_STATE_DO)
|
||||||
|
#define my_want_state_is_will(opt) (options[opt]&MY_WANT_STATE_WILL)
|
||||||
|
|
||||||
|
#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 set_my_state_do(opt) (options[opt] |= MY_STATE_DO)
|
||||||
|
#define set_my_state_will(opt) (options[opt] |= MY_STATE_WILL)
|
||||||
|
#define set_my_want_state_do(opt) (options[opt] |= MY_WANT_STATE_DO)
|
||||||
|
#define set_my_want_state_will(opt) (options[opt] |= MY_WANT_STATE_WILL)
|
||||||
|
|
||||||
|
#define set_my_state_dont(opt) (options[opt] &= ~MY_STATE_DO)
|
||||||
|
#define set_my_state_wont(opt) (options[opt] &= ~MY_STATE_WILL)
|
||||||
|
#define set_my_want_state_dont(opt) (options[opt] &= ~MY_WANT_STATE_DO)
|
||||||
|
#define set_my_want_state_wont(opt) (options[opt] &= ~MY_WANT_STATE_WILL)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tricky code here. What we want to know is if the MY_STATE_WILL
|
||||||
|
* and MY_WANT_STATE_WILL bits have the same value. Since the two
|
||||||
|
* bits are adjacent, a little arithmatic will show that by adding
|
||||||
|
* in the lower bit, the upper bit will be set if the two bits were
|
||||||
|
* different, and clear if they were the same.
|
||||||
|
*/
|
||||||
|
#define my_will_wont_is_changing(opt) \
|
||||||
|
((options[opt]+MY_STATE_WILL) & MY_WANT_STATE_WILL)
|
||||||
|
|
||||||
|
#define my_do_dont_is_changing(opt) \
|
||||||
|
((options[opt]+MY_STATE_DO) & MY_WANT_STATE_DO)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make everything symetrical
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define HIS_STATE_WILL MY_STATE_DO
|
||||||
|
#define HIS_WANT_STATE_WILL MY_WANT_STATE_DO
|
||||||
|
#define HIS_STATE_DO MY_STATE_WILL
|
||||||
|
#define HIS_WANT_STATE_DO MY_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 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_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_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 his_will_wont_is_changing my_do_dont_is_changing
|
||||||
|
#define his_do_dont_is_changing my_will_wont_is_changing
|
240
secure/libexec/telnetd/ext.h
Normal file
240
secure/libexec/telnetd/ext.h
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)ext.h 8.2 (Berkeley) 12/15/93
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Telnet server variable declarations
|
||||||
|
*/
|
||||||
|
extern char options[256];
|
||||||
|
extern char do_dont_resp[256];
|
||||||
|
extern char will_wont_resp[256];
|
||||||
|
extern int linemode; /* linemode on/off */
|
||||||
|
#ifdef LINEMODE
|
||||||
|
extern int uselinemode; /* what linemode to use (on/off) */
|
||||||
|
extern int editmode; /* edit modes in use */
|
||||||
|
extern int useeditmode; /* edit modes to use */
|
||||||
|
extern int alwayslinemode; /* command line option */
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
extern int lmodetype; /* Client support for linemode */
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
extern int flowmode; /* current flow control state */
|
||||||
|
extern int restartany; /* restart output on any character state */
|
||||||
|
#ifdef DIAGNOSTICS
|
||||||
|
extern int diagnostic; /* telnet diagnostic capabilities */
|
||||||
|
#endif /* DIAGNOSTICS */
|
||||||
|
#ifdef BFTPDAEMON
|
||||||
|
extern int bftpd; /* behave as bftp daemon */
|
||||||
|
#endif /* BFTPDAEMON */
|
||||||
|
#if defined(SecurID)
|
||||||
|
extern int require_SecurID;
|
||||||
|
#endif
|
||||||
|
#if defined(AUTHENTICATION)
|
||||||
|
extern int auth_level;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern slcfun slctab[NSLC + 1]; /* slc mapping table */
|
||||||
|
|
||||||
|
char *terminaltype;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* I/O data buffers, pointers, and counters.
|
||||||
|
*/
|
||||||
|
extern char ptyobuf[BUFSIZ+NETSLOP], *pfrontp, *pbackp;
|
||||||
|
|
||||||
|
extern char netibuf[BUFSIZ], *netip;
|
||||||
|
|
||||||
|
extern char netobuf[BUFSIZ+NETSLOP], *nfrontp, *nbackp;
|
||||||
|
extern char *neturg; /* one past last bye of urgent data */
|
||||||
|
|
||||||
|
extern int pcc, ncc;
|
||||||
|
|
||||||
|
#if defined(CRAY2) && defined(UNICOS5)
|
||||||
|
extern int unpcc; /* characters left unprocessed by CRAY-2 terminal routine */
|
||||||
|
extern char *unptyip; /* pointer to remaining characters in buffer */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern int pty, net;
|
||||||
|
extern char *line;
|
||||||
|
extern int SYNCHing; /* we are in TELNET SYNCH mode */
|
||||||
|
|
||||||
|
#ifndef P
|
||||||
|
# ifdef __STDC__
|
||||||
|
# define P(x) x
|
||||||
|
# else
|
||||||
|
# define P(x) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void
|
||||||
|
_termstat P((void)),
|
||||||
|
add_slc P((int, int, int)),
|
||||||
|
check_slc P((void)),
|
||||||
|
change_slc P((int, int, int)),
|
||||||
|
cleanup P((int)),
|
||||||
|
clientstat P((int, int, int)),
|
||||||
|
copy_termbuf P((char *, int)),
|
||||||
|
deferslc P((void)),
|
||||||
|
defer_terminit P((void)),
|
||||||
|
do_opt_slc P((unsigned char *, int)),
|
||||||
|
doeof P((void)),
|
||||||
|
dooption P((int)),
|
||||||
|
dontoption P((int)),
|
||||||
|
edithost P((char *, char *)),
|
||||||
|
fatal P((int, char *)),
|
||||||
|
fatalperror P((int, char *)),
|
||||||
|
get_slc_defaults P((void)),
|
||||||
|
init_env P((void)),
|
||||||
|
init_termbuf P((void)),
|
||||||
|
interrupt P((void)),
|
||||||
|
localstat P((void)),
|
||||||
|
flowstat P((void)),
|
||||||
|
netclear P((void)),
|
||||||
|
netflush P((void)),
|
||||||
|
#ifdef DIAGNOSTICS
|
||||||
|
printoption P((char *, int)),
|
||||||
|
printdata P((char *, char *, int)),
|
||||||
|
printsub P((int, unsigned char *, int)),
|
||||||
|
#endif
|
||||||
|
ptyflush P((void)),
|
||||||
|
putchr P((int)),
|
||||||
|
putf P((char *, char *)),
|
||||||
|
recv_ayt P((void)),
|
||||||
|
send_do P((int, int)),
|
||||||
|
send_dont P((int, int)),
|
||||||
|
send_slc P((void)),
|
||||||
|
send_status P((void)),
|
||||||
|
send_will P((int, int)),
|
||||||
|
send_wont P((int, int)),
|
||||||
|
sendbrk P((void)),
|
||||||
|
sendsusp P((void)),
|
||||||
|
set_termbuf P((void)),
|
||||||
|
start_login P((char *, int, char *)),
|
||||||
|
start_slc P((int)),
|
||||||
|
#if defined(AUTHENTICATION)
|
||||||
|
start_slave P((char *)),
|
||||||
|
#else
|
||||||
|
start_slave P((char *, int, char *)),
|
||||||
|
#endif
|
||||||
|
suboption P((void)),
|
||||||
|
telrcv P((void)),
|
||||||
|
ttloop P((void)),
|
||||||
|
tty_binaryin P((int)),
|
||||||
|
tty_binaryout P((int));
|
||||||
|
|
||||||
|
extern int
|
||||||
|
end_slc P((unsigned char **)),
|
||||||
|
getnpty P((void)),
|
||||||
|
#ifndef convex
|
||||||
|
getpty P((int *)),
|
||||||
|
#endif
|
||||||
|
login_tty P((int)),
|
||||||
|
spcset P((int, cc_t *, cc_t **)),
|
||||||
|
stilloob P((int)),
|
||||||
|
terminit P((void)),
|
||||||
|
termstat P((void)),
|
||||||
|
tty_flowmode P((void)),
|
||||||
|
tty_restartany P((void)),
|
||||||
|
tty_isbinaryin P((void)),
|
||||||
|
tty_isbinaryout P((void)),
|
||||||
|
tty_iscrnl P((void)),
|
||||||
|
tty_isecho P((void)),
|
||||||
|
tty_isediting P((void)),
|
||||||
|
tty_islitecho P((void)),
|
||||||
|
tty_isnewmap P((void)),
|
||||||
|
tty_israw P((void)),
|
||||||
|
tty_issofttab P((void)),
|
||||||
|
tty_istrapsig P((void)),
|
||||||
|
tty_linemode P((void));
|
||||||
|
|
||||||
|
extern void
|
||||||
|
tty_rspeed P((int)),
|
||||||
|
tty_setecho P((int)),
|
||||||
|
tty_setedit P((int)),
|
||||||
|
tty_setlinemode P((int)),
|
||||||
|
tty_setlitecho P((int)),
|
||||||
|
tty_setsig P((int)),
|
||||||
|
tty_setsofttab P((int)),
|
||||||
|
tty_tspeed P((int)),
|
||||||
|
willoption P((int)),
|
||||||
|
wontoption P((int)),
|
||||||
|
writenet P((unsigned char *, int));
|
||||||
|
|
||||||
|
#ifdef ENCRYPTION
|
||||||
|
extern void (*encrypt_output) P((unsigned char *, int));
|
||||||
|
extern int (*decrypt_input) P((int));
|
||||||
|
extern char *nclearto;
|
||||||
|
#endif /* ENCRYPTION */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following are some clocks used to decide how to interpret
|
||||||
|
* the relationship between various variables.
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern struct {
|
||||||
|
int
|
||||||
|
system, /* what the current time is */
|
||||||
|
echotoggle, /* last time user entered echo character */
|
||||||
|
modenegotiated, /* last time operating mode negotiated */
|
||||||
|
didnetreceive, /* last time we read data from network */
|
||||||
|
ttypesubopt, /* ttype subopt is received */
|
||||||
|
tspeedsubopt, /* tspeed subopt is received */
|
||||||
|
environsubopt, /* environ subopt is received */
|
||||||
|
oenvironsubopt, /* old environ subopt is received */
|
||||||
|
xdisplocsubopt, /* xdisploc subopt is received */
|
||||||
|
baseline, /* time started to do timed action */
|
||||||
|
gotDM; /* when did we last see a data mark */
|
||||||
|
} clocks;
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(CRAY2) && defined(UNICOS5)
|
||||||
|
extern int needtermstat;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef DEFAULT_IM
|
||||||
|
# ifdef CRAY
|
||||||
|
# define DEFAULT_IM "\r\n\r\nCray UNICOS (%h) (%t)\r\n\r\r\n\r"
|
||||||
|
# else
|
||||||
|
# ifdef sun
|
||||||
|
# define DEFAULT_IM "\r\n\r\nSunOS UNIX (%h) (%t)\r\n\r\r\n\r"
|
||||||
|
# else
|
||||||
|
# ifdef ultrix
|
||||||
|
# define DEFAULT_IM "\r\n\r\nULTRIX (%h) (%t)\r\n\r\r\n\r"
|
||||||
|
# else
|
||||||
|
# define DEFAULT_IM "\r\n\r\n4.4 BSD UNIX (%h) (%t)\r\n\r\r\n\r"
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
48
secure/libexec/telnetd/global.c
Normal file
48
secure/libexec/telnetd/global.c
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)global.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate global variables. We do this
|
||||||
|
* by including the header file that defines
|
||||||
|
* them all as externs, but first we define
|
||||||
|
* the keyword "extern" to be nothing, so that
|
||||||
|
* we will actually allocate the space.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "defs.h"
|
||||||
|
#define extern
|
||||||
|
#include "ext.h"
|
55
secure/libexec/telnetd/pathnames.h
Normal file
55
secure/libexec/telnetd/pathnames.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)pathnames.h 8.1 (Berkeley) 6/4/93
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if BSD > 43
|
||||||
|
|
||||||
|
# include <paths.h>
|
||||||
|
|
||||||
|
# ifndef _PATH_LOGIN
|
||||||
|
# define _PATH_LOGIN "/usr/bin/login"
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
# define _PATH_TTY "/dev/tty"
|
||||||
|
# ifndef _PATH_LOGIN
|
||||||
|
# define _PATH_LOGIN "/bin/login"
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef BFTPDAEMON
|
||||||
|
#define BFTPPATH "/usr/ucb/bftp"
|
||||||
|
#endif /* BFTPDAEMON */
|
493
secure/libexec/telnetd/slc.c
Normal file
493
secure/libexec/telnetd/slc.c
Normal file
@ -0,0 +1,493 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)slc.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "telnetd.h"
|
||||||
|
|
||||||
|
#ifdef LINEMODE
|
||||||
|
/*
|
||||||
|
* local varibles
|
||||||
|
*/
|
||||||
|
static unsigned char *def_slcbuf = (unsigned char *)0;
|
||||||
|
static int def_slclen = 0;
|
||||||
|
static int slcchange; /* change to slc is requested */
|
||||||
|
static unsigned char *slcptr; /* pointer into slc buffer */
|
||||||
|
static unsigned char slcbuf[NSLC*6]; /* buffer for slc negotiation */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* send_slc
|
||||||
|
*
|
||||||
|
* Write out the current special characters to the client.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
send_slc()
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send out list of triplets of special characters
|
||||||
|
* to client. We only send info on the characters
|
||||||
|
* that are currently supported.
|
||||||
|
*/
|
||||||
|
for (i = 1; i <= NSLC; i++) {
|
||||||
|
if ((slctab[i].defset.flag & SLC_LEVELBITS) == SLC_NOSUPPORT)
|
||||||
|
continue;
|
||||||
|
add_slc((unsigned char)i, slctab[i].current.flag,
|
||||||
|
slctab[i].current.val);
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end of send_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* default_slc
|
||||||
|
*
|
||||||
|
* Set pty special characters to all the defaults.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
default_slc()
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
for (i = 1; i <= NSLC; i++) {
|
||||||
|
slctab[i].current.val = slctab[i].defset.val;
|
||||||
|
if (slctab[i].current.val == (cc_t)(_POSIX_VDISABLE))
|
||||||
|
slctab[i].current.flag = SLC_NOSUPPORT;
|
||||||
|
else
|
||||||
|
slctab[i].current.flag = slctab[i].defset.flag;
|
||||||
|
if (slctab[i].sptr) {
|
||||||
|
*(slctab[i].sptr) = slctab[i].defset.val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
slcchange = 1;
|
||||||
|
|
||||||
|
} /* end of default_slc */
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* get_slc_defaults
|
||||||
|
*
|
||||||
|
* Initialize the slc mapping table.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
get_slc_defaults()
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
init_termbuf();
|
||||||
|
|
||||||
|
for (i = 1; i <= NSLC; i++) {
|
||||||
|
slctab[i].defset.flag =
|
||||||
|
spcset(i, &slctab[i].defset.val, &slctab[i].sptr);
|
||||||
|
slctab[i].current.flag = SLC_NOSUPPORT;
|
||||||
|
slctab[i].current.val = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end of get_slc_defaults */
|
||||||
|
|
||||||
|
#ifdef LINEMODE
|
||||||
|
/*
|
||||||
|
* add_slc
|
||||||
|
*
|
||||||
|
* Add an slc triplet to the slc buffer.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
add_slc(func, flag, val)
|
||||||
|
register char func, flag;
|
||||||
|
register cc_t val;
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((*slcptr++ = (unsigned char)func) == 0xff)
|
||||||
|
*slcptr++ = 0xff;
|
||||||
|
|
||||||
|
if ((*slcptr++ = (unsigned char)flag) == 0xff)
|
||||||
|
*slcptr++ = 0xff;
|
||||||
|
|
||||||
|
if ((*slcptr++ = (unsigned char)val) == 0xff)
|
||||||
|
*slcptr++ = 0xff;
|
||||||
|
|
||||||
|
} /* end of add_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* start_slc
|
||||||
|
*
|
||||||
|
* Get ready to process incoming slc's and respond to them.
|
||||||
|
*
|
||||||
|
* The parameter getit is non-zero if it is necessary to grab a copy
|
||||||
|
* of the terminal control structures.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
start_slc(getit)
|
||||||
|
register int getit;
|
||||||
|
{
|
||||||
|
|
||||||
|
slcchange = 0;
|
||||||
|
if (getit)
|
||||||
|
init_termbuf();
|
||||||
|
(void) sprintf((char *)slcbuf, "%c%c%c%c",
|
||||||
|
IAC, SB, TELOPT_LINEMODE, LM_SLC);
|
||||||
|
slcptr = slcbuf + 4;
|
||||||
|
|
||||||
|
} /* end of start_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* end_slc
|
||||||
|
*
|
||||||
|
* Finish up the slc negotiation. If something to send, then send it.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
end_slc(bufp)
|
||||||
|
register unsigned char **bufp;
|
||||||
|
{
|
||||||
|
register int len;
|
||||||
|
void netflush();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If a change has occured, store the new terminal control
|
||||||
|
* structures back to the terminal driver.
|
||||||
|
*/
|
||||||
|
if (slcchange) {
|
||||||
|
set_termbuf();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the pty state has not yet been fully processed and there is a
|
||||||
|
* deferred slc request from the client, then do not send any
|
||||||
|
* sort of slc negotiation now. We will respond to the client's
|
||||||
|
* request very soon.
|
||||||
|
*/
|
||||||
|
if (def_slcbuf && (terminit() == 0)) {
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (slcptr > (slcbuf + 4)) {
|
||||||
|
if (bufp) {
|
||||||
|
*bufp = &slcbuf[4];
|
||||||
|
return(slcptr - slcbuf - 4);
|
||||||
|
} else {
|
||||||
|
(void) sprintf((char *)slcptr, "%c%c", IAC, SE);
|
||||||
|
slcptr += 2;
|
||||||
|
len = slcptr - slcbuf;
|
||||||
|
writenet(slcbuf, len);
|
||||||
|
netflush(); /* force it out immediately */
|
||||||
|
DIAG(TD_OPTIONS, printsub('>', slcbuf+2, len-2););
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
} /* end of end_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* process_slc
|
||||||
|
*
|
||||||
|
* Figure out what to do about the client's slc
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
process_slc(func, flag, val)
|
||||||
|
register unsigned char func, flag;
|
||||||
|
register cc_t val;
|
||||||
|
{
|
||||||
|
register int hislevel, mylevel, ack;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ensure that we know something about this function
|
||||||
|
*/
|
||||||
|
if (func > NSLC) {
|
||||||
|
add_slc(func, SLC_NOSUPPORT, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Process the special case requests of 0 SLC_DEFAULT 0
|
||||||
|
* and 0 SLC_VARIABLE 0. Be a little forgiving here, don't
|
||||||
|
* worry about whether the value is actually 0 or not.
|
||||||
|
*/
|
||||||
|
if (func == 0) {
|
||||||
|
if ((flag = flag & SLC_LEVELBITS) == SLC_DEFAULT) {
|
||||||
|
default_slc();
|
||||||
|
send_slc();
|
||||||
|
} else if (flag == SLC_VARIABLE) {
|
||||||
|
send_slc();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Appears to be a function that we know something about. So
|
||||||
|
* get on with it and see what we know.
|
||||||
|
*/
|
||||||
|
|
||||||
|
hislevel = flag & SLC_LEVELBITS;
|
||||||
|
mylevel = slctab[func].current.flag & SLC_LEVELBITS;
|
||||||
|
ack = flag & SLC_ACK;
|
||||||
|
/*
|
||||||
|
* ignore the command if:
|
||||||
|
* the function value and level are the same as what we already have;
|
||||||
|
* or the level is the same and the ack bit is set
|
||||||
|
*/
|
||||||
|
if (hislevel == mylevel && (val == slctab[func].current.val || ack)) {
|
||||||
|
return;
|
||||||
|
} else if (ack) {
|
||||||
|
/*
|
||||||
|
* If we get here, we got an ack, but the levels don't match.
|
||||||
|
* This shouldn't happen. If it does, it is probably because
|
||||||
|
* we have sent two requests to set a variable without getting
|
||||||
|
* a response between them, and this is the first response.
|
||||||
|
* So, ignore it, and wait for the next response.
|
||||||
|
*/
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
change_slc(func, flag, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end of process_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* change_slc
|
||||||
|
*
|
||||||
|
* Process a request to change one of our special characters.
|
||||||
|
* Compare client's request with what we are capable of supporting.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
change_slc(func, flag, val)
|
||||||
|
register char func, flag;
|
||||||
|
register cc_t val;
|
||||||
|
{
|
||||||
|
register int hislevel, mylevel;
|
||||||
|
|
||||||
|
hislevel = flag & SLC_LEVELBITS;
|
||||||
|
mylevel = slctab[func].defset.flag & SLC_LEVELBITS;
|
||||||
|
/*
|
||||||
|
* If client is setting a function to NOSUPPORT
|
||||||
|
* or DEFAULT, then we can easily and directly
|
||||||
|
* accomodate the request.
|
||||||
|
*/
|
||||||
|
if (hislevel == SLC_NOSUPPORT) {
|
||||||
|
slctab[func].current.flag = flag;
|
||||||
|
slctab[func].current.val = (cc_t)_POSIX_VDISABLE;
|
||||||
|
flag |= SLC_ACK;
|
||||||
|
add_slc(func, flag, val);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (hislevel == SLC_DEFAULT) {
|
||||||
|
/*
|
||||||
|
* Special case here. If client tells us to use
|
||||||
|
* the default on a function we don't support, then
|
||||||
|
* return NOSUPPORT instead of what we may have as a
|
||||||
|
* default level of DEFAULT.
|
||||||
|
*/
|
||||||
|
if (mylevel == SLC_DEFAULT) {
|
||||||
|
slctab[func].current.flag = SLC_NOSUPPORT;
|
||||||
|
} else {
|
||||||
|
slctab[func].current.flag = slctab[func].defset.flag;
|
||||||
|
}
|
||||||
|
slctab[func].current.val = slctab[func].defset.val;
|
||||||
|
add_slc(func, slctab[func].current.flag,
|
||||||
|
slctab[func].current.val);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Client wants us to change to a new value or he
|
||||||
|
* is telling us that he can't change to our value.
|
||||||
|
* Some of the slc's we support and can change,
|
||||||
|
* some we do support but can't change,
|
||||||
|
* and others we don't support at all.
|
||||||
|
* If we can change it then we have a pointer to
|
||||||
|
* the place to put the new value, so change it,
|
||||||
|
* otherwise, continue the negotiation.
|
||||||
|
*/
|
||||||
|
if (slctab[func].sptr) {
|
||||||
|
/*
|
||||||
|
* We can change this one.
|
||||||
|
*/
|
||||||
|
slctab[func].current.val = val;
|
||||||
|
*(slctab[func].sptr) = val;
|
||||||
|
slctab[func].current.flag = flag;
|
||||||
|
flag |= SLC_ACK;
|
||||||
|
slcchange = 1;
|
||||||
|
add_slc(func, flag, val);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* It is not possible for us to support this
|
||||||
|
* request as he asks.
|
||||||
|
*
|
||||||
|
* If our level is DEFAULT, then just ack whatever was
|
||||||
|
* sent.
|
||||||
|
*
|
||||||
|
* If he can't change and we can't change,
|
||||||
|
* then degenerate to NOSUPPORT.
|
||||||
|
*
|
||||||
|
* Otherwise we send our level back to him, (CANTCHANGE
|
||||||
|
* or NOSUPPORT) and if CANTCHANGE, send
|
||||||
|
* our value as well.
|
||||||
|
*/
|
||||||
|
if (mylevel == SLC_DEFAULT) {
|
||||||
|
slctab[func].current.flag = flag;
|
||||||
|
slctab[func].current.val = val;
|
||||||
|
flag |= SLC_ACK;
|
||||||
|
} else if (hislevel == SLC_CANTCHANGE &&
|
||||||
|
mylevel == SLC_CANTCHANGE) {
|
||||||
|
flag &= ~SLC_LEVELBITS;
|
||||||
|
flag |= SLC_NOSUPPORT;
|
||||||
|
slctab[func].current.flag = flag;
|
||||||
|
} else {
|
||||||
|
flag &= ~SLC_LEVELBITS;
|
||||||
|
flag |= mylevel;
|
||||||
|
slctab[func].current.flag = flag;
|
||||||
|
if (mylevel == SLC_CANTCHANGE) {
|
||||||
|
slctab[func].current.val =
|
||||||
|
slctab[func].defset.val;
|
||||||
|
val = slctab[func].current.val;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
add_slc(func, flag, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end of change_slc */
|
||||||
|
|
||||||
|
#if defined(USE_TERMIO) && (VEOF == VMIN)
|
||||||
|
cc_t oldeofc = '\004';
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check_slc
|
||||||
|
*
|
||||||
|
* Check the special characters in use and notify the client if any have
|
||||||
|
* changed. Only those characters that are capable of being changed are
|
||||||
|
* likely to have changed. If a local change occurs, kick the support level
|
||||||
|
* and flags up to the defaults.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
check_slc()
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
for (i = 1; i <= NSLC; i++) {
|
||||||
|
#if defined(USE_TERMIO) && (VEOF == VMIN)
|
||||||
|
/*
|
||||||
|
* In a perfect world this would be a neat little
|
||||||
|
* function. But in this world, we should not notify
|
||||||
|
* client of changes to the VEOF char when
|
||||||
|
* ICANON is off, because it is not representing
|
||||||
|
* a special character.
|
||||||
|
*/
|
||||||
|
if (i == SLC_EOF) {
|
||||||
|
if (!tty_isediting())
|
||||||
|
continue;
|
||||||
|
else if (slctab[i].sptr)
|
||||||
|
oldeofc = *(slctab[i].sptr);
|
||||||
|
}
|
||||||
|
#endif /* defined(USE_TERMIO) && defined(SYSV_TERMIO) */
|
||||||
|
if (slctab[i].sptr &&
|
||||||
|
(*(slctab[i].sptr) != slctab[i].current.val)) {
|
||||||
|
slctab[i].current.val = *(slctab[i].sptr);
|
||||||
|
if (*(slctab[i].sptr) == (cc_t)_POSIX_VDISABLE)
|
||||||
|
slctab[i].current.flag = SLC_NOSUPPORT;
|
||||||
|
else
|
||||||
|
slctab[i].current.flag = slctab[i].defset.flag;
|
||||||
|
add_slc((unsigned char)i, slctab[i].current.flag,
|
||||||
|
slctab[i].current.val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* check_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* do_opt_slc
|
||||||
|
*
|
||||||
|
* Process an slc option buffer. Defer processing of incoming slc's
|
||||||
|
* until after the terminal state has been processed. Save the first slc
|
||||||
|
* request that comes along, but discard all others.
|
||||||
|
*
|
||||||
|
* ptr points to the beginning of the buffer, len is the length.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
do_opt_slc(ptr, len)
|
||||||
|
register unsigned char *ptr;
|
||||||
|
register int len;
|
||||||
|
{
|
||||||
|
register unsigned char func, flag;
|
||||||
|
cc_t val;
|
||||||
|
register unsigned char *end = ptr + len;
|
||||||
|
|
||||||
|
if (terminit()) { /* go ahead */
|
||||||
|
while (ptr < end) {
|
||||||
|
func = *ptr++;
|
||||||
|
if (ptr >= end) break;
|
||||||
|
flag = *ptr++;
|
||||||
|
if (ptr >= end) break;
|
||||||
|
val = (cc_t)*ptr++;
|
||||||
|
|
||||||
|
process_slc(func, flag, val);
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* save this slc buffer if it is the first, otherwise dump
|
||||||
|
* it.
|
||||||
|
*/
|
||||||
|
if (def_slcbuf == (unsigned char *)0) {
|
||||||
|
def_slclen = len;
|
||||||
|
def_slcbuf = (unsigned char *)malloc((unsigned)len);
|
||||||
|
if (def_slcbuf == (unsigned char *)0)
|
||||||
|
return; /* too bad */
|
||||||
|
bcopy(ptr, def_slcbuf, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end of do_opt_slc */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* deferslc
|
||||||
|
*
|
||||||
|
* Do slc stuff that was deferred.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
deferslc()
|
||||||
|
{
|
||||||
|
if (def_slcbuf) {
|
||||||
|
start_slc(1);
|
||||||
|
do_opt_slc(def_slcbuf, def_slclen);
|
||||||
|
(void) end_slc(0);
|
||||||
|
free(def_slcbuf);
|
||||||
|
def_slcbuf = (unsigned char *)0;
|
||||||
|
def_slclen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
} /* end of deferslc */
|
||||||
|
|
||||||
|
#endif /* LINEMODE */
|
1620
secure/libexec/telnetd/state.c
Normal file
1620
secure/libexec/telnetd/state.c
Normal file
File diff suppressed because it is too large
Load Diff
2135
secure/libexec/telnetd/sys_term.c
Normal file
2135
secure/libexec/telnetd/sys_term.c
Normal file
File diff suppressed because it is too large
Load Diff
605
secure/libexec/telnetd/telnetd.8
Normal file
605
secure/libexec/telnetd/telnetd.8
Normal file
@ -0,0 +1,605 @@
|
|||||||
|
.\" Copyright (c) 1983, 1993
|
||||||
|
.\" The Regents of the University of California. All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" Redistribution and use in source and binary forms, with or without
|
||||||
|
.\" modification, are permitted provided that the following conditions
|
||||||
|
.\" are met:
|
||||||
|
.\" 1. Redistributions of source code must retain the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer.
|
||||||
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer in the
|
||||||
|
.\" documentation and/or other materials provided with the distribution.
|
||||||
|
.\" 3. All advertising materials mentioning features or use of this software
|
||||||
|
.\" must display the following acknowledgement:
|
||||||
|
.\" This product includes software developed by the University of
|
||||||
|
.\" California, Berkeley and its contributors.
|
||||||
|
.\" 4. Neither the name of the University nor the names of its contributors
|
||||||
|
.\" may be used to endorse or promote products derived from this software
|
||||||
|
.\" without specific prior written permission.
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
.\" SUCH DAMAGE.
|
||||||
|
.\"
|
||||||
|
.\" @(#)telnetd.8 8.3 (Berkeley) 3/1/94
|
||||||
|
.\"
|
||||||
|
.Dd March 1, 1994
|
||||||
|
.Dt TELNETD 8
|
||||||
|
.Os BSD 4.2
|
||||||
|
.Sh NAME
|
||||||
|
.Nm telnetd
|
||||||
|
.Nd DARPA
|
||||||
|
.Tn TELNET
|
||||||
|
protocol server
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Nm /usr/libexec/telnetd
|
||||||
|
.Op Fl BUhlkns
|
||||||
|
.Op Fl D Ar debugmode
|
||||||
|
.Op Fl I Ns Ar initid
|
||||||
|
.Op Fl S Ar tos
|
||||||
|
.Op Fl X Ar authtype
|
||||||
|
.Op Fl a Ar authmode
|
||||||
|
.Op Fl edebug
|
||||||
|
.Op Fl r Ns Ar lowpty-highpty
|
||||||
|
.Op Fl u Ar len
|
||||||
|
.Op Fl debug Op Ar port
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
The
|
||||||
|
.Nm telnetd
|
||||||
|
command is a server which supports the
|
||||||
|
.Tn DARPA
|
||||||
|
standard
|
||||||
|
.Tn TELNET
|
||||||
|
virtual terminal protocol.
|
||||||
|
.Nm Telnetd
|
||||||
|
is normally invoked by the internet server (see
|
||||||
|
.Xr inetd 8 )
|
||||||
|
for requests to connect to the
|
||||||
|
.Tn TELNET
|
||||||
|
port as indicated by the
|
||||||
|
.Pa /etc/services
|
||||||
|
file (see
|
||||||
|
.Xr services 5 ) .
|
||||||
|
The
|
||||||
|
.Fl debug
|
||||||
|
option may be used to start up
|
||||||
|
.Nm telnetd
|
||||||
|
manually, instead of through
|
||||||
|
.Xr inetd 8 .
|
||||||
|
If started up this way,
|
||||||
|
.Ar port
|
||||||
|
may be specified to run
|
||||||
|
.Nm telnetd
|
||||||
|
on an alternate
|
||||||
|
.Tn TCP
|
||||||
|
port number.
|
||||||
|
.Pp
|
||||||
|
The
|
||||||
|
.Nm telnetd
|
||||||
|
command accepts the following options:
|
||||||
|
.Bl -tag -width "-a authmode"
|
||||||
|
.It Fl a Ar authmode
|
||||||
|
This option may be used for specifying what mode should
|
||||||
|
be used for authentication.
|
||||||
|
Note that this option is only useful if
|
||||||
|
.Nm telnetd
|
||||||
|
has been compiled with support for the
|
||||||
|
.Dv AUTHENTICATION
|
||||||
|
option.
|
||||||
|
There are several valid values for
|
||||||
|
.Ar authmode:
|
||||||
|
.Bl -tag -width debug
|
||||||
|
.It debug
|
||||||
|
Turns on authentication debugging code.
|
||||||
|
.It user
|
||||||
|
Only allow connections when the remote user
|
||||||
|
can provide valid authentication information
|
||||||
|
to identify the remote user,
|
||||||
|
and is allowed access to the specified account
|
||||||
|
without providing a password.
|
||||||
|
.It valid
|
||||||
|
Only allow connections when the remote user
|
||||||
|
can provide valid authentication information
|
||||||
|
to identify the remote user.
|
||||||
|
The
|
||||||
|
.Xr login 1
|
||||||
|
command will provide any additional user verification
|
||||||
|
needed if the remote user is not allowed automatic
|
||||||
|
access to the specified account.
|
||||||
|
.It other
|
||||||
|
Only allow connections that supply some authentication information.
|
||||||
|
This option is currently not supported
|
||||||
|
by any of the existing authentication mechanisms,
|
||||||
|
and is thus the same as specifying
|
||||||
|
.Fl a
|
||||||
|
.Cm valid .
|
||||||
|
.It none
|
||||||
|
This is the default state.
|
||||||
|
Authentication information is not required.
|
||||||
|
If no or insufficient authentication information
|
||||||
|
is provided, then the
|
||||||
|
.Xr login 1
|
||||||
|
program will provide the necessary user
|
||||||
|
verification.
|
||||||
|
.It off
|
||||||
|
This disables the authentication code.
|
||||||
|
All user verification will happen through the
|
||||||
|
.Xr login 1
|
||||||
|
program.
|
||||||
|
.El
|
||||||
|
.It Fl B
|
||||||
|
Specifies bftp server mode. In this mode,
|
||||||
|
.Nm telnetd
|
||||||
|
causes login to start a
|
||||||
|
.Xr bftp 1
|
||||||
|
session rather than the user's
|
||||||
|
normal shell. In bftp daemon mode normal
|
||||||
|
logins are not supported, and it must be used
|
||||||
|
on a port other than the normal
|
||||||
|
.Tn TELNET
|
||||||
|
port.
|
||||||
|
.It Fl D Ar debugmode
|
||||||
|
This option may be used for debugging purposes.
|
||||||
|
This allows
|
||||||
|
.Nm telnetd
|
||||||
|
to print out debugging information
|
||||||
|
to the connection, allowing the user to see what
|
||||||
|
.Nm telnetd
|
||||||
|
is doing.
|
||||||
|
There are several possible values for
|
||||||
|
.Ar debugmode:
|
||||||
|
.Bl -tag -width exercise
|
||||||
|
.It Cm options
|
||||||
|
Prints information about the negotiation of
|
||||||
|
.Tn TELNET
|
||||||
|
options.
|
||||||
|
.It Cm report
|
||||||
|
Prints the
|
||||||
|
.Cm options
|
||||||
|
information, plus some additional information
|
||||||
|
about what processing is going on.
|
||||||
|
.It Cm netdata
|
||||||
|
Displays the data stream received by
|
||||||
|
.Nm telnetd.
|
||||||
|
.It Cm ptydata
|
||||||
|
Displays data written to the pty.
|
||||||
|
.It Cm exercise
|
||||||
|
Has not been implemented yet.
|
||||||
|
.El
|
||||||
|
.It Fl debug
|
||||||
|
Enables debugging on each socket created by
|
||||||
|
.Nm telnetd
|
||||||
|
(see
|
||||||
|
.Dv SO_DEBUG
|
||||||
|
in
|
||||||
|
.Xr socket 2 ) .
|
||||||
|
.It Fl edebug
|
||||||
|
If
|
||||||
|
.Nm telnetd
|
||||||
|
has been compiled with support for data encryption, then the
|
||||||
|
.Fl edebug
|
||||||
|
option may be used to enable encryption debugging code.
|
||||||
|
.It Fl h
|
||||||
|
Disables the printing of host-specific information before
|
||||||
|
login has been completed.
|
||||||
|
.It Fl I Ar initid
|
||||||
|
This option is only applicable to
|
||||||
|
.Tn UNICOS
|
||||||
|
systems prior to 7.0.
|
||||||
|
It specifies the
|
||||||
|
.Dv ID
|
||||||
|
from
|
||||||
|
.Pa /etc/inittab
|
||||||
|
to use when init starts login sessions. The default
|
||||||
|
.Dv ID
|
||||||
|
is
|
||||||
|
.Dv fe.
|
||||||
|
.It Fl k
|
||||||
|
This option is only useful if
|
||||||
|
.Nm telnetd
|
||||||
|
has been compiled with both linemode and kludge linemode
|
||||||
|
support. If the
|
||||||
|
.Fl k
|
||||||
|
option is specified, then if the remote client does not
|
||||||
|
support the
|
||||||
|
.Dv LINEMODE
|
||||||
|
option, then
|
||||||
|
.Nm telnetd
|
||||||
|
will operate in character at a time mode.
|
||||||
|
It will still support kludge linemode, but will only
|
||||||
|
go into kludge linemode if the remote client requests
|
||||||
|
it.
|
||||||
|
(This is done by by the client sending
|
||||||
|
.Dv DONT SUPPRESS-GO-AHEAD
|
||||||
|
and
|
||||||
|
.Dv DONT ECHO . )
|
||||||
|
The
|
||||||
|
.Fl k
|
||||||
|
option is most useful when there are remote clients
|
||||||
|
that do not support kludge linemode, but pass the heuristic
|
||||||
|
(if they respond with
|
||||||
|
.Dv WILL TIMING-MARK
|
||||||
|
in response to a
|
||||||
|
.Dv DO TIMING-MARK)
|
||||||
|
for kludge linemode support.
|
||||||
|
.It Fl l
|
||||||
|
Specifies line mode. Tries to force clients to use line-
|
||||||
|
at-a-time mode.
|
||||||
|
If the
|
||||||
|
.Dv LINEMODE
|
||||||
|
option is not supported, it will go
|
||||||
|
into kludge linemode.
|
||||||
|
.It Fl n
|
||||||
|
Disable
|
||||||
|
.Dv TCP
|
||||||
|
keep-alives. Normally
|
||||||
|
.Nm telnetd
|
||||||
|
enables the
|
||||||
|
.Tn TCP
|
||||||
|
keep-alive mechanism to probe connections that
|
||||||
|
have been idle for some period of time to determine
|
||||||
|
if the client is still there, so that idle connections
|
||||||
|
from machines that have crashed or can no longer
|
||||||
|
be reached may be cleaned up.
|
||||||
|
.It Fl r Ar lowpty-highpty
|
||||||
|
This option is only enabled when
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled for
|
||||||
|
.Dv UNICOS.
|
||||||
|
It specifies an inclusive range of pseudo-terminal devices to
|
||||||
|
use. If the system has sysconf variable
|
||||||
|
.Dv _SC_CRAY_NPTY
|
||||||
|
configured, the default pty search range is 0 to
|
||||||
|
.Dv _SC_CRAY_NPTY;
|
||||||
|
otherwise, the default range is 0 to 128. Either
|
||||||
|
.Ar lowpty
|
||||||
|
or
|
||||||
|
.Ar highpty
|
||||||
|
may be omitted to allow changing
|
||||||
|
either end of the search range. If
|
||||||
|
.Ar lowpty
|
||||||
|
is omitted, the - character is still required so that
|
||||||
|
.Nm telnetd
|
||||||
|
can differentiate
|
||||||
|
.Ar highpty
|
||||||
|
from
|
||||||
|
.Ar lowpty .
|
||||||
|
.It Fl s
|
||||||
|
This option is only enabled if
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled with support for
|
||||||
|
.Tn SecurID
|
||||||
|
cards.
|
||||||
|
It causes the
|
||||||
|
.Fl s
|
||||||
|
option to be passed on to
|
||||||
|
.Xr login 1 ,
|
||||||
|
and thus is only useful if
|
||||||
|
.Xr login 1
|
||||||
|
supports the
|
||||||
|
.Fl s
|
||||||
|
flag to indicate that only
|
||||||
|
.Tn SecurID
|
||||||
|
validated logins are allowed, and is
|
||||||
|
usually useful for controlling remote logins
|
||||||
|
from outside of a firewall.
|
||||||
|
.It Fl S Ar tos
|
||||||
|
.It Fl u Ar len
|
||||||
|
This option is used to specify the size of the field
|
||||||
|
in the
|
||||||
|
.Dv utmp
|
||||||
|
structure that holds the remote host name.
|
||||||
|
If the resolved host name is longer than
|
||||||
|
.Ar len ,
|
||||||
|
the dotted decimal value will be used instead.
|
||||||
|
This allows hosts with very long host names that
|
||||||
|
overflow this field to still be uniquely identified.
|
||||||
|
Specifying
|
||||||
|
.Fl u0
|
||||||
|
indicates that only dotted decimal addresses
|
||||||
|
should be put into the
|
||||||
|
.Pa utmp
|
||||||
|
file.
|
||||||
|
.It Fl U
|
||||||
|
This option causes
|
||||||
|
.Nm telnetd
|
||||||
|
to refuse connections from addresses that
|
||||||
|
cannot be mapped back into a symbolic name
|
||||||
|
via the
|
||||||
|
.Xr gethostbyaddr 3
|
||||||
|
routine.
|
||||||
|
.It Fl X Ar authtype
|
||||||
|
This option is only valid if
|
||||||
|
.Nm telnetd
|
||||||
|
has been built with support for the authentication option.
|
||||||
|
It disables the use of
|
||||||
|
.Ar authtype
|
||||||
|
authentication, and
|
||||||
|
can be used to temporarily disable
|
||||||
|
a specific authentication type without having to recompile
|
||||||
|
.Nm telnetd .
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
.Nm Telnetd
|
||||||
|
operates by allocating a pseudo-terminal device (see
|
||||||
|
.Xr pty 4 )
|
||||||
|
for a client, then creating a login process which has
|
||||||
|
the slave side of the pseudo-terminal as
|
||||||
|
.Dv stdin ,
|
||||||
|
.Dv stdout
|
||||||
|
and
|
||||||
|
.Dv stderr .
|
||||||
|
.Nm Telnetd
|
||||||
|
manipulates the master side of the pseudo-terminal,
|
||||||
|
implementing the
|
||||||
|
.Tn TELNET
|
||||||
|
protocol and passing characters
|
||||||
|
between the remote client and the login process.
|
||||||
|
.Pp
|
||||||
|
When a
|
||||||
|
.Tn TELNET
|
||||||
|
session is started up,
|
||||||
|
.Nm telnetd
|
||||||
|
sends
|
||||||
|
.Tn TELNET
|
||||||
|
options to the client side indicating
|
||||||
|
a willingness to do the
|
||||||
|
following
|
||||||
|
.Tn TELNET
|
||||||
|
options, which are described in more detail below:
|
||||||
|
.Bd -literal -offset indent
|
||||||
|
DO AUTHENTICATION
|
||||||
|
WILL ENCRYPT
|
||||||
|
DO TERMINAL TYPE
|
||||||
|
DO TSPEED
|
||||||
|
DO XDISPLOC
|
||||||
|
DO NEW-ENVIRON
|
||||||
|
DO ENVIRON
|
||||||
|
WILL SUPPRESS GO AHEAD
|
||||||
|
DO ECHO
|
||||||
|
DO LINEMODE
|
||||||
|
DO NAWS
|
||||||
|
WILL STATUS
|
||||||
|
DO LFLOW
|
||||||
|
DO TIMING-MARK
|
||||||
|
.Ed
|
||||||
|
.Pp
|
||||||
|
The pseudo-terminal allocated to the client is configured
|
||||||
|
to operate in \*(lqcooked\*(rq mode, and with
|
||||||
|
.Dv XTABS and
|
||||||
|
.Dv CRMOD
|
||||||
|
enabled (see
|
||||||
|
.Xr tty 4 ) .
|
||||||
|
.Pp
|
||||||
|
.Nm Telnetd
|
||||||
|
has support for enabling locally the following
|
||||||
|
.Tn TELNET
|
||||||
|
options:
|
||||||
|
.Bl -tag -width "DO AUTHENTICATION"
|
||||||
|
.It "WILL ECHO"
|
||||||
|
When the
|
||||||
|
.Dv LINEMODE
|
||||||
|
option is enabled, a
|
||||||
|
.Dv WILL ECHO
|
||||||
|
or
|
||||||
|
.Dv WONT ECHO
|
||||||
|
will be sent to the client to indicate the
|
||||||
|
current state of terminal echoing.
|
||||||
|
When terminal echo is not desired, a
|
||||||
|
.Dv WILL ECHO
|
||||||
|
is sent to indicate that
|
||||||
|
.Tn telnetd
|
||||||
|
will take care of echoing any data that needs to be
|
||||||
|
echoed to the terminal, and then nothing is echoed.
|
||||||
|
When terminal echo is desired, a
|
||||||
|
.Dv WONT ECHO
|
||||||
|
is sent to indicate that
|
||||||
|
.Tn telnetd
|
||||||
|
will not be doing any terminal echoing, so the
|
||||||
|
client should do any terminal echoing that is needed.
|
||||||
|
.It "WILL BINARY"
|
||||||
|
Indicates that the client is willing to send a
|
||||||
|
8 bits of data, rather than the normal 7 bits
|
||||||
|
of the Network Virtual Terminal.
|
||||||
|
.It "WILL SGA"
|
||||||
|
Indicates that it will not be sending
|
||||||
|
.Dv IAC GA,
|
||||||
|
go ahead, commands.
|
||||||
|
.It "WILL STATUS"
|
||||||
|
Indicates a willingness to send the client, upon
|
||||||
|
request, of the current status of all
|
||||||
|
.Tn TELNET
|
||||||
|
options.
|
||||||
|
.It "WILL TIMING-MARK"
|
||||||
|
Whenever a
|
||||||
|
.Dv DO TIMING-MARK
|
||||||
|
command is received, it is always responded
|
||||||
|
to with a
|
||||||
|
.Dv WILL TIMING-MARK
|
||||||
|
.It "WILL LOGOUT"
|
||||||
|
When a
|
||||||
|
.Dv DO LOGOUT
|
||||||
|
is received, a
|
||||||
|
.Dv WILL LOGOUT
|
||||||
|
is sent in response, and the
|
||||||
|
.Tn TELNET
|
||||||
|
session is shut down.
|
||||||
|
.It "WILL ENCRYPT"
|
||||||
|
Only sent if
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled with support for data encryption, and
|
||||||
|
indicates a willingness to decrypt
|
||||||
|
the data stream.
|
||||||
|
.El
|
||||||
|
.Pp
|
||||||
|
.Nm Telnetd
|
||||||
|
has support for enabling remotely the following
|
||||||
|
.Tn TELNET
|
||||||
|
options:
|
||||||
|
.Bl -tag -width "DO AUTHENTICATION"
|
||||||
|
.It "DO BINARY"
|
||||||
|
Sent to indicate that
|
||||||
|
.Tn telnetd
|
||||||
|
is willing to receive an 8 bit data stream.
|
||||||
|
.It "DO LFLOW"
|
||||||
|
Requests that the client handle flow control
|
||||||
|
characters remotely.
|
||||||
|
.It "DO ECHO"
|
||||||
|
This is not really supported, but is sent to identify a 4.2BSD
|
||||||
|
.Xr telnet 1
|
||||||
|
client, which will improperly respond with
|
||||||
|
.Dv WILL ECHO.
|
||||||
|
If a
|
||||||
|
.Dv WILL ECHO
|
||||||
|
is received, a
|
||||||
|
.Dv DONT ECHO
|
||||||
|
will be sent in response.
|
||||||
|
.It "DO TERMINAL-TYPE"
|
||||||
|
Indicates a desire to be able to request the
|
||||||
|
name of the type of terminal that is attached
|
||||||
|
to the client side of the connection.
|
||||||
|
.It "DO SGA"
|
||||||
|
Indicates that it does not need to receive
|
||||||
|
.Dv IAC GA,
|
||||||
|
the go ahead command.
|
||||||
|
.It "DO NAWS"
|
||||||
|
Requests that the client inform the server when
|
||||||
|
the window (display) size changes.
|
||||||
|
.It "DO TERMINAL-SPEED"
|
||||||
|
Indicates a desire to be able to request information
|
||||||
|
about the speed of the serial line to which
|
||||||
|
the client is attached.
|
||||||
|
.It "DO XDISPLOC"
|
||||||
|
Indicates a desire to be able to request the name
|
||||||
|
of the X windows display that is associated with
|
||||||
|
the telnet client.
|
||||||
|
.It "DO NEW-ENVIRON"
|
||||||
|
Indicates a desire to be able to request environment
|
||||||
|
variable information, as described in RFC 1572.
|
||||||
|
.It "DO ENVIRON"
|
||||||
|
Indicates a desire to be able to request environment
|
||||||
|
variable information, as described in RFC 1408.
|
||||||
|
.It "DO LINEMODE"
|
||||||
|
Only sent if
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled with support for linemode, and
|
||||||
|
requests that the client do line by line processing.
|
||||||
|
.It "DO TIMING-MARK"
|
||||||
|
Only sent if
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled with support for both linemode and
|
||||||
|
kludge linemode, and the client responded with
|
||||||
|
.Dv WONT LINEMODE.
|
||||||
|
If the client responds with
|
||||||
|
.Dv WILL TM,
|
||||||
|
the it is assumed that the client supports
|
||||||
|
kludge linemode.
|
||||||
|
Note that the
|
||||||
|
.Op Fl k
|
||||||
|
option can be used to disable this.
|
||||||
|
.It "DO AUTHENTICATION"
|
||||||
|
Only sent if
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled with support for authentication, and
|
||||||
|
indicates a willingness to receive authentication
|
||||||
|
information for automatic login.
|
||||||
|
.It "DO ENCRYPT"
|
||||||
|
Only sent if
|
||||||
|
.Nm telnetd
|
||||||
|
is compiled with support for data encryption, and
|
||||||
|
indicates a willingness to decrypt
|
||||||
|
the data stream.
|
||||||
|
.Sh ENVIRONMENT
|
||||||
|
.Sh FILES
|
||||||
|
.Pa /etc/services
|
||||||
|
.br
|
||||||
|
.Pa /etc/inittab
|
||||||
|
(UNICOS systems only)
|
||||||
|
.br
|
||||||
|
.Pa /etc/iptos
|
||||||
|
(if supported)
|
||||||
|
.br
|
||||||
|
.Pa /usr/ucb/bftp
|
||||||
|
(if supported)
|
||||||
|
.Sh "SEE ALSO"
|
||||||
|
.Xr telnet 1 ,
|
||||||
|
.Xr login 1 ,
|
||||||
|
.Xr bftp 1
|
||||||
|
(if supported)
|
||||||
|
.Sh STANDARDS
|
||||||
|
.Bl -tag -compact -width RFC-1572
|
||||||
|
.It Cm RFC-854
|
||||||
|
.Tn TELNET
|
||||||
|
PROTOCOL SPECIFICATION
|
||||||
|
.It Cm RFC-855
|
||||||
|
TELNET OPTION SPECIFICATIONS
|
||||||
|
.It Cm RFC-856
|
||||||
|
TELNET BINARY TRANSMISSION
|
||||||
|
.It Cm RFC-857
|
||||||
|
TELNET ECHO OPTION
|
||||||
|
.It Cm RFC-858
|
||||||
|
TELNET SUPPRESS GO AHEAD OPTION
|
||||||
|
.It Cm RFC-859
|
||||||
|
TELNET STATUS OPTION
|
||||||
|
.It Cm RFC-860
|
||||||
|
TELNET TIMING MARK OPTION
|
||||||
|
.It Cm RFC-861
|
||||||
|
TELNET EXTENDED OPTIONS - LIST OPTION
|
||||||
|
.It Cm RFC-885
|
||||||
|
TELNET END OF RECORD OPTION
|
||||||
|
.It Cm RFC-1073
|
||||||
|
Telnet Window Size Option
|
||||||
|
.It Cm RFC-1079
|
||||||
|
Telnet Terminal Speed Option
|
||||||
|
.It Cm RFC-1091
|
||||||
|
Telnet Terminal-Type Option
|
||||||
|
.It Cm RFC-1096
|
||||||
|
Telnet X Display Location Option
|
||||||
|
.It Cm RFC-1123
|
||||||
|
Requirements for Internet Hosts -- Application and Support
|
||||||
|
.It Cm RFC-1184
|
||||||
|
Telnet Linemode Option
|
||||||
|
.It Cm RFC-1372
|
||||||
|
Telnet Remote Flow Control Option
|
||||||
|
.It Cm RFC-1416
|
||||||
|
Telnet Authentication Option
|
||||||
|
.It Cm RFC-1411
|
||||||
|
Telnet Authentication: Kerberos Version 4
|
||||||
|
.It Cm RFC-1412
|
||||||
|
Telnet Authentication: SPX
|
||||||
|
.It Cm RFC-1571
|
||||||
|
Telnet Environment Option Interoperability Issues
|
||||||
|
.It Cm RFC-1572
|
||||||
|
Telnet Environment Option
|
||||||
|
.Sh BUGS
|
||||||
|
Some
|
||||||
|
.Tn TELNET
|
||||||
|
commands are only partially implemented.
|
||||||
|
.Pp
|
||||||
|
Because of bugs in the original 4.2 BSD
|
||||||
|
.Xr telnet 1 ,
|
||||||
|
.Nm telnetd
|
||||||
|
performs some dubious protocol exchanges to try to discover if the remote
|
||||||
|
client is, in fact, a 4.2 BSD
|
||||||
|
.Xr telnet 1 .
|
||||||
|
.Pp
|
||||||
|
Binary mode
|
||||||
|
has no common interpretation except between similar operating systems
|
||||||
|
(Unix in this case).
|
||||||
|
.Pp
|
||||||
|
The terminal type name received from the remote client is converted to
|
||||||
|
lower case.
|
||||||
|
.Pp
|
||||||
|
.Nm Telnetd
|
||||||
|
never sends
|
||||||
|
.Tn TELNET
|
||||||
|
.Dv IAC GA
|
||||||
|
(go ahead) commands.
|
1582
secure/libexec/telnetd/telnetd.c
Normal file
1582
secure/libexec/telnetd/telnetd.c
Normal file
File diff suppressed because it is too large
Load Diff
49
secure/libexec/telnetd/telnetd.h
Normal file
49
secure/libexec/telnetd/telnetd.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)telnetd.h 8.1 (Berkeley) 6/4/93
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "defs.h"
|
||||||
|
#include "ext.h"
|
||||||
|
|
||||||
|
#ifdef DIAGNOSTICS
|
||||||
|
#define DIAG(a,b) if (diagnostic & (a)) b
|
||||||
|
#else
|
||||||
|
#define DIAG(a,b)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* other external variables */
|
||||||
|
extern char **environ;
|
||||||
|
extern int errno;
|
||||||
|
|
660
secure/libexec/telnetd/termstat.c
Normal file
660
secure/libexec/telnetd/termstat.c
Normal file
@ -0,0 +1,660 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 1989, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
static char sccsid[] = "@(#)termstat.c 8.1 (Berkeley) 6/4/93";
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include "telnetd.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* local variables
|
||||||
|
*/
|
||||||
|
int def_tspeed = -1, def_rspeed = -1;
|
||||||
|
#ifdef TIOCSWINSZ
|
||||||
|
int def_row = 0, def_col = 0;
|
||||||
|
#endif
|
||||||
|
#ifdef LINEMODE
|
||||||
|
static int _terminit = 0;
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
|
||||||
|
#if defined(CRAY2) && defined(UNICOS5)
|
||||||
|
int newmap = 1; /* nonzero if \n maps to ^M^J */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LINEMODE
|
||||||
|
/*
|
||||||
|
* localstat
|
||||||
|
*
|
||||||
|
* This function handles all management of linemode.
|
||||||
|
*
|
||||||
|
* Linemode allows the client to do the local editing of data
|
||||||
|
* and send only complete lines to the server. Linemode state is
|
||||||
|
* based on the state of the pty driver. If the pty is set for
|
||||||
|
* external processing, then we can use linemode. Further, if we
|
||||||
|
* can use real linemode, then we can look at the edit control bits
|
||||||
|
* in the pty to determine what editing the client should do.
|
||||||
|
*
|
||||||
|
* Linemode support uses the following state flags to keep track of
|
||||||
|
* current and desired linemode state.
|
||||||
|
* alwayslinemode : true if -l was specified on the telnetd
|
||||||
|
* command line. It means to have linemode on as much as
|
||||||
|
* possible.
|
||||||
|
*
|
||||||
|
* lmodetype: signifies whether the client can
|
||||||
|
* handle real linemode, or if use of kludgeomatic linemode
|
||||||
|
* is preferred. It will be set to one of the following:
|
||||||
|
* REAL_LINEMODE : use linemode option
|
||||||
|
* NO_KLUDGE : don't initiate kludge linemode.
|
||||||
|
* KLUDGE_LINEMODE : use kludge linemode
|
||||||
|
* NO_LINEMODE : client is ignorant of linemode
|
||||||
|
*
|
||||||
|
* linemode, uselinemode : linemode is true if linemode
|
||||||
|
* is currently on, uselinemode is the state that we wish
|
||||||
|
* to be in. If another function wishes to turn linemode
|
||||||
|
* on or off, it sets or clears uselinemode.
|
||||||
|
*
|
||||||
|
* editmode, useeditmode : like linemode/uselinemode, but
|
||||||
|
* these contain the edit mode states (edit and trapsig).
|
||||||
|
*
|
||||||
|
* The state variables correspond to some of the state information
|
||||||
|
* in the pty.
|
||||||
|
* linemode:
|
||||||
|
* In real linemode, this corresponds to whether the pty
|
||||||
|
* expects external processing of incoming data.
|
||||||
|
* In kludge linemode, this more closely corresponds to the
|
||||||
|
* whether normal processing is on or not. (ICANON in
|
||||||
|
* system V, or COOKED mode in BSD.)
|
||||||
|
* If the -l option was specified (alwayslinemode), then
|
||||||
|
* an attempt is made to force external processing on at
|
||||||
|
* all times.
|
||||||
|
*
|
||||||
|
* The following heuristics are applied to determine linemode
|
||||||
|
* handling within the server.
|
||||||
|
* 1) Early on in starting up the server, an attempt is made
|
||||||
|
* to negotiate the linemode option. If this succeeds
|
||||||
|
* then lmodetype is set to REAL_LINEMODE and all linemode
|
||||||
|
* processing occurs in the context of the linemode option.
|
||||||
|
* 2) If the attempt to negotiate the linemode option failed,
|
||||||
|
* and the "-k" (don't initiate kludge linemode) isn't set,
|
||||||
|
* then we try to use kludge linemode. We test for this
|
||||||
|
* capability by sending "do Timing Mark". If a positive
|
||||||
|
* response comes back, then we assume that the client
|
||||||
|
* understands kludge linemode (ech!) and the
|
||||||
|
* lmodetype flag is set to KLUDGE_LINEMODE.
|
||||||
|
* 3) Otherwise, linemode is not supported at all and
|
||||||
|
* lmodetype remains set to NO_LINEMODE (which happens
|
||||||
|
* to be 0 for convenience).
|
||||||
|
* 4) At any time a command arrives that implies a higher
|
||||||
|
* state of linemode support in the client, we move to that
|
||||||
|
* linemode support.
|
||||||
|
*
|
||||||
|
* A short explanation of kludge linemode is in order here.
|
||||||
|
* 1) The heuristic to determine support for kludge linemode
|
||||||
|
* is to send a do timing mark. We assume that a client
|
||||||
|
* that supports timing marks also supports kludge linemode.
|
||||||
|
* A risky proposition at best.
|
||||||
|
* 2) Further negotiation of linemode is done by changing the
|
||||||
|
* the server's state regarding SGA. If server will SGA,
|
||||||
|
* then linemode is off, if server won't SGA, then linemode
|
||||||
|
* is on.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
localstat()
|
||||||
|
{
|
||||||
|
void netflush();
|
||||||
|
int need_will_echo = 0;
|
||||||
|
|
||||||
|
#if defined(CRAY2) && defined(UNICOS5)
|
||||||
|
/*
|
||||||
|
* Keep track of that ol' CR/NL mapping while we're in the
|
||||||
|
* neighborhood.
|
||||||
|
*/
|
||||||
|
newmap = tty_isnewmap();
|
||||||
|
#endif /* defined(CRAY2) && defined(UNICOS5) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for state of BINARY options.
|
||||||
|
*/
|
||||||
|
if (tty_isbinaryin()) {
|
||||||
|
if (his_want_state_is_wont(TELOPT_BINARY))
|
||||||
|
send_do(TELOPT_BINARY, 1);
|
||||||
|
} else {
|
||||||
|
if (his_want_state_is_will(TELOPT_BINARY))
|
||||||
|
send_dont(TELOPT_BINARY, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tty_isbinaryout()) {
|
||||||
|
if (my_want_state_is_wont(TELOPT_BINARY))
|
||||||
|
send_will(TELOPT_BINARY, 1);
|
||||||
|
} else {
|
||||||
|
if (my_want_state_is_will(TELOPT_BINARY))
|
||||||
|
send_wont(TELOPT_BINARY, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for changes to flow control if client supports it.
|
||||||
|
*/
|
||||||
|
flowstat();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check linemode on/off state
|
||||||
|
*/
|
||||||
|
uselinemode = tty_linemode();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If alwayslinemode is on, and pty is changing to turn it off, then
|
||||||
|
* force linemode back on.
|
||||||
|
*/
|
||||||
|
if (alwayslinemode && linemode && !uselinemode) {
|
||||||
|
uselinemode = 1;
|
||||||
|
tty_setlinemode(uselinemode);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef ENCRYPTION
|
||||||
|
/*
|
||||||
|
* If the terminal is not echoing, but editing is enabled,
|
||||||
|
* something like password input is going to happen, so
|
||||||
|
* if we the other side is not currently sending encrypted
|
||||||
|
* data, ask the other side to start encrypting.
|
||||||
|
*/
|
||||||
|
if (his_state_is_will(TELOPT_ENCRYPT)) {
|
||||||
|
static int enc_passwd = 0;
|
||||||
|
if (uselinemode && !tty_isecho() && tty_isediting()
|
||||||
|
&& (enc_passwd == 0) && !decrypt_input) {
|
||||||
|
encrypt_send_request_start();
|
||||||
|
enc_passwd = 1;
|
||||||
|
} else if (enc_passwd) {
|
||||||
|
encrypt_send_request_end();
|
||||||
|
enc_passwd = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* ENCRYPTION */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do echo mode handling as soon as we know what the
|
||||||
|
* linemode is going to be.
|
||||||
|
* If the pty has echo turned off, then tell the client that
|
||||||
|
* the server will echo. If echo is on, then the server
|
||||||
|
* will echo if in character mode, but in linemode the
|
||||||
|
* client should do local echoing. The state machine will
|
||||||
|
* not send anything if it is unnecessary, so don't worry
|
||||||
|
* about that here.
|
||||||
|
*
|
||||||
|
* If we need to send the WILL ECHO (because echo is off),
|
||||||
|
* then delay that until after we have changed the MODE.
|
||||||
|
* This way, when the user is turning off both editing
|
||||||
|
* and echo, the client will get editing turned off first.
|
||||||
|
* This keeps the client from going into encryption mode
|
||||||
|
* and then right back out if it is doing auto-encryption
|
||||||
|
* when passwords are being typed.
|
||||||
|
*/
|
||||||
|
if (uselinemode) {
|
||||||
|
if (tty_isecho())
|
||||||
|
send_wont(TELOPT_ECHO, 1);
|
||||||
|
else
|
||||||
|
need_will_echo = 1;
|
||||||
|
#ifdef KLUDGELINEMODE
|
||||||
|
if (lmodetype == KLUDGE_OK)
|
||||||
|
lmodetype = KLUDGE_LINEMODE;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If linemode is being turned off, send appropriate
|
||||||
|
* command and then we're all done.
|
||||||
|
*/
|
||||||
|
if (!uselinemode && linemode) {
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
if (lmodetype == REAL_LINEMODE) {
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
send_dont(TELOPT_LINEMODE, 1);
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
} else if (lmodetype == KLUDGE_LINEMODE)
|
||||||
|
send_will(TELOPT_SGA, 1);
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
send_will(TELOPT_ECHO, 1);
|
||||||
|
linemode = uselinemode;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
/*
|
||||||
|
* If using real linemode check edit modes for possible later use.
|
||||||
|
* If we are in kludge linemode, do the SGA negotiation.
|
||||||
|
*/
|
||||||
|
if (lmodetype == REAL_LINEMODE) {
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
useeditmode = 0;
|
||||||
|
if (tty_isediting())
|
||||||
|
useeditmode |= MODE_EDIT;
|
||||||
|
if (tty_istrapsig())
|
||||||
|
useeditmode |= MODE_TRAPSIG;
|
||||||
|
if (tty_issofttab())
|
||||||
|
useeditmode |= MODE_SOFT_TAB;
|
||||||
|
if (tty_islitecho())
|
||||||
|
useeditmode |= MODE_LIT_ECHO;
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
} else if (lmodetype == KLUDGE_LINEMODE) {
|
||||||
|
if (tty_isediting() && uselinemode)
|
||||||
|
send_wont(TELOPT_SGA, 1);
|
||||||
|
else
|
||||||
|
send_will(TELOPT_SGA, 1);
|
||||||
|
}
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Negotiate linemode on if pty state has changed to turn it on.
|
||||||
|
* Send appropriate command and send along edit mode, then all done.
|
||||||
|
*/
|
||||||
|
if (uselinemode && !linemode) {
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
if (lmodetype == KLUDGE_LINEMODE) {
|
||||||
|
send_wont(TELOPT_SGA, 1);
|
||||||
|
} else if (lmodetype == REAL_LINEMODE) {
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
send_do(TELOPT_LINEMODE, 1);
|
||||||
|
/* send along edit modes */
|
||||||
|
(void) sprintf(nfrontp, "%c%c%c%c%c%c%c", IAC, SB,
|
||||||
|
TELOPT_LINEMODE, LM_MODE, useeditmode,
|
||||||
|
IAC, SE);
|
||||||
|
nfrontp += 7;
|
||||||
|
editmode = useeditmode;
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
}
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
linemode = uselinemode;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
/*
|
||||||
|
* None of what follows is of any value if not using
|
||||||
|
* real linemode.
|
||||||
|
*/
|
||||||
|
if (lmodetype < REAL_LINEMODE)
|
||||||
|
goto done;
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
|
||||||
|
if (linemode && his_state_is_will(TELOPT_LINEMODE)) {
|
||||||
|
/*
|
||||||
|
* If edit mode changed, send edit mode.
|
||||||
|
*/
|
||||||
|
if (useeditmode != editmode) {
|
||||||
|
/*
|
||||||
|
* Send along appropriate edit mode mask.
|
||||||
|
*/
|
||||||
|
(void) sprintf(nfrontp, "%c%c%c%c%c%c%c", IAC, SB,
|
||||||
|
TELOPT_LINEMODE, LM_MODE, useeditmode,
|
||||||
|
IAC, SE);
|
||||||
|
nfrontp += 7;
|
||||||
|
editmode = useeditmode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for changes to special characters in use.
|
||||||
|
*/
|
||||||
|
start_slc(0);
|
||||||
|
check_slc();
|
||||||
|
(void) end_slc(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (need_will_echo)
|
||||||
|
send_will(TELOPT_ECHO, 1);
|
||||||
|
/*
|
||||||
|
* Some things should be deferred until after the pty state has
|
||||||
|
* been set by the local process. Do those things that have been
|
||||||
|
* deferred now. This only happens once.
|
||||||
|
*/
|
||||||
|
if (_terminit == 0) {
|
||||||
|
_terminit = 1;
|
||||||
|
defer_terminit();
|
||||||
|
}
|
||||||
|
|
||||||
|
netflush();
|
||||||
|
set_termbuf();
|
||||||
|
return;
|
||||||
|
|
||||||
|
} /* end of localstat */
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* flowstat
|
||||||
|
*
|
||||||
|
* Check for changes to flow control
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
flowstat()
|
||||||
|
{
|
||||||
|
if (his_state_is_will(TELOPT_LFLOW)) {
|
||||||
|
if (tty_flowmode() != flowmode) {
|
||||||
|
flowmode = tty_flowmode();
|
||||||
|
(void) sprintf(nfrontp, "%c%c%c%c%c%c",
|
||||||
|
IAC, SB, TELOPT_LFLOW,
|
||||||
|
flowmode ? LFLOW_ON : LFLOW_OFF,
|
||||||
|
IAC, SE);
|
||||||
|
nfrontp += 6;
|
||||||
|
}
|
||||||
|
if (tty_restartany() != restartany) {
|
||||||
|
restartany = tty_restartany();
|
||||||
|
(void) sprintf(nfrontp, "%c%c%c%c%c%c",
|
||||||
|
IAC, SB, TELOPT_LFLOW,
|
||||||
|
restartany ? LFLOW_RESTART_ANY
|
||||||
|
: LFLOW_RESTART_XON,
|
||||||
|
IAC, SE);
|
||||||
|
nfrontp += 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* clientstat
|
||||||
|
*
|
||||||
|
* Process linemode related requests from the client.
|
||||||
|
* Client can request a change to only one of linemode, editmode or slc's
|
||||||
|
* at a time, and if using kludge linemode, then only linemode may be
|
||||||
|
* affected.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
clientstat(code, parm1, parm2)
|
||||||
|
register int code, parm1, parm2;
|
||||||
|
{
|
||||||
|
void netflush();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get a copy of terminal characteristics.
|
||||||
|
*/
|
||||||
|
init_termbuf();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Process request from client. code tells what it is.
|
||||||
|
*/
|
||||||
|
switch (code) {
|
||||||
|
#ifdef LINEMODE
|
||||||
|
case TELOPT_LINEMODE:
|
||||||
|
/*
|
||||||
|
* Don't do anything unless client is asking us to change
|
||||||
|
* modes.
|
||||||
|
*/
|
||||||
|
uselinemode = (parm1 == WILL);
|
||||||
|
if (uselinemode != linemode) {
|
||||||
|
# ifdef KLUDGELINEMODE
|
||||||
|
/*
|
||||||
|
* If using kludge linemode, make sure that
|
||||||
|
* we can do what the client asks.
|
||||||
|
* We can not turn off linemode if alwayslinemode
|
||||||
|
* and the ICANON bit is set.
|
||||||
|
*/
|
||||||
|
if (lmodetype == KLUDGE_LINEMODE) {
|
||||||
|
if (alwayslinemode && tty_isediting()) {
|
||||||
|
uselinemode = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Quit now if we can't do it.
|
||||||
|
*/
|
||||||
|
if (uselinemode == linemode)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If using real linemode and linemode is being
|
||||||
|
* turned on, send along the edit mode mask.
|
||||||
|
*/
|
||||||
|
if (lmodetype == REAL_LINEMODE && uselinemode)
|
||||||
|
# else /* KLUDGELINEMODE */
|
||||||
|
if (uselinemode)
|
||||||
|
# endif /* KLUDGELINEMODE */
|
||||||
|
{
|
||||||
|
useeditmode = 0;
|
||||||
|
if (tty_isediting())
|
||||||
|
useeditmode |= MODE_EDIT;
|
||||||
|
if (tty_istrapsig)
|
||||||
|
useeditmode |= MODE_TRAPSIG;
|
||||||
|
if (tty_issofttab())
|
||||||
|
useeditmode |= MODE_SOFT_TAB;
|
||||||
|
if (tty_islitecho())
|
||||||
|
useeditmode |= MODE_LIT_ECHO;
|
||||||
|
(void) sprintf(nfrontp, "%c%c%c%c%c%c%c", IAC,
|
||||||
|
SB, TELOPT_LINEMODE, LM_MODE,
|
||||||
|
useeditmode, IAC, SE);
|
||||||
|
nfrontp += 7;
|
||||||
|
editmode = useeditmode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
tty_setlinemode(uselinemode);
|
||||||
|
|
||||||
|
linemode = uselinemode;
|
||||||
|
|
||||||
|
if (!linemode)
|
||||||
|
send_will(TELOPT_ECHO, 1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case LM_MODE:
|
||||||
|
{
|
||||||
|
register int ack, changed;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Client has sent along a mode mask. If it agrees with
|
||||||
|
* what we are currently doing, ignore it; if not, it could
|
||||||
|
* be viewed as a request to change. Note that the server
|
||||||
|
* will change to the modes in an ack if it is different from
|
||||||
|
* what we currently have, but we will not ack the ack.
|
||||||
|
*/
|
||||||
|
useeditmode &= MODE_MASK;
|
||||||
|
ack = (useeditmode & MODE_ACK);
|
||||||
|
useeditmode &= ~MODE_ACK;
|
||||||
|
|
||||||
|
if (changed = (useeditmode ^ editmode)) {
|
||||||
|
/*
|
||||||
|
* This check is for a timing problem. If the
|
||||||
|
* state of the tty has changed (due to the user
|
||||||
|
* application) we need to process that info
|
||||||
|
* before we write in the state contained in the
|
||||||
|
* ack!!! This gets out the new MODE request,
|
||||||
|
* and when the ack to that command comes back
|
||||||
|
* we'll set it and be in the right mode.
|
||||||
|
*/
|
||||||
|
if (ack)
|
||||||
|
localstat();
|
||||||
|
if (changed & MODE_EDIT)
|
||||||
|
tty_setedit(useeditmode & MODE_EDIT);
|
||||||
|
|
||||||
|
if (changed & MODE_TRAPSIG)
|
||||||
|
tty_setsig(useeditmode & MODE_TRAPSIG);
|
||||||
|
|
||||||
|
if (changed & MODE_SOFT_TAB)
|
||||||
|
tty_setsofttab(useeditmode & MODE_SOFT_TAB);
|
||||||
|
|
||||||
|
if (changed & MODE_LIT_ECHO)
|
||||||
|
tty_setlitecho(useeditmode & MODE_LIT_ECHO);
|
||||||
|
|
||||||
|
set_termbuf();
|
||||||
|
|
||||||
|
if (!ack) {
|
||||||
|
(void) sprintf(nfrontp, "%c%c%c%c%c%c%c", IAC,
|
||||||
|
SB, TELOPT_LINEMODE, LM_MODE,
|
||||||
|
useeditmode|MODE_ACK,
|
||||||
|
IAC, SE);
|
||||||
|
nfrontp += 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
editmode = useeditmode;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
} /* end of case LM_MODE */
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
|
||||||
|
case TELOPT_NAWS:
|
||||||
|
#ifdef TIOCSWINSZ
|
||||||
|
{
|
||||||
|
struct winsize ws;
|
||||||
|
|
||||||
|
def_col = parm1;
|
||||||
|
def_row = parm2;
|
||||||
|
#ifdef LINEMODE
|
||||||
|
/*
|
||||||
|
* Defer changing window size until after terminal is
|
||||||
|
* initialized.
|
||||||
|
*/
|
||||||
|
if (terminit() == 0)
|
||||||
|
return;
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Change window size as requested by client.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ws.ws_col = parm1;
|
||||||
|
ws.ws_row = parm2;
|
||||||
|
(void) ioctl(pty, TIOCSWINSZ, (char *)&ws);
|
||||||
|
}
|
||||||
|
#endif /* TIOCSWINSZ */
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TELOPT_TSPEED:
|
||||||
|
{
|
||||||
|
def_tspeed = parm1;
|
||||||
|
def_rspeed = parm2;
|
||||||
|
#ifdef LINEMODE
|
||||||
|
/*
|
||||||
|
* Defer changing the terminal speed.
|
||||||
|
*/
|
||||||
|
if (terminit() == 0)
|
||||||
|
return;
|
||||||
|
#endif /* LINEMODE */
|
||||||
|
/*
|
||||||
|
* Change terminal speed as requested by client.
|
||||||
|
* We set the receive speed first, so that if we can't
|
||||||
|
* store seperate receive and transmit speeds, the transmit
|
||||||
|
* speed will take precedence.
|
||||||
|
*/
|
||||||
|
tty_rspeed(parm2);
|
||||||
|
tty_tspeed(parm1);
|
||||||
|
set_termbuf();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
} /* end of case TELOPT_TSPEED */
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* What? */
|
||||||
|
break;
|
||||||
|
} /* end of switch */
|
||||||
|
|
||||||
|
#if defined(CRAY2) && defined(UNICOS5)
|
||||||
|
/*
|
||||||
|
* Just in case of the likely event that we changed the pty state.
|
||||||
|
*/
|
||||||
|
rcv_ioctl();
|
||||||
|
#endif /* defined(CRAY2) && defined(UNICOS5) */
|
||||||
|
|
||||||
|
netflush();
|
||||||
|
|
||||||
|
} /* end of clientstat */
|
||||||
|
|
||||||
|
#if defined(CRAY2) && defined(UNICOS5)
|
||||||
|
void
|
||||||
|
termstat()
|
||||||
|
{
|
||||||
|
needtermstat = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
_termstat()
|
||||||
|
{
|
||||||
|
needtermstat = 0;
|
||||||
|
init_termbuf();
|
||||||
|
localstat();
|
||||||
|
rcv_ioctl();
|
||||||
|
}
|
||||||
|
#endif /* defined(CRAY2) && defined(UNICOS5) */
|
||||||
|
|
||||||
|
#ifdef LINEMODE
|
||||||
|
/*
|
||||||
|
* defer_terminit
|
||||||
|
*
|
||||||
|
* Some things should not be done until after the login process has started
|
||||||
|
* and all the pty modes are set to what they are supposed to be. This
|
||||||
|
* function is called when the pty state has been processed for the first time.
|
||||||
|
* It calls other functions that do things that were deferred in each module.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
defer_terminit()
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
* local stuff that got deferred.
|
||||||
|
*/
|
||||||
|
if (def_tspeed != -1) {
|
||||||
|
clientstat(TELOPT_TSPEED, def_tspeed, def_rspeed);
|
||||||
|
def_tspeed = def_rspeed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef TIOCSWINSZ
|
||||||
|
if (def_col || def_row) {
|
||||||
|
struct winsize ws;
|
||||||
|
|
||||||
|
bzero((char *)&ws, sizeof(ws));
|
||||||
|
ws.ws_col = def_col;
|
||||||
|
ws.ws_row = def_row;
|
||||||
|
(void) ioctl(pty, TIOCSWINSZ, (char *)&ws);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The only other module that currently defers anything.
|
||||||
|
*/
|
||||||
|
deferslc();
|
||||||
|
|
||||||
|
} /* end of defer_terminit */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* terminit
|
||||||
|
*
|
||||||
|
* Returns true if the pty state has been processed yet.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
terminit()
|
||||||
|
{
|
||||||
|
return(_terminit);
|
||||||
|
|
||||||
|
} /* end of terminit */
|
||||||
|
#endif /* LINEMODE */
|
1192
secure/libexec/telnetd/utility.c
Normal file
1192
secure/libexec/telnetd/utility.c
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user