diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2011-09-05 18:24:04 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2011-09-06 12:19:19 +0200 |
commit | 1690efe5a4daf5cd2d1b71c49286c376cc7fcc15 (patch) | |
tree | 0be6c48a6bd57cfa66d462e17cd9bc5e54c17051 /src | |
parent | 9abe990480a602ff076caa1010edee033e74b54c (diff) |
libmediactl: split media_get_devname_sysfs from media_enum_entities
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/media.c | 61 |
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; |