diff options
Diffstat (limited to 'dynamicdevice.c')
-rw-r--r-- | dynamicdevice.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/dynamicdevice.c b/dynamicdevice.c index ae0cab3..a594438 100644 --- a/dynamicdevice.c +++ b/dynamicdevice.c @@ -562,6 +562,7 @@ cDynamicDevice::cDynamicDevice() ,subDeviceIsReady(false) ,devpath(NULL) ,udevRemoveSyspath(NULL) +,udevProvidesSources(NULL) ,getTSTimeoutHandlerArg(NULL) ,isDetachable(true) ,getTSTimeout(defaultGetTSTimeout) @@ -612,6 +613,13 @@ void cDynamicDevice::ReadUdevProperties(void) || (strcmp(disableAutoIdleArg, "1") == 0))) disableAutoIdle = true; + const char *providesSources = dev->GetPropertyValue("dynamite_sources"); + if (providesSources) { + if (udevProvidesSources) + delete udevProvidesSources; + udevProvidesSources = new cString(cString::sprintf(",%s,", providesSources)); + } + cUdevDevice *p = dev->GetParent(); if (p) { const char *subsystem = p->GetSubsystem(); @@ -672,6 +680,10 @@ void cDynamicDevice::DeleteSubDevice() delete udevRemoveSyspath; udevRemoveSyspath = NULL; } + if (udevProvidesSources) { + delete udevProvidesSources; + udevProvidesSources = NULL; + } if (devpath) { delete devpath; devpath = NULL; @@ -795,6 +807,14 @@ void cDynamicDevice::CloseFilter(int Handle) bool cDynamicDevice::ProvidesSource(int Source) const { + if (udevProvidesSources) { + cString source = cSource::ToString(Source); + cString search = cString::sprintf(",%s,", *source); + if (strstr(**udevProvidesSources, *search) == NULL) { + isyslog("dynamite: device %s shall not provide source %s", GetDevPath(), *source); + return false; + } + } if (subDevice) return subDevice->ProvidesSource(Source); return cDevice::ProvidesSource(Source); |