}
static char wasalarm=0;
-static void sigalarm(int signo)
+static void sigalarm(int signo);
+
+static void setalarm(void)
{
signal(SIGALRM,(RETSIGTYPE (*)(int))sigalarm);
+#ifdef HAVE_SIGINTERRUPT
+ siginterrupt(SIGALRM,1);
+#endif
+}
+
+static void sigalarm(int signo)
+{
+ setalarm();
wasalarm=1;
if (verbose>=1) error("Timed out");
}
got=read(devfd,buf+bufl,1);
}
if (got<=0) {
- if (wasalarm) error("!Maximum response timeout (%ds) exceeded",readtimen);
- error("Couldn't read device data (ret=%d): %m",got);
+ if (wasalarm) error("Maximum response timeout (%ds) exceeded",readtimen);
+ else error("Couldn't read device data (ret=%d): %m",got);
goto err;
}
s=buf+bufl;
if (tcsetattr(devfd,TCSANOW,&tios))
error("!Unable to set initial termios device settings: %m");
- signal(SIGALRM,(RETSIGTYPE (*)(int))sigalarm);
+ setalarm();
do {
devcmd("",NULL,"\r\nAT\033");
devcmd(NULL,NULL,"\r\nAT");