From b1889443117c12403426ee9a781fff3f145314ca Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Wed, 26 Jun 1996 00:51:06 +0000 Subject: [PATCH] added echo patch --- chat/chat.8 | 36 +++++++++++++- chat/chat.c | 138 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 145 insertions(+), 29 deletions(-) diff --git a/chat/chat.8 b/chat/chat.8 index c227e79..c3028d4 100644 --- a/chat/chat.8 +++ b/chat/chat.8 @@ -1,6 +1,6 @@ .\" -*- nroff -*- .\" manual page [] for chat 1.8 -.\" $Id: chat.8,v 1.3 1995/12/18 03:32:45 paulus Exp $ +.\" $Id: chat.8,v 1.4 1996/06/26 00:51:05 paulus Exp $ .\" SH section heading .\" SS subsection heading .\" LP paragraph @@ -43,6 +43,12 @@ Set the file for output of the report strings. If you use the keyword option is not used and you still use \fIREPORT\fR keywords, the \fIstderr\fR file is used for the report strings. .TP +.B -e +Start with the echo option turned on. Echoing may also be turned on +or off at specific points in the chat script by using the \fIECHO\fR +keyword. When echoing is enabled, all output from the modem is echoed +to \fIstderr\fR. +.TP .B -v Request that the \fIchat\fR script be executed in a verbose mode. The \fIchat\fR program will then log all text received from the modem and @@ -164,6 +170,34 @@ ATDT5551212 to dial the telephone. The expected string is of the script is executed. In addition the program will write to the expect-file the string "CONNECT" plus any characters which follow it such as the connection rate. +.SH ECHO +The echo options controls whether the output from the modem is echoed +to \fIstderr\fR. This option may be set with the \fI-e\fR option, but +it can also be controlled by the \fIECHO\fR keyword. The "expect-send" +pair \fIECHO\fR \fION\fR enables echoing, and \fIECHO\fR \fIOFF\fR +disables it. With this keyword you can select which parts of the +conversation should be visible. For instance, with the following +script: +.IP +ABORT 'BUSY' +.br +ABORT 'NO CARIER' +.br +'' ATZ +.br +OK\\r\\n ATD1234567 +.br +\\r\\n \\c +.br +ECHO ON +.br +CONNECT \\c +.br +ogin: account +.LP +all output resulting from modem configuration and dialing is not visible, +but starting with the \fICONNECT\fR (or \fIBUSY\fR) message, everything +will be echoed. .SH TIMEOUT The initial timeout value is 45 seconds. This may be changed using the \fB-t\fR parameter. diff --git a/chat/chat.c b/chat/chat.c index e74fdfa..115ab2d 100644 --- a/chat/chat.c +++ b/chat/chat.c @@ -21,6 +21,9 @@ * Added -r "report file" switch & REPORT keyword. * Robert Geer * + * Added -e "echo" switch & ECHO keyword + * Dick Streefland + * * The original author is: * * Karl Fox @@ -31,7 +34,7 @@ * */ -static char rcsid[] = "$Id: chat.c,v 1.11 1996/05/28 00:57:08 paulus Exp $"; +static char rcsid[] = "$Id: chat.c,v 1.12 1996/06/26 00:51:06 paulus Exp $"; #include #include @@ -92,6 +95,7 @@ char *program_name; #define MAX_REPORTS 50 #define DEFAULT_CHAT_TIMEOUT 45 +int echo = 0; int verbose = 0; int Verbose = 0; int quiet = 0; @@ -120,7 +124,7 @@ struct termios saved_tty_parameters; char *abort_string[MAX_ABORTS], *fail_reason = (char *)0, fail_buffer[50]; -int n_aborts = 0, abort_next = 0, timeout_next = 0; +int n_aborts = 0, abort_next = 0, timeout_next = 0, echo_next = 0; char *report_string[MAX_REPORTS] ; char report_buffer[50] ; @@ -140,6 +144,7 @@ SIGTYPE sighup __P((int signo)); void unalarm __P((void)); void init __P((void)); void set_tty_parameters __P((void)); +void echo_stderr __P((int)); void break_sequence __P((void)); void terminate __P((int status)); void do_file __P((char *chat_file)); @@ -196,6 +201,10 @@ char **argv; { switch (option) { + case 'e': + ++echo; + break; + case 'v': ++verbose; break; @@ -302,6 +311,25 @@ char **argv; } } } +/* + * Allow the last of the report string to be gathered before we terminate. + */ + while (report_gathering) + { + int c; + c = get_char(); + if (!iscntrl (c)) + { + int rep_len = strlen (report_buffer); + report_buffer[rep_len] = c; + report_buffer[rep_len + 1] = '\0'; + } + else + { + report_gathering = 0; + fprintf (report_fp, "chat: %s\n", report_buffer); + } + } terminate(0); } @@ -402,7 +430,7 @@ char *chat_file; void usage() { fprintf(stderr, "\ -Usage: %s [-v] [-t timeout] [-r report-file] {-f chat-file | chat-script}\n", +Usage: %s [-e] [-v] [-t timeout] [-r report-file] {-f chat-file | chat-script}\n", program_name); exit(1); } @@ -578,6 +606,7 @@ void break_sequence() void terminate(status) int status; { + echo_stderr(-1); if (report_file != (char *) 0 && report_fp != (FILE *) NULL) { if (verbose) @@ -764,50 +793,56 @@ int sending; char *expect_strtok (s, term) char *s, *term; { - static char *str = ""; - static int escape_flag = 0; + static char *str = ""; + int escape_flag = 0; char *result; /* * If a string was specified then do initial processing. */ if (s) { - str = s; - escape_flag = 0; + str = s; } +/* + * If this is the escape flag then reset it and ignore the character. + */ + if (*str) + { + result = str; + } + else + { + result = (char *) 0; + } - result = (char *) 0; while (*str) { -/* - * Look for the terminator sequence. - * If the escape flag is set then this character is not the terminator. - * We assume that term does not contain the backslash character. - */ - if (escape_flag || strchr (term, *str) == (char *) 0) + if (escape_flag) { - if (result == (char *) 0) - { - result = str; - } - - if (escape_flag || *str == '\\') - { - escape_flag = !escape_flag; - } + escape_flag = 0; + ++str; + continue; + } + if (*str == '\\') + { ++str; + escape_flag = 1; continue; } /* - * This is the terminator. If we have a string then this is the end of the - * scan operation. + * If this is not in the termination string, continue. */ - *str++ = '\0'; - if (result) + if (strchr (term, *str) == (char *) 0) { - break; + ++str; + continue; } +/* + * This is the terminator. Mark the end of the string and stop. + */ + *str++ = '\0'; + break; } return (result); } @@ -839,6 +874,12 @@ char *s; ++timeout_next; return; } + + if (strcmp(s, "ECHO") == 0) + { + ++echo_next; + return; + } /* * Fetch the expect and reply string. */ @@ -924,6 +965,12 @@ int c; void chat_send (s) register char *s; { + if (echo_next) + { + echo_next = 0; + echo = (strcmp(s, "ON") == 0); + return; + } if (abort_next) { char *s1; @@ -1193,6 +1240,37 @@ register char *s; return (1); } +/* + * Echo a character to stderr. + * When called with -1, a '\n' character is generated when + * the cursor is not at the beginning of a line. + */ +void echo_stderr(n) +int n; + { + static int need_lf; + char *s; + + switch (n) + { + case '\r': /* ignore '\r' */ + break; + case -1: + if (need_lf == 0) + break; + /* fall through */ + case '\n': + write(2, "\n", 1); + need_lf = 0; + break; + default: + s = character(n); + write(2, s, strlen(s)); + need_lf = 1; + break; + } + } + /* * 'Wait for' this string to appear on this file descriptor. */ @@ -1246,6 +1324,10 @@ register char *string; { int n, abort_len, report_len; + if (echo) + { + echo_stderr(c); + } if (verbose) { if (c == '\n') -- 2.39.2