Remove telnetd sources
Differential Revision: https://reviews.freebsd.org/D36621
This commit is contained in:
parent
1d090028d3
commit
d701f45aba
@ -1,86 +0,0 @@
|
|||||||
/*-
|
|
||||||
* 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. 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#ifndef lint
|
|
||||||
static const char sccsid[] = "@(#)authenc.c 8.2 (Berkeley) 5/30/95";
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#ifdef AUTHENTICATION
|
|
||||||
#ifdef ENCRYPTION
|
|
||||||
/* Above "#ifdef"s actually "or"'ed together. XXX MarkM
|
|
||||||
*/
|
|
||||||
#include "telnetd.h"
|
|
||||||
#include <libtelnet/misc.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
net_write(unsigned char *str, int len)
|
|
||||||
{
|
|
||||||
if (nfrontp + len < netobuf + BUFSIZ) {
|
|
||||||
output_datalen(str, len);
|
|
||||||
return(len);
|
|
||||||
}
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
net_encrypt(void)
|
|
||||||
{
|
|
||||||
#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(void)
|
|
||||||
{
|
|
||||||
ttloop();
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
telnet_getenv(char *val)
|
|
||||||
{
|
|
||||||
return(getenv(val));
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
|
||||||
telnet_gets(const char *prompt __unused, char *result __unused, int length __unused, int echo __unused)
|
|
||||||
{
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
#endif /* ENCRYPTION */
|
|
||||||
#endif /* AUTHENTICATION */
|
|
@ -1,254 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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. 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
|
|
||||||
* $FreeBSD$
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Telnet server defines
|
|
||||||
*/
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
|
|
||||||
#ifndef BSD
|
|
||||||
# define BSD 43
|
|
||||||
#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>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
#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
|
|
||||||
|
|
||||||
#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
|
|
||||||
|
|
||||||
#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
|
|
@ -1,218 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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. 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
|
|
||||||
* $FreeBSD$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef EXTERN
|
|
||||||
#define EXTERN extern
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 */
|
|
||||||
EXTERN int lmodetype; /* Client support for linemode */
|
|
||||||
#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 */
|
|
||||||
#ifdef AUTHENTICATION
|
|
||||||
EXTERN int auth_level;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
EXTERN slcfun slctab[NSLC + 1]; /* slc mapping table */
|
|
||||||
|
|
||||||
EXTERN 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], *nfrontp, *nbackp;
|
|
||||||
EXTERN char *neturg; /* one past last bye of urgent data */
|
|
||||||
|
|
||||||
EXTERN int pcc, ncc;
|
|
||||||
|
|
||||||
EXTERN int pty, net;
|
|
||||||
EXTERN char line[32];
|
|
||||||
EXTERN int SYNCHing; /* we are in TELNET SYNCH mode */
|
|
||||||
|
|
||||||
EXTERN void
|
|
||||||
_termstat(void),
|
|
||||||
add_slc(char, char, cc_t),
|
|
||||||
check_slc(void),
|
|
||||||
change_slc(char, char, cc_t),
|
|
||||||
cleanup(int),
|
|
||||||
clientstat(int, int, int),
|
|
||||||
copy_termbuf(char *, size_t),
|
|
||||||
deferslc(void),
|
|
||||||
defer_terminit(void),
|
|
||||||
do_opt_slc(unsigned char *, int),
|
|
||||||
doeof(void),
|
|
||||||
dooption(int),
|
|
||||||
dontoption(int),
|
|
||||||
edithost(char *, char *),
|
|
||||||
fatal(int, const char *),
|
|
||||||
fatalperror(int, const char *),
|
|
||||||
get_slc_defaults(void),
|
|
||||||
init_env(void),
|
|
||||||
init_termbuf(void),
|
|
||||||
interrupt(void),
|
|
||||||
localstat(void),
|
|
||||||
flowstat(void),
|
|
||||||
netclear(void),
|
|
||||||
netflush(void),
|
|
||||||
#ifdef DIAGNOSTICS
|
|
||||||
printoption(const char *, int),
|
|
||||||
printdata(const char *, char *, int),
|
|
||||||
printsub(char, unsigned char *, int),
|
|
||||||
#endif
|
|
||||||
process_slc(unsigned char, unsigned char, cc_t),
|
|
||||||
ptyflush(void),
|
|
||||||
putchr(int),
|
|
||||||
putf(char *, char *),
|
|
||||||
recv_ayt(void),
|
|
||||||
send_do(int, int),
|
|
||||||
send_dont(int, int),
|
|
||||||
send_slc(void),
|
|
||||||
send_status(void),
|
|
||||||
send_will(int, int),
|
|
||||||
send_wont(int, int),
|
|
||||||
sendbrk(void),
|
|
||||||
sendsusp(void),
|
|
||||||
set_termbuf(void),
|
|
||||||
start_login(char *, int, char *),
|
|
||||||
start_slc(int),
|
|
||||||
#ifdef AUTHENTICATION
|
|
||||||
start_slave(char *),
|
|
||||||
#else
|
|
||||||
start_slave(char *, int, char *),
|
|
||||||
#endif
|
|
||||||
suboption(void),
|
|
||||||
telrcv(void),
|
|
||||||
ttloop(void),
|
|
||||||
tty_binaryin(int),
|
|
||||||
tty_binaryout(int);
|
|
||||||
|
|
||||||
EXTERN int
|
|
||||||
end_slc(unsigned char **),
|
|
||||||
getnpty(void),
|
|
||||||
#ifndef convex
|
|
||||||
getpty(int *),
|
|
||||||
#endif
|
|
||||||
login_tty(int),
|
|
||||||
spcset(int, cc_t *, cc_t **),
|
|
||||||
stilloob(int),
|
|
||||||
terminit(void),
|
|
||||||
termstat(void),
|
|
||||||
tty_flowmode(void),
|
|
||||||
tty_restartany(void),
|
|
||||||
tty_isbinaryin(void),
|
|
||||||
tty_isbinaryout(void),
|
|
||||||
tty_iscrnl(void),
|
|
||||||
tty_isecho(void),
|
|
||||||
tty_isediting(void),
|
|
||||||
tty_islitecho(void),
|
|
||||||
tty_isnewmap(void),
|
|
||||||
tty_israw(void),
|
|
||||||
tty_issofttab(void),
|
|
||||||
tty_istrapsig(void),
|
|
||||||
tty_linemode(void);
|
|
||||||
|
|
||||||
EXTERN void
|
|
||||||
tty_rspeed(int),
|
|
||||||
tty_setecho(int),
|
|
||||||
tty_setedit(int),
|
|
||||||
tty_setlinemode(int),
|
|
||||||
tty_setlitecho(int),
|
|
||||||
tty_setsig(int),
|
|
||||||
tty_setsofttab(int),
|
|
||||||
tty_tspeed(int),
|
|
||||||
willoption(int),
|
|
||||||
wontoption(int);
|
|
||||||
|
|
||||||
int output_data(const char *, ...) __printflike(1, 2);
|
|
||||||
void output_datalen(const char *, int);
|
|
||||||
void startslave(char *, int, char *);
|
|
||||||
|
|
||||||
#ifdef ENCRYPTION
|
|
||||||
extern void (*encrypt_output)(unsigned char *, int);
|
|
||||||
extern int (*decrypt_input)(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;
|
|
||||||
|
|
||||||
#ifndef DEFAULT_IM
|
|
||||||
# ifdef ultrix
|
|
||||||
# define DEFAULT_IM "\r\n\r\nULTRIX (%h) (%t)\r\n\r\r\n\r"
|
|
||||||
# else
|
|
||||||
# ifdef __FreeBSD__
|
|
||||||
# define DEFAULT_IM "\r\n\r\nFreeBSD (%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
|
|
@ -1,48 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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. 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#ifndef lint
|
|
||||||
static const char sccsid[] = "@(#)global.c 8.1 (Berkeley) 6/4/93";
|
|
||||||
#endif /* not lint */
|
|
||||||
#endif
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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"
|
|
@ -1,52 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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. 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
|
|
||||||
* $FreeBSD$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#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 */
|
|
@ -1,480 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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. 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#ifndef lint
|
|
||||||
static const char sccsid[] = "@(#)slc.c 8.2 (Berkeley) 5/30/95";
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include "telnetd.h"
|
|
||||||
|
|
||||||
#ifdef LINEMODE
|
|
||||||
/*
|
|
||||||
* local variables
|
|
||||||
*/
|
|
||||||
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(void)
|
|
||||||
{
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
default_slc(void)
|
|
||||||
{
|
|
||||||
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(void)
|
|
||||||
{
|
|
||||||
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(char func, char flag, 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(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(unsigned char **bufp)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
output_datalen(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(unsigned char func, unsigned char flag, cc_t val)
|
|
||||||
{
|
|
||||||
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(char func, char flag, cc_t val)
|
|
||||||
{
|
|
||||||
int hislevel, mylevel;
|
|
||||||
|
|
||||||
hislevel = flag & SLC_LEVELBITS;
|
|
||||||
mylevel = slctab[(int)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[(int)func].current.flag = flag;
|
|
||||||
slctab[(int)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[(int)func].current.flag = SLC_NOSUPPORT;
|
|
||||||
} else {
|
|
||||||
slctab[(int)func].current.flag = slctab[(int)func].defset.flag;
|
|
||||||
}
|
|
||||||
slctab[(int)func].current.val = slctab[(int)func].defset.val;
|
|
||||||
add_slc(func, slctab[(int)func].current.flag,
|
|
||||||
slctab[(int)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[(int)func].sptr) {
|
|
||||||
/*
|
|
||||||
* We can change this one.
|
|
||||||
*/
|
|
||||||
slctab[(int)func].current.val = val;
|
|
||||||
*(slctab[(int)func].sptr) = val;
|
|
||||||
slctab[(int)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[(int)func].current.flag = flag;
|
|
||||||
slctab[(int)func].current.val = val;
|
|
||||||
flag |= SLC_ACK;
|
|
||||||
} else if (hislevel == SLC_CANTCHANGE &&
|
|
||||||
mylevel == SLC_CANTCHANGE) {
|
|
||||||
flag &= ~SLC_LEVELBITS;
|
|
||||||
flag |= SLC_NOSUPPORT;
|
|
||||||
slctab[(int)func].current.flag = flag;
|
|
||||||
} else {
|
|
||||||
flag &= ~SLC_LEVELBITS;
|
|
||||||
flag |= mylevel;
|
|
||||||
slctab[(int)func].current.flag = flag;
|
|
||||||
if (mylevel == SLC_CANTCHANGE) {
|
|
||||||
slctab[(int)func].current.val =
|
|
||||||
slctab[(int)func].defset.val;
|
|
||||||
val = slctab[(int)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(void)
|
|
||||||
{
|
|
||||||
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(unsigned char *ptr, int len)
|
|
||||||
{
|
|
||||||
unsigned char func, flag;
|
|
||||||
cc_t val;
|
|
||||||
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 */
|
|
||||||
memmove(def_slcbuf, ptr, len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} /* end of do_opt_slc */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* deferslc
|
|
||||||
*
|
|
||||||
* Do slc stuff that was deferred.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
deferslc(void)
|
|
||||||
{
|
|
||||||
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 */
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,618 +0,0 @@
|
|||||||
.\" 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. 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.4 (Berkeley) 6/1/94
|
|
||||||
.\" $FreeBSD$
|
|
||||||
.\"
|
|
||||||
.Dd September 21, 2022
|
|
||||||
.Dt TELNETD 8
|
|
||||||
.Os
|
|
||||||
.Sh NAME
|
|
||||||
.Nm telnetd
|
|
||||||
.Nd DARPA
|
|
||||||
.Tn TELNET
|
|
||||||
protocol server
|
|
||||||
.Sh SYNOPSIS
|
|
||||||
.Nm /usr/libexec/telnetd
|
|
||||||
.Op Fl 46BUhlkn
|
|
||||||
.Op Fl D Ar debugmode
|
|
||||||
.Op Fl S Ar tos
|
|
||||||
.Op Fl X Ar authtype
|
|
||||||
.Op Fl a Ar authmode
|
|
||||||
.Op Fl edebug
|
|
||||||
.Op Fl p Ar loginprog
|
|
||||||
.Op Fl u Ar len
|
|
||||||
.Op Fl debug Op Ar port
|
|
||||||
.SH DEPRECATION NOTICE
|
|
||||||
.Nm
|
|
||||||
is deprecated and may not be available in
|
|
||||||
.Fx 14.0
|
|
||||||
and later.
|
|
||||||
.Sh DESCRIPTION
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
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
|
|
||||||
manually, instead of through
|
|
||||||
.Xr inetd 8 .
|
|
||||||
If started up this way,
|
|
||||||
.Ar port
|
|
||||||
may be specified to run
|
|
||||||
.Nm
|
|
||||||
on an alternate
|
|
||||||
.Tn TCP
|
|
||||||
port number.
|
|
||||||
.Pp
|
|
||||||
The
|
|
||||||
.Nm
|
|
||||||
command accepts the following options:
|
|
||||||
.Bl -tag -width indent
|
|
||||||
.It Fl 4
|
|
||||||
Forces
|
|
||||||
.Nm
|
|
||||||
to use IPv4 addresses only.
|
|
||||||
.It Fl 6
|
|
||||||
Forces
|
|
||||||
.Nm
|
|
||||||
to use IPv6 addresses only.
|
|
||||||
.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
|
|
||||||
has been compiled with support for the
|
|
||||||
.Dv AUTHENTICATION
|
|
||||||
option.
|
|
||||||
There are several valid values for
|
|
||||||
.Ar authmode :
|
|
||||||
.Bl -tag -width debug
|
|
||||||
.It Cm debug
|
|
||||||
Turn on authentication debugging code.
|
|
||||||
.It Cm 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 Cm 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 Cm 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 Cm 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 Cm off
|
|
||||||
Disable the authentication code.
|
|
||||||
All user verification will happen through the
|
|
||||||
.Xr login 1
|
|
||||||
program.
|
|
||||||
.El
|
|
||||||
.It Fl B
|
|
||||||
Specify bftp server mode.
|
|
||||||
In this mode,
|
|
||||||
.Nm
|
|
||||||
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
|
|
||||||
to print out debugging information
|
|
||||||
to the connection, allowing the user to see what
|
|
||||||
.Nm
|
|
||||||
is doing.
|
|
||||||
There are several possible values for
|
|
||||||
.Ar debugmode :
|
|
||||||
.Bl -tag -width exercise
|
|
||||||
.It Cm options
|
|
||||||
Print information about the negotiation of
|
|
||||||
.Tn TELNET
|
|
||||||
options.
|
|
||||||
.It Cm report
|
|
||||||
Print the
|
|
||||||
.Cm options
|
|
||||||
information, plus some additional information
|
|
||||||
about what processing is going on.
|
|
||||||
.It Cm netdata
|
|
||||||
Display the data stream received by
|
|
||||||
.Nm .
|
|
||||||
.It Cm ptydata
|
|
||||||
Display data written to the pty.
|
|
||||||
.It Cm exercise
|
|
||||||
Has not been implemented yet.
|
|
||||||
.El
|
|
||||||
.It Fl debug
|
|
||||||
Enable debugging on each socket created by
|
|
||||||
.Nm
|
|
||||||
(see
|
|
||||||
.Dv SO_DEBUG
|
|
||||||
in
|
|
||||||
.Xr socket 2 ) .
|
|
||||||
.It Fl edebug
|
|
||||||
If
|
|
||||||
.Nm
|
|
||||||
has been compiled with support for data encryption, then the
|
|
||||||
.Fl edebug
|
|
||||||
option may be used to enable encryption debugging code.
|
|
||||||
.It Fl h
|
|
||||||
Disable the printing of host-specific information before
|
|
||||||
login has been completed.
|
|
||||||
.It Fl k
|
|
||||||
This option is only useful if
|
|
||||||
.Nm
|
|
||||||
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
|
|
||||||
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 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
|
|
||||||
Specify line mode.
|
|
||||||
Try 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
|
|
||||||
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 p Ar loginprog
|
|
||||||
Specify an alternate
|
|
||||||
.Xr login 1
|
|
||||||
command to run to complete the login.
|
|
||||||
The alternate command must
|
|
||||||
understand the same command arguments as the standard login.
|
|
||||||
.It Fl S Ar tos
|
|
||||||
Sets the IP type-of-service (TOS) option for the telnet
|
|
||||||
connection to the value
|
|
||||||
.Ar tos ,
|
|
||||||
which can be a numeric TOS value or, on systems that support it, a symbolic
|
|
||||||
TOS name found in the
|
|
||||||
.Pa /etc/iptos
|
|
||||||
file.
|
|
||||||
.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
|
|
||||||
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
|
|
||||||
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 .
|
|
||||||
Available
|
|
||||||
.Ar authtype
|
|
||||||
values include
|
|
||||||
.Ar KERBEROS_V4, Ar KERBEROS_V5, Ar SPX, Ar MINK,
|
|
||||||
and
|
|
||||||
.Ar SRA .
|
|
||||||
These options are completely independent of the
|
|
||||||
.Fl a
|
|
||||||
option.
|
|
||||||
.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
|
|
||||||
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
|
|
||||||
.Dq cooked
|
|
||||||
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
|
|
||||||
.Nm
|
|
||||||
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
|
|
||||||
.Nm
|
|
||||||
will not be doing any terminal echoing, so the
|
|
||||||
client should do any terminal echoing that is needed.
|
|
||||||
.It "WILL BINARY"
|
|
||||||
Indicate 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"
|
|
||||||
Indicate that it will not be sending
|
|
||||||
.Dv IAC GA ,
|
|
||||||
go ahead, commands.
|
|
||||||
.It "WILL STATUS"
|
|
||||||
Indicate 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
|
|
||||||
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
|
|
||||||
.Nm
|
|
||||||
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
|
|
||||||
.Bx 4.2
|
|
||||||
.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"
|
|
||||||
Indicate 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"
|
|
||||||
Indicate 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"
|
|
||||||
Indicate a desire to be able to request information
|
|
||||||
about the speed of the serial line to which
|
|
||||||
the client is attached.
|
|
||||||
.It "DO XDISPLOC"
|
|
||||||
Indicate a desire to be able to request the name
|
|
||||||
of the X Window System display that is associated with
|
|
||||||
the telnet client.
|
|
||||||
.It "DO NEW-ENVIRON"
|
|
||||||
Indicate a desire to be able to request environment
|
|
||||||
variable information, as described in RFC 1572.
|
|
||||||
.It "DO ENVIRON"
|
|
||||||
Indicate a desire to be able to request environment
|
|
||||||
variable information, as described in RFC 1408.
|
|
||||||
.It "DO LINEMODE"
|
|
||||||
Only sent if
|
|
||||||
.Nm
|
|
||||||
is compiled with support for linemode, and
|
|
||||||
requests that the client do line by line processing.
|
|
||||||
.It "DO TIMING-MARK"
|
|
||||||
Only sent if
|
|
||||||
.Nm
|
|
||||||
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
|
|
||||||
is compiled with support for authentication, and
|
|
||||||
indicates a willingness to receive authentication
|
|
||||||
information for automatic login.
|
|
||||||
.It "DO ENCRYPT"
|
|
||||||
Only sent if
|
|
||||||
.Nm
|
|
||||||
is compiled with support for data encryption, and
|
|
||||||
indicates a willingness to decrypt
|
|
||||||
the data stream.
|
|
||||||
.El
|
|
||||||
.Sh NOTES
|
|
||||||
By default
|
|
||||||
.Nm
|
|
||||||
will read the
|
|
||||||
.Em \&he ,
|
|
||||||
.Em \&hn ,
|
|
||||||
and
|
|
||||||
.Em \&im
|
|
||||||
capabilities from
|
|
||||||
.Pa /etc/gettytab
|
|
||||||
and use that information (if present) to determine
|
|
||||||
what to display before the login: prompt.
|
|
||||||
You can
|
|
||||||
also use a System V style
|
|
||||||
.Pa /etc/issue
|
|
||||||
file by using the
|
|
||||||
.Em \&if
|
|
||||||
capability, which will override
|
|
||||||
.Em \&im .
|
|
||||||
The information specified in either
|
|
||||||
.Em \&im
|
|
||||||
or
|
|
||||||
.Em \&if
|
|
||||||
will be displayed to both console and remote logins.
|
|
||||||
.\" .Sh ENVIRONMENT
|
|
||||||
.Sh FILES
|
|
||||||
.Bl -tag -width /usr/ucb/bftp -compact
|
|
||||||
.It Pa /etc/services
|
|
||||||
.It Pa /etc/gettytab
|
|
||||||
.It Pa /etc/iptos
|
|
||||||
(if supported)
|
|
||||||
.It Pa /usr/ucb/bftp
|
|
||||||
(if supported)
|
|
||||||
.El
|
|
||||||
.Sh "SEE ALSO"
|
|
||||||
.Xr bftp 1 ,
|
|
||||||
.Xr login 1 ,
|
|
||||||
.Xr telnet 1
|
|
||||||
(if supported),
|
|
||||||
.Xr gettytab 5
|
|
||||||
.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
|
|
||||||
.El
|
|
||||||
.Sh HISTORY
|
|
||||||
IPv6 support was added by WIDE/KAME project.
|
|
||||||
.Sh BUGS
|
|
||||||
Some
|
|
||||||
.Tn TELNET
|
|
||||||
commands are only partially implemented.
|
|
||||||
.Pp
|
|
||||||
Because of bugs in the original
|
|
||||||
.Bx 4.2
|
|
||||||
.Xr telnet 1 ,
|
|
||||||
.Nm
|
|
||||||
performs some dubious protocol exchanges to try to discover if the remote
|
|
||||||
client is, in fact, a
|
|
||||||
.Bx 4.2
|
|
||||||
.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.
|
|
File diff suppressed because it is too large
Load Diff
@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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. 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
|
|
||||||
* $FreeBSD$
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#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 const char *altlogin;
|
|
@ -1,628 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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. 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#ifndef lint
|
|
||||||
static const char sccsid[] = "@(#)termstat.c 8.2 (Berkeley) 5/30/95";
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#include <sys/cdefs.h>
|
|
||||||
__FBSDID("$FreeBSD$");
|
|
||||||
|
|
||||||
#include "telnetd.h"
|
|
||||||
|
|
||||||
#ifdef ENCRYPTION
|
|
||||||
#include <libtelnet/encrypt.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 */
|
|
||||||
|
|
||||||
#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)
|
|
||||||
{
|
|
||||||
int need_will_echo = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uselinemode) {
|
|
||||||
/*
|
|
||||||
* Check for state of BINARY options.
|
|
||||||
*
|
|
||||||
* We only need to do the binary dance if we are actually going
|
|
||||||
* to use linemode. As this confuses some telnet clients
|
|
||||||
* that don't support linemode, and doesn't gain us
|
|
||||||
* anything, we don't do it unless we're doing linemode.
|
|
||||||
* -Crh (henrich@msu.edu)
|
|
||||||
*/
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#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 */
|
|
||||||
output_data("%c%c%c%c%c%c%c", IAC, SB,
|
|
||||||
TELOPT_LINEMODE, LM_MODE, useeditmode,
|
|
||||||
IAC, SE);
|
|
||||||
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.
|
|
||||||
*/
|
|
||||||
output_data("%c%c%c%c%c%c%c", IAC, SB,
|
|
||||||
TELOPT_LINEMODE, LM_MODE, useeditmode,
|
|
||||||
IAC, SE);
|
|
||||||
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(void)
|
|
||||||
{
|
|
||||||
if (his_state_is_will(TELOPT_LFLOW)) {
|
|
||||||
if (tty_flowmode() != flowmode) {
|
|
||||||
flowmode = tty_flowmode();
|
|
||||||
output_data("%c%c%c%c%c%c",
|
|
||||||
IAC, SB, TELOPT_LFLOW,
|
|
||||||
flowmode ? LFLOW_ON : LFLOW_OFF,
|
|
||||||
IAC, SE);
|
|
||||||
}
|
|
||||||
if (tty_restartany() != restartany) {
|
|
||||||
restartany = tty_restartany();
|
|
||||||
output_data("%c%c%c%c%c%c",
|
|
||||||
IAC, SB, TELOPT_LFLOW,
|
|
||||||
restartany ? LFLOW_RESTART_ANY
|
|
||||||
: LFLOW_RESTART_XON,
|
|
||||||
IAC, SE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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(int code, int parm1, int parm2)
|
|
||||||
{
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
output_data("%c%c%c%c%c%c%c", IAC,
|
|
||||||
SB, TELOPT_LINEMODE, LM_MODE,
|
|
||||||
useeditmode, IAC, SE);
|
|
||||||
editmode = useeditmode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
tty_setlinemode(uselinemode);
|
|
||||||
|
|
||||||
linemode = uselinemode;
|
|
||||||
|
|
||||||
if (!linemode)
|
|
||||||
send_will(TELOPT_ECHO, 1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LM_MODE:
|
|
||||||
{
|
|
||||||
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) {
|
|
||||||
output_data("%c%c%c%c%c%c%c", IAC,
|
|
||||||
SB, TELOPT_LINEMODE, LM_MODE,
|
|
||||||
useeditmode|MODE_ACK,
|
|
||||||
IAC, SE);
|
|
||||||
}
|
|
||||||
|
|
||||||
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 separate 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 */
|
|
||||||
|
|
||||||
netflush();
|
|
||||||
|
|
||||||
} /* end of clientstat */
|
|
||||||
|
|
||||||
#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(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
memset((char *)&ws, 0, 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(void)
|
|
||||||
{
|
|
||||||
return(_terminit);
|
|
||||||
|
|
||||||
} /* end of terminit */
|
|
||||||
#endif /* LINEMODE */
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user