This is OK with me, anyone else?


On Fri, Mar 15, 2019 at 06:56:31PM +0200, Artturi Alm wrote:
> On Fri, Mar 15, 2019 at 02:43:04PM +0000, Nicholas Marriott wrote:
> > .
> > Another couple of minor changes below, with those it looks good to
> > me. Any OK for this?
> > 
> 
> With joined lines, the cast, and some runtime testing with ~, % and ^[.
> 
> -Artturi
> 
> diff --git a/usr.bin/cu/command.c b/usr.bin/cu/command.c
> index c07fe73aeca..27d80f16dd7 100644
> --- a/usr.bin/cu/command.c
> +++ b/usr.bin/cu/command.c
> @@ -30,6 +30,7 @@
>  #include <stdio.h>
>  #include <string.h>
>  #include <unistd.h>
> +#include <vis.h>
>  
>  #include "cu.h"
>  
> @@ -223,6 +224,8 @@ start_record(void)
>  void
>  do_command(char c)
>  {
> +     char esc[4 + 1];
> +
>       if (restricted && strchr("CRX$>", c) != NULL) {
>               cu_warnx("~%c command is not allowed in restricted mode", c);
>               return;
> @@ -266,20 +269,23 @@ do_command(char c)
>               sleep(1);
>               ioctl(line_fd, TIOCCBRK, NULL);
>               break;
> -     case '~':
> -             bufferevent_write(line_ev, "~", 1);
> +     default:
> +             if (c == escape_char)
> +                     bufferevent_write(line_ev, &c, 1);
>               break;
>       case '?':
> +             vis(esc, escape_char, VIS_WHITE | VIS_NOSLASH, 0);
>               printf("\r\n"
> -                 "~#      send break\r\n"
> -                 "~$      pipe local command to remote host\r\n"
> -                 "~>      send file to remote host\r\n"
> -                 "~C      connect program to remote host\r\n"
> -                 "~D      de-assert DTR line briefly\r\n"
> -                 "~R      start recording to file\r\n"
> -                 "~S      set speed\r\n"
> -                 "~X      send file with XMODEM\r\n"
> -                 "~?      get this summary\r\n"
> +                 "%s#      send break\r\n"
> +                 "%s$      pipe local command to remote host\r\n"
> +                 "%s>      send file to remote host\r\n"
> +                 "%sC      connect program to remote host\r\n"
> +                 "%sD      de-assert DTR line briefly\r\n"
> +                 "%sR      start recording to file\r\n"
> +                 "%sS      set speed\r\n"
> +                 "%sX      send file with XMODEM\r\n"
> +                 "%s?      get this summary\r\n",
> +                 esc, esc, esc, esc, esc, esc, esc, esc, esc
>               );
>               break;
>       }
> diff --git a/usr.bin/cu/cu.1 b/usr.bin/cu/cu.1
> index 104a6ea7893..3e85488e87c 100644
> --- a/usr.bin/cu/cu.1
> +++ b/usr.bin/cu/cu.1
> @@ -36,6 +36,7 @@
>  .Sh SYNOPSIS
>  .Nm
>  .Op Fl dr
> +.Op Fl E Ar escape_char
>  .Op Fl l Ar line
>  .Op Fl s Ar speed | Fl Ar speed
>  .Nm
> @@ -55,6 +56,8 @@ The options are as follows:
>  Specify that the line is directly connected and
>  .Nm
>  should not allow the driver to block waiting for a carrier to be detected.
> +.It Fl E Ar escape_char
> +Specify an escape character to use instead of the default tilde.
>  .It Fl l Ar line
>  Specify the line to use.
>  Either of the forms like
> diff --git a/usr.bin/cu/cu.c b/usr.bin/cu/cu.c
> index 03a2df4181f..d01c3327042 100644
> --- a/usr.bin/cu/cu.c
> +++ b/usr.bin/cu/cu.c
> @@ -41,6 +41,7 @@ FILE                        *record_file;
>  struct termios                saved_tio;
>  struct bufferevent   *input_ev;
>  struct bufferevent   *output_ev;
> +int                   escape_char = '~';
>  int                   is_direct = -1;
>  int                   restricted = 0;
>  const char           *line_path = NULL;
> @@ -53,7 +54,7 @@ struct event                 sighup_ev;
>  enum {
>       STATE_NONE,
>       STATE_NEWLINE,
> -     STATE_TILDE
> +     STATE_ESCAPE
>  } last_state = STATE_NEWLINE;
>  
>  __dead void  usage(void);
> @@ -67,8 +68,8 @@ void                try_remote(const char *, const char *, 
> const char *);
>  __dead void
>  usage(void)
>  {
> -     fprintf(stderr, "usage: %s [-dr] [-l line] [-s speed | -speed]\n",
> -         __progname);
> +     fprintf(stderr, "usage: %s [-dr] [-E escape_char] [-l line] "
> +         "[-s speed | -speed]\n", __progname);
>       fprintf(stderr, "       %s [host]\n", __progname);
>       exit(1);
>  }
> @@ -94,14 +95,14 @@ main(int argc, char **argv)
>       for (i = 1; i < argc; i++) {
>               if (strcmp("--", argv[i]) == 0)
>                       break;
> -             if (argv[i][0] != '-' || !isdigit((unsigned char)argv[i][1]))
> +             if (argv[i][0] != '-' || !isdigit((u_char)argv[i][1]))
>                       continue;
>  
>               if (asprintf(&argv[i], "-s%s", &argv[i][1]) == -1)
>                       errx(1, "speed asprintf");
>       }
>  
> -     while ((opt = getopt(argc, argv, "drl:s:")) != -1) {
> +     while ((opt = getopt(argc, argv, "drE:l:s:")) != -1) {
>               switch (opt) {
>               case 'd':
>                       is_direct = 1;
> @@ -111,6 +112,15 @@ main(int argc, char **argv)
>                               err(1, "pledge");
>                       restricted = 1;
>                       break;
> +             case 'E':
> +                     if (optarg[0] == '^' && optarg[2] == 0 &&
> +                         (u_char)optarg[1] >= 64 && (u_char)optarg[1] < 128)
> +                             escape_char = (u_char)optarg[1] & 31;
> +                     else if (strlen(optarg) == 1)
> +                             escape_char = (u_char)optarg[0];
> +                     else
> +                             errx(1, "invalid escape character: %s", optarg);
> +                     break;
>               case 'l':
>                       line_path = optarg;
>                       break;
> @@ -308,14 +318,14 @@ stream_read(struct bufferevent *bufev, void *data)
>                               last_state = STATE_NEWLINE;
>                       break;
>               case STATE_NEWLINE:
> -                     if (state_change && *ptr == '~') {
> -                             last_state = STATE_TILDE;
> +                     if (state_change && (u_char)*ptr == escape_char) {
> +                             last_state = STATE_ESCAPE;
>                               continue;
>                       }
>                       if (*ptr != '\r')
>                               last_state = STATE_NONE;
>                       break;
> -             case STATE_TILDE:
> +             case STATE_ESCAPE:
>                       do_command(*ptr);
>                       last_state = STATE_NEWLINE;
>                       continue;
> diff --git a/usr.bin/cu/cu.h b/usr.bin/cu/cu.h
> index 2a7ca45d414..abcedc6d77a 100644
> --- a/usr.bin/cu/cu.h
> +++ b/usr.bin/cu/cu.h
> @@ -23,6 +23,7 @@
>  void                          do_command(char);
>  
>  /* cu.c */
> +extern int                    escape_char;
>  extern int                    restricted;
>  extern FILE                  *record_file;
>  extern struct termios                 saved_tio;

Reply via email to