summaryrefslogtreecommitdiff
path: root/dynamicdevice.c
diff options
context:
space:
mode:
Diffstat (limited to 'dynamicdevice.c')
-rw-r--r--dynamicdevice.c20
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);