Signed-off-by: Andy Shevchenko <andriy.shevche...@linux.intel.com>
---
 src/media.c |   69 +++++++++++++++++++++++++++++++++-------------------------
 1 files changed, 39 insertions(+), 30 deletions(-)

diff --git a/src/media.c b/src/media.c
index 050289e..fc05a86 100644
--- a/src/media.c
+++ b/src/media.c
@@ -245,15 +245,50 @@ 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(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;
+
+       if (media_entity_type(entity) != MEDIA_ENT_T_DEVNODE &&
+           media_entity_type(entity) != MEDIA_ENT_T_V4L2_SUBDEV)
+               return 0;
+
+       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;
 
@@ -289,33 +324,7 @@ static int media_enum_entities(struct media_device *media)
                media->entities_count++;
 
                /* Find the corresponding device name. */
-               if (media_entity_type(entity) != MEDIA_ENT_T_DEVNODE &&
-                   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(entity);
        }
 
        return ret;
-- 
1.7.5.4

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

Reply via email to