summaryrefslogtreecommitdiff
path: root/monitor.c
diff options
context:
space:
mode:
authorLars Hanisch <dvb@flensrocker.de>2011-10-26 23:02:06 +0200
committerLars Hanisch <dvb@flensrocker.de>2011-10-26 23:02:06 +0200
commit6842192298a8c1cf38db4c51d62598b704256933 (patch)
tree7181fb99a2d9b7cb7a6a457855fe6ab9c2731869 /monitor.c
parent6e1064dca6de162e199b4687612d3f5f72c7c0c4 (diff)
downloadvdr-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 'monitor.c')
-rw-r--r--monitor.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/monitor.c b/monitor.c
index e603c30..824d15c 100644
--- a/monitor.c
+++ b/monitor.c
@@ -49,6 +49,22 @@ bool cUdevMonitor::AddFilter(const char *Subsystem, cUdevFilter *Filter)
return true;
}
+bool cUdevMonitor::DelFilter(const char *Subsystem, cUdevFilter *Filter)
+{
+ if (Filter == NULL)
+ return false;
+ cUdevMonitor *m = Get(Subsystem);
+ if (m == NULL) {
+ delete Filter;
+ return false;
+ }
+ if (!m->DelFilter(Filter)) {
+ delete Filter;
+ return false;
+ }
+ return true;
+}
+
void cUdevMonitor::ShutdownAllMonitors(void)
{
cMutexLock lock(&mutexMonitors);
@@ -219,6 +235,78 @@ void cUdevDvbFilter::Process(cUdevDevice &Device)
}
}
+// --- cUdevUsbRemoveFilter---------------------------------------------------
+
+cUdevUsbRemoveFilter::cItem::cItem(const char *i, const char *d)
+{
+ item = new cString(i);
+ devpath = new cString(d);
+}
+
+cUdevUsbRemoveFilter::cItem::~cItem(void)
+{
+ delete item;
+ delete devpath;
+}
+
+cMutex cUdevUsbRemoveFilter::mutexFilter;
+cUdevUsbRemoveFilter *cUdevUsbRemoveFilter::filter = NULL;
+
+void cUdevUsbRemoveFilter::Process(cUdevDevice &Device)
+{
+ const char *action = Device.GetAction();
+ const char *syspath = Device.GetSyspath();
+ if (action && syspath && (strcmp(action, "remove") == 0)) {
+ isyslog("dynamite: usb remove monitor: action = %s", action);
+ isyslog("dynamite: usb remove monitor: syspath = %s", syspath);
+ cMutexLock lock(&mutexItems);
+ for (cItem *i = items.First(); i; i = items.Next(i)) {
+ if (strcmp(**(i->item), syspath) == 0) {
+ isyslog("dynamite: usb remove monitor: force detach of %s", **(i->devpath));
+ cDynamicDeviceProbe::QueueDynamicDeviceCommand(ddpcService, *cString::sprintf("dynamite-ForceDetachDevice-v0.1 %s", **(i->devpath)));
+ }
+ }
+ }
+}
+
+void cUdevUsbRemoveFilter::AddItem(const char *item, const char *devpath)
+{
+ if ((item == NULL) || (devpath == NULL))
+ return;
+ cMutexLock lock(&mutexFilter);
+ if (filter == NULL) {
+ filter = new cUdevUsbRemoveFilter();
+ if (!cUdevMonitor::AddFilter( "usb", filter)) {
+ delete filter;
+ filter = NULL;
+ return;
+ }
+ }
+ isyslog("dynamite: usb remove monitor: add syspath = %s", item);
+ cMutexLock lock2(&filter->mutexItems);
+ filter->items.Add(new cItem(item, devpath));
+}
+
+void cUdevUsbRemoveFilter::RemoveItem(const char *item, const char *devpath)
+{
+ if ((item == NULL) || (devpath == NULL))
+ return;
+ cMutexLock lock(&mutexFilter);
+ if (filter == NULL)
+ return;
+ cMutexLock lock2(&filter->mutexItems);
+ for (cItem *i = filter->items.First(); i; i = filter->items.Next(i)) {
+ if ((strcmp(**(i->item), item) == 0) && (strcmp(**(i->devpath), devpath) == 0)) {
+ filter->items.Del(i);
+ if (filter->items.Count() == 0) {
+ cUdevMonitor::DelFilter("usb", filter);
+ filter = NULL;
+ }
+ return;
+ }
+ }
+}
+
// --- cUdevPatternFilter ----------------------------------------------------
cMutex cUdevPatternFilter::filtersMutex;