@@ -245,15 +245,46 @@ static int media_enum_links(struct media_device *media)
return ret;
}
-static int media_enum_entities(struct media_device *media)
+static int media_get_devname_sysfs(struct media_entity *entity)
{
- struct media_entity *entity;
struct stat devstat;
- unsigned int size;
char devname[32];
char sysname[32];
char target[1024];
char *p;
+ int ret;
+
+ sprintf(sysname, "/sys/dev/char/%u:%u", entity->info.v4l.major,
+ entity->info.v4l.minor);
+ ret = readlink(sysname, target, sizeof(target));
+ if (ret < 0)
+ return -errno;
+
+ target[ret] = '\0';
+ p = strrchr(target, '/');
+ if (p == NULL)
+ return -EINVAL;
+
+ sprintf(devname, "/dev/%s", p + 1);
+ ret = stat(devname, &devstat);
+ if (ret < 0)
+ return -errno;
+
+ /* Sanity check: udev might have reordered the device nodes.
+ * Make sure the major/minor match. We should really use
+ * libudev.
+ */
+ if (major(devstat.st_rdev) == entity->info.v4l.major &&
+ minor(devstat.st_rdev) == entity->info.v4l.minor)
+ strcpy(entity->devname, devname);
+
+ return 0;
+}
+
+static int media_enum_entities(struct media_device *media)
+{
+ struct media_entity *entity;
+ unsigned int size;
__u32 id;
int ret = 0;
@@ -293,29 +324,7 @@ static int media_enum_entities(struct media_device *media)
media_entity_type(entity) != MEDIA_ENT_T_V4L2_SUBDEV)
continue;
- sprintf(sysname, "/sys/dev/char/%u:%u", entity->info.v4l.major,
- entity->info.v4l.minor);
- ret = readlink(sysname, target, sizeof(target));
- if (ret < 0)
- continue;
-
- target[ret] = '\0';
- p = strrchr(target, '/');
- if (p == NULL)
- continue;
-
- sprintf(devname, "/dev/%s", p + 1);
- ret = stat(devname, &devstat);
- if (ret < 0)
- continue;
-
- /* Sanity check: udev might have reordered the device nodes.
- * Make sure the major/minor match. We should really use
- * libudev.
- */
- if (major(devstat.st_rdev) == entity->info.v4l.major &&
- minor(devstat.st_rdev) == entity->info.v4l.minor)
- strcpy(entity->devname, devname);
+ media_get_devname_sysfs(entity);
}
return ret;
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> --- src/media.c | 61 +++++++++++++++++++++++++++++++++------------------------- 1 files changed, 35 insertions(+), 26 deletions(-)