diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 97041b41..eb9b25a0 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1485,6 +1485,8 @@ Ville Skytt for adding a missing #include to thread.c for adding missing i18n entry for the "Timer" button for removing the obsolete "ca.conf" section from vdr.1 + for making the cLircRemote try to reestablish the connection to the LIRC daemon + in case it breaks Steffen Beyer for fixing setting the colored button help after deleting a recording in case the next diff --git a/HISTORY b/HISTORY index 24aeabcd..2d4e5617 100644 --- a/HISTORY +++ b/HISTORY @@ -4243,3 +4243,5 @@ Video Disk Recorder Revision History Mair). - Now checking whether the channel exists before setting the PMT filter in cPatFilter::Process() (thanks to Thomas Bergwinkl). +- Now trying to reestablish the connection to the LIRC daemon in case it breaks + (thanks to Ville Skyttä). diff --git a/lirc.c b/lirc.c index ac9de010..9bb83287 100644 --- a/lirc.c +++ b/lirc.c @@ -6,35 +6,28 @@ * * LIRC support added by Carsten Koch 2000-06-16. * - * $Id: lirc.c 1.13 2005/09/02 12:51:35 kls Exp $ + * $Id: lirc.c 1.14 2006/01/27 15:59:47 kls Exp $ */ #include "lirc.h" #include #include -#include #define REPEATLIMIT 20 // ms #define REPEATDELAY 350 // ms #define KEYPRESSDELAY 150 // ms +#define RECONNECTDELAY 3000 // ms cLircRemote::cLircRemote(const char *DeviceName) :cRemote("LIRC") ,cThread("LIRC remote control") { - struct sockaddr_un addr; addr.sun_family = AF_UNIX; strcpy(addr.sun_path, DeviceName); - if ((f = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0) { - if (connect(f, (struct sockaddr *)&addr, sizeof(addr)) >= 0) { - Start(); - return; - } - LOG_ERROR_STR(DeviceName); - close(f); + if (Connect()) { + Start(); + return; } - else - LOG_ERROR_STR(DeviceName); f = -1; } @@ -47,6 +40,20 @@ cLircRemote::~cLircRemote() close(fh); } +bool cLircRemote::Connect(void) +{ + if ((f = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0) { + if (connect(f, (struct sockaddr *)&addr, sizeof(addr)) >= 0) + return true; + LOG_ERROR_STR(addr.sun_path); + close(f); + f = -1; + } + else + LOG_ERROR_STR(addr.sun_path); + return false; +} + bool cLircRemote::Ready(void) { return f >= 0; @@ -67,10 +74,16 @@ void cLircRemote::Action(void) int ret = ready ? safe_read(f, buf, sizeof(buf)) : -1; if (ready && ret <= 0 ) { - esyslog("ERROR: lircd connection lost"); + esyslog("ERROR: lircd connection broken, trying to reconnect every %.1f seconds", float(RECONNECTDELAY) / 1000); close(f); f = -1; - break; + while (Running() && f < 0) { + cCondWait::SleepMs(RECONNECTDELAY); + if (Connect()) { + isyslog("reconnected to lircd"); + break; + } + } } if (ready && ret > 21) { diff --git a/lirc.h b/lirc.h index 25b743fe..3c4735a8 100644 --- a/lirc.h +++ b/lirc.h @@ -4,12 +4,13 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: lirc.h 1.3 2005/07/31 10:18:15 kls Exp $ + * $Id: lirc.h 1.4 2006/01/27 16:00:19 kls Exp $ */ #ifndef __LIRC_H #define __LIRC_H +#include #include "remote.h" #include "thread.h" @@ -17,7 +18,9 @@ class cLircRemote : public cRemote, private cThread { private: enum { LIRC_KEY_BUF = 30, LIRC_BUFFER_SIZE = 128 }; int f; + struct sockaddr_un addr; virtual void Action(void); + bool Connect(void); public: cLircRemote(const char *DeviceName); virtual ~cLircRemote();