summaryrefslogtreecommitdiff
path: root/udev.c
diff options
context:
space:
mode:
Diffstat (limited to 'udev.c')
-rw-r--r--udev.c222
1 files changed, 222 insertions, 0 deletions
diff --git a/udev.c b/udev.c
new file mode 100644
index 0000000..d78e39d
--- /dev/null
+++ b/udev.c
@@ -0,0 +1,222 @@
+#include "udev.h"
+#include <linux/stddef.h>
+
+// --- cUdevListEntry --------------------------------------------------------
+
+cUdevListEntry::cUdevListEntry(struct udev_list_entry *ListEntry)
+:listEntry(ListEntry)
+{
+}
+
+cUdevListEntry::~cUdevListEntry(void)
+{
+}
+
+cUdevListEntry *cUdevListEntry::GetNext(void) const
+{
+ if (listEntry == NULL)
+ return NULL;
+ struct udev_list_entry *next = udev_list_entry_get_next(listEntry);
+ if (next == NULL)
+ return NULL;
+ return new cUdevListEntry(next);
+}
+
+const char *cUdevListEntry::GetName(void) const
+{
+ if (listEntry == NULL)
+ return NULL;
+ return udev_list_entry_get_name(listEntry);
+}
+
+const char *cUdevListEntry::GetValue(void) const
+{
+ if (listEntry == NULL)
+ return NULL;
+ return udev_list_entry_get_value(listEntry);
+}
+
+// --- cUdevDevice -----------------------------------------------------------
+
+cUdevDevice::cUdevDevice(udev_device *Device, bool DoUnref)
+:device(Device)
+,doUnref(DoUnref)
+{
+}
+
+cUdevDevice::~cUdevDevice(void)
+{
+ if (doUnref && device)
+ udev_device_unref(device);
+}
+
+int cUdevDevice::Compare(const cListObject &ListObject) const
+{
+ const char *n1 = GetDevnode();
+ const char *n2 = ((cUdevDevice*)&ListObject)->GetDevnode();
+ if ((n1 != NULL) && (n2 != NULL))
+ return strcmp(n1, n2);
+ return 0;
+}
+
+const char *cUdevDevice::GetAction(void) const
+{
+ if (device == NULL)
+ return NULL;
+ return udev_device_get_action(device);
+}
+
+cUdevListEntry *cUdevDevice::GetDevlinksList(void) const
+{
+ if (device == NULL)
+ return NULL;
+ struct udev_list_entry *listEntry = udev_device_get_devlinks_list_entry(device);
+ if (listEntry == NULL)
+ return NULL;
+ return new cUdevListEntry(listEntry);
+}
+
+const char *cUdevDevice::GetDevnode(void) const
+{
+ if (device == NULL)
+ return false;
+ return udev_device_get_devnode(device);
+}
+
+const char *cUdevDevice::GetDevpath(void) const
+{
+ if (device == NULL)
+ return false;
+ return udev_device_get_devpath(device);
+}
+
+cUdevDevice *cUdevDevice::GetParent(void) const
+{
+ if (device == NULL)
+ return NULL;
+ struct udev_device *parent = udev_device_get_parent(device);
+ if (parent == NULL)
+ return NULL;
+ return new cUdevDevice(parent, false);
+}
+
+const char *cUdevDevice::GetPropertyValue(const char *Key) const
+{
+ if (device == NULL)
+ return false;
+ return udev_device_get_property_value(device, Key);
+}
+
+const char *cUdevDevice::GetSubsystem(void) const
+{
+ if (device == NULL)
+ return false;
+ return udev_device_get_subsystem(device);
+}
+
+const char *cUdevDevice::GetSysname(void) const
+{
+ if (device == NULL)
+ return false;
+ return udev_device_get_sysname(device);
+}
+
+const char *cUdevDevice::GetSyspath(void) const
+{
+ if (device == NULL)
+ return false;
+ return udev_device_get_syspath(device);
+}
+
+// --- cUdev -----------------------------------------------------------------
+
+struct udev *cUdev::udev = NULL;
+
+struct udev *cUdev::Init(void)
+{
+ if (udev == NULL)
+ udev = udev_new();
+ return udev;
+}
+
+void cUdev::Free(void)
+{
+ if (udev)
+ udev_unref(udev);
+ udev = NULL;
+}
+
+cUdevDevice *cUdev::GetDeviceFromDevName(const char *DevName)
+{
+ if (DevName == NULL)
+ return NULL;
+ struct stat statbuf;
+ if (stat(DevName, &statbuf) < 0)
+ return NULL;
+ char type;
+ if (S_ISBLK(statbuf.st_mode))
+ type = 'b';
+ else if (S_ISCHR(statbuf.st_mode))
+ type = 'c';
+ else
+ return NULL;
+ udev_device *dev = udev_device_new_from_devnum(udev, type, statbuf.st_rdev);
+ if (dev == NULL)
+ return NULL;
+ return new cUdevDevice(dev);
+}
+
+cUdevDevice *cUdev::GetDeviceFromSysPath(const char *SysPath)
+{
+ if (SysPath == NULL)
+ return NULL;
+ udev_device *dev = udev_device_new_from_syspath(udev, SysPath);
+ if (dev == NULL)
+ return NULL;
+ return new cUdevDevice(dev);
+}
+
+cList<cUdevDevice> *cUdev::EnumDevices(const char *Subsystem, const char *Property, const char *Value)
+{
+ cList<cUdevDevice> *devices = new cList<cUdevDevice>;
+ struct udev_enumerate *e = udev_enumerate_new(udev);
+ struct udev_list_entry *l;
+ cUdevListEntry *listEntry;
+ const char *path;
+ cUdevDevice *dev;
+ if (e != NULL) {
+ int rc = 0;
+ if (Subsystem && ((rc = udev_enumerate_add_match_subsystem(e, Subsystem)) < 0)) {
+ esyslog("pvrinput: can't add subsystem %s to enum-filter: %d", Subsystem, rc);
+ goto unref;
+ }
+ if (Property && Value && ((rc = udev_enumerate_add_match_property(e, Property, Value)) < 0)) {
+ esyslog("pvrinput: can't add property %s value %s to enum-filter: %d", Property, Value, rc);
+ goto unref;
+ }
+ if ((rc = udev_enumerate_scan_devices(e)) < 0) {
+ esyslog("pvrinput: can't scan for devices: %d", rc);
+ goto unref;
+ }
+ l = udev_enumerate_get_list_entry(e);
+ if (l == NULL) {
+ isyslog("pvrinput: no devices found for %s/%s=%s", Subsystem, Property, Value);
+ goto unref;
+ }
+ listEntry = new cUdevListEntry(l);
+ while (listEntry) {
+ path = listEntry->GetName();
+ if (path != NULL) {
+ dev = GetDeviceFromSysPath(path);
+ if (dev != NULL)
+ devices->Add(dev);
+ }
+ cUdevListEntry *tmp = listEntry->GetNext();
+ delete listEntry;
+ listEntry = tmp;
+ }
+unref:
+ udev_enumerate_unref(e);
+ }
+ return devices;
+}