From owner-freebsd-bugs@FreeBSD.ORG Mon Nov 19 21:50:00 2012 Return-Path: Delivered-To: freebsd-bugs@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id C3F27281 for ; Mon, 19 Nov 2012 21:50:00 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) by mx1.freebsd.org (Postfix) with ESMTP id 95FF88FC0C for ; Mon, 19 Nov 2012 21:50:00 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id qAJLo00T048277 for ; Mon, 19 Nov 2012 21:50:00 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id qAJLo0Td048276; Mon, 19 Nov 2012 21:50:00 GMT (envelope-from gnats) Resent-Date: Mon, 19 Nov 2012 21:50:00 GMT Resent-Message-Id: <201211192150.qAJLo0Td048276@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Garrett Cooper Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 0B2AFEDC for ; Mon, 19 Nov 2012 21:43:10 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22]) by mx1.freebsd.org (Postfix) with ESMTP id DA3F58FC08 for ; Mon, 19 Nov 2012 21:43:09 +0000 (UTC) Received: from red.freebsd.org (localhost [127.0.0.1]) by red.freebsd.org (8.14.5/8.14.5) with ESMTP id qAJLh9wG002136 for ; Mon, 19 Nov 2012 21:43:09 GMT (envelope-from nobody@red.freebsd.org) Received: (from nobody@localhost) by red.freebsd.org (8.14.5/8.14.5/Submit) id qAJLh9XW002135; Mon, 19 Nov 2012 21:43:09 GMT (envelope-from nobody) Message-Id: <201211192143.qAJLh9XW002135@red.freebsd.org> Date: Mon, 19 Nov 2012 21:43:09 GMT From: Garrett Cooper To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Subject: bin/173728: [patch] add set baud rate support to telnet(1) X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 19 Nov 2012 21:50:00 -0000 >Number: 173728 >Category: bin >Synopsis: [patch] add set baud rate support to telnet(1) >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Mon Nov 19 21:50:00 UTC 2012 >Closed-Date: >Last-Modified: >Originator: Garrett Cooper >Release: 9.1-PRERELEASE >Organization: EMC Isilon >Environment: FreeBSD forza.west.isilon.com 9.1-PRERELEASE FreeBSD 9.1-PRERELEASE #0 r240770: Thu Sep 20 19:28:45 PDT 2012 gcooper@forza.west.isilon.com:/usr/obj/usr/src/sys/FORZA amd64 >Description: The attached patch adds baud rate support setting in telnet so I can login to console servers with a predefined baud rate, per RFC2217, like so: $ telnet -B 115200 CS624 8007 Trying 10.7.191.113... Connected to cs-624.west.isilon.com. Escape character is '^]'. Isilon OneFS/amd64 (dem-nodes-2) (ttyd0) login: Or like so: $ telnet telnet> set baudrate 115200 baudrate set to "115200". telnet> telnet CS624 8007 Trying 10.7.191.113... Connected to cs-624.west.isilon.com. Escape character is '^]'. Isilon OneFS/amd64 (dem-nodes-2) (ttyd0) This work is based on a local modification to telnet made by Sujal Patel at Isilon, with additional modifications made by other Isilon employees. >How-To-Repeat: >Fix: Patch attached with submission follows: Index: contrib/telnet/arpa/telnet.h =================================================================== --- contrib/telnet/arpa/telnet.h (revision 242903) +++ contrib/telnet/arpa/telnet.h (working copy) @@ -127,6 +127,7 @@ #define TELOPT_KERMIT 47 /* RFC2840 - Kermit */ #define TELOPT_EXOPL 255 /* extended-options-list */ +#define COMPORT_SET_BAUDRATE 1 /* RFC2217 - Com Port Set Baud Rate */ #define NTELOPTS (1+TELOPT_KERMIT) #ifdef TELOPTS Index: contrib/telnet/telnet/baud.h =================================================================== --- contrib/telnet/telnet/baud.h (revision 0) +++ contrib/telnet/telnet/baud.h (working copy) @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2012 EMC Corporation + * 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. + * + * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL 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. + * + * $FreeBSD$ + */ + +/* + * Try to guess whether speeds are "encoded" (4.2BSD) or just numeric (4.4BSD). + */ +#if B4800 != 4800 +#define DECODE_BAUD +#endif + +#ifdef DECODE_BAUD +#ifndef B7200 +#define B7200 B4800 +#endif + +#ifndef B14400 +#define B14400 B9600 +#endif + +#ifndef B19200 +#define B19200 B14400 +#endif + +#ifndef B28800 +#define B28800 B19200 +#endif + +#ifndef B38400 +#define B38400 B28800 +#endif + +#ifndef B57600 +#define B57600 B38400 +#endif + +#ifndef B76800 +#define B76800 B57600 +#endif + +#ifndef B115200 +#define B115200 B76800 +#endif + +#ifndef B115200 +#define B115200 B76800 +#endif +#endif + +#ifndef B230400 +#define B230400 B115200 +#endif + +/* + * A table of available terminal speeds + */ +struct termspeeds 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 }, +#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 } +}; Index: contrib/telnet/telnet/commands.c =================================================================== --- contrib/telnet/telnet/commands.c (revision 242903) +++ contrib/telnet/telnet/commands.c (working copy) @@ -896,6 +896,7 @@ { "forw1", "alternate end of line character", NULL, termForw1Charp }, { "forw2", "alternate end of line character", NULL, termForw2Charp }, { "ayt", "alternate AYT character", NULL, termAytCharp }, + { "baudrate", "set remote baud rate", DoBaudRate, ComPortBaudRate }, { NULL, NULL, NULL, NULL } }; Index: contrib/telnet/telnet/externs.h =================================================================== --- contrib/telnet/telnet/externs.h (revision 242903) +++ contrib/telnet/telnet/externs.h (working copy) @@ -231,6 +231,10 @@ NetTraceFile[]; /* Name of file where debugging output goes */ extern void SetNetTrace(char *); /* Function to change where debugging goes */ +extern unsigned char + ComPortBaudRate[]; /* Baud rate of the remote end */ +extern void + DoBaudRate(char *); /* Function to set the baud rate of the remote end */ extern jmp_buf toplevel; /* For error conditions. */ @@ -475,7 +479,17 @@ # endif #endif +typedef 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 */ + gotDM; /* when did we last see a data mark */ +} Clocks; +extern Clocks clocks; + /* Ring buffer structures which are shared */ extern Ring Index: contrib/telnet/telnet/main.c =================================================================== --- contrib/telnet/telnet/main.c (revision 242903) +++ contrib/telnet/telnet/main.c (working copy) @@ -154,7 +154,7 @@ #define IPSECOPT #endif while ((ch = getopt(argc, argv, - "468EKLNS:X:acde:fFk:l:n:rs:uxy" IPSECOPT)) != -1) + "468B:EKLNS:X:acde:fFk:l:n:rs:uxy" IPSECOPT)) != -1) #undef IPSECOPT { switch(ch) { @@ -169,6 +169,9 @@ case '8': eight = 3; /* binary output and input */ break; + case 'B': + DoBaudRate(optarg); + break; case 'E': rlogin = escape = _POSIX_VDISABLE; break; Index: contrib/telnet/telnet/sys_bsd.c =================================================================== --- contrib/telnet/telnet/sys_bsd.c (revision 242903) +++ contrib/telnet/telnet/sys_bsd.c (working copy) @@ -60,6 +60,7 @@ #include "defines.h" #include "externs.h" #include "types.h" +#include "baud.h" int tout, /* Output file descriptor */ @@ -682,71 +683,6 @@ } -/* - * Try to guess whether speeds are "encoded" (4.2BSD) or just numeric (4.4BSD). - */ -#if B4800 != 4800 -#define DECODE_BAUD -#endif - -#ifdef DECODE_BAUD -#ifndef B7200 -#define B7200 B4800 -#endif - -#ifndef B14400 -#define B14400 B9600 -#endif - -#ifndef B19200 -# define B19200 B14400 -#endif - -#ifndef B28800 -#define B28800 B19200 -#endif - -#ifndef B38400 -# define B38400 B28800 -#endif - -#ifndef B57600 -#define B57600 B38400 -#endif - -#ifndef B76800 -#define B76800 B57600 -#endif - -#ifndef B115200 -#define B115200 B76800 -#endif - -#ifndef B230400 -#define B230400 B115200 -#endif - - -/* - * This code assumes that the values B0, B50, B75... - * are in ascending order. They do not have to be - * contiguous. - */ -struct termspeeds { - long speed; - long 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 }, { 7200, B7200 }, { 9600, B9600 }, - { 14400, B14400 }, { 19200, B19200 }, { 28800, B28800 }, - { 38400, B38400 }, { 57600, B57600 }, { 115200, B115200 }, - { 230400, B230400 }, { -1, B230400 } -}; -#endif /* DECODE_BAUD */ - void TerminalSpeeds(long *ispeed, long *ospeed) { Index: contrib/telnet/telnet/telnet.1 =================================================================== --- contrib/telnet/telnet/telnet.1 (revision 242903) +++ contrib/telnet/telnet/telnet.1 (working copy) @@ -43,6 +43,7 @@ .Sh SYNOPSIS .Nm .Op Fl 468EFKLNacdfruxy +.Op Fl B Ar baudrate .Op Fl S Ar tos .Op Fl X Ar authtype .Op Fl e Ar escapechar @@ -89,6 +90,9 @@ negotiate the .Dv TELNET BINARY option on both input and output. +.It Fl B Ar baudrate +Sets the baud rate to +.Ar baudrate . .It Fl E Stops any character from being recognized as an escape character. .It Fl F Index: contrib/telnet/telnet/telnet.c =================================================================== --- contrib/telnet/telnet/telnet.c (revision 242903) +++ contrib/telnet/telnet/telnet.c (working copy) @@ -52,6 +52,7 @@ #include #include #include +#include #include #include "ring.h" @@ -206,7 +207,44 @@ * is in disagreement as to what the current state should be. */ +unsigned char ComPortBaudRate[256]; + void +DoBaudRate(char *arg) +{ + char *temp; + size_t len; + int baudrate, i; + + /* XXX: add support for 0 (baud rate retrieval) */ + baudrate = (int)strtol(arg, &temp, 10); + for (i = 1; termspeeds[i].speed != -1; i++) { + if (baudrate == termspeeds[i].speed) { + baudrate = termspeeds[i].speed; + break; + } + } + if (termspeeds[i].speed == -1) + return; + strcpy(ComPortBaudRate, arg); + + len = 10; + if (NETROOM() <= len) { + ExitString("No room in buffer for baud rate.\n", 1); + /*NOTREACHED*/ + } + if (asprintf(&temp, "%c%c%c%c....%c%c", IAC, SB, TELOPT_COMPORT, + COMPORT_SET_BAUDRATE, IAC, SE) < 0) { + ExitString("Could not allocate baud rate buffer\n", 1); + /* NOTREACHED */ + } + baudrate = htonl(baudrate); + memcpy(&temp[4], &baudrate, sizeof(baudrate)); + ring_supply_data(&netoring, temp, len); + printsub('>', &temp[2], len-2); +} + +void send_do(int c, int init) { if (init) { Index: contrib/telnet/telnet/types.h =================================================================== --- contrib/telnet/telnet/types.h (revision 242903) +++ contrib/telnet/telnet/types.h (working copy) @@ -40,13 +40,9 @@ extern Modelist modelist[]; -typedef 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 */ - gotDM; /* when did we last see a data mark */ -} Clocks; +struct termspeeds { + int speed; + int value; +}; -extern Clocks clocks; +extern struct termspeeds termspeeds[]; Index: contrib/telnet/telnetd/sys_term.c =================================================================== --- contrib/telnet/telnetd/sys_term.c (revision 242903) +++ contrib/telnet/telnetd/sys_term.c (working copy) @@ -46,6 +46,8 @@ #include "telnetd.h" #include "pathnames.h" +#include "types.h" +#include "baud.h" #ifdef AUTHENTICATION #include @@ -743,56 +745,6 @@ #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 - */ -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 }, -#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_BAUD */ - void tty_tspeed(int val) { Index: libexec/telnetd/Makefile =================================================================== --- libexec/telnetd/Makefile (revision 242903) +++ libexec/telnetd/Makefile (working copy) @@ -25,6 +25,7 @@ .endif CFLAGS+= -I${TELNETDIR} +CFLAGS+= -I${TELNETDIR}/telnet LIBTELNET= ${.OBJDIR}/../../lib/libtelnet/libtelnet.a >Release-Note: >Audit-Trail: >Unformatted: