summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>2011-09-05 18:24:04 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2011-09-06 12:19:19 +0200
commit1690efe5a4daf5cd2d1b71c49286c376cc7fcc15 (patch)
tree0be6c48a6bd57cfa66d462e17cd9bc5e54c17051
parent9abe990480a602ff076caa1010edee033e74b54c (diff)
libmediactl: split media_get_devname_sysfs from media_enum_entities
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
-rw-r--r--src/media.c61
1 files changed, 35 insertions, 26 deletions
diff --git a/src/media.c b/src/media.c
index 3819b69..30d603b 100644
--- a/src/media.c
+++ b/src/media.c
@@ -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;
@@ -292,29 +323,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;