[vdr] [PATCH] remote: allow for no devices & missing devices; constness

Darren Salt linux at youmustbejoking.demon.co.uk
Sun Mar 12 15:39:23 CET 2006


Patches attached.

-- 
| Darren Salt    | linux or ds at              | nr. Ashington, | Toon
| RISC OS, Linux | youmustbejoking,demon,co,uk | Northumberland | Army
|   Say NO to UK ID cards. http://www.no2id.net/

Multics is security spelled sideways.
-------------- next part --------------
diff -urNad vdr-plugin-remote-0.3.4~/remote.c vdr-plugin-remote-0.3.4/remote.c
--- vdr-plugin-remote-0.3.4~/remote.c	2006-01-09 20:04:36.000000000 +0000
+++ vdr-plugin-remote-0.3.4/remote.c	2006-01-09 20:04:36.670699823 +0000
@@ -786,9 +786,9 @@
     } // for
     
     if (!ok)
-        esyslog("%s: fatal error - unable to open input device", Name());
+        esyslog("%s: warning: unable to open input device", Name());
 
-    return ok;
+    return true;
 }
 
 
-------------- next part --------------
diff -urNad vdr-plugin-remote-0.3.4~/remote.c vdr-plugin-remote-0.3.4/remote.c
--- vdr-plugin-remote-0.3.4~/remote.c	2006-01-09 20:04:41.000000000 +0000
+++ vdr-plugin-remote-0.3.4/remote.c	2006-01-09 20:04:41.158402951 +0000
@@ -174,7 +174,7 @@
 //          -1 - error
 //
 // ---------------------------------------------------------------------------
-int identifyInputDevice(const int fh, char *name)
+int identifyInputDevice(const int fh, const char *name)
 // ---------------------------------------------------------------------------
 {
     char description[256];
@@ -654,6 +654,23 @@
 }
 
 
+class cListString : public cListObject
+{
+private:
+  cString *content;
+public:
+  cListString (const char *obj) { content = new cString (obj); }
+  ~cListString () { delete content; }
+  int Compare (const cListObject &obj) const;
+  const cString& Get () { return *content; }
+};
+
+int cListString::Compare (const cListObject &obj) const
+{
+  return strcmp (**content, **((const cListString &)obj).content);
+}
+
+
 // ---------------------------------------------------------------------------
 bool cPluginRemote::Start(void)
 // ---------------------------------------------------------------------------
@@ -671,17 +688,59 @@
         devcnt = 1;
     }
 
+    cList<cListString> devices;
+
+    DIR *dir = opendir ("/dev/input");
+    if (!dir)
+    {
+        esyslog ("%s: unable to open '%s': %s",
+                 Name (), "/dev/input", strerror (errno));
+        return false;
+    }
+
+    long devmin = INT_MAX;
+    for (;;)
+    {
+        dirent obj, *ret;
+        int err = readdir_r (dir, &obj, &ret);
+        if (err)
+        {
+            esyslog ("%s: unable to read '%s': %s",
+                     Name (), "/dev/input", strerror (errno));
+            closedir (dir);
+            return false;
+        }
+        if (!ret)
+            break;
+
+        if (strncmp (obj.d_name, "event", 5))
+            continue;
+
+        long j;
+        char *end;
+        j = strtol (obj.d_name + 5, &end, 10);
+        if (j < 0 || end == obj.d_name || *end)
+            continue;
+
+        // keep track of the lowest device number (in case it's not 0)
+        if (j < devmin)
+            devmin = j;
+
+        devices.Add (new cListString (cString::sprintf ("/dev/input/%s", obj.d_name)));
+    }
+    closedir (dir);
+
+    devices.Sort ();
+
     /* probe eventX devices */
     for (int i = 0; i < devcnt; i++)
     {
         if (devtyp[i] == 'i' && strcmp(devnam[i], "autodetect") == 0)
         {
-            char nam[80];
 
-            for (int j = 0; ; j++)
+            for (cListString *dev = devices.First (); dev; dev = devices.Next (dev))
             {
-                sprintf(nam, "/dev/input/event%d", j);
-                fh[i] = open(nam, O_RDONLY);
+                fh[i] = open(dev->Get (), O_RDONLY);
                 if (fh[i] < 0)
                 {
                     switch (errno)
@@ -694,22 +753,23 @@
                     break;
                 }
 		
-                if (identifyInputDevice(fh[i], nam) >= 1)
+                if (identifyInputDevice(fh[i], dev->Get ()) >= 1)
                 {
                     // found DVB card receiver
-                    devnam[i] = strdup(nam);
+                    devnam[i] = strdup(dev->Get ());
                     close(fh[i]);
+                    devices.Del (dev);
                     break;
                 }
 
                 // unknown device, try next one
                 close(fh[i]);
-            } // for j
+            } // for each (remaining) eventX
         } // if autodetect
 
         // use default device if nothing could be identified
         if (devtyp[i] == 'i' && strcmp(devnam[i], "autodetect") == 0)
-            devnam[i] = "/dev/input/event0";
+            asprintf (&devnam[i], "/dev/input/event%ld", devmin);
     } // for i
 
     for (int i = 0; i < devcnt; i++)
-------------- next part --------------
diff -urNad vdr-plugin-remote-0.3.5~/remote.c vdr-plugin-remote-0.3.5/remote.c
--- vdr-plugin-remote-0.3.5~/remote.c	2006-01-25 14:35:49.000000000 +0000
+++ vdr-plugin-remote-0.3.5/remote.c	2006-01-25 14:38:21.525298825 +0000
@@ -26,10 +26,8 @@
 
 #define NUMREMOTES      10        // maximum number of remote control devices
  
-#define KEYMAP_DEVICE_AV7110   "/proc/av7110_ir"
-
-static const char *VERSION        = "0.3.5";
-static const char *DESCRIPTION    = "Remote control";
+static const char VERSION[]     = "0.3.5";
+static const char DESCRIPTION[] = "Remote control";
 
 
 
@@ -616,7 +614,7 @@
 bool cPluginRemote::ProcessArgs(int argc, char *argv[])
 // ---------------------------------------------------------------------------
 {
-    static struct option long_options[] =
+    static const struct option long_options[] =
             { { "input", required_argument, NULL, 'i' },
               { "lirc",  required_argument, NULL, 'l' },
               { "port",  required_argument, NULL, 'p' },


More information about the vdr mailing list