Date: Sun, 14 May 1995 08:06:23 -0400 (EDT) From: John Capo <jc@irbs.com> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/396: telnetd problems fix. Message-ID: <199505141206.IAA08763@irbs.irbs.com> In-Reply-To: <9505140223.AA04228@cs.weber.edu> from "Terry Lambert" at May 13, 95 08:23:51 pm
index | next in thread | previous in thread | raw e-mail
Terry Lambert writes:
>
> > I disagree, and we have been down this road at least 4 times in the
> > last 2 years with FreeBSD. The bug is not in the FreeBSD code, it should
> > not be bandaided to work with code that gets option negotiation wrong.
> >
> > I don't like to fix bugs in other software by making FreeBSD slower at
> > *anything*. Go get NCSA and FTP software to fix there very ancient
> > and broken code, they have had 2 years to do this, and still have not.
>
> Change the offer/accept order in BSD so it does not appear to be a 4.2
> system to this software (without impacting the actual algorithm for
> doing the negotiation) and the problem will disappear.
>
> The option ordering is commutative as far as BSD is concerned, but
> associative as far as the malfunctioning clients are concerned.
>
> It costs nothing and fixes many things to commute the BSD order to
> change the clients opinion of the association.
>
> Other than that, you're right: we've been down the road before and
> it doesn't need a big rehash. All the opinions "A is broken; fix A",
> "B is broken, fix B", and "A is broken, fix B" have been restated.
>
>
Here is my patch that fixes the missing prompt problem when your
erase character is ^H. Option negotiation is all done before
starting the slave slide of the pty. May want to give this a try.
The sys_term.c patch applies with a bit of offset. I haven't generated
a new one lately.
John Capo
*** libexec/telnetd/telnetd.c.orig Fri Aug 12 19:00:02 1994
--- libexec/telnetd/telnetd.c Wed Apr 12 11:46:21 1995
***************
*** 740,749 ****
char host_name[MAXHOSTNAMELEN];
char remote_host_name[MAXHOSTNAMELEN];
! #ifndef convex
! extern void telnet P((int, int));
! #else
extern void telnet P((int, int, char *));
#endif
/*
--- 740,749 ----
char host_name[MAXHOSTNAMELEN];
char remote_host_name[MAXHOSTNAMELEN];
! #if defined(convex) || defined(__FreeBSD__)
extern void telnet P((int, int, char *));
+ #else
+ extern void telnet P((int, int));
#endif
/*
***************
*** 837,843 ****
/*
* Start up the login process on the slave side of the terminal
*/
! #ifndef convex
startslave(host, level, user_name);
#if defined(_SC_CRAY_SECURE_SYS)
--- 837,843 ----
/*
* Start up the login process on the slave side of the terminal
*/
! #if !defined(convex) && !defined(__FreeBSD__)
startslave(host, level, user_name);
#if defined(_SC_CRAY_SECURE_SYS)
***************
*** 849,855 ****
--- 849,859 ----
}
#endif /* _SC_CRAY_SECURE_SYS */
+ #if __FreeBSD__
+ telnet(net, pty, host); /* begin server processing */
+ #else
telnet(net, pty); /* begin server processing */
+ #endif
#else
telnet(net, pty, host);
#endif
***************
*** 876,888 ****
* hand data to telnet receiver finite state machine.
*/
void
! #ifndef convex
! telnet(f, p)
! #else
telnet(f, p, host)
#endif
int f, p;
! #ifdef convex
char *host;
#endif
{
--- 880,892 ----
* hand data to telnet receiver finite state machine.
*/
void
! #if defined(convex) || defined(__FreeBSD__)
telnet(f, p, host)
+ #else
+ telnet(f, p)
#endif
int f, p;
! #if defined(convex) || defined(__FreeBSD__)
char *host;
#endif
{
***************
*** 1120,1126 ****
{sprintf(nfrontp, "td: Entering processing loop\r\n");
nfrontp += strlen(nfrontp);});
! #ifdef convex
startslave(host);
#endif
--- 1124,1130 ----
{sprintf(nfrontp, "td: Entering processing loop\r\n");
nfrontp += strlen(nfrontp);});
! #if defined(convex) || defined(__FreeBSD__)
startslave(host);
#endif
*** libexec/telnetd/sys_term.c.orig Thu Feb 9 10:17:32 1995
--- libexec/telnetd/sys_term.c Thu Apr 13 13:10:34 1995
***************
*** 1025,1030 ****
--- 1025,1031 ----
getptyslave()
{
register int t = -1;
+ char erase;
#if !defined(CRAY) || !defined(NEWINIT)
# ifdef LINEMODE
***************
*** 1046,1052 ****
# ifdef LINEMODE
waslm = tty_linemode();
# endif
!
/*
* Make sure that we don't have a controlling tty, and
--- 1047,1053 ----
# ifdef LINEMODE
waslm = tty_linemode();
# endif
! erase = termbuf.c_cc[VERASE];
/*
* Make sure that we don't have a controlling tty, and
***************
*** 1090,1095 ****
--- 1091,1097 ----
* set up the tty modes as we like them to be.
*/
init_termbuf();
+
# ifdef TIOCGWINSZ
if (def_row || def_col) {
bzero((char *)&ws, sizeof(ws));
***************
*** 1133,1138 ****
--- 1135,1143 ----
tty_rspeed((def_rspeed > 0) ? def_rspeed : 9600);
tty_tspeed((def_tspeed > 0) ? def_tspeed : 9600);
# ifdef LINEMODE
+ if (erase)
+ termbuf.c_cc[VERASE] = erase;
+
if (waslm)
tty_setlinemode(1);
# endif /* LINEMODE */
***************
*** 1400,1405 ****
--- 1405,1411 ----
utmp_sig_notify(pid);
# endif /* PARENT_DOES_UTMP */
} else {
+ usleep(125000);
getptyslave(autologin);
start_login(host, autologin, autoname);
/*NOTREACHED*/
home |
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199505141206.IAA08763>
