summaryrefslogtreecommitdiff
path: root/monitor.c
diff options
context:
space:
mode:
authorLars Hanisch <dvb@flensrocker.de>2011-02-02 21:44:20 +0100
committerLars Hanisch <dvb@flensrocker.de>2011-02-02 21:44:20 +0100
commit6fb28a2e29faf239b1b14fcac981d560a7550e65 (patch)
tree0fe226aad44f26d2d375fa9320bcfa2f2135123f /monitor.c
parent8a8770d8b8b8d19e5f7d07628f742957d1ade4f1 (diff)
downloadvdr-plugin-dynamite-6fb28a2e29faf239b1b14fcac981d560a7550e65.tar.gz
vdr-plugin-dynamite-6fb28a2e29faf239b1b14fcac981d560a7550e65.tar.bz2
add generic udev-filter
Other plugins can add a filter for different subsystems and devnodes. example: AddUdevMonitor video4linux /dev/video If udev signals an "add"-event whose devnode starts with "/dev/video" the whole devnode is queued for attaching.
Diffstat (limited to 'monitor.c')
-rw-r--r--monitor.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/monitor.c b/monitor.c
index ff9392c..e603c30 100644
--- a/monitor.c
+++ b/monitor.c
@@ -218,3 +218,55 @@ void cUdevDvbFilter::Process(cUdevDevice &Device)
cDynamicDeviceProbe::QueueDynamicDeviceCommand(ddpcAttach, devname);
}
}
+
+// --- cUdevPatternFilter ----------------------------------------------------
+
+cMutex cUdevPatternFilter::filtersMutex;
+cList<cUdevPatternFilter> cUdevPatternFilter::filters;
+
+bool cUdevPatternFilter::AddFilter(const char *Subsystem, const char *Pattern)
+{
+ if (Pattern == NULL)
+ return false;
+ cMutexLock lock(&filtersMutex);
+ cUdevPatternFilter *f = filters.First();
+ while (f) {
+ if (f->monitor && (strcmp(*f->pattern, Pattern) == 0)) {
+ if ((Subsystem == NULL) && (*f->monitor->GetSubsystem() == NULL))
+ return true;
+ if ((Subsystem != NULL)
+ && (*f->monitor->GetSubsystem() != NULL)
+ && (strcmp(*f->monitor->GetSubsystem(), Subsystem) == 0))
+ return true;
+ }
+ f = filters.Next(f);
+ }
+ return cUdevMonitor::AddFilter(Subsystem, new cUdevPatternFilter(Pattern));
+}
+
+cUdevPatternFilter::cUdevPatternFilter(const char *Pattern)
+:pattern(Pattern)
+{
+ cMutexLock lock(&filtersMutex);
+ filters.Add(this);
+}
+
+cUdevPatternFilter::~cUdevPatternFilter(void)
+{
+ cMutexLock lock(&filtersMutex);
+ filters.Del(this, false);
+}
+
+void cUdevPatternFilter::Process(cUdevDevice &Device)
+{
+ const char *action = Device.GetAction();
+ if (action && (strcmp(action, "add") == 0)) {
+ const char *devname = Device.GetDevnode();
+ if (devname != NULL) {
+ int dLen = strlen(devname);
+ int pLen = strlen(*pattern);
+ if ((pLen <= dLen) && (strncmp(devname, *pattern, pLen) == 0))
+ cDynamicDeviceProbe::QueueDynamicDeviceCommand(ddpcAttach, devname);
+ }
+ }
+}