Hi, Whenever I use cu(1) I miss the possibility to configure the escape character. Both ssh(1) and telnet(1) provide the option -e to change the escape character.
So I created the diffs below to implement it. I think it's time to share it with you and ask for your feedback. Cheers, Bruno Index: usr.bin/cu/command.c =================================================================== RCS file: /cvs/src/usr.bin/cu/command.c,v retrieving revision 1.15 diff -u -p -r1.15 command.c --- usr.bin/cu/command.c 5 Oct 2015 23:15:31 -0000 1.15 +++ usr.bin/cu/command.c 3 Aug 2017 08:54:38 -0000 @@ -219,9 +219,29 @@ start_record(void) cu_warnx("%s", file); } +struct escape_help_text { + const char *cmd; + const char *text; +}; + +static struct escape_help_text esc_txt[] = { + {".", "drop connection and exit"}, + {"#", "send break"}, + {"$", "pipe local command to remote host"}, + {">", "send file to remote host"}, + {"C", "connect program to remote host"}, + {"D", "de-assert DTR line briefly"}, + {"R", "start recording to file"}, + {"S", "set speed"}, + {"X", "send file with XMODEM"}, + {"?", "get this summary"}, +}; + void do_command(char c) { + int i; + switch (c) { case '.': case '\004': /* ^D */ @@ -260,21 +280,15 @@ do_command(char c) sleep(1); ioctl(line_fd, TIOCCBRK, NULL); break; - case '~': - bufferevent_write(line_ev, "~", 1); - 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" - ); + for (i = 0; i < sizeof(esc_txt) / sizeof(esc_txt[0]); i++) { + if (escape < 32) + printf("\r\n^%c", escape + 64); + else + printf("\r\n%c", escape); + printf("%s\t%s", esc_txt[i].cmd, esc_txt[i].text); + } + printf("\r\n"); break; } } Index: usr.bin/cu/cu.1 =================================================================== RCS file: /cvs/src/usr.bin/cu/cu.1,v retrieving revision 1.15 diff -u -p -r1.15 cu.1 --- usr.bin/cu/cu.1 18 May 2015 09:35:05 -0000 1.15 +++ usr.bin/cu/cu.1 11 May 2017 11:56:15 -0000 @@ -36,6 +36,7 @@ .Sh SYNOPSIS .Nm .Op Fl d +.Op Fl e Ar char .Op Fl l Ar line .Op Fl s Ar speed | Fl Ar speed .Nm @@ -55,6 +56,13 @@ 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 char +Sets the +.Nm +escape character to +.Pa char . +If not specified the escape character is the tilde +.Pq Ql ~ . .It Fl l Ar line Specify the line to use. Either of the forms like @@ -95,8 +103,8 @@ utility ignores other capabilities found .Pp Typed characters are normally transmitted directly to the remote machine (which does the echoing as well). -A tilde -.Pq Ql ~ +The escape character (by default: +.Ql ~ ) appearing as the first character of a line is an escape signal; the following are recognized: .Bl -tag -offset indent -width Fl Index: usr.bin/cu/cu.c =================================================================== RCS file: /cvs/src/usr.bin/cu/cu.c,v retrieving revision 1.24 diff -u -p -r1.24 cu.c --- usr.bin/cu/cu.c 16 Oct 2015 07:01:53 -0000 1.24 +++ usr.bin/cu/cu.c 3 Aug 2017 08:54:54 -0000 @@ -41,6 +41,7 @@ FILE *record_file; struct termios saved_tio; struct bufferevent *input_ev; struct bufferevent *output_ev; +u_char escape = '~'; int is_direct = -1; const char *line_path = NULL; int line_speed = -1; @@ -52,7 +53,7 @@ struct event sighup_ev; enum { STATE_NONE, STATE_NEWLINE, - STATE_TILDE + STATE_ESCAPE } last_state = STATE_NEWLINE; __dead void usage(void); @@ -66,7 +67,7 @@ void try_remote(const char *, const cha __dead void usage(void) { - fprintf(stderr, "usage: %s [-d] [-l line] [-s speed | -speed]\n", + fprintf(stderr, "usage: %s [-d] [-e char] [-l line] [-s speed | -speed]\n", __progname); fprintf(stderr, " %s [host]\n", __progname); exit(1); @@ -100,11 +101,21 @@ main(int argc, char **argv) errx(1, "speed asprintf"); } - while ((opt = getopt(argc, argv, "dl:s:")) != -1) { + while ((opt = getopt(argc, argv, "de:l:s:")) != -1) { switch (opt) { case 'd': is_direct = 1; break; + case 'e': + if (optarg[0] == '^' && optarg[2] == 0 && + (u_char) optarg[1] >= 64 && + (u_char) optarg[1] < 128) + escape = (u_char) optarg[1] & 31; + else if (strlen(optarg) == 1) + escape = (u_char) optarg[0]; + else + errx(1, "bad escape character '%s'", optarg); + break; case 'l': line_path = optarg; break; @@ -298,15 +309,18 @@ stream_read(struct bufferevent *bufev, v last_state = STATE_NEWLINE; break; case STATE_NEWLINE: - if (state_change && *ptr == '~') { - last_state = STATE_TILDE; + if (state_change && *ptr == escape) { + last_state = STATE_ESCAPE; continue; } if (*ptr != '\r') last_state = STATE_NONE; break; - case STATE_TILDE: - do_command(*ptr); + case STATE_ESCAPE: + if (*ptr == escape) + bufferevent_write(line_ev, ptr, 1); + else + do_command(*ptr); last_state = STATE_NEWLINE; continue; } Index: usr.bin/cu/cu.h =================================================================== RCS file: /cvs/src/usr.bin/cu/cu.h,v retrieving revision 1.7 diff -u -p -r1.7 cu.h --- usr.bin/cu/cu.h 5 Oct 2015 23:15:31 -0000 1.7 +++ usr.bin/cu/cu.h 11 May 2017 11:18:45 -0000 @@ -25,6 +25,7 @@ void do_command(char); /* cu.c */ extern FILE *record_file; extern struct termios saved_tio; +extern char escape; extern int line_fd; extern struct bufferevent *line_ev; void set_blocking(int, int);