I will commit this in the next few days unless I hear objections.



On Mon, Mar 18, 2019 at 07:39:45AM +0000, Nicholas Marriott wrote:
> 
> 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