[PATCH] libmediactl.c: add poor man's udev support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



If libudev is not available (android!), then just try to find the device in /dev.
It's a poor man's solution, but it is better than nothing.

Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx>

diff --git a/utils/media-ctl/libmediactl.c b/utils/media-ctl/libmediactl.c
index 4a82d24..1577783 100644
--- a/utils/media-ctl/libmediactl.c
+++ b/utils/media-ctl/libmediactl.c
@@ -441,7 +441,10 @@ static int media_get_devname_udev(struct udev *udev,
 	return ret;
 }

-#else	/* HAVE_LIBUDEV */
+#else
+
+#include <dirent.h>
+#include <sys/stat.h>

 struct udev;

@@ -449,10 +452,36 @@ static inline int media_udev_open(struct udev **udev) { return 0; }

 static inline void media_udev_close(struct udev *udev) { }

-static inline int media_get_devname_udev(struct udev *udev,
-		struct media_entity *entity)
+static int media_get_devname_udev(struct udev *udev,
+				  struct media_entity *entity)
 {
-	return -ENOTSUP;
+	DIR *dp;
+	struct dirent *ep;
+	dev_t devnum;
+
+	dp = opendir("/dev");
+	if (dp == NULL) {
+		media_dbg(entity->media, "couldn't open /dev\n");
+		return -ENODEV;
+	}
+	devnum = makedev(entity->info.v4l.major, entity->info.v4l.minor);
+	while ((ep = readdir(dp))) {
+		struct stat st;
+		char fname[256];
+
+		snprintf(fname, sizeof(fname) - 1, "/dev/%s", ep->d_name);
+		fname[sizeof(fname) - 1] = 0;
+		stat(fname, &st);
+		if ((st.st_mode & S_IFMT) != S_IFCHR)
+			continue;
+		if (st.st_rdev == devnum) {
+			strncpy(entity->devname, fname, sizeof(entity->devname));
+                        entity->devname[sizeof(entity->devname) - 1] = '\0';
+			return 0;
+		}
+	}
+	closedir(dp);
+	return -ENODEV;
 }

 #endif	/* HAVE_LIBUDEV */
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux