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:
jtk 1996-02-24 01:22:12 +00:00
parent 583a8146a9
commit 42e1b6b73d
12 changed files with 318 additions and 135 deletions

View File

@ -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

View File

@ -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) */

View File

@ -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 $
*/
/*

View File

@ -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)),

View File

@ -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>

View File

@ -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

View File

@ -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);
@ -377,7 +377,7 @@ gotiac: switch (c) {
* All state defaults are negative, and resp defaults to 0.
*
* When initiating a request to change state to new_state:
*
*
* if ((want_resp == 0 && new_state == my_state) || want_state == new_state) {
* do nothing;
* } else {
@ -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);

View File

@ -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)
@ -1077,7 +1124,7 @@ getptyslave()
#ifdef USE_TERMIO
ttyfd = t;
#endif
if (ioctl(t, I_PUSH, "ptem") < 0)
if (ioctl(t, I_PUSH, "ptem") < 0)
fatal(net, "I_PUSH ptem");
if (ioctl(t, I_PUSH, "ldterm") < 0)
fatal(net, "I_PUSH ldterm");
@ -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
@ -1576,7 +1642,7 @@ start_login(host, autologin, name)
if (bftpd) {
argv = addarg(argv, "-e");
argv = addarg(argv, BFTPPATH);
} else
} else
#endif
#if defined (SecurID)
/*
@ -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);
}
@ -2064,7 +2236,7 @@ rmut()
if (statbf.st_size && utmp) {
nutmp = read(f, (char *)utmp, (int)statbf.st_size);
nutmp /= sizeof(struct utmp);
for (u = utmp ; u < &utmp[nutmp] ; u++) {
if (SCMPN(u->ut_line, line+5) ||
u->ut_name[0]==0)

View File

@ -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();
}
@ -785,7 +796,7 @@ doit(who)
#if defined(_SC_CRAY_SECURE_SYS)
/*
* set ttyp line security label
* set ttyp line security label
*/
if (secflag) {
char slave_dev[16];
@ -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--;
@ -1369,7 +1389,7 @@ telnet(f, p, host)
}
cleanup(0);
} /* end of telnet */
#ifndef TCSIG
# ifdef TIOCSIG
# define TCSIG TIOCSIG
@ -1445,7 +1465,7 @@ int readstream(p, ibuf, bufsize)
tp = (struct termio *) (ibuf+1 + sizeof(struct iocblk));
vstop = tp->c_cc[VSTOP];
vstart = tp->c_cc[VSTART];
ixon = tp->c_iflag & IXON;
ixon = tp->c_iflag & IXON;
break;
default:
errno = EAGAIN;
@ -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
}
/*

View File

@ -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

View File

@ -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"
@ -302,7 +302,7 @@ localstat()
nfrontp += 7;
editmode = useeditmode;
}
/*
* Check for changes to special characters in use.
@ -404,7 +404,7 @@ clientstat(code, parm1, parm2)
uselinemode = 1;
}
}
/*
* Quit now if we can't do it.
*/
@ -445,7 +445,7 @@ clientstat(code, parm1, parm2)
send_will(TELOPT_ECHO, 1);
}
break;
case LM_MODE:
{
register int ack, changed;
@ -494,7 +494,7 @@ clientstat(code, parm1, parm2)
IAC, SE);
nfrontp += 7;
}
editmode = useeditmode;
}
@ -528,9 +528,9 @@ clientstat(code, parm1, parm2)
(void) ioctl(pty, TIOCSWINSZ, (char *)&ws);
}
#endif /* TIOCSWINSZ */
break;
case TELOPT_TSPEED:
{
def_tspeed = parm1;
@ -595,7 +595,7 @@ _termstat()
*
* 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.
* 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
@ -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);

View File

@ -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) {
@ -700,7 +700,7 @@ printsub(direction, pointer, length)
break;
}
break;
case LM_SLC:
sprintf(nfrontp, "SLC");
nfrontp += strlen(nfrontp);
@ -850,7 +850,7 @@ printsub(direction, pointer, length)
nfrontp += strlen(nfrontp);
break;
default:
sprintf(nfrontp, " %d", pointer[i]);
nfrontp += strlen(nfrontp);
@ -953,7 +953,7 @@ printsub(direction, pointer, length)
case TELOPT_AUTHENTICATION:
sprintf(nfrontp, "AUTHENTICATION");
nfrontp += strlen(nfrontp);
if (length < 2) {
sprintf(nfrontp, " (empty suboption??\?)");
nfrontp += strlen(nfrontp);
@ -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]);
@ -1071,13 +1071,13 @@ printdata(tag, ptr, cnt)
nfrontp += strlen(nfrontp);
for (i = 0; i < 20 && cnt; i++) {
sprintf(nfrontp, "%02x", *ptr);
nfrontp += strlen(nfrontp);
nfrontp += strlen(nfrontp);
if (isprint(*ptr)) {
xbuf[i] = *ptr;
} else {
xbuf[i] = '.';
}
if (i % 2) {
if (i % 2) {
*nfrontp = ' ';
nfrontp++;
}
@ -1087,6 +1087,6 @@ printdata(tag, ptr, cnt)
xbuf[i] = '\0';
sprintf(nfrontp, " %s\r\n", xbuf );
nfrontp += strlen(nfrontp);
}
}
}
#endif /* DIAGNOSTICS */