Hi,

Am 15.08.2011 14:20, schrieb Andy Shevchenko:
Signed-off-by: Andy Shevchenko<andriy.shevche...@linux.intel.com>
---
  configure.in    |   10 ++++++++
  src/Makefile.am |    2 +
  src/media.c     |   66 ++++++++++++++++++++++++++----------------------------
  3 files changed, 44 insertions(+), 34 deletions(-)

diff --git a/configure.in b/configure.in
index fd4c70c..63432ba 100644
--- a/configure.in
+++ b/configure.in
@@ -12,6 +12,16 @@ AC_PROG_CC
  AC_PROG_LIBTOOL

  # Checks for libraries.
+PKG_CHECK_MODULES(libudev, libudev, have_libudev=yes, have_libudev=no)
+
+if test x$have_libudev = xyes; then
+    LIBUDEV_CFLAGS="$lbudev_CFLAGS"

 Just reading it, shouldn't it be
 LIBUDEV_CFLAGS="$libudev_CFLAGS"

Regards,
Lars.

+    LIBUDEV_LIBS="$libudev_LIBS"
+    AC_SUBST(LIBUDEV_CFLAGS)
+    AC_SUBST(LIBUDEV_LIBS)
+else
+    AC_MSG_ERROR([libudev is required])
+fi

  # Kernel headers path.
  AC_ARG_WITH(kernel-headers,
diff --git a/src/Makefile.am b/src/Makefile.am
index 267ea83..52628d2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -5,6 +5,8 @@ mediactl_includedir=$(includedir)/mediactl
  mediactl_include_HEADERS = media.h subdev.h

  bin_PROGRAMS = media-ctl
+media_ctl_CFLAGS = $(LIBUDEV_CFLAGS)
+media_ctl_LDFLAGS = $(LIBUDEV_LIBS)
  media_ctl_SOURCES = main.c options.c options.h tools.h
  media_ctl_LDADD = libmediactl.la libv4l2subdev.la

diff --git a/src/media.c b/src/media.c
index e3cab86..000d750 100644
--- a/src/media.c
+++ b/src/media.c
@@ -31,6 +31,8 @@
  #include<linux/videodev2.h>
  #include<linux/media.h>

+#include<libudev.h>
+
  #include "media.h"
  #include "tools.h"

@@ -247,15 +249,20 @@ static int media_enum_links(struct media_device *media)

  static int media_enum_entities(struct media_device *media)
  {
+       struct udev *udev;
+       dev_t devnum;
+       struct udev_device *device;
        struct media_entity *entity;
-       struct stat devstat;
        unsigned int size;
-       char devname[32];
-       char sysname[32];
-       char target[1024];
-       char *p;
+       const char *p;
        __u32 id;
-       int ret;
+       int ret = 0;
+
+       udev = udev_new();
+       if (udev == NULL) {
+               printf("unable to allocate memory for context\n");
+               return -ENOMEM;
+       }

        for (id = 0; ; id = entity->info.id) {
                size = (media->entities_count + 1) * sizeof(*media->entities);
@@ -268,9 +275,9 @@ static int media_enum_entities(struct media_device *media)

                ret = ioctl(media->fd, MEDIA_IOC_ENUM_ENTITIES,&entity->info);
                if (ret<  0) {
-                       if (errno == EINVAL)
-                               break;
-                       return -errno;
+                       if (errno != EINVAL)
+                               ret = -errno;
+                       break;
                }

                /* Number of links (for outbound links) plus number of pads (for
@@ -281,8 +288,10 @@ static int media_enum_entities(struct media_device *media)

                entity->pads = malloc(entity->info.pads * 
sizeof(*entity->pads));
                entity->links = malloc(entity->max_links * 
sizeof(*entity->links));
-               if (entity->pads == NULL || entity->links == NULL)
-                       return -ENOMEM;
+               if (entity->pads == NULL || entity->links == NULL) {
+                       ret = -ENOMEM;
+                       break;
+               }

                media->entities_count++;

@@ -291,32 +300,21 @@ 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;
+               devnum = makedev(entity->info.v4l.major, 
entity->info.v4l.minor);
+               printf("looking up device: %u:%u\n", major(devnum), 
minor(devnum));
+               device = udev_device_new_from_devnum(udev, 'c', devnum);
+               if (device) {
+                       p = udev_device_get_devnode(device);
+                       if (p)
+                               snprintf(entity->devname, 
sizeof(entity->devname),
+                                        "%s", p);
+               }

-               /* 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);
+               udev_device_unref(device);
        }

-       return 0;
+       udev_unref(udev);
+       return ret;
  }

  struct media_device *media_open(const char *name, int verbose)
--
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