diff options
author | Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> | 2012-12-26 17:19:54 +0100 |
---|---|---|
committer | Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> | 2012-12-26 17:19:54 +0100 |
commit | 1eaaa955de899e8c6076be3a7bd1d8855e7ce682 (patch) | |
tree | 4491334331e2402e08f29efbae861ef7ca075137 | |
parent | 97236387af5729929e14d86cafe460dbb08cea1d (diff) | |
download | vdr-plugin-inputdev-1eaaa955de899e8c6076be3a7bd1d8855e7ce682.tar.gz vdr-plugin-inputdev-1eaaa955de899e8c6076be3a7bd1d8855e7ce682.tar.bz2 |
implemented coldplugging
-rw-r--r-- | inputdev.c | 52 | ||||
-rw-r--r-- | inputdev.h | 3 | ||||
-rw-r--r-- | plugin.c | 6 |
3 files changed, 51 insertions, 10 deletions
@@ -570,16 +570,17 @@ void cInputDeviceController::remove_device(class cInputDevice *dev) dev_mutex_.Unlock(); } -void cInputDeviceController::add_device(char const *dev_name) +bool cInputDeviceController::add_device(char const *dev_name) { class cInputDevice *dev = new cInputDevice(*this, cString::sprintf("/dev/input/%s", dev_name)); char const *desc; + bool res; if (!dev->open()) { delete dev; - return; + return false; } desc = dev->get_description(); @@ -606,8 +607,14 @@ void cInputDeviceController::add_device(char const *dev_name) } } - if (dev != NULL && !dev->start(fd_epoll_)) + if (dev != NULL && !dev->start(fd_epoll_)) { + res = false; remove_device(dev); + } else { + res = dev != NULL; + } + + return res; } void cInputDeviceController::handle_uevent(void) @@ -653,15 +660,46 @@ void cInputDeviceController::handle_uevent(void) } } -bool cInputDeviceController::start(void) +bool cInputDeviceController::coldplug_devices(char const *path) { - cThread::Start(); - return true; + cReadDir cdir(path); + bool res = true; + + for (;;) { + struct dirent const *ent = cdir.Next(); + + if (!ent) + break; + + if (strcmp(ent->d_name, ".") == 0 || + strcmp(ent->d_name, "..") == 0) + continue; + + if (!add_device(ent->d_name)) { + esyslog("%s: failed to coldplug '%s'\n", + plugin_name(), ent->d_name); + res = false; + } else { + isyslog("%s: coldplugged '%s'\n", + plugin_name(), ent->d_name); + } + } + + return res; } -bool cInputDeviceController::initialize(void) +bool cInputDeviceController::initialize(char const *coldplug_dir) { cInputDevice::install_keymap(Name()); + + coldplug_devices(coldplug_dir); + + return true; +} + +bool cInputDeviceController::start(void) +{ + cThread::Start(); return true; } @@ -40,6 +40,7 @@ private: void cleanup_devices(void); void handle_uevent(void); + bool coldplug_devices(char const *); protected: virtual void Action(void); @@ -48,7 +49,7 @@ public: explicit cInputDeviceController(cPlugin &p); virtual ~cInputDeviceController(); - bool initialize(void); + bool initialize(char const *coldplug_dir); bool start(void); void stop(void); @@ -39,6 +39,8 @@ private: int idx; } socket_; + cString coldplug_dir; + public: cInputDevicePlugin(void); virtual ~cInputDevicePlugin(); @@ -53,7 +55,7 @@ public: }; cInputDevicePlugin::cInputDevicePlugin() : - controller_(NULL) + controller_(NULL), coldplug_dir("/dev/vdr/input") { } @@ -134,7 +136,7 @@ bool cInputDevicePlugin::Initialize(void) } if (is_ok) - is_ok = controller_->initialize(); + is_ok = controller_->initialize(coldplug_dir); if (!is_ok) { delete controller_; |