diff --git a/usr.sbin/pppd/chat/chat.8 b/usr.sbin/pppd/chat/chat.8 index 1d4fab513bed..db49acca4b81 100644 --- a/usr.sbin/pppd/chat/chat.8 +++ b/usr.sbin/pppd/chat/chat.8 @@ -1,7 +1,7 @@ -.\" $NetBSD: chat.8,v 1.10 1999/01/24 06:27:06 ross Exp $ +.\" $NetBSD: chat.8,v 1.11 1999/08/25 02:52:15 christos Exp $ .\" -*- nroff -*- .\" manual page [] for chat 1.8 -.\" Id: chat.8,v 1.7 1998/02/04 01:35:49 paulus Exp +.\" Id: chat.8,v 1.8 1999/05/12 06:13:22 paulus Exp .\" SH section heading .\" SS subsection heading .\" LP paragraph @@ -154,6 +154,16 @@ character, you would have to write something like this: \'# ' logout .LP +.SH SENDING DATA FROM A FILE +If the string to send starts with an at sign (@), the rest of the +string is taken to be the name of a file to read to get the string to +send. If the last character of the data read is a newline, it is +removed. The file can be a named pipe (or fifo) instead of a regular +file. This provides a way for \fBchat\fR to communicate with another +program, for example, a program to prompt the user and receive a +password typed in. +.LP + .SH ABORT STRINGS Many modems will report the status of the call as a string. These strings may be \fBCONNECTED\fR or \fBNO CARRIER\fR or \fBBUSY\fR. It diff --git a/usr.sbin/pppd/chat/chat.c b/usr.sbin/pppd/chat/chat.c index 791376808d99..65443e49598f 100644 --- a/usr.sbin/pppd/chat/chat.c +++ b/usr.sbin/pppd/chat/chat.c @@ -1,4 +1,4 @@ -/* $NetBSD: chat.c,v 1.16 1999/05/06 08:59:21 jeremy Exp $ */ +/* $NetBSD: chat.c,v 1.17 1999/08/25 02:52:15 christos Exp $ */ /* * Chat -- a program for automatic session establishment (i.e. dial @@ -16,6 +16,9 @@ * This software is in the public domain. * * ----------------- + * 12-May-99 added a feature to read data to be sent from a file, + * if the send string starts with @. Idea from gpk . + * * added -T and -U option and \T and \U substitution to pass a phone * number into chat script. Two are needed for some ISDN TA applications. * Keith Dart @@ -76,16 +79,17 @@ * Columbus, OH 43221 * (614)451-1883 * - * */ #include #ifndef lint #if 0 -static char rcsid[] = "Id: chat.c,v 1.19 1998/03/24 23:57:48 paulus Exp "; +static char rcsid[] = "Id: chat.c,v 1.24 1999/08/13 06:46:09 paulus Exp "; #else -__RCSID("$NetBSD: chat.c,v 1.16 1999/05/06 08:59:21 jeremy Exp $"); +__RCSID("$NetBSD: chat.c,v 1.17 1999/08/25 02:52:15 christos Exp $"); #endif +#ifndef __STDC__ +#define const #endif #include @@ -600,27 +604,32 @@ void break_sequence() void terminate(status) int status; { + static int terminating = 0; + + if (terminating) + exit(status); + terminating = 1; 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; + 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); + 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 (report_file != (char *) 0 && report_fp != (FILE *) NULL) { if (verbose) fprintf (report_fp, "Closing \"%s\".\n", report_file); fclose (report_fp); @@ -960,6 +969,8 @@ int c; void chat_send (s) register char *s; { + char file_data[STR_LEN]; + if (say_next) { say_next = 0; s = clean(s,0); @@ -1098,6 +1109,43 @@ register char *s; return; } + /* + * The syntax @filename means read the string to send from the + * file `filename'. + */ + if (s[0] == '@') { + /* skip the @ and any following white-space */ + char *fn = s; + while (*++fn == ' ' || *fn == '\t') + ; + + if (*fn != 0) { + FILE *f; + int n = 0; + + /* open the file and read until STR_LEN-1 bytes or end-of-file */ + f = fopen(fn, "r"); + if (f == NULL) + fatal(1, "%s -- open failed: %m", fn); + while (n < STR_LEN - 1) { + int nr = fread(&file_data[n], 1, STR_LEN - 1 - n, f); + if (nr < 0) + fatal(1, "%s -- read error", fn); + if (nr == 0) + break; + n += nr; + } + fclose(f); + + /* use the string we got as the string to send, + but trim off the final newline if any. */ + if (n > 0 && file_data[n-1] == '\n') + --n; + file_data[n] = 0; + s = file_data; + } + } + if (strcmp(s, "EOT") == 0) s = "^D\\c"; else if (strcmp(s, "BREAK") == 0)