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?
>
>
> On Fri, Mar 15, 2019 at 01:49:52PM +0200, Artturi Alm wrote:
> > On Thu, Mar 14, 2019 at 10:18:57AM +0000, Nicholas Marriott wrote:
> > > Thanks, comments inline.
> > >
> >
> > The diff looks much better to me, now with those things fixed based
> > on your feedback, thanks :]
> >
> > -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
> > );
Maybe it's nicer to use numbered arguments for this instead of repeating esc?
Like: printf("%1$s %1$s %1$s", 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..8e3ce0b0c0e 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,17 @@ 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)
>
> This line can be joined to the previous line now.
>
> > + 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);
>
> And here as well.
>
> > + break;
> > case 'l':
> > line_path = optarg;
> > break;
> > @@ -308,14 +320,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 && *ptr == escape_char) {
>
> This needs to be (u_char)*ptr.
>
> > + 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;
>
--
Kind regards,
Hiltjo