diff options
author | Lars Hanisch <dvb@flensrocker.de> | 2011-10-26 23:02:06 +0200 |
---|---|---|
committer | Lars Hanisch <dvb@flensrocker.de> | 2011-10-26 23:02:06 +0200 |
commit | 6842192298a8c1cf38db4c51d62598b704256933 (patch) | |
tree | 7181fb99a2d9b7cb7a6a457855fe6ab9c2731869 /dynamicdevice.c | |
parent | 6e1064dca6de162e199b4687612d3f5f72c7c0c4 (diff) | |
download | vdr-plugin-dynamite-6842192298a8c1cf38db4c51d62598b704256933.tar.gz vdr-plugin-dynamite-6842192298a8c1cf38db4c51d62598b704256933.tar.bz2 |
add udev monitor for remove events of usb hardware so devices can be detached on unplugging
Diffstat (limited to 'dynamicdevice.c')
-rw-r--r-- | dynamicdevice.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/dynamicdevice.c b/dynamicdevice.c index a5817c7..267038a 100644 --- a/dynamicdevice.c +++ b/dynamicdevice.c @@ -1,5 +1,5 @@ #include "dynamicdevice.h" -#include "udev.h" +#include "monitor.h" #include <glob.h> #include <vdr/skins.h> #include <vdr/transfer.h> @@ -434,6 +434,7 @@ bool cDynamicDevice::IsAttached(const char *DevPath) cDynamicDevice::cDynamicDevice() :index(-1) ,devpath(NULL) +,udevRemoveSyspath(NULL) ,getTSTimeoutHandlerArg(NULL) ,isDetachable(true) ,getTSTimeout(defaultGetTSTimeout) @@ -476,6 +477,18 @@ void cDynamicDevice::ReadUdevProperties(void) if (timeoutHandlerArg) InternSetGetTSTimeoutHandlerArg(timeoutHandlerArg); + cUdevDevice *p = dev->GetParent(); + if (p) { + const char *subsystem = p->GetSubsystem(); + const char *syspath = p->GetSyspath(); + if (subsystem && syspath && (strcmp(subsystem, "usb") == 0)) { + cUdevUsbRemoveFilter::AddItem(syspath, **devpath); + if (udevRemoveSyspath) + delete udevRemoveSyspath; + udevRemoveSyspath = new cString(syspath); + } + } + delete dev; } } @@ -518,6 +531,11 @@ void cDynamicDevice::DeleteSubDevice() if (devpath) cPluginManager::CallAllServices("dynamite-event-DeviceDetached-v0.1", (void*)**devpath); } + if (udevRemoveSyspath) { + cUdevUsbRemoveFilter::RemoveItem(**udevRemoveSyspath, GetDevPath()); + delete udevRemoveSyspath; + udevRemoveSyspath = NULL; + } if (devpath) { delete devpath; devpath = NULL; |