diff options
author | Lars Hanisch <dvb@flensrocker.de> | 2011-02-02 21:44:20 +0100 |
---|---|---|
committer | Lars Hanisch <dvb@flensrocker.de> | 2011-02-02 21:44:20 +0100 |
commit | 6fb28a2e29faf239b1b14fcac981d560a7550e65 (patch) | |
tree | 0fe226aad44f26d2d375fa9320bcfa2f2135123f /monitor.c | |
parent | 8a8770d8b8b8d19e5f7d07628f742957d1ade4f1 (diff) | |
download | vdr-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.c | 52 |
1 files changed, 52 insertions, 0 deletions
@@ -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); + } + } +} |