update to telnetd from 95.10.23 version. Includes Borman's scrub_env()
to keep stuff out of the environment on the way to exec (we already have one in the state machine that keeps them from arriving over the wire, so this should be redundant, but it'll make any further updates easier to have it present). also, RCS Id police.
This commit is contained in:
parent
583a8146a9
commit
42e1b6b73d
|
@ -1,15 +1,16 @@
|
|||
# from: @(#)Makefile 8.2 (Berkeley) 12/15/93
|
||||
# $Id: Makefile,v 1.5 1994/12/22 10:28:19 cgd Exp $
|
||||
# $NetBSD: Makefile,v 1.6 1996/02/24 01:22:12 jtk Exp $
|
||||
|
||||
PROG= telnetd
|
||||
CFLAGS+=-DLINEMODE -DKLUDGELINEMODE -DUSE_TERMIO -DDIAGNOSTICS
|
||||
CFLAGS+=-DOLD_ENVIRON -DENV_HACK
|
||||
CFLAGS+=-DOLD_ENVIRON -DENV_HACK -I${.CURDIR}
|
||||
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+= -lutil -ltermcap -ltelnet
|
||||
MAN= 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
|
||||
|
|
|
@ -32,10 +32,11 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char sccsid[] = "@(#)authenc.c 8.1 (Berkeley) 6/4/93";
|
||||
/* from: static char sccsid[] = "@(#)authenc.c 8.2 (Berkeley) 5/30/95"; */
|
||||
static char rcsid[] = "$NetBSD: authenc.c,v 1.2 1996/02/24 01:22:13 jtk Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
#if defined(AUTHENTICATION) || defined(ENCRYPTION)
|
||||
#if defined(AUTHENTICATION)
|
||||
#include "telnetd.h"
|
||||
#include <libtelnet/misc.h>
|
||||
|
||||
|
@ -45,7 +46,7 @@ net_write(str, len)
|
|||
int len;
|
||||
{
|
||||
if (nfrontp + len < netobuf + BUFSIZ) {
|
||||
bcopy((void *)str, (void *)nfrontp, len);
|
||||
memmove((void *)nfrontp, (void *)str, len);
|
||||
nfrontp += len;
|
||||
return(len);
|
||||
}
|
||||
|
@ -55,13 +56,6 @@ net_write(str, len)
|
|||
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
|
||||
|
@ -88,4 +82,4 @@ telnet_gets(prompt, result, length, echo)
|
|||
{
|
||||
return((char *)0);
|
||||
}
|
||||
#endif /* defined(AUTHENTICATION) || defined(ENCRYPTION) */
|
||||
#endif /* defined(AUTHENTICATION) */
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)defs.h 8.1 (Berkeley) 6/4/93
|
||||
* $Id: defs.h,v 1.4 1994/02/25 03:20:46 cgd Exp $
|
||||
* $NetBSD: defs.h,v 1.5 1996/02/24 01:22:15 jtk Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
|
|
@ -30,8 +30,8 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)ext.h 8.1 (Berkeley) 6/4/93
|
||||
* $Id: ext.h,v 1.4 1994/02/25 03:20:47 cgd Exp $
|
||||
* from: @(#)ext.h 8.2 (Berkeley) 12/15/93
|
||||
* $NetBSD: ext.h,v 1.5 1996/02/24 01:22:16 jtk Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -90,13 +90,8 @@ 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
|
||||
#include <sys/cdefs.h>
|
||||
#define P __P
|
||||
|
||||
extern void
|
||||
_termstat P((void)),
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
|
||||
#ifndef lint
|
||||
/* from: static char sccsid[] = "@(#)global.c 8.1 (Berkeley) 6/4/93"; */
|
||||
static char *rcsid = "$Id: global.c,v 1.3 1994/02/25 03:20:49 cgd Exp $";
|
||||
static char *rcsid = "$Id: global.c,v 1.4 1996/02/24 01:22:17 jtk Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
|
@ -44,6 +44,6 @@ static char *rcsid = "$Id: global.c,v 1.3 1994/02/25 03:20:49 cgd Exp $";
|
|||
* we will actually allocate the space.
|
||||
*/
|
||||
|
||||
#include "defs.h"
|
||||
#include <defs.h>
|
||||
#define extern
|
||||
#include "ext.h"
|
||||
#include <ext.h>
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)pathnames.h 8.1 (Berkeley) 6/4/93
|
||||
* $Id: pathnames.h,v 1.3 1994/02/25 03:20:50 cgd Exp $
|
||||
* $NetBSD: pathnames.h,v 1.4 1996/02/24 01:22:18 jtk Exp $
|
||||
*/
|
||||
|
||||
#if BSD > 43
|
||||
|
|
|
@ -32,8 +32,8 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
/* from: static char sccsid[] = "@(#)state.c 8.1 (Berkeley) 6/4/93"; */
|
||||
static char *rcsid = "$Id: state.c,v 1.7 1995/10/19 12:47:28 ghudson Exp $";
|
||||
/* from: static char sccsid[] = "@(#)state.c 8.5 (Berkeley) 5/30/95"; */
|
||||
static char rcsid[] = "$NetBSD: state.c,v 1.8 1996/02/24 01:22:19 jtk Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "telnetd.h"
|
||||
|
@ -355,7 +355,7 @@ gotiac: switch (c) {
|
|||
char xbuf2[BUFSIZ];
|
||||
register char *cp;
|
||||
int n = pfrontp - opfrontp, oc;
|
||||
bcopy(opfrontp, xptyobuf, n);
|
||||
memmove(xptyobuf, opfrontp, n);
|
||||
pfrontp = opfrontp;
|
||||
pfrontp += term_input(xptyobuf, pfrontp, n, BUFSIZ+NETSLOP,
|
||||
xbuf2, &oc, BUFSIZ);
|
||||
|
@ -691,7 +691,6 @@ wontoption(option)
|
|||
*/
|
||||
if (lmodetype != REAL_LINEMODE)
|
||||
break;
|
||||
lmodetype = KLUDGE_LINEMODE;
|
||||
# endif /* KLUDGELINEMODE */
|
||||
clientstat(TELOPT_LINEMODE, WONT, 0);
|
||||
break;
|
||||
|
@ -1463,8 +1462,8 @@ doclientstat()
|
|||
clientstat(TELOPT_LINEMODE, WILL, 0);
|
||||
}
|
||||
|
||||
#define ADD(c) *ncp++ = c;
|
||||
#define ADD_DATA(c) { *ncp++ = c; if (c == SE) *ncp++ = c; }
|
||||
#define ADD(c) *ncp++ = c
|
||||
#define ADD_DATA(c) { *ncp++ = c; if (c == SE || c == IAC) *ncp++ = c; }
|
||||
void
|
||||
send_status()
|
||||
{
|
||||
|
@ -1493,14 +1492,10 @@ send_status()
|
|||
if (my_want_state_is_will(i)) {
|
||||
ADD(WILL);
|
||||
ADD_DATA(i);
|
||||
if (i == IAC)
|
||||
ADD(IAC);
|
||||
}
|
||||
if (his_want_state_is_will(i)) {
|
||||
ADD(DO);
|
||||
ADD_DATA(i);
|
||||
if (i == IAC)
|
||||
ADD(IAC);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1515,15 +1510,14 @@ send_status()
|
|||
ADD(SE);
|
||||
|
||||
if (restartany >= 0) {
|
||||
ADD(SB)
|
||||
ADD(SB);
|
||||
ADD(TELOPT_LFLOW);
|
||||
if (restartany) {
|
||||
ADD(LFLOW_RESTART_ANY);
|
||||
} else {
|
||||
ADD(LFLOW_RESTART_XON);
|
||||
}
|
||||
ADD(SE)
|
||||
ADD(SB);
|
||||
ADD(SE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1536,8 +1530,6 @@ send_status()
|
|||
ADD(TELOPT_LINEMODE);
|
||||
ADD(LM_MODE);
|
||||
ADD_DATA(editmode);
|
||||
if (editmode == IAC)
|
||||
ADD(IAC);
|
||||
ADD(SE);
|
||||
|
||||
ADD(SB);
|
||||
|
|
|
@ -32,13 +32,16 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
/* from: static char sccsid[] = "@(#)sys_term.c 8.1 (Berkeley) 6/4/93"; */
|
||||
static char *rcsid = "$Id: sys_term.c,v 1.5 1996/02/08 06:10:52 mycroft Exp $";
|
||||
/* from: static char sccsid[] = "@(#)sys_term.c 8.4+1 (Berkeley) 5/30/95"; */
|
||||
static char rcsid[] = "$NetBSD: sys_term.c,v 1.6 1996/02/24 01:22:21 jtk Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "telnetd.h"
|
||||
#include "pathnames.h"
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#define P __P
|
||||
|
||||
#if defined(AUTHENTICATION)
|
||||
#include <libtelnet/auth.h>
|
||||
#endif
|
||||
|
@ -70,21 +73,16 @@ char wtmpf[] = "/etc/wtmp";
|
|||
# ifdef CRAY
|
||||
#include <tmpdir.h>
|
||||
#include <sys/wait.h>
|
||||
# if defined(_SC_CRAY_SECURE_SYS) && !defined(SCM_SECURITY)
|
||||
/*
|
||||
* UNICOS 6.0/6.1 do not have SCM_SECURITY defined, so we can
|
||||
* use it to tell us to turn off all the socket security code,
|
||||
* since that is only used in UNICOS 7.0 and later.
|
||||
*/
|
||||
# undef _SC_CRAY_SECURE_SYS
|
||||
# if (UNICOS_LVL == '7.0') || (UNICOS_LVL == '7.1')
|
||||
# define UNICOS7x
|
||||
# endif
|
||||
|
||||
# if defined(_SC_CRAY_SECURE_SYS)
|
||||
# ifdef UNICOS7x
|
||||
#include <sys/sysv.h>
|
||||
#include <sys/secstat.h>
|
||||
extern int secflag;
|
||||
extern struct sysv sysv;
|
||||
# endif /* _SC_CRAY_SECURE_SYS */
|
||||
# endif /* UNICOS7x */
|
||||
# endif /* CRAY */
|
||||
#endif /* NEWINIT */
|
||||
|
||||
|
@ -216,7 +214,7 @@ copy_termbuf(cp, len)
|
|||
{
|
||||
if (len > sizeof(termbuf))
|
||||
len = sizeof(termbuf);
|
||||
bcopy(cp, (char *)&termbuf, len);
|
||||
memmove((char *)&termbuf, cp, len);
|
||||
termbuf2 = termbuf;
|
||||
}
|
||||
#endif /* defined(LINEMODE) && defined(TIOCPKT_IOCTL) */
|
||||
|
@ -228,17 +226,19 @@ set_termbuf()
|
|||
* Only make the necessary changes.
|
||||
*/
|
||||
#ifndef USE_TERMIO
|
||||
if (bcmp((char *)&termbuf.sg, (char *)&termbuf2.sg, sizeof(termbuf.sg)))
|
||||
if (memcmp((char *)&termbuf.sg, (char *)&termbuf2.sg,
|
||||
sizeof(termbuf.sg)))
|
||||
(void) ioctl(pty, TIOCSETN, (char *)&termbuf.sg);
|
||||
if (bcmp((char *)&termbuf.tc, (char *)&termbuf2.tc, sizeof(termbuf.tc)))
|
||||
if (memcmp((char *)&termbuf.tc, (char *)&termbuf2.tc,
|
||||
sizeof(termbuf.tc)))
|
||||
(void) ioctl(pty, TIOCSETC, (char *)&termbuf.tc);
|
||||
if (bcmp((char *)&termbuf.ltc, (char *)&termbuf2.ltc,
|
||||
if (memcmp((char *)&termbuf.ltc, (char *)&termbuf2.ltc,
|
||||
sizeof(termbuf.ltc)))
|
||||
(void) ioctl(pty, TIOCSLTC, (char *)&termbuf.ltc);
|
||||
if (termbuf.lflags != termbuf2.lflags)
|
||||
(void) ioctl(pty, TIOCLSET, (char *)&termbuf.lflags);
|
||||
#else /* USE_TERMIO */
|
||||
if (bcmp((char *)&termbuf, (char *)&termbuf2, sizeof(termbuf)))
|
||||
if (memcmp((char *)&termbuf, (char *)&termbuf2, sizeof(termbuf)))
|
||||
# ifdef STREAMSPTY
|
||||
(void) tcsetattr(ttyfd, TCSANOW, &termbuf);
|
||||
# else
|
||||
|
@ -943,6 +943,15 @@ tty_iscrnl()
|
|||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to guess whether speeds are "encoded" (4.2BSD) or just numeric (4.4BSD).
|
||||
*/
|
||||
#if B4800 != 4800
|
||||
#define DECODE_BAUD
|
||||
#endif
|
||||
|
||||
#ifdef DECODE_BAUD
|
||||
|
||||
/*
|
||||
* A table of available terminal speeds
|
||||
*/
|
||||
|
@ -950,34 +959,72 @@ struct termspeeds {
|
|||
int speed;
|
||||
int value;
|
||||
} termspeeds[] = {
|
||||
{ 0, B0 }, { 50, B50 }, { 75, B75 },
|
||||
{ 110, B110 }, { 134, B134 }, { 150, B150 },
|
||||
{ 200, B200 }, { 300, B300 }, { 600, B600 },
|
||||
{ 1200, B1200 }, { 1800, B1800 }, { 2400, B2400 },
|
||||
{ 4800, B4800 }, { 9600, B9600 }, { 19200, B9600 },
|
||||
{ 38400, B9600 }, { -1, B9600 }
|
||||
{ 0, B0 }, { 50, B50 }, { 75, B75 },
|
||||
{ 110, B110 }, { 134, B134 }, { 150, B150 },
|
||||
{ 200, B200 }, { 300, B300 }, { 600, B600 },
|
||||
{ 1200, B1200 }, { 1800, B1800 }, { 2400, B2400 },
|
||||
{ 4800, B4800 },
|
||||
#ifdef B7200
|
||||
{ 7200, B7200 },
|
||||
#endif
|
||||
{ 9600, B9600 },
|
||||
#ifdef B14400
|
||||
{ 14400, B14400 },
|
||||
#endif
|
||||
#ifdef B19200
|
||||
{ 19200, B19200 },
|
||||
#endif
|
||||
#ifdef B28800
|
||||
{ 28800, B28800 },
|
||||
#endif
|
||||
#ifdef B38400
|
||||
{ 38400, B38400 },
|
||||
#endif
|
||||
#ifdef B57600
|
||||
{ 57600, B57600 },
|
||||
#endif
|
||||
#ifdef B115200
|
||||
{ 115200, B115200 },
|
||||
#endif
|
||||
#ifdef B230400
|
||||
{ 230400, B230400 },
|
||||
#endif
|
||||
{ -1, 0 }
|
||||
};
|
||||
#endif /* DECODE_BUAD */
|
||||
|
||||
void
|
||||
tty_tspeed(val)
|
||||
int val;
|
||||
{
|
||||
#ifdef DECODE_BAUD
|
||||
register struct termspeeds *tp;
|
||||
|
||||
for (tp = termspeeds; (tp->speed != -1) && (val > tp->speed); tp++)
|
||||
;
|
||||
if (tp->speed == -1) /* back up to last valid value */
|
||||
--tp;
|
||||
cfsetospeed(&termbuf, tp->value);
|
||||
#else /* DECODE_BUAD */
|
||||
cfsetospeed(&termbuf, val);
|
||||
#endif /* DECODE_BUAD */
|
||||
}
|
||||
|
||||
void
|
||||
tty_rspeed(val)
|
||||
int val;
|
||||
{
|
||||
#ifdef DECODE_BAUD
|
||||
register struct termspeeds *tp;
|
||||
|
||||
for (tp = termspeeds; (tp->speed != -1) && (val > tp->speed); tp++)
|
||||
;
|
||||
if (tp->speed == -1) /* back up to last valid value */
|
||||
--tp;
|
||||
cfsetispeed(&termbuf, tp->value);
|
||||
#else /* DECODE_BAUD */
|
||||
cfsetispeed(&termbuf, val);
|
||||
#endif /* DECODE_BAUD */
|
||||
}
|
||||
|
||||
#if defined(CRAY2) && defined(UNICOS5)
|
||||
|
@ -1093,7 +1140,7 @@ getptyslave()
|
|||
init_termbuf();
|
||||
# ifdef TIOCGWINSZ
|
||||
if (def_row || def_col) {
|
||||
bzero((char *)&ws, sizeof(ws));
|
||||
memset((char *)&ws, 0, sizeof(ws));
|
||||
ws.ws_col = def_col;
|
||||
ws.ws_row = def_row;
|
||||
(void)ioctl(t, TIOCSWINSZ, (char *)&ws);
|
||||
|
@ -1173,9 +1220,9 @@ cleanopen(line)
|
|||
char *line;
|
||||
{
|
||||
register int t;
|
||||
#if defined(_SC_CRAY_SECURE_SYS)
|
||||
#ifdef UNICOS7x
|
||||
struct secstat secbuf;
|
||||
#endif /* _SC_CRAY_SECURE_SYS */
|
||||
#endif /* UNICOS7x */
|
||||
|
||||
#ifndef STREAMSPTY
|
||||
/*
|
||||
|
@ -1189,7 +1236,7 @@ cleanopen(line)
|
|||
# if !defined(CRAY) && (BSD > 43)
|
||||
(void) revoke(line);
|
||||
# endif
|
||||
#if defined(_SC_CRAY_SECURE_SYS)
|
||||
#ifdef UNICOS7x
|
||||
if (secflag) {
|
||||
if (secstat(line, &secbuf) < 0)
|
||||
return(-1);
|
||||
|
@ -1198,18 +1245,18 @@ cleanopen(line)
|
|||
if (setucmp(secbuf.st_compart) < 0)
|
||||
return(-1);
|
||||
}
|
||||
#endif /* _SC_CRAY_SECURE_SYS */
|
||||
#endif /* UNICOS7x */
|
||||
|
||||
t = open(line, O_RDWR|O_NOCTTY);
|
||||
|
||||
#if defined(_SC_CRAY_SECURE_SYS)
|
||||
#ifdef UNICOS7x
|
||||
if (secflag) {
|
||||
if (setulvl(sysv.sy_minlvl) < 0)
|
||||
return(-1);
|
||||
if (setucmp(0) < 0)
|
||||
return(-1);
|
||||
}
|
||||
#endif /* _SC_CRAY_SECURE_SYS */
|
||||
#endif /* UNICOS7x */
|
||||
|
||||
if (t < 0)
|
||||
return(-1);
|
||||
|
@ -1232,9 +1279,8 @@ cleanopen(line)
|
|||
(void) signal(SIGHUP, SIG_IGN);
|
||||
(void) ioctl(t, TCVHUP, (char *)0);
|
||||
(void) signal(SIGHUP, SIG_DFL);
|
||||
setpgrp();
|
||||
|
||||
#if defined(_SC_CRAY_SECURE_SYS)
|
||||
#ifdef UNICOS7x
|
||||
if (secflag) {
|
||||
if (secstat(line, &secbuf) < 0)
|
||||
return(-1);
|
||||
|
@ -1243,18 +1289,18 @@ cleanopen(line)
|
|||
if (setucmp(secbuf.st_compart) < 0)
|
||||
return(-1);
|
||||
}
|
||||
#endif /* _SC_CRAY_SECURE_SYS */
|
||||
#endif /* UNICOS7x */
|
||||
|
||||
i = open(line, O_RDWR);
|
||||
|
||||
#if defined(_SC_CRAY_SECURE_SYS)
|
||||
#ifdef UNICOS7x
|
||||
if (secflag) {
|
||||
if (setulvl(sysv.sy_minlvl) < 0)
|
||||
return(-1);
|
||||
if (setucmp(0) < 0)
|
||||
return(-1);
|
||||
}
|
||||
#endif /* _SC_CRAY_SECURE_SYS */
|
||||
#endif /* UNICOS7x */
|
||||
|
||||
if (i < 0)
|
||||
return(-1);
|
||||
|
@ -1303,7 +1349,11 @@ login_tty(t)
|
|||
* setsid() call above may have set our pgrp, so clear
|
||||
* it out before opening the tty...
|
||||
*/
|
||||
# ifndef SOLARIS
|
||||
(void) setpgrp(0, 0);
|
||||
# else
|
||||
(void) setpgrp();
|
||||
# endif
|
||||
close(open(line, O_RDWR));
|
||||
# endif
|
||||
if (t != 0)
|
||||
|
@ -1337,6 +1387,7 @@ startslave(host, autologin, autoname)
|
|||
char *autoname;
|
||||
{
|
||||
register int i;
|
||||
long time();
|
||||
char name[256];
|
||||
#ifdef NEWINIT
|
||||
extern char *ptyip;
|
||||
|
@ -1513,7 +1564,7 @@ start_login(host, autologin, name)
|
|||
* Create utmp entry for child
|
||||
*/
|
||||
|
||||
bzero(&utmpx, sizeof(utmpx));
|
||||
memset(&utmpx, 0, sizeof(utmpx));
|
||||
SCPYN(utmpx.ut_user, ".telnet");
|
||||
SCPYN(utmpx.ut_line, line + sizeof("/dev/") - 1);
|
||||
utmpx.ut_pid = pid;
|
||||
|
@ -1527,6 +1578,8 @@ start_login(host, autologin, name)
|
|||
fatal(net, "makeutx failed");
|
||||
#endif
|
||||
|
||||
scrub_env();
|
||||
|
||||
/*
|
||||
* -h : pass on name of host.
|
||||
* WARNING: -h is accepted by login if and only if
|
||||
|
@ -1568,6 +1621,19 @@ start_login(host, autologin, name)
|
|||
#if !defined(NO_LOGIN_P)
|
||||
argv = addarg(argv, "-p");
|
||||
#endif
|
||||
#ifdef LINEMODE
|
||||
/*
|
||||
* Set the environment variable "LINEMODE" to either
|
||||
* "real" or "kludge" if we are operating in either
|
||||
* real or kludge linemode.
|
||||
*/
|
||||
if (lmodetype == REAL_LINEMODE)
|
||||
setenv("LINEMODE", "real", 1);
|
||||
# ifdef KLUDGELINEMODE
|
||||
else if (lmodetype == KLUDGE_LINEMODE || lmodetype == KLUDGE_OK)
|
||||
setenv("LINEMODE", "kludge", 1);
|
||||
# endif
|
||||
#endif
|
||||
#ifdef BFTPDAEMON
|
||||
/*
|
||||
* Are we working as the bftp daemon? If so, then ask login
|
||||
|
@ -1691,11 +1757,27 @@ start_login(host, autologin, name)
|
|||
*/
|
||||
unsetenv("USER");
|
||||
}
|
||||
#ifdef SOLARIS
|
||||
else {
|
||||
char **p;
|
||||
|
||||
argv = addarg(argv, ""); /* no login name */
|
||||
for (p = environ; *p; p++) {
|
||||
argv = addarg(argv, *p);
|
||||
}
|
||||
}
|
||||
#endif /* SOLARIS */
|
||||
#if defined(AUTHENTICATION) && defined(NO_LOGIN_F) && defined(LOGIN_R)
|
||||
if (pty > 2)
|
||||
close(pty);
|
||||
#endif
|
||||
closelog();
|
||||
/*
|
||||
* This sleep(1) is in here so that telnetd can
|
||||
* finish up with the tty. There's a race condition
|
||||
* the login banner message gets lost...
|
||||
*/
|
||||
sleep(1);
|
||||
execv(_PATH_LOGIN, argv);
|
||||
|
||||
syslog(LOG_ERR, "%s: %m\n", _PATH_LOGIN);
|
||||
|
@ -1722,14 +1804,14 @@ addarg(argv, val)
|
|||
}
|
||||
for (cpp = argv; *cpp; cpp++)
|
||||
;
|
||||
if (cpp == &argv[(long)argv[-1]]) {
|
||||
if (cpp == &argv[(int)argv[-1]]) {
|
||||
--argv;
|
||||
*argv = (char *)((long)(*argv) + 10);
|
||||
argv = (char **)realloc(argv, (long)(*argv) + 2);
|
||||
*argv = (char *)((int)(*argv) + 10);
|
||||
argv = (char **)realloc(argv, sizeof(*argv)*((int)(*argv) + 2));
|
||||
if (argv == NULL)
|
||||
return(NULL);
|
||||
argv++;
|
||||
cpp = &argv[(long)argv[-1] - 10];
|
||||
cpp = &argv[(int)argv[-1] - 10];
|
||||
}
|
||||
*cpp++ = val;
|
||||
*cpp = 0;
|
||||
|
@ -1737,6 +1819,26 @@ addarg(argv, val)
|
|||
}
|
||||
#endif /* NEWINIT */
|
||||
|
||||
/*
|
||||
* scrub_env()
|
||||
*
|
||||
* Remove a few things from the environment that
|
||||
* don't need to be there.
|
||||
*/
|
||||
scrub_env()
|
||||
{
|
||||
register char **cpp, **cpp2;
|
||||
|
||||
for (cpp2 = cpp = environ; *cpp; cpp++) {
|
||||
if (strncmp(*cpp, "LD_", 3) &&
|
||||
strncmp(*cpp, "_RLD_", 5) &&
|
||||
strncmp(*cpp, "LIBPATH=", 8) &&
|
||||
strncmp(*cpp, "IFS=", 4))
|
||||
*cpp2++ = *cpp;
|
||||
}
|
||||
*cpp2 = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* cleanup()
|
||||
*
|
||||
|
@ -1778,6 +1880,8 @@ cleanup(sig)
|
|||
# ifdef CRAY
|
||||
static int incleanup = 0;
|
||||
register int t;
|
||||
int child_status; /* status of child process as returned by waitpid */
|
||||
int flags = WNOHANG|WUNTRACED;
|
||||
|
||||
/*
|
||||
* 1: Pick up the zombie, if we are being called
|
||||
|
@ -1788,9 +1892,17 @@ cleanup(sig)
|
|||
* 5: Close down the network and pty connections.
|
||||
* 6: Finish up the TMPDIR cleanup, if needed.
|
||||
*/
|
||||
if (sig == SIGCHLD)
|
||||
while (waitpid(-1, 0, WNOHANG) > 0)
|
||||
if (sig == SIGCHLD) {
|
||||
while (waitpid(-1, &child_status, flags) > 0)
|
||||
; /* VOID */
|
||||
/* Check if the child process was stopped
|
||||
* rather than exited. We want cleanup only if
|
||||
* the child has died.
|
||||
*/
|
||||
if (WIFSTOPPED(child_status)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
t = sigblock(sigmask(SIGCHLD));
|
||||
if (incleanup) {
|
||||
sigsetmask(t);
|
||||
|
@ -1798,6 +1910,7 @@ cleanup(sig)
|
|||
}
|
||||
incleanup = 1;
|
||||
sigsetmask(t);
|
||||
#ifdef UNICOS7x
|
||||
if (secflag) {
|
||||
/*
|
||||
* We need to set ourselves back to a null
|
||||
|
@ -1807,6 +1920,7 @@ cleanup(sig)
|
|||
setulvl(sysv.sy_minlvl);
|
||||
setucmp((long)0);
|
||||
}
|
||||
#endif /* UNICOS7x */
|
||||
|
||||
t = cleantmp(&wtmp);
|
||||
setutent(); /* just to make sure */
|
||||
|
@ -1906,6 +2020,28 @@ sigjob(sig)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* jid_getutid:
|
||||
* called by jobend() before calling cleantmp()
|
||||
* to find the correct $TMPDIR to cleanup.
|
||||
*/
|
||||
|
||||
struct utmp *
|
||||
jid_getutid(jid)
|
||||
int jid;
|
||||
{
|
||||
struct utmp *cur = NULL;
|
||||
|
||||
setutent(); /* just to make sure */
|
||||
while (cur = getutent()) {
|
||||
if ( (cur->ut_type != NULL) && (jid == cur->ut_jid) ) {
|
||||
return(cur);
|
||||
}
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Clean up the TMPDIR that login created.
|
||||
* The first time this is called we pick up the info
|
||||
|
@ -1962,9 +2098,27 @@ jobend(jid, path, user)
|
|||
register char *user;
|
||||
{
|
||||
static int saved_jid = 0;
|
||||
static int pty_saved_jid = 0;
|
||||
static char saved_path[sizeof(wtmp.ut_tpath)+1];
|
||||
static char saved_user[sizeof(wtmp.ut_user)+1];
|
||||
|
||||
/*
|
||||
* this little piece of code comes into play
|
||||
* only when ptyreconnect is used to reconnect
|
||||
* to an previous session.
|
||||
*
|
||||
* this is the only time when the
|
||||
* "saved_jid != jid" code is executed.
|
||||
*/
|
||||
|
||||
if ( saved_jid && saved_jid != jid ) {
|
||||
if (!path) { /* called from signal handler */
|
||||
pty_saved_jid = jid;
|
||||
} else {
|
||||
pty_saved_jid = saved_jid;
|
||||
}
|
||||
}
|
||||
|
||||
if (path) {
|
||||
strncpy(saved_path, path, sizeof(wtmp.ut_tpath));
|
||||
strncpy(saved_user, user, sizeof(wtmp.ut_user));
|
||||
|
@ -1975,6 +2129,24 @@ jobend(jid, path, user)
|
|||
saved_jid = jid;
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* if the jid has changed, get the correct entry from the utmp file */
|
||||
|
||||
if ( saved_jid != jid ) {
|
||||
struct utmp *utp = NULL;
|
||||
struct utmp *jid_getutid();
|
||||
|
||||
utp = jid_getutid(pty_saved_jid);
|
||||
|
||||
if (utp == 0) {
|
||||
syslog(LOG_ERR, "Can't get /etc/utmp entry to clean TMPDIR");
|
||||
return(-1);
|
||||
}
|
||||
|
||||
cleantmpdir(jid, utp->ut_tpath, utp->ut_user);
|
||||
return(1);
|
||||
}
|
||||
|
||||
cleantmpdir(jid, saved_path, saved_user);
|
||||
return(1);
|
||||
}
|
||||
|
|
|
@ -38,13 +38,16 @@ static char copyright[] =
|
|||
#endif /* not lint */
|
||||
|
||||
#ifndef lint
|
||||
/* from: static char sccsid[] = "@(#)telnetd.c 8.1 (Berkeley) 6/4/93"; */
|
||||
static char *rcsid = "$Id: telnetd.c,v 1.3 1994/02/25 03:20:59 cgd Exp $";
|
||||
/* from: static char sccsid[] = "@(#)telnetd.c 8.4 (Berkeley) 5/30/95"; */
|
||||
static char rcsid[] = "$NetBSD: telnetd.c,v 1.4 1996/02/24 01:22:23 jtk Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "telnetd.h"
|
||||
#include "pathnames.h"
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#define P __P
|
||||
|
||||
#if defined(_SC_CRAY_SECURE_SYS) && !defined(SCM_SECURITY)
|
||||
/*
|
||||
* UNICOS 6.0/6.1 do not have SCM_SECURITY defined, so we can
|
||||
|
@ -435,7 +438,7 @@ main(argc, argv)
|
|||
int szi = sizeof(int);
|
||||
#endif /* SO_SEC_MULTI */
|
||||
|
||||
bzero((char *)&dv, sizeof(dv));
|
||||
memset((char *)&dv, 0, sizeof(dv));
|
||||
|
||||
if (getsysv(&sysv, sizeof(struct sysv)) != 0) {
|
||||
perror("getsysv");
|
||||
|
@ -606,34 +609,40 @@ getterminaltype(name)
|
|||
static unsigned char sb[] =
|
||||
{ IAC, SB, TELOPT_TSPEED, TELQUAL_SEND, IAC, SE };
|
||||
|
||||
bcopy(sb, nfrontp, sizeof sb);
|
||||
memmove(nfrontp, sb, sizeof sb);
|
||||
nfrontp += sizeof sb;
|
||||
DIAG(TD_OPTIONS, printsub('>', sb + 2, sizeof sb - 2););
|
||||
}
|
||||
if (his_state_is_will(TELOPT_XDISPLOC)) {
|
||||
static unsigned char sb[] =
|
||||
{ IAC, SB, TELOPT_XDISPLOC, TELQUAL_SEND, IAC, SE };
|
||||
|
||||
bcopy(sb, nfrontp, sizeof sb);
|
||||
memmove(nfrontp, sb, sizeof sb);
|
||||
nfrontp += sizeof sb;
|
||||
DIAG(TD_OPTIONS, printsub('>', sb + 2, sizeof sb - 2););
|
||||
}
|
||||
if (his_state_is_will(TELOPT_NEW_ENVIRON)) {
|
||||
static unsigned char sb[] =
|
||||
{ IAC, SB, TELOPT_NEW_ENVIRON, TELQUAL_SEND, IAC, SE };
|
||||
|
||||
bcopy(sb, nfrontp, sizeof sb);
|
||||
memmove(nfrontp, sb, sizeof sb);
|
||||
nfrontp += sizeof sb;
|
||||
DIAG(TD_OPTIONS, printsub('>', sb + 2, sizeof sb - 2););
|
||||
}
|
||||
else if (his_state_is_will(TELOPT_OLD_ENVIRON)) {
|
||||
static unsigned char sb[] =
|
||||
{ IAC, SB, TELOPT_OLD_ENVIRON, TELQUAL_SEND, IAC, SE };
|
||||
|
||||
bcopy(sb, nfrontp, sizeof sb);
|
||||
memmove(nfrontp, sb, sizeof sb);
|
||||
nfrontp += sizeof sb;
|
||||
DIAG(TD_OPTIONS, printsub('>', sb + 2, sizeof sb - 2););
|
||||
}
|
||||
if (his_state_is_will(TELOPT_TTYPE)) {
|
||||
|
||||
bcopy(ttytype_sbbuf, nfrontp, sizeof ttytype_sbbuf);
|
||||
memmove(nfrontp, ttytype_sbbuf, sizeof ttytype_sbbuf);
|
||||
nfrontp += sizeof ttytype_sbbuf;
|
||||
DIAG(TD_OPTIONS, printsub('>', ttytype_sbbuf + 2,
|
||||
sizeof ttytype_sbbuf - 2););
|
||||
}
|
||||
if (his_state_is_will(TELOPT_TSPEED)) {
|
||||
while (sequenceIs(tspeedsubopt, baseline))
|
||||
|
@ -706,8 +715,10 @@ _gettermname()
|
|||
if (his_state_is_wont(TELOPT_TTYPE))
|
||||
return;
|
||||
settimer(baseline);
|
||||
bcopy(ttytype_sbbuf, nfrontp, sizeof ttytype_sbbuf);
|
||||
memmove(nfrontp, ttytype_sbbuf, sizeof ttytype_sbbuf);
|
||||
nfrontp += sizeof ttytype_sbbuf;
|
||||
DIAG(TD_OPTIONS, printsub('>', ttytype_sbbuf + 2,
|
||||
sizeof ttytype_sbbuf - 2););
|
||||
while (sequenceIs(ttypesubopt, baseline))
|
||||
ttloop();
|
||||
}
|
||||
|
@ -805,9 +816,10 @@ doit(who)
|
|||
|
||||
if (hp == NULL && registerd_host_only) {
|
||||
fatal(net, "Couldn't resolve your address into a host name.\r\n\
|
||||
Please contact your net administrator");
|
||||
Please contact your net administrator");
|
||||
} else if (hp &&
|
||||
(strlen(hp->h_name) <= ((utmp_len < 0) ? -utmp_len : utmp_len))) {
|
||||
(strlen(hp->h_name) <= (unsigned int)((utmp_len < 0) ? -utmp_len
|
||||
: utmp_len))) {
|
||||
host = hp->h_name;
|
||||
} else {
|
||||
host = inet_ntoa(who->sin_addr);
|
||||
|
@ -896,6 +908,7 @@ telnet(f, p, host)
|
|||
char *HN;
|
||||
char *IM;
|
||||
void netflush();
|
||||
int nfd;
|
||||
|
||||
/*
|
||||
* Initialize the slc mapping table.
|
||||
|
@ -1125,6 +1138,7 @@ telnet(f, p, host)
|
|||
startslave(host);
|
||||
#endif
|
||||
|
||||
nfd = ((f > p) ? f : p) + 1;
|
||||
for (;;) {
|
||||
fd_set ibits, obits, xbits;
|
||||
register int c;
|
||||
|
@ -1156,7 +1170,7 @@ telnet(f, p, host)
|
|||
if (!SYNCHing) {
|
||||
FD_SET(f, &xbits);
|
||||
}
|
||||
if ((c = select(16, &ibits, &obits, &xbits,
|
||||
if ((c = select(nfd, &ibits, &obits, &xbits,
|
||||
(struct timeval *)0)) < 1) {
|
||||
if (c == -1) {
|
||||
if (errno == EINTR) {
|
||||
|
@ -1295,6 +1309,9 @@ telnet(f, p, host)
|
|||
*nfrontp++ = IAC;
|
||||
*nfrontp++ = DM;
|
||||
neturg = nfrontp-1; /* off by one XXX */
|
||||
DIAG(TD_OPTIONS,
|
||||
printoption("td: send IAC", DM));
|
||||
|
||||
#endif
|
||||
}
|
||||
if (his_state_is_will(TELOPT_LFLOW) &&
|
||||
|
@ -1311,6 +1328,9 @@ telnet(f, p, host)
|
|||
: LFLOW_OFF,
|
||||
IAC, SE);
|
||||
nfrontp += 6;
|
||||
DIAG(TD_OPTIONS, printsub('>',
|
||||
(unsigned char *)nfrontp-4,
|
||||
4););
|
||||
}
|
||||
}
|
||||
pcc--;
|
||||
|
@ -1476,6 +1496,14 @@ interrupt()
|
|||
{
|
||||
ptyflush(); /* half-hearted */
|
||||
|
||||
#if defined(STREAMSPTY) && defined(TIOCSIGNAL)
|
||||
/* Streams PTY style ioctl to post a signal */
|
||||
{
|
||||
int sig = SIGINT;
|
||||
(void) ioctl(pty, TIOCSIGNAL, &sig);
|
||||
(void) ioctl(pty, I_FLUSH, FLUSHR);
|
||||
}
|
||||
#else
|
||||
#ifdef TCSIG
|
||||
(void) ioctl(pty, TCSIG, (char *)SIGINT);
|
||||
#else /* TCSIG */
|
||||
|
@ -1483,6 +1511,7 @@ interrupt()
|
|||
*pfrontp++ = slctab[SLC_IP].sptr ?
|
||||
(unsigned char)*slctab[SLC_IP].sptr : '\177';
|
||||
#endif /* TCSIG */
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -31,12 +31,12 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)telnetd.h 8.1 (Berkeley) 6/4/93
|
||||
* $Id: telnetd.h,v 1.3 1994/02/25 03:21:00 cgd Exp $
|
||||
* $NetBSD: telnetd.h,v 1.4 1996/02/24 01:22:24 jtk Exp $
|
||||
*/
|
||||
|
||||
|
||||
#include "defs.h"
|
||||
#include "ext.h"
|
||||
#include <defs.h>
|
||||
#include <ext.h>
|
||||
|
||||
#ifdef DIAGNOSTICS
|
||||
#define DIAG(a,b) if (diagnostic & (a)) b
|
||||
|
|
|
@ -32,8 +32,8 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
/* from: static char sccsid[] = "@(#)termstat.c 8.1 (Berkeley) 6/4/93"; */
|
||||
static char *rcsid = "$Id: termstat.c,v 1.3 1994/02/25 03:21:01 cgd Exp $";
|
||||
/* from: static char sccsid[] = "@(#)termstat.c 8.2 (Berkeley) 5/30/95"; */
|
||||
static char rcsid[] = "$NetBSD: termstat.c,v 1.4 1996/02/24 01:22:27 jtk Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "telnetd.h"
|
||||
|
@ -614,7 +614,7 @@ defer_terminit()
|
|||
if (def_col || def_row) {
|
||||
struct winsize ws;
|
||||
|
||||
bzero((char *)&ws, sizeof(ws));
|
||||
memset((char *)&ws, 0, sizeof(ws));
|
||||
ws.ws_col = def_col;
|
||||
ws.ws_row = def_row;
|
||||
(void) ioctl(pty, TIOCSWINSZ, (char *)&ws);
|
||||
|
|
|
@ -32,8 +32,8 @@
|
|||
*/
|
||||
|
||||
#ifndef lint
|
||||
/* from: static char sccsid[] = "@(#)utility.c 8.2 (Berkeley) 12/15/93"; */
|
||||
static char *rcsid = "$Id: utility.c,v 1.7 1994/06/05 14:27:12 cgd Exp $";
|
||||
/* from: static char sccsid[] = "@(#)utility.c 8.4 (Berkeley) 5/30/95"; */
|
||||
static char rcsid[] = "$NetBSD: utility.c,v 1.8 1996/02/24 01:22:28 jtk Exp $";
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/utsname.h>
|
||||
|
@ -214,7 +214,7 @@ netclear()
|
|||
next = nextitem(next);
|
||||
} while (wewant(next) && (nfrontp > next));
|
||||
length = next-thisitem;
|
||||
bcopy(thisitem, good, length);
|
||||
memmove(good, thisitem, length);
|
||||
good += length;
|
||||
thisitem = next;
|
||||
} else {
|
||||
|
@ -305,7 +305,7 @@ writenet(ptr, len)
|
|||
netflush();
|
||||
}
|
||||
|
||||
bcopy(ptr, nfrontp, len);
|
||||
memmove(nfrontp, ptr, len);
|
||||
nfrontp += len;
|
||||
|
||||
} /* end of writenet */
|
||||
|
@ -336,7 +336,7 @@ fatalperror(f, msg)
|
|||
{
|
||||
char buf[BUFSIZ], *strerror();
|
||||
|
||||
(void) sprintf(buf, "%s: %s\r\n", msg, strerror(errno));
|
||||
(void) sprintf(buf, "%s: %s", msg, strerror(errno));
|
||||
fatal(f, buf);
|
||||
}
|
||||
|
||||
|
@ -406,7 +406,7 @@ putchr(cc)
|
|||
* between two % signs and expand it...
|
||||
*/
|
||||
static char fmtstr[] = { "%l:%M\
|
||||
%P on %A, %d %B %Y" };
|
||||
%p on %A, %d %B %Y" };
|
||||
|
||||
void
|
||||
putf(cp, where)
|
||||
|
@ -418,9 +418,9 @@ putf(cp, where)
|
|||
char db[100];
|
||||
struct utsname utsinfo;
|
||||
#ifdef STREAMSPTY
|
||||
extern char *index();
|
||||
extern char *strchr();
|
||||
#else
|
||||
extern char *rindex();
|
||||
extern char *strrchr();
|
||||
#endif
|
||||
|
||||
uname(&utsinfo);
|
||||
|
@ -437,9 +437,9 @@ putf(cp, where)
|
|||
case 't':
|
||||
#ifdef STREAMSPTY
|
||||
/* names are like /dev/pts/2 -- we want pts/2 */
|
||||
slash = index(line+1, '/');
|
||||
slash = strchr(line+1, '/');
|
||||
#else
|
||||
slash = rindex(line, '/');
|
||||
slash = strrchr(line, '/');
|
||||
#endif
|
||||
if (slash == (char *) 0)
|
||||
putstr(line);
|
||||
|
@ -509,7 +509,7 @@ printsub(direction, pointer, length)
|
|||
register int i;
|
||||
char buf[512];
|
||||
|
||||
if (!(diagnostic & TD_OPTIONS))
|
||||
if (!(diagnostic & TD_OPTIONS))
|
||||
return;
|
||||
|
||||
if (direction) {
|
||||
|
@ -1034,9 +1034,9 @@ printsub(direction, pointer, length)
|
|||
|
||||
default:
|
||||
if (TELOPT_OK(pointer[0]))
|
||||
sprintf(nfrontp, "%s (unknown)", TELOPT(pointer[0]));
|
||||
sprintf(nfrontp, "%s (unknown)", TELOPT(pointer[0]));
|
||||
else
|
||||
sprintf(nfrontp, "%d (unknown)", pointer[i]);
|
||||
sprintf(nfrontp, "%d (unknown)", pointer[i]);
|
||||
nfrontp += strlen(nfrontp);
|
||||
for (i = 1; i < length; i++) {
|
||||
sprintf(nfrontp, " %d", pointer[i]);
|
||||
|
|
Loading…
Reference in New Issue