Hi,

i don't have issues with tilde when using locally, but i mostly ssh to
reach cu, and too many times i've forgotten to configure ssh/use -e,
with this cu(1) becomes safer/easier to use for us with non-english
keyboard.
~tilde is certainly annoying when it's three key presses alone,
and then you mostly get only one shot at trying..

is this bloat?

-Artturi


diff --git a/usr.bin/cu/command.c b/usr.bin/cu/command.c
index c07fe73aeca..d97db3b56de 100644
--- a/usr.bin/cu/command.c
+++ b/usr.bin/cu/command.c
@@ -223,6 +223,8 @@ start_record(void)
 void
 do_command(char c)
 {
+       char esc = alt_esc ? '%' : '~';
+
        if (restricted && strchr("CRX$>", c) != NULL) {
                cu_warnx("~%c command is not allowed in restricted mode", c);
                return;
@@ -271,15 +273,16 @@ do_command(char c)
                break;
        case '?':
                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"
+                   "%c#      send break\r\n"
+                   "%c$      pipe local command to remote host\r\n"
+                   "%c>      send file to remote host\r\n"
+                   "%cC      connect program to remote host\r\n"
+                   "%cD      de-assert DTR line briefly\r\n"
+                   "%cR      start recording to file\r\n"
+                   "%cS      set speed\r\n"
+                   "%cX      send file with XMODEM\r\n"
+                   "%c?      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..1d609e14947 100644
--- a/usr.bin/cu/cu.1
+++ b/usr.bin/cu/cu.1
@@ -35,7 +35,7 @@
 .Nd serial terminal emulator
 .Sh SYNOPSIS
 .Nm
-.Op Fl dr
+.Op Fl der
 .Op Fl l Ar line
 .Op Fl s Ar speed | Fl Ar speed
 .Nm
@@ -55,6 +55,10 @@ 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
+Use a percent sign
+.Pq Ql %
+as the escape character instead of 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..b66f4698605 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                     alt_esc = 0;
 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,7 +68,7 @@ void          try_remote(const char *, const char *, const 
char *);
 __dead void
 usage(void)
 {
-       fprintf(stderr, "usage: %s [-dr] [-l line] [-s speed | -speed]\n",
+       fprintf(stderr, "usage: %s [-der] [-l line] [-s speed | -speed]\n",
            __progname);
        fprintf(stderr, "       %s [host]\n", __progname);
        exit(1);
@@ -101,11 +102,14 @@ main(int argc, char **argv)
                        errx(1, "speed asprintf");
        }
 
-       while ((opt = getopt(argc, argv, "drl:s:")) != -1) {
+       while ((opt = getopt(argc, argv, "derl:s:")) != -1) {
                switch (opt) {
                case 'd':
                        is_direct = 1;
                        break;
+               case 'e':
+                       alt_esc = 1;
+                       break;
                case 'r':
                        if (pledge("stdio rpath wpath tty", NULL) == -1)
                                err(1, "pledge");
@@ -308,14 +312,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 == "~%"[alt_esc]) {
+                               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..9d8ea3fc86a 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                      alt_esc;
 extern int                      restricted;
 extern FILE                    *record_file;
 extern struct termios           saved_tio;

Reply via email to