From 1b79faff780befa63a04be86560e7183d7a663aa Mon Sep 17 00:00:00 2001 From: "M. Liebmann" Date: Wed, 22 Feb 2017 06:21:33 +0100 Subject: [PATCH] rcinput: Add exception handling for cs hd2 - Supplement to previous commit --- src/driver/rcinput.cpp | 54 +++++++++++++++++++++++++++++++++++++++++- src/driver/rcinput.h | 6 +++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/driver/rcinput.cpp b/src/driver/rcinput.cpp index bbcfbb2b7..250b9744f 100644 --- a/src/driver/rcinput.cpp +++ b/src/driver/rcinput.cpp @@ -178,6 +178,27 @@ bool CRCInput::checkdev() bool CRCInput::checkpath(in_dev id) { for (std::vector::iterator it = indev.begin(); it != indev.end(); ++it) { +#ifdef BOXMODEL_CS_HD2 + if ((id.type == DT_LNK) || ((*it).type == DT_LNK)) { + std::string check1, check2; + if (id.type == DT_LNK) + check1 = readLink(id.path); + else + check1 = id.path; + + if ((*it).type == DT_LNK) + check2 = readLink((*it).path); + else + check2 = (*it).path; + + if ((!check1.empty()) && (!check2.empty()) && (check1 == check2)) { + printf("[rcinput:%s] skipping already opened %s => %s\n", __func__, id.path.c_str(), check1.c_str()); + return true; + } + else + return false; + } +#endif if ((*it).path == id.path) { printf("[rcinput:%s] skipping already opened %s\n", __func__, id.path.c_str()); return true; @@ -186,6 +207,25 @@ bool CRCInput::checkpath(in_dev id) return false; } +#ifdef BOXMODEL_CS_HD2 +bool CRCInput::checkLnkDev(std::string lnk) +{ + static struct stat info; + if (lstat(lnk.c_str(), &info) != -1) { + if (S_ISLNK(info.st_mode)) { + std::string tmp = readLink(lnk); + if (!tmp.empty()) { + if (lstat(tmp.c_str(), &info) != -1) { + if (S_ISCHR(info.st_mode)) + return true; + } + } + } + } + return false; +} +#endif + /* if recheck == true, only not already opened devices are opened, if not, close then (re)open all */ void CRCInput::open(bool recheck) { @@ -206,10 +246,22 @@ void CRCInput::open(bool recheck) while ((dentry = readdir(dir)) != NULL) { - if (dentry->d_type != DT_CHR) { + if ((dentry->d_type != DT_CHR) +#ifdef BOXMODEL_CS_HD2 + && (dentry->d_type != DT_LNK) +#endif + + ) { d_printf("[rcinput:%s] skipping '%s'\n", __func__, dentry->d_name); continue; } +#ifdef BOXMODEL_CS_HD2 + if ((dentry->d_type == DT_LNK) && (!checkLnkDev("/dev/input/" + std::string(dentry->d_name)))) { + d_printf("[rcinput:%s] skipping '%s'\n", __func__, dentry->d_name); + continue; + } + id.type = dentry->d_type; +#endif d_printf("[rcinput:%s] considering '%s'\n", __func__, dentry->d_name); id.path = "/dev/input/" + std::string(dentry->d_name); if (checkpath(id)) diff --git a/src/driver/rcinput.h b/src/driver/rcinput.h index 9a859b929..502dc259f 100644 --- a/src/driver/rcinput.h +++ b/src/driver/rcinput.h @@ -145,6 +145,9 @@ class CRCInput { int fd; std::string path; +#ifdef BOXMODEL_CS_HD2 + int type; +#endif }; uint32_t timerid; @@ -169,6 +172,9 @@ class CRCInput void open(bool recheck = false); bool checkpath(in_dev id); bool checkdev(); +#ifdef BOXMODEL_CS_HD2 + bool checkLnkDev(std::string lnk); +#endif void close(); int translate(int code); void calculateMaxFd(void);