Files
QNX/lib/c/services/modem_script.c
2025-08-20 19:02:58 +08:00

104 lines
2.8 KiB
C

/*
* $QNXLicenseC:
* Copyright 2007, QNX Software Systems. All Rights Reserved.
*
* You must obtain a written license from and pay applicable license fees to QNX
* Software Systems before you may reproduce, modify or distribute this software,
* or any work that includes all or part of this software. Free development
* licenses are available for evaluation and non-commercial purposes. For more
* information visit http://licensing.qnx.com or email licensing@qnx.com.
*
* This file may contain contributions from others. Please review this entire
* file for other proprietary rights or license notices, as well as the QNX
* Development Suite License Guide at http://licensing.qnx.com/license-guide/
* for other information.
* $
*/
#include <unistd.h>
#include <stdlib.h>
#include <fnmatch.h>
#include <sys/modem.h>
//#define DEBUG
//
// Execute a script.
// The passed table is terminated by a NULL pointer to a pattern.
// Baud will be set to a number if it can be extracted. Otherwise 0.
//
int modem_script(int fd, struct modem_script *table, speed_t *baud, void (*io)(char *progress, char *in, char *out), int (*cancel)(void)) {
int quiet;
int timeout;
int state;
int flags;
char buf[200];
char *cp;
struct modem_script *csp;
csp = table;
quiet = timeout = flags = state = 0;
*baud = 0;
// On entry we always write the first response.
if(io)
(*io)(csp->progress, 0, csp->response);
(void)modem_write(fd, csp->response);
for(;;) {
// Check for a state change.
if(state != csp->newstate) {
#ifdef DEBUG
printf("goto %d\n", csp->newstate);
#endif
if(csp->newstate == 0) // Return on newstate of 0
return(csp->retvalue);
timeout = csp->newtimeout * 10; // Convert to 1/10 sec
quiet = csp->newquiet;
state = csp->newstate;
flags = csp->newflags;
}
// Collect input until a timeout or a match.
do {
// Wait for input
if(modem_read(fd, buf, sizeof(buf), quiet, timeout, flags, cancel) == -1)
return(-1); // Timeout
if(io)
(*io)(0, buf, 0);
// Try and match input
for(csp = &table[1]; csp->pattern ; ++csp) {
if((csp->curstate == state || csp->curstate == 0) && fnmatch(csp->pattern, buf, FNM_QUOTE) == 0) {
#ifdef DEBUG
printf("match \"%s\"\n", csp->pattern);
#endif
if(io) {
(*io)(csp->progress, 0, 0);
if((csp->curflags & MODEM_NOECHO) == 0)
(*io)(0, 0, csp->response);
}
(void)modem_write(fd, csp->response);
break;
}
}
} while(csp->pattern == 0);
// Found a match. Should we try and extract the baud?
if((csp->curflags & MODEM_BAUD) && baud) {
for(cp = buf; *cp && (*cp < '0' || *cp > '9') ; ++cp)
;
*baud = atoi(cp);
}
}
}
__SRCVERSION("modem_script.c $Rev: 153052 $");