* Added -r "report file" switch & REPORT keyword.
* Robert Geer <bgeer@xmission.com>
*
+ * Added -e "echo" switch & ECHO keyword
+ * Dick Streefland <dicks@tasking.nl>
+ *
* The original author is:
*
* Karl Fox <karl@MorningStar.Com>
*
*/
-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.13 1997/03/04 03:25:59 paulus Exp $";
#include <stdio.h>
#include <time.h>
#define MAX_REPORTS 50
#define DEFAULT_CHAT_TIMEOUT 45
+int echo = 0;
int verbose = 0;
int Verbose = 0;
int quiet = 0;
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] ;
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));
{
switch (option)
{
+ case 'e':
+ ++echo;
+ break;
+
case 'v':
++verbose;
break;
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);
}
-char line[256];
+char line[128];
char *p;
void logf (str)
const char *str;
- {
- p = line + strlen(line);
- strcat (p, str);
+{
+ int l = strlen(line);
- if (str[strlen(str)-1] == '\n')
- {
+ if (l + strlen(str) >= sizeof(line)) {
+ syslog(LOG_INFO, "%s", line);
+ l = 0;
+ }
+ strcpy(line + l, str);
+
+ if (str[strlen(str)-1] == '\n') {
syslog (LOG_INFO, "%s", line);
line[0] = 0;
- }
}
+}
void logflush()
{
void terminate(status)
int status;
{
+ echo_stderr(-1);
if (report_file != (char *) 0 && report_fp != (FILE *) NULL)
- {
+ {
+/*
+ * Allow the last of the report string to be gathered before we terminate.
+ */
+ if (report_gathering) {
+ int c, rep_len;
+
+ rep_len = strlen(report_buffer);
+ while (rep_len + 1 <= sizeof(report_buffer)) {
+ alarm(1);
+ c = get_char();
+ alarm(0);
+ if (c < 0 || iscntrl(c))
+ break;
+ report_buffer[rep_len] = c;
+ ++rep_len;
+ }
+ report_buffer[rep_len] = 0;
+ fprintf (report_fp, "chat: %s\n", report_buffer);
+ }
if (verbose)
{
fprintf (report_fp, "Closing \"%s\".\n", report_file);
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);
}
++timeout_next;
return;
}
+
+ if (strcmp(s, "ECHO") == 0)
+ {
+ ++echo_next;
+ return;
+ }
/*
* Fetch the expect and reply string.
*/
void chat_send (s)
register char *s;
{
+ if (echo_next)
+ {
+ echo_next = 0;
+ echo = (strcmp(s, "ON") == 0);
+ return;
+ }
if (abort_next)
{
char *s1;
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.
*/
{
int n, abort_len, report_len;
+ if (echo)
+ {
+ echo_stderr(c);
+ }
if (verbose)
{
if (c == '\n')