[BACK]Return to README CVS log [TXT][DIR] Up to [local] / src / usr.bin / telnet

Annotation of src/usr.bin/telnet/README, Revision 1.1.1.1

1.1       deraadt     1:
                      2:
                      3: This is a distribution of both client and server telnet.  These programs
                      4: have been compiled on:
                      5:                        telnet  telnetd
                      6:        BSD 4.3 Reno      X       X
                      7:        UNICOS 5.1        X       X
                      8:        UNICOS 6.0        X       X
                      9:        UNICOS 6.1        X       X
                     10:        UNICOS 7.0        X       X
                     11:        SunOs 3.5         X       X (no linemode in server)
                     12:        SunOs 4.1         X       X (no linemode in server)
                     13:        DYNIX V3.0.17.9   X       X (no linemode in server)
                     14:        Ultrix 3.1        X       X (no linemode in server)
                     15:        Ultrix 4.0        X       X (no linemode in server)
                     16:
                     17: In addition, previous versions have been compiled on the following
                     18: machines, but were not available for testing this version.
                     19:                        telnet  telnetd
                     20:        SunOs 4.0.3c      X       X (no linemode in server)
                     21:        BSD 4.3           X       X (no linemode in server)
                     22:        DYNIX V3.0.12     X       X (no linemode in server)
                     23:
                     24: Februrary 22, 1991:
                     25:
                     26:     Features:
                     27:
                     28:        This version of telnet/telnetd has support for both
                     29:        the AUTHENTICATION and ENCRYPTION options.  The
                     30:        AUTHENTICATION option is fairly well defined, and
                     31:        an option number has been assigned to it.  The
                     32:        ENCRYPTION option is still in a state of flux; an
                     33:        option number has NOT been assigned to it yet.
                     34:        The code is provided in this release for experimental
                     35:        and testing purposes.
                     36:
                     37:        The telnet "send" command can now be used to send
                     38:        do/dont/will/wont commands, with any telnet option
                     39:        name.  The rules for when do/dont/will/wont are sent
                     40:        are still followed, so just because the user requests
                     41:        that one of these be sent doesn't mean that it will
                     42:        be sent...
                     43:
                     44:        The telnet "getstatus" command no longer requires
                     45:        that option printing be enabled to see the response
                     46:        to the "DO STATUS" command.
                     47:
                     48:        A -n flag has been added to telnetd to disable
                     49:        keepalives.
                     50:
                     51:        A new telnet command, "auth" has been added (if
                     52:        AUTHENTICATE is defined).  It has four sub-commands,
                     53:        "status", "debug", "disable", "enable" and "help".
                     54:
                     55:        A new telnet command, "encrypt" has been added (if
                     56:        ENCRYPT is defined).  It has many sub-commands:
                     57:        "enable", "type", "start", "stop", "input",
                     58:        "-input", "output", "-output", "status", "auto",
                     59:        "verbose", "debug", and "help".
                     60:
                     61:        An "rlogin" interface has been added.  If the program
                     62:        is named "rlogin", or the "-r" flag is given, then
                     63:        an rlogin type of interface will be used.
                     64:                ~.      Terminates the session
                     65:                ~<susp> Suspend the session
                     66:                ~^]     Escape to telnet command mode
                     67:                ~~      Pass through the ~.
                     68:            BUG: If you type the rlogin escape character
                     69:                 in the middle of a line while in rlogin
                     70:                 mode, you cannot erase it or any characters
                     71:                 before it.  Hopefully this can be fixed
                     72:                 in a future release...
                     73:
                     74:     General changes:
                     75:
                     76:        A "libtelnet.a" has now been created.  This libraray
                     77:        contains code that is common to both telnet and
                     78:        telnetd.  This is also where library routines that
                     79:        are needed, but are not in the standard C library,
                     80:        are placed.
                     81:
                     82:        The makefiles have been re-done.  All of the site
                     83:        specific configuration information has now been put
                     84:        into a single "Config.generic" file, in the top level
                     85:        directory.  Changing this one file will take care of
                     86:        all three subdirectories.  Also, to add a new/local
                     87:        definition, a "Config.local" file may be created
                     88:        at the top level; if that file exists, the subdirectories
                     89:        will use that file instead of "Config.generic".
                     90:
                     91:        Many 1-2 line functions in commands.c have been
                     92:        removed, and just inserted in-line, or replaced
                     93:        with a macro.
                     94:
                     95:     Bug Fixes:
                     96:
                     97:        The non-termio code in both telnet and telnetd was
                     98:        setting/clearing CTLECH in the sg_flags word.  This
                     99:        was incorrect, and has been changed to set/clear the
                    100:        LCTLECH bit in the local mode word.
                    101:
                    102:        The SRCRT #define has been removed.  If IP_OPTIONS
                    103:        and IPPROTO_IP are defined on the system, then the
                    104:        source route code is automatically enabled.
                    105:
                    106:        The NO_GETTYTAB #define has been removed; there
                    107:        is a compatability routine that can be built into
                    108:        libtelnet to achive the same results.
                    109:
                    110:        The server, telnetd, has been switched to use getopt()
                    111:        for parsing the argument list.
                    112:
                    113:        The code for getting the input/output speeds via
                    114:        cfgetispeed()/cfgetospeed() was still not quite
                    115:        right in telnet.  Posix says if the ispeed is 0,
                    116:        then it is really equal to the ospeed.
                    117:
                    118:        The suboption processing code in telnet now has
                    119:        explicit checks to make sure that we received
                    120:        the entire suboption (telnetd was already doing this).
                    121:
                    122:        The telnet code for processing the terminal type
                    123:        could cause a core dump if an existing connection
                    124:        was closed, and a new connection opened without
                    125:        exiting telnet.
                    126:
                    127:        Telnetd was doing a TCSADRAIN when setting the new
                    128:        terminal settings;  This is not good, because it means
                    129:        that the tcsetattr() will hang waiting for output to
                    130:        drain, and telnetd is the only one that will drain
                    131:        the output...  The fix is to use TCSANOW which does
                    132:        not wait.
                    133:
                    134:        Telnetd was improperly setting/clearing the ISTRIP
                    135:        flag in the c_lflag field, it should be using the
                    136:        c_iflag field.
                    137:
                    138:        When the child process of telnetd was opening the
                    139:        slave side of the pty, it was re-setting the EXTPROC
                    140:        bit too early, and some of the other initialization
                    141:        code was wiping it out.  This would cause telnetd
                    142:        to go out of linemode and into single character mode.
                    143:
                    144:        One instance of leaving linemode in telnetd forgot
                    145:        to send a WILL ECHO to the client, the net result
                    146:        would be that the user would see double character
                    147:        echo.
                    148:
                    149:        If the MODE was being changed several times very
                    150:        quickly, telnetd could get out of sync with the
                    151:        state changes and the returning acks; and wind up
                    152:        being left in the wrong state.
                    153:
                    154: September 14, 1990:
                    155:
                    156:        Switch the client to use getopt() for parsing the
                    157:        argument list.  The 4.3Reno getopt.c is included for
                    158:        systems that don't have getopt().
                    159:
                    160:        Use the posix _POSIX_VDISABLE value for what value
                    161:        to use when disabling special characters.  If this
                    162:        is undefined, it defaults to 0x3ff.
                    163:
                    164:        For non-termio systems, TIOCSETP was being used to
                    165:        change the state of the terminal.  This causes the
                    166:        input queue to be flushed, which we don't want.  This
                    167:        is now changed to TIOCSETN.
                    168:
                    169:        Take out the "#ifdef notdef" around the code in the
                    170:        server that generates a "sync" when the pty oputput
                    171:        is flushed.  The potential problem is that some older
                    172:        telnet clients may go into an infinate loop when they
                    173:        receive a "sync", if so, the server can be compiled
                    174:        with "NO_URGENT" defined.
                    175:
                    176:        Fix the client where it was setting/clearing the OPOST
                    177:        bit in the c_lflag field, not the c_oflag field.
                    178:
                    179:        Fix the client where it was setting/clearing the ISTRIP
                    180:        bit in the c_lflag field, not the c_iflag field.  (On
                    181:        4.3Reno, this is the ECHOPRT bit in the c_lflag field.)
                    182:        The client also had its interpretation of WILL BINARY
                    183:        and DO BINARY reversed.
                    184:
                    185:        Fix a bug in client that would cause a core dump when
                    186:        attempting to remove the last environment variable.
                    187:
                    188:        In the client, there were a few places were switch()
                    189:        was being passed a character, and if it was a negative
                    190:        value, it could get sign extended, and not match
                    191:        the 8 bit case statements.  The fix is to and the
                    192:        switch value with 0xff.
                    193:
                    194:        Add a couple more printoption() calls in the client, I
                    195:        don't think there are any more places were a telnet
                    196:        command can be received and not printed out when
                    197:        "options" is on.
                    198:
                    199:        A new flag has been added to the client, "-a".  Currently,
                    200:        this just causes the USER name to be sent across, in
                    201:        the future this may be used to signify that automatic
                    202:        authentication is requested.
                    203:
                    204:        The USER variable is now only sent by the client if
                    205:        the "-a" or "-l user" options are explicity used, or
                    206:        if the user explicitly asks for the "USER" environment
                    207:        variable to be exported.  In the server, if it receives
                    208:        the "USER" environment variable, it won't print out the
                    209:        banner message, so that only "Password:" will be printed.
                    210:        This makes the symantics more like rlogin, and should be
                    211:        more familiar to the user.  (People are not used to
                    212:        getting a banner message, and then getting just a
                    213:        "Password:" prompt.)
                    214:
                    215:        Re-vamp the code for starting up the child login
                    216:        process.  The code was getting ugly, and it was
                    217:        hard to tell what was really going on.  What we
                    218:        do now is after the fork(), in the child:
                    219:                1) make sure we have no controlling tty
                    220:                2) open and initialize the tty
                    221:                3) do a setsid()/setpgrp()
                    222:                4) makes the tty our controlling tty.
                    223:        On some systems, #2 makes the tty our controlling
                    224:        tty, and #4 is a no-op.  The parent process does
                    225:        a gets rid of any controlling tty after the child
                    226:        is fork()ed.
                    227:
                    228:        Use the strdup() library routine in telnet, instead
                    229:        of the local savestr() routine.  If you don't have
                    230:        strdup(), you need to define NO_STRDUP.
                    231:
                    232:        Add support for ^T (SIGINFO/VSTATUS), found in the
                    233:        4.3Reno distribution.  This maps to the AYT character.
                    234:        You need a 4-line bugfix in the kernel to get this
                    235:        to work properly:
                    236:
                    237:        > *** tty_pty.c.ORG     Tue Sep 11 09:41:53 1990
                    238:        > --- tty_pty.c Tue Sep 11 17:48:03 1990
                    239:        > ***************
                    240:        > *** 609,613 ****
                    241:        >                       if ((tp->t_lflag&NOFLSH) == 0)
                    242:        >                               ttyflush(tp, FREAD|FWRITE);
                    243:        > !                     pgsignal(tp->t_pgrp, *(unsigned int *)data);
                    244:        >                       return(0);
                    245:        >               }
                    246:        > --- 609,616 ----
                    247:        >                       if ((tp->t_lflag&NOFLSH) == 0)
                    248:        >                               ttyflush(tp, FREAD|FWRITE);
                    249:        > !                     pgsignal(tp->t_pgrp, *(unsigned int *)data, 1);
                    250:        > !                     if ((*(unsigned int *)data == SIGINFO) &&
                    251:        > !                         ((tp->t_lflag&NOKERNINFO) == 0))
                    252:        > !                             ttyinfo(tp);
                    253:        >                       return(0);
                    254:        >               }
                    255:
                    256:        The client is now smarter when setting the telnet escape
                    257:        character; it only sets it to one of VEOL and VEOL2 if
                    258:        one of them is undefined, and the other one is not already
                    259:        defined to the telnet escape character.
                    260:
                    261:        Handle TERMIOS systems that have seperate input and output
                    262:        line speed settings imbedded in the flags.
                    263:
                    264:        Many other minor bug fixes.
                    265:
                    266: June 20, 1990:
                    267:        Re-organize makefiles and source tree.  The telnet/Source
                    268:        directory is now gone, and all the source that was in
                    269:        telnet/Source is now just in the telnet directory.
                    270:
                    271:        Seperate makefile for each system are now gone.  There
                    272:        are two makefiles, Makefile and Makefile.generic.
                    273:        The "Makefile" has the definitions for the various
                    274:        system, and "Makefile.generic" does all the work.
                    275:        There is a variable called "WHAT" that is used to
                    276:        specify what to make.  For example, in the telnet
                    277:        directory, you might say:
                    278:                make 4.4bsd WHAT=clean
                    279:        to clean out the directory.
                    280:
                    281:        Add support for the ENVIRON and XDISPLOC options.
                    282:        In order for the server to work, login has to have
                    283:        the "-p" option to preserve environment variables.
                    284:
                    285:        Add the SOFT_TAB and LIT_ECHO modes in the LINEMODE support.
                    286:
                    287:        Add the "-l user" option to command line and open command
                    288:        (This is passed through the ENVIRON option).
                    289:
                    290:        Add the "-e" command line option, for setting the escape
                    291:        character.
                    292:
                    293:        Add the "-D", diagnostic, option to the server.  This allows
                    294:        the server to print out debug information, which is very
                    295:        useful when trying to debug a telnet that doesn't have any
                    296:        debugging ability.
                    297:
                    298:        Turn off the literal next character when not in LINEMODE.
                    299:
                    300:        Don't recognize ^Y locally, just pass it through.
                    301:
                    302:        Make minor modifications for Sun4.0 and Sun4.1
                    303:
                    304:        Add support for both FORW1 and FORW2 characters.  The
                    305:        telnet escpape character is set to whichever of the
                    306:        two is not being used.  If both are in use, the escape
                    307:        character is not set, so when in linemode the user will
                    308:        have to follow the escape character with a <CR> or <EOF)
                    309:        to get it passed through.
                    310:
                    311:        Commands can now be put in single and double quotes, and
                    312:        a backslash is now an escape character.  This is needed
                    313:        for allowing arbitrary strings to be assigned to environment
                    314:        variables.
                    315:
                    316:        Switch telnetd to use macros like telnet for keeping
                    317:        track of the state of all the options.
                    318:
                    319:        Fix telnetd's processing of options so that we always do
                    320:        the right processing of the LINEMODE option, regardless
                    321:        of who initiates the request to turn it on.  Also, make
                    322:        sure that if the other side went "WILL ECHO" in response
                    323:        to our "DO ECHO", that we send a "DONT ECHO" to get the
                    324:        option turned back off!
                    325:
                    326:        Fix the TERMIOS setting of the terminal speed to handle both
                    327:        BSD's seperate fields, and the SYSV method of CBAUD bits.
                    328:
                    329:        Change how we deal with the other side refusing to enable
                    330:        an option.  The sequence used to be: send DO option; receive
                    331:        WONT option; send DONT option.  Now, the sequence is: send
                    332:        DO option; receive WONT option.  Both should be valid
                    333:        according to the spec, but there has been at least one
                    334:        client implementation of telnet identified that can get
                    335:        really confused by this.  (The exact sequence, from a trace
                    336:        on the server side, is (numbers are number of responses that
                    337:        we expect to get after that line...):
                    338:
                    339:                send WILL ECHO  1 (initial request)
                    340:                send WONT ECHO  2 (server is changing state)
                    341:                recv DO ECHO    1 (first reply, ok.  expect DONT ECHO next)
                    342:                send WILL ECHO  2 (server changes state again)
                    343:                recv DONT ECHO  1 (second reply, ok.  expect DO ECHO next)
                    344:                recv DONT ECHO  0 (third reply, wrong answer. got DONT!!!)
                    345:        ***     send WONT ECHO    (send WONT to acknowledge the DONT)
                    346:                send WILL ECHO  1 (ask again to enable option)
                    347:                recv DO ECHO    0
                    348:
                    349:                recv DONT ECHO  0
                    350:                send WONT ECHO  1
                    351:                recv DONT ECHO  0
                    352:                recv DO ECHO    1
                    353:                send WILL ECHO  0
                    354:                (and the last 5 lines loop forever)
                    355:
                    356:        The line with the "***" is last of the WILL/DONT/WONT sequence.
                    357:        The change to the server to not generate that makes this same
                    358:        example become:
                    359:
                    360:                send will ECHO  1
                    361:                send wont ECHO  2
                    362:                recv do ECHO    1
                    363:                send will ECHO  2
                    364:                recv dont ECHO  1
                    365:                recv dont ECHO  0
                    366:                recv do ECHO    1
                    367:                send will ECHO  0
                    368:
                    369:        There is other option negotiation going on, and not sending
                    370:        the third part changes some of the timings, but this specific
                    371:        example no longer gets stuck in a loop.  The "telnet.state"
                    372:        file has been modified to reflect this change to the algorithm.
                    373:
                    374:        A bunch of miscellaneous bug fixes and changes to make
                    375:        lint happier.
                    376:
                    377:        This version of telnet also has some KERBEROS stuff in
                    378:        it. This has not been tested, it uses an un-authorized
                    379:        telnet option number, and uses an out-of-date version
                    380:        of the (still being defined) AUTHENTICATION option.
                    381:        There is no support for this code, do not enable it.
                    382:
                    383:
                    384: March 1, 1990:
                    385: CHANGES/BUGFIXES SINCE LAST RELEASE:
                    386:        Some support for IP TOS has been added.  Requires that the
                    387:        kernel support the IP_TOS socket option (currently this
                    388:        is only in UNICOS 6.0).
                    389:
                    390:        Both telnet and telnetd now use the cc_t typedef.  typedefs are
                    391:        included for systems that don't have it (in termios.h).
                    392:
                    393:        SLC_SUSP was not supported properly before.  It is now.
                    394:
                    395:        IAC EOF was not translated  properly in telnetd for SYSV_TERMIO
                    396:        when not in linemode.  It now saves a copy of the VEOF character,
                    397:        so that when ICANON is turned off and we can't trust it anymore
                    398:        (because it is now the VMIN character) we use the saved value.
                    399:
                    400:        There were two missing "break" commands in the linemode
                    401:        processing code in telnetd.
                    402:
                    403:        Telnetd wasn't setting the kernel window size information
                    404:        properly.  It was using the rows for both rows and columns...
                    405:
                    406: Questions/comments go to
                    407:                David Borman
                    408:                Cray Research, Inc.
                    409:                655F Lone Oak Drive
                    410:                Eagan, MN 55123
                    411:                dab@cray.com.
                    412:
                    413: README:        You are reading it.
                    414:
                    415: Config.generic:
                    416:        This file contains all the OS specific definitions.  It
                    417:        has pre-definitions for many common system types, and is
                    418:        in standard makefile fromat.  See the comments at the top
                    419:        of the file for more information.
                    420:
                    421: Config.local:
                    422:        This is not part of the distribution, but if this file exists,
                    423:        it is used instead of "Config.generic".  This allows site
                    424:        specific configuration without having to modify the distributed
                    425:        "Config.generic" file.
                    426:
                    427: kern.diff:
                    428:        This file contains the diffs for the changes needed for the
                    429:        kernel to support LINEMODE is the server.  These changes are
                    430:        for a 4.3BSD system.  You may need to make some changes for
                    431:        your particular system.
                    432:
                    433:        There is a new bit in the terminal state word, TS_EXTPROC.
                    434:        When this bit is set, several aspects of the terminal driver
                    435:        are disabled.  Input line editing, character echo, and
                    436:        mapping of signals are all disabled.  This allows the telnetd
                    437:        to turn of these functions when in linemode, but still keep
                    438:        track of what state the user wants the terminal to be in.
                    439:
                    440:        New ioctl()s:
                    441:
                    442:                TIOCEXT         Turn on/off the TS_EXTPROC bit
                    443:                TIOCGSTATE      Get t_state of tty to look at TS_EXTPROC bit
                    444:                TIOCSIG         Generate a signal to processes in the
                    445:                                current process group of the pty.
                    446:
                    447:        There is a new mode for packet driver, the TIOCPKT_IOCTL bit.
                    448:        When packet mode is turned on in the pty, and the TS_EXTPROC
                    449:        bit is set, then whenever the state of the pty is changed, the
                    450:        next read on the master side of the pty will have the TIOCPKT_IOCTL
                    451:        bit set, and the data will contain the following:
                    452:                struct xx {
                    453:                        struct sgttyb a;
                    454:                        struct tchars b;
                    455:                        struct ltchars c;
                    456:                        int t_state;
                    457:                        int t_flags;
                    458:                }
                    459:        This allows the process on the server side of the pty to know
                    460:        when the state of the terminal has changed, and what the new
                    461:        state is.
                    462:
                    463:        However, if you define USE_TERMIO or SYSV_TERMIO, the code will
                    464:        expect that the structure returned in the TIOCPKT_IOCTL is
                    465:        the termio/termios structure.
                    466:
                    467: stty.diff:
                    468:        This file contains the changes needed for the stty(1) program
                    469:        to report on the current status of the TS_EXTPROC bit.  It also
                    470:        allows the user to turn on/off the TS_EXTPROC bit.  This is useful
                    471:        because it allows the user to say "stty -extproc", and the
                    472:        LINEMODE option will be automatically disabled, and saying "stty
                    473:        extproc" will re-enable the LINEMODE option.
                    474:
                    475: telnet.state:
                    476:        Both the client and server have code in them to deal
                    477:        with option negotiation loops.  The algorithm that is
                    478:        used is described in this file.
                    479:
                    480: tmac.doc:
                    481:        Macros for use in formatting the man pages on non-4.3Reno
                    482:        systems.
                    483:
                    484: telnet:
                    485:        This directory contains the client code.  No kernel changes are
                    486:        needed to use this code.
                    487:
                    488: telnetd:
                    489:        This directory contains the server code.  If LINEMODE or KLUDGELINEMODE
                    490:        are defined, then the kernel modifications listed above are needed.
                    491:
                    492: libtelnet:
                    493:        This directory contains code that is common to both the client
                    494:        and the server.
                    495:
                    496: arpa:
                    497:        This directory has a new <arpa/telnet.h>
                    498:
                    499:
                    500: The following TELNET options are supported:
                    501:
                    502:        LINEMODE:
                    503:                The LINEMODE option is supported as per RFC1116.  The
                    504:                FORWARDMASK option is not currently supported.
                    505:
                    506:        BINARY: The client has the ability to turn on/off the BINARY
                    507:                option in each direction.  Turning on BINARY from
                    508:                server to client causes the LITOUT bit to get set in
                    509:                the terminal driver on both ends,  turning on BINARY
                    510:                from the client to the server causes the PASS8 bit
                    511:                to get set in the terminal driver on both ends.
                    512:
                    513:        TERMINAL-TYPE:
                    514:                This is supported as per RFC1091.  On the server side,
                    515:                when a terminal type is received, termcap/terminfo
                    516:                is consulted to determine if it is a known terminal
                    517:                type.  It keeps requesting terminal types until it
                    518:                gets one that it recongnizes, or hits the end of the
                    519:                list.  The server side looks up the entry in the
                    520:                termcap/terminfo data base, and generates a list of
                    521:                names which it then passes one at a time to each
                    522:                request for a terminal type, duplicating the last
                    523:                entry in the list before cycling back to the beginning.
                    524:
                    525:        NAWS:   The Negotiate about Window Size, as per RFC 1073.
                    526:
                    527:        TERMINAL-SPEED:
                    528:                Implemented as per RFC 1079
                    529:
                    530:        TOGGLE-FLOW-CONTROL:
                    531:                Implemented as per RFC 1080
                    532:
                    533:        TIMING-MARK:
                    534:                As per RFC 860
                    535:
                    536:        SGA:    As per RFC 858
                    537:
                    538:        ECHO:   As per RFC 857
                    539:
                    540:        STATUS:
                    541:                The server will send its current status upon
                    542:                request.  It does not ask for the clients status.
                    543:                The client will request the servers current status
                    544:                from the "send getstatus" command.
                    545:
                    546:        ENVIRON:
                    547:                This option is currently being defined by the IETF
                    548:                Telnet Working Group, and an RFC has not yet been
                    549:                issued, but should be in the near future...
                    550:
                    551:        X-DISPLAY-LOCATION:
                    552:                This functionality can be done through the ENVIRON
                    553:                option, it is added here for completeness.
                    554:
                    555:        AUTHENTICATION:
                    556:                This option is currently being defined by the IETF
                    557:                Telnet Working Group, and an RFC has not yet been
                    558:                issued.  The basic framework is pretty much decided,
                    559:                but the definitions for the specific authentication
                    560:                schemes is still in a state of flux.
                    561:
                    562:        ENCRYPT:
                    563:                This option is currently being defined by the IETF
                    564:                Telnet Working Group, and an RFC has not yet been
                    565:                issued.  The draft RFC is still in a state of flux,
                    566:                so this code may change in the future.