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