From 50b14be807e1d3002246f359de83a8a18a0e6008 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sat, 24 Feb 2007 11:20:42 +0100 Subject: [PATCH] Fixed handling error status in cDvbTuner::GetFrontendStatus() --- CONTRIBUTORS | 1 + HISTORY | 4 +++- dvbdevice.c | 16 +++++++--------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index d59d7284..51970b8f 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1117,6 +1117,7 @@ Reinhard Nissl for fixing a possible crash in remux.c on 64-bit machines for making cCommand::Execute() use cPipe instead of popen() to avoid problems with open file handles when starting background commands + for fixing handling error status in cDvbTuner::GetFrontendStatus() Richard Robson for reporting freezing replay if a timer starts while in Transfer Mode from the diff --git a/HISTORY b/HISTORY index 7798eca7..84004438 100644 --- a/HISTORY +++ b/HISTORY @@ -5091,11 +5091,13 @@ Video Disk Recorder Revision History with open file handles when starting background commands (thanks to Reinhard Nissl). -2007-02-17: Version 1.4.5-2 +2007-02-24: Version 1.4.5-2 - Removed 'assert(0)' from cDvbSpuDecoder::setTime() (thanks to Marco Schlüßler). - Fixed a possible crash when loading an invalid XPM file (thanks to Martin Wache). - Updated satellite names in 'sources.conf' (thanks to Thilo Wunderlich). +- Fixed handling error status in cDvbTuner::GetFrontendStatus() (thanks to + Reinhard Nissl). 2007-02-03: Version 1.5.1 diff --git a/dvbdevice.c b/dvbdevice.c index 7271b4f0..8ea76fb5 100644 --- a/dvbdevice.c +++ b/dvbdevice.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbdevice.c 1.162 2007/01/13 11:37:00 kls Exp $ + * $Id: dvbdevice.c 1.163 2007/02/24 11:20:42 kls Exp $ */ #include "dvbdevice.h" @@ -155,15 +155,13 @@ bool cDvbTuner::GetFrontendStatus(fe_status_t &Status, int TimeoutMs) ; // just to clear the event queue - we'll read the actual status below } } - do { - int stat = ioctl(fd_frontend, FE_READ_STATUS, &Status); - if (stat == 0) - return true; - if (stat < 0) { - if (errno == EINTR) - continue; + while (1) { + int stat = ioctl(fd_frontend, FE_READ_STATUS, &Status); + if (stat == 0) + return true; + if (stat > 0 || errno != EINTR) + break; } - } while (0); return false; }