From 9621bbab1023b211d1ab0ee2f1039b0462b55812 Mon Sep 17 00:00:00 2001 From: simon Date: Mon, 10 Aug 2009 20:55:19 +0000 Subject: [PATCH] Patch from Alan Clucas (somewhat polished) providing command-line options to select and configure serial port mode. git-svn-id: svn://svn.tartarus.org/sgt/putty@8617 cda61777-01e9-0310-a592-d414129be87e --- cmdline.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++- doc/index.but | 2 + doc/man-pl.but | 27 ++++++++++++++ doc/man-putt.but | 25 ++++++++++++- doc/plink.but | 4 +- doc/using.but | 38 +++++++++++++++++-- unix/uxplink.c | 2 + windows/winplink.c | 2 + 8 files changed, 198 insertions(+), 7 deletions(-) diff --git a/cmdline.c b/cmdline.c index e0d43929..aafb6900 100644 --- a/cmdline.c +++ b/cmdline.c @@ -192,6 +192,16 @@ int cmdline_process_param(char *p, char *value, int need_save, Config *cfg) SAVEABLE(0); default_protocol = cfg->protocol = PROT_RAW; } + if (!strcmp(p, "-serial")) { + RETURN(1); + /* Serial is not NONNETWORK in an odd sense of the word */ + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(0); + default_protocol = cfg->protocol = PROT_SERIAL; + /* The host parameter will already be loaded into cfg->host, so copy it across */ + strncpy(cfg->serline, cfg->host, sizeof(cfg->serline) - 1); + cfg->serline[sizeof(cfg->serline) - 1] = '\0'; + } if (!strcmp(p, "-v")) { RETURN(1); flags |= FLAG_VERBOSE; @@ -435,7 +445,100 @@ int cmdline_process_param(char *p, char *value, int need_save, Config *cfg) SAVEABLE(1); cfg->addressfamily = ADDRTYPE_IPV6; } - + if (!strcmp(p, "-sercfg")) { + char* nextitem; + RETURN(2); + UNAVAILABLE_IN(TOOLTYPE_FILETRANSFER | TOOLTYPE_NONNETWORK); + SAVEABLE(1); + if (cfg->protocol != PROT_SERIAL) + cmdline_error("the -sercfg option can only be used with the " + "serial protocol"); + /* Value[0] contains one or more , separated values, like 19200,8,n,1,X */ + nextitem = value; + while (nextitem[0] != '\0') { + int length, skip; + char *end = strchr(nextitem, ','); + if (!end) { + length = strlen(nextitem); + skip = 0; + } else { + length = end - nextitem; + nextitem[length] = '\0'; + skip = 1; + } + if (length == 1) { + switch (*nextitem) { + case '1': + cfg->serstopbits = 2; + break; + case '2': + cfg->serstopbits = 4; + break; + + case '5': + cfg->serdatabits = 5; + break; + case '6': + cfg->serdatabits = 6; + break; + case '7': + cfg->serdatabits = 7; + break; + case '8': + cfg->serdatabits = 8; + break; + case '9': + cfg->serdatabits = 9; + break; + + case 'n': + cfg->serparity = SER_PAR_NONE; + break; + case 'o': + cfg->serparity = SER_PAR_ODD; + break; + case 'e': + cfg->serparity = SER_PAR_EVEN; + break; + case 'm': + cfg->serparity = SER_PAR_MARK; + break; + case 's': + cfg->serparity = SER_PAR_SPACE; + break; + + case 'N': + cfg->serflow = SER_FLOW_NONE; + break; + case 'X': + cfg->serflow = SER_FLOW_XONXOFF; + break; + case 'R': + cfg->serflow = SER_FLOW_RTSCTS; + break; + case 'D': + cfg->serflow = SER_FLOW_DSRDTR; + break; + + default: + cmdline_error("Unrecognised suboption \"-sercfg %c\"", + *nextitem); + } + } else if (length == 3 && !strncmp(nextitem,"1.5",3)) { + /* Messy special case */ + cfg->serstopbits = 3; + } else { + int serspeed = atoi(nextitem); + if (serspeed != 0) { + cfg->serspeed = serspeed; + } else { + cmdline_error("Unrecognised suboption \"-sercfg %s\"", + nextitem); + } + } + nextitem += length + skip; + } + } return ret; /* unrecognised */ } diff --git a/doc/index.but b/doc/index.but index 2b4cef75..0b869c6a 100644 --- a/doc/index.but +++ b/doc/index.but @@ -206,6 +206,7 @@ saved sessions from \IM{-raw} \c{-raw} command-line option \IM{-rlogin} \c{-rlogin} command-line option \IM{-ssh} \c{-ssh} command-line option +\IM{-serial} \c{-serial} command-line option \IM{-cleanup} \c{-cleanup} command-line option \IM{-load} \c{-load} command-line option \IM{-v} \c{-v} command-line option @@ -228,6 +229,7 @@ saved sessions from \IM{-2} \c{-2} command-line option \IM{-i} \c{-i} command-line option \IM{-pgpfp} \c{-pgpfp} command-line option +\IM{-sercfg} \c{-sercfg} command-line option \IM{removing registry entries} removing registry entries \IM{removing registry entries} registry entries, removing diff --git a/doc/man-pl.but b/doc/man-pl.but index d70ae965..2e3013c5 100644 --- a/doc/man-pl.but +++ b/doc/man-pl.but @@ -52,6 +52,10 @@ to aid in verifying new files released by the PuTTY team. \dd Force raw mode. +\dt \cw{-serial} + +\dd Force serial mode. + \dt \cw{-P} \e{port} \dd Connect to port \e{port}. @@ -145,6 +149,29 @@ tunnel all their connections. Only works in SSH. \dd Don't start a remote command or shell at all (SSH-2 only). +\dt \cw{\-sercfg} \e{configuration-string} + +\dd Specify the configuration parameters for the serial port, in +\cw{-serial} mode. \e{configuration-string} should be a +comma-separated list of configuration parameters as follows: + +\lcont{ + +\b Any single digit from 5 to 9 sets the number of data bits. + +\b \cq{1}, \cq{1.5} or \cq{2} sets the number of stop bits. + +\b Any other numeric string is interpreted as a baud rate. + +\b A single lower-case letter specifies the parity: \cq{n} for none, +\cq{o} for odd, \cq{e} for even, \cq{m} for mark and \cq{s} for space. + +\b A single upper-case letter specifies the flow control: \cq{N} for +none, \cq{X} for XON/XOFF, \cq{R} for RTS/CTS and \cq{D} for +DSR/DTR. + +} + \S{plink-manpage-more-information} MORE INFORMATION For more information on plink, it's probably best to go and look at diff --git a/doc/man-putt.but b/doc/man-putt.but index 1dc1ab6e..74c14b59 100644 --- a/doc/man-putt.but +++ b/doc/man-putt.but @@ -160,7 +160,7 @@ in verifying new files released by the PuTTY team. straight from the command line without having to go through the configuration box first. -\dt \cw{\-ssh}, \cw{\-telnet}, \cw{\-rlogin}, \cw{\-raw} +\dt \cw{\-ssh}, \cw{\-telnet}, \cw{\-rlogin}, \cw{\-raw}, \cw{\-serial} \dd Select the protocol \cw{putty} will use to make the connection. @@ -223,6 +223,29 @@ pseudo-terminal at the server end. keys, this key file must be in PuTTY's format, not OpenSSH's or anyone else's. +\dt \cw{\-sercfg} \e{configuration-string} + +\dd Specify the configuration parameters for the serial port, in +\cw{-serial} mode. \e{configuration-string} should be a +comma-separated list of configuration parameters as follows: + +\lcont{ + +\b Any single digit from 5 to 9 sets the number of data bits. + +\b \cq{1}, \cq{1.5} or \cq{2} sets the number of stop bits. + +\b Any other numeric string is interpreted as a baud rate. + +\b A single lower-case letter specifies the parity: \cq{n} for none, +\cq{o} for odd, \cq{e} for even, \cq{m} for mark and \cq{s} for space. + +\b A single upper-case letter specifies the flow control: \cq{N} for +none, \cq{X} for XON/XOFF, \cq{R} for RTS/CTS and \cq{D} for +DSR/DTR. + +} + \S{putty-manpage-saved-sessions} SAVED SESSIONS Saved sessions are stored in a \cw{.putty/sessions} subdirectory in diff --git a/doc/plink.but b/doc/plink.but index a70f54f6..8fe92975 100644 --- a/doc/plink.but +++ b/doc/plink.but @@ -51,7 +51,7 @@ use Plink: \c -pgpfp print PGP key fingerprints and exit \c -v show verbose messages \c -load sessname Load settings from saved session -\c -ssh -telnet -rlogin -raw +\c -ssh -telnet -rlogin -raw -serial \c force use of a particular protocol \c -P port connect to specified port \c -l user connect with specified username @@ -78,6 +78,8 @@ use Plink: \c -N don't start a shell/command (SSH-2 only) \c -nc host:port \c open tunnel in place of session (SSH-2 only) +\c -sercfg configuration-string (e.g. 19200,8,n,1,X) +\c Specify the serial configuration (serial only) Once this works, you are ready to use Plink. diff --git a/doc/using.but b/doc/using.but index 228500ba..6d5d44ba 100644 --- a/doc/using.but +++ b/doc/using.but @@ -550,9 +550,9 @@ window}, or a \i{Windows shortcut}). \S{using-cmdline-session} Starting a session from the command line -\I\c{-ssh}\I\c{-telnet}\I\c{-rlogin}\I\c{-raw}These options allow -you to bypass the configuration window and launch straight into a -session. +\I\c{-ssh}\I\c{-telnet}\I\c{-rlogin}\I\c{-raw}\I\c{-serial}These +options allow you to bypass the configuration window and launch +straight into a session. To start a connection to a server called \c{host}: @@ -569,6 +569,10 @@ URLs} in web browsers): \c putty.exe telnet://host[:port]/ +To start a connection to a serial port, e.g. COM1: + +\c putty.exe -serial com1 + In order to start an existing saved session called \c{sessionname}, use the \c{-load} option (described in \k{using-cmdline-load}). @@ -618,7 +622,7 @@ must be the very first thing on the command line. This form of the option is deprecated.) \S2{using-cmdline-protocol} Selecting a protocol: \c{-ssh}, -\c{-telnet}, \c{-rlogin}, \c{-raw} +\c{-telnet}, \c{-rlogin}, \c{-raw} \c{-serial} To choose which protocol you want to connect with, you can use one of these options: @@ -631,6 +635,8 @@ of these options: \b \i\c{-raw} selects the raw protocol. +\b \i\c{-serial} selects a serial connection. + These options are not available in the file transfer tools PSCP and PSFTP (which only work with the SSH protocol). @@ -915,3 +921,27 @@ on this. This option causes the PuTTY tools not to run as normal, but instead to display the fingerprints of the PuTTY PGP Master Keys, in order to aid with \i{verifying new versions}. See \k{pgpkeys} for more information. + +\S2{using-cmdline-sercfg} \i\c{-sercfg}: specify serial port +\i{configuration} + +This option specifies the configuration parameters for the serial +port (baud rate, stop bits etc). Its argument is interpreted as a +comma-separated list of configuration options, which can be as +follows: + +\b Any single digit from 5 to 9 sets the number of data bits. + +\b \cq{1}, \cq{1.5} or \cq{2} sets the number of stop bits. + +\b Any other numeric string is interpreted as a baud rate. + +\b A single lower-case letter specifies the parity: \cq{n} for none, +\cq{o} for odd, \cq{e} for even, \cq{m} for mark and \cq{s} for space. + +\b A single upper-case letter specifies the flow control: \cq{N} for +none, \cq{X} for XON/XOFF, \cq{R} for RTS/CTS and \cq{D} for +DSR/DTR. + +For example, \cq{-sercfg 19200,8,n,1,N} denotes a baud rate of +19200, 8 data bits, no parity, 1 stop bit and no flow control. diff --git a/unix/uxplink.c b/unix/uxplink.c index cbfcc713..a9661b54 100644 --- a/unix/uxplink.c +++ b/unix/uxplink.c @@ -565,6 +565,8 @@ static void usage(void) printf(" -N don't start a shell/command (SSH-2 only)\n"); printf(" -nc host:port\n"); printf(" open tunnel in place of session (SSH-2 only)\n"); + printf(" -sercfg configuration-string (e.g. 19200,8,n,1,X)\n"); + printf(" Specify the serial configuration (serial only)\n"); exit(1); } diff --git a/windows/winplink.c b/windows/winplink.c index 5f707316..49e15547 100644 --- a/windows/winplink.c +++ b/windows/winplink.c @@ -193,6 +193,8 @@ static void usage(void) printf(" -N don't start a shell/command (SSH-2 only)\n"); printf(" -nc host:port\n"); printf(" open tunnel in place of session (SSH-2 only)\n"); + printf(" -sercfg configuration-string (e.g. 19200,8,n,1,X)\n"); + printf(" Specify the serial configuration (serial only)\n"); exit(1); } -- 2.11.0