[{"id":126,"web_url":"https://patchwork.libcamera.org/comment/126/","msgid":"<20181230100754.ksjksblder6kvzjs@uno.localdomain>","date":"2018-12-30T10:07:54","subject":"Re: [libcamera-devel] [PATCH v2 06/12] libcamera:\n\tdevice_enumerator: add DeviceEnumeratorUdev class","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Niklas,\n\nOn Sat, Dec 29, 2018 at 04:28:49AM +0100, Niklas Söderlund wrote:\n> Provide a DeviceEnumeratorUdev class which is a specialization\n> of DeviceEnumerator which uses udev to enumerate information in the\n> system.\n>\n\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\nThanks\n  j\n\n> ---\n> * Changes since v1\n> - s/NULL/nullptr/\n> - s/foo == NULL/!foo/\n> - Break log messages to not exceed 80 chars.\n> - Return a std::string from lookupDevnode().\n> ---\n>  src/libcamera/device_enumerator.cpp       | 98 +++++++++++++++++++++++\n>  src/libcamera/include/device_enumerator.h | 15 ++++\n>  2 files changed, 113 insertions(+)\n>\n> diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp\n> index df9e89a1afeecda1..3cafd0d3703dac99 100644\n> --- a/src/libcamera/device_enumerator.cpp\n> +++ b/src/libcamera/device_enumerator.cpp\n> @@ -266,4 +266,102 @@ DeviceInfo *DeviceEnumerator::search(DeviceMatch &dm) const\n>  \treturn info;\n>  }\n>\n> +/* -----------------------------------------------------------------------------\n> + * Enumerator Udev\n> + */\n> +\n> +DeviceEnumeratorUdev::DeviceEnumeratorUdev()\n> +\t: udev_(nullptr)\n> +{\n> +}\n> +\n> +DeviceEnumeratorUdev::~DeviceEnumeratorUdev()\n> +{\n> +\tif (udev_)\n> +\t\tudev_unref(udev_);\n> +}\n> +\n> +int DeviceEnumeratorUdev::init()\n> +{\n> +\tif (udev_)\n> +\t\treturn -EBUSY;\n> +\n> +\tudev_ = udev_new();\n> +\tif (!udev_)\n> +\t\treturn -ENODEV;\n> +\n> +\treturn 0;\n> +}\n> +\n> +int DeviceEnumeratorUdev::enumerate()\n> +{\n> +\tstruct udev_enumerate *udev_enum = nullptr;\n> +\tstruct udev_list_entry *ents, *ent;\n> +\tint ret;\n> +\n> +\tudev_enum = udev_enumerate_new(udev_);\n> +\tif (!udev_enum)\n> +\t\treturn -ENOMEM;\n> +\n> +\tret = udev_enumerate_add_match_subsystem(udev_enum, \"media\");\n> +\tif (ret < 0)\n> +\t\tgoto done;\n> +\n> +\tret = udev_enumerate_scan_devices(udev_enum);\n> +\tif (ret < 0)\n> +\t\tgoto done;\n> +\n> +\tents = udev_enumerate_get_list_entry(udev_enum);\n> +\tif (!ents)\n> +\t\tgoto done;\n> +\n> +\tudev_list_entry_foreach(ent, ents) {\n> +\t\tstruct udev_device *dev;\n> +\t\tconst char *devnode;\n> +\t\tconst char *syspath = udev_list_entry_get_name(ent);\n> +\n> +\t\tdev = udev_device_new_from_syspath(udev_, syspath);\n> +\t\tif (!dev) {\n> +\t\t\tLOG(Error) << \"Failed to get device for '\" <<\n> +\t\t\t\t   syspath << \"', skipping\";\n> +\t\t\tcontinue;\n> +\t\t}\n> +\n> +\t\tdevnode = udev_device_get_devnode(dev);\n> +\t\tif (!devnode) {\n> +\t\t\tudev_device_unref(dev);\n> +\t\t\tret = -ENODEV;\n> +\t\t\tgoto done;\n> +\t\t}\n> +\n> +\t\taddDevice(devnode);\n> +\n> +\t\tudev_device_unref(dev);\n> +\t}\n> +done:\n> +\tudev_enumerate_unref(udev_enum);\n> +\treturn ret >= 0 ? 0 : ret;\n> +}\n> +\n> +std::string DeviceEnumeratorUdev::lookupDevnode(int major, int minor)\n> +{\n> +\tstruct udev_device *device;\n> +\tconst char *name;\n> +\tdev_t devnum;\n> +\tstd::string devnode(\"\");\n> +\n> +\tdevnum = makedev(major, minor);\n> +\tdevice = udev_device_new_from_devnum(udev_, 'c', devnum);\n> +\tif (!device)\n> +\t\treturn \"\";\n> +\n> +\tname = udev_device_get_devnode(device);\n> +\tif (name)\n> +\t\tdevnode = name;\n> +\n> +\tudev_device_unref(device);\n> +\n> +\treturn devnode;\n> +}\n> +\n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/include/device_enumerator.h b/src/libcamera/include/device_enumerator.h\n> index 1f8cef3311012308..5348e6cf583dbd15 100644\n> --- a/src/libcamera/include/device_enumerator.h\n> +++ b/src/libcamera/include/device_enumerator.h\n> @@ -75,6 +75,21 @@ private:\n>  \tvirtual std::string lookupDevnode(int major, int minor) = 0;\n>  };\n>\n> +class DeviceEnumeratorUdev: public DeviceEnumerator\n> +{\n> +public:\n> +\tDeviceEnumeratorUdev();\n> +\t~DeviceEnumeratorUdev();\n> +\n> +\tint init() final;\n> +\tint enumerate() final;\n> +\n> +private:\n> +\tstruct udev *udev_;\n> +\n> +\tstd::string lookupDevnode(int major, int minor) final;\n> +};\n> +\n>  } /* namespace libcamera */\n>\n>  #endif\t/* __LIBCAMERA_DEVICE_ENUMERATOR_H__ */\n> --\n> 2.20.1\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay10.mail.gandi.net (relay10.mail.gandi.net\n\t[217.70.178.230])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3DBD260B31\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 30 Dec 2018 11:07:53 +0100 (CET)","from uno.localdomain (unknown [37.176.180.32])\n\t(Authenticated sender: jacopo@jmondi.org)\n\tby relay10.mail.gandi.net (Postfix) with ESMTPSA id A4768240002;\n\tSun, 30 Dec 2018 10:07:52 +0000 (UTC)"],"Date":"Sun, 30 Dec 2018 11:07:54 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20181230100754.ksjksblder6kvzjs@uno.localdomain>","References":"<20181229032855.26249-1-niklas.soderlund@ragnatech.se>\n\t<20181229032855.26249-7-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"uy5gktzoyt4ca4fw\"","Content-Disposition":"inline","In-Reply-To":"<20181229032855.26249-7-niklas.soderlund@ragnatech.se>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH v2 06/12] libcamera:\n\tdevice_enumerator: add DeviceEnumeratorUdev class","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Sun, 30 Dec 2018 10:07:53 -0000"}},{"id":137,"web_url":"https://patchwork.libcamera.org/comment/137/","msgid":"<6641997.szHRQQ79HW@avalon>","date":"2018-12-30T20:41:09","subject":"Re: [libcamera-devel] [PATCH v2 06/12] libcamera:\n\tdevice_enumerator: add DeviceEnumeratorUdev class","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Niklas,\n\nThank you for the patch.\n\nOn Saturday, 29 December 2018 05:28:49 EET Niklas Söderlund wrote:\n> Provide a DeviceEnumeratorUdev class which is a specialization\n> of DeviceEnumerator which uses udev to enumerate information in the\n> system.\n> \n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n> * Changes since v1\n> - s/NULL/nullptr/\n> - s/foo == NULL/!foo/\n> - Break log messages to not exceed 80 chars.\n> - Return a std::string from lookupDevnode().\n> ---\n>  src/libcamera/device_enumerator.cpp       | 98 +++++++++++++++++++++++\n>  src/libcamera/include/device_enumerator.h | 15 ++++\n>  2 files changed, 113 insertions(+)\n> \n> diff --git a/src/libcamera/device_enumerator.cpp\n> b/src/libcamera/device_enumerator.cpp index\n> df9e89a1afeecda1..3cafd0d3703dac99 100644\n> --- a/src/libcamera/device_enumerator.cpp\n> +++ b/src/libcamera/device_enumerator.cpp\n> @@ -266,4 +266,102 @@ DeviceInfo *DeviceEnumerator::search(DeviceMatch &dm)\n> const return info;\n>  }\n> \n> +/*\n> ---------------------------------------------------------------------------\n> -- + * Enumerator Udev\n> + */\n> +\n> +DeviceEnumeratorUdev::DeviceEnumeratorUdev()\n> +\t: udev_(nullptr)\n> +{\n> +}\n> +\n> +DeviceEnumeratorUdev::~DeviceEnumeratorUdev()\n> +{\n> +\tif (udev_)\n> +\t\tudev_unref(udev_);\n> +}\n> +\n> +int DeviceEnumeratorUdev::init()\n> +{\n> +\tif (udev_)\n> +\t\treturn -EBUSY;\n> +\n> +\tudev_ = udev_new();\n> +\tif (!udev_)\n> +\t\treturn -ENODEV;\n> +\n> +\treturn 0;\n> +}\n> +\n> +int DeviceEnumeratorUdev::enumerate()\n> +{\n> +\tstruct udev_enumerate *udev_enum = nullptr;\n> +\tstruct udev_list_entry *ents, *ent;\n> +\tint ret;\n> +\n> +\tudev_enum = udev_enumerate_new(udev_);\n> +\tif (!udev_enum)\n> +\t\treturn -ENOMEM;\n> +\n> +\tret = udev_enumerate_add_match_subsystem(udev_enum, \"media\");\n> +\tif (ret < 0)\n> +\t\tgoto done;\n> +\n> +\tret = udev_enumerate_scan_devices(udev_enum);\n> +\tif (ret < 0)\n> +\t\tgoto done;\n> +\n> +\tents = udev_enumerate_get_list_entry(udev_enum);\n> +\tif (!ents)\n> +\t\tgoto done;\n> +\n> +\tudev_list_entry_foreach(ent, ents) {\n> +\t\tstruct udev_device *dev;\n> +\t\tconst char *devnode;\n> +\t\tconst char *syspath = udev_list_entry_get_name(ent);\n> +\n> +\t\tdev = udev_device_new_from_syspath(udev_, syspath);\n> +\t\tif (!dev) {\n> +\t\t\tLOG(Error) << \"Failed to get device for '\" <<\n> +\t\t\t\t   syspath << \"', skipping\";\n> +\t\t\tcontinue;\n> +\t\t}\n> +\n> +\t\tdevnode = udev_device_get_devnode(dev);\n> +\t\tif (!devnode) {\n> +\t\t\tudev_device_unref(dev);\n> +\t\t\tret = -ENODEV;\n> +\t\t\tgoto done;\n> +\t\t}\n> +\n> +\t\taddDevice(devnode);\n> +\n> +\t\tudev_device_unref(dev);\n> +\t}\n> +done:\n> +\tudev_enumerate_unref(udev_enum);\n> +\treturn ret >= 0 ? 0 : ret;\n> +}\n> +\n> +std::string DeviceEnumeratorUdev::lookupDevnode(int major, int minor)\n> +{\n> +\tstruct udev_device *device;\n> +\tconst char *name;\n> +\tdev_t devnum;\n> +\tstd::string devnode(\"\");\n\nWouldn't std::string devnode(); be a little more efficient as it won't need to \nparse the const char * ?\n\n> +\n> +\tdevnum = makedev(major, minor);\n> +\tdevice = udev_device_new_from_devnum(udev_, 'c', devnum);\n> +\tif (!device)\n> +\t\treturn \"\";\n\nSame here, return std::string() ?\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +\n> +\tname = udev_device_get_devnode(device);\n> +\tif (name)\n> +\t\tdevnode = name;\n> +\n> +\tudev_device_unref(device);\n> +\n> +\treturn devnode;\n> +}\n> +\n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/include/device_enumerator.h\n> b/src/libcamera/include/device_enumerator.h index\n> 1f8cef3311012308..5348e6cf583dbd15 100644\n> --- a/src/libcamera/include/device_enumerator.h\n> +++ b/src/libcamera/include/device_enumerator.h\n> @@ -75,6 +75,21 @@ private:\n>  \tvirtual std::string lookupDevnode(int major, int minor) = 0;\n>  };\n> \n> +class DeviceEnumeratorUdev: public DeviceEnumerator\n> +{\n> +public:\n> +\tDeviceEnumeratorUdev();\n> +\t~DeviceEnumeratorUdev();\n> +\n> +\tint init() final;\n> +\tint enumerate() final;\n> +\n> +private:\n> +\tstruct udev *udev_;\n> +\n> +\tstd::string lookupDevnode(int major, int minor) final;\n> +};\n> +\n>  } /* namespace libcamera */\n> \n>  #endif\t/* __LIBCAMERA_DEVICE_ENUMERATOR_H__ */","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 17B8B600CC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 30 Dec 2018 21:40:14 +0100 (CET)","from avalon.localnet (unknown\n\t[IPv6:2a02:a03f:3ad5:900:7d1d:858b:75d5:534d])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id BA1EF50A;\n\tSun, 30 Dec 2018 21:40:12 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1546202412;\n\tbh=1eEpC1yUXy5ywS7TSxvYYm8OCLHjBO+rQ7bwttr5xYs=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=AgwPy4vOKnMHWwNgDUoLFYtqI7PaE5BIxm8inwlLpStGBBrIWYKtUGyypomJJlv0p\n\tQDqpBzan+yutcsIorZxz0bWrM9fpvRZim8XBlYDuhXpOijWxFUviqZ7JGzv3Awi46k\n\twjYxOJlAFdwKjQELEQWSLpCJTcz3v79Vc4Mi8JrU=","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","Date":"Sun, 30 Dec 2018 22:41:09 +0200","Message-ID":"<6641997.szHRQQ79HW@avalon>","Organization":"Ideas on Board Oy","In-Reply-To":"<20181229032855.26249-7-niklas.soderlund@ragnatech.se>","References":"<20181229032855.26249-1-niklas.soderlund@ragnatech.se>\n\t<20181229032855.26249-7-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","Content-Type":"text/plain; charset=\"iso-8859-1\"","Subject":"Re: [libcamera-devel] [PATCH v2 06/12] libcamera:\n\tdevice_enumerator: add DeviceEnumeratorUdev class","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Sun, 30 Dec 2018 20:40:14 -0000"}},{"id":138,"web_url":"https://patchwork.libcamera.org/comment/138/","msgid":"<20181230210053.GE31866@bigcity.dyn.berto.se>","date":"2018-12-30T21:00:53","subject":"Re: [libcamera-devel] [PATCH v2 06/12] libcamera:\n\tdevice_enumerator: add DeviceEnumeratorUdev class","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Laurent,\n\nThanks for your feedback.\n\nOn 2018-12-30 22:41:09 +0200, Laurent Pinchart wrote:\n> Hi Niklas,\n> \n> Thank you for the patch.\n> \n> On Saturday, 29 December 2018 05:28:49 EET Niklas Söderlund wrote:\n> > Provide a DeviceEnumeratorUdev class which is a specialization\n> > of DeviceEnumerator which uses udev to enumerate information in the\n> > system.\n> > \n> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > ---\n> > * Changes since v1\n> > - s/NULL/nullptr/\n> > - s/foo == NULL/!foo/\n> > - Break log messages to not exceed 80 chars.\n> > - Return a std::string from lookupDevnode().\n> > ---\n> >  src/libcamera/device_enumerator.cpp       | 98 +++++++++++++++++++++++\n> >  src/libcamera/include/device_enumerator.h | 15 ++++\n> >  2 files changed, 113 insertions(+)\n> > \n> > diff --git a/src/libcamera/device_enumerator.cpp\n> > b/src/libcamera/device_enumerator.cpp index\n> > df9e89a1afeecda1..3cafd0d3703dac99 100644\n> > --- a/src/libcamera/device_enumerator.cpp\n> > +++ b/src/libcamera/device_enumerator.cpp\n> > @@ -266,4 +266,102 @@ DeviceInfo *DeviceEnumerator::search(DeviceMatch &dm)\n> > const return info;\n> >  }\n> > \n> > +/*\n> > ---------------------------------------------------------------------------\n> > -- + * Enumerator Udev\n> > + */\n> > +\n> > +DeviceEnumeratorUdev::DeviceEnumeratorUdev()\n> > +\t: udev_(nullptr)\n> > +{\n> > +}\n> > +\n> > +DeviceEnumeratorUdev::~DeviceEnumeratorUdev()\n> > +{\n> > +\tif (udev_)\n> > +\t\tudev_unref(udev_);\n> > +}\n> > +\n> > +int DeviceEnumeratorUdev::init()\n> > +{\n> > +\tif (udev_)\n> > +\t\treturn -EBUSY;\n> > +\n> > +\tudev_ = udev_new();\n> > +\tif (!udev_)\n> > +\t\treturn -ENODEV;\n> > +\n> > +\treturn 0;\n> > +}\n> > +\n> > +int DeviceEnumeratorUdev::enumerate()\n> > +{\n> > +\tstruct udev_enumerate *udev_enum = nullptr;\n> > +\tstruct udev_list_entry *ents, *ent;\n> > +\tint ret;\n> > +\n> > +\tudev_enum = udev_enumerate_new(udev_);\n> > +\tif (!udev_enum)\n> > +\t\treturn -ENOMEM;\n> > +\n> > +\tret = udev_enumerate_add_match_subsystem(udev_enum, \"media\");\n> > +\tif (ret < 0)\n> > +\t\tgoto done;\n> > +\n> > +\tret = udev_enumerate_scan_devices(udev_enum);\n> > +\tif (ret < 0)\n> > +\t\tgoto done;\n> > +\n> > +\tents = udev_enumerate_get_list_entry(udev_enum);\n> > +\tif (!ents)\n> > +\t\tgoto done;\n> > +\n> > +\tudev_list_entry_foreach(ent, ents) {\n> > +\t\tstruct udev_device *dev;\n> > +\t\tconst char *devnode;\n> > +\t\tconst char *syspath = udev_list_entry_get_name(ent);\n> > +\n> > +\t\tdev = udev_device_new_from_syspath(udev_, syspath);\n> > +\t\tif (!dev) {\n> > +\t\t\tLOG(Error) << \"Failed to get device for '\" <<\n> > +\t\t\t\t   syspath << \"', skipping\";\n> > +\t\t\tcontinue;\n> > +\t\t}\n> > +\n> > +\t\tdevnode = udev_device_get_devnode(dev);\n> > +\t\tif (!devnode) {\n> > +\t\t\tudev_device_unref(dev);\n> > +\t\t\tret = -ENODEV;\n> > +\t\t\tgoto done;\n> > +\t\t}\n> > +\n> > +\t\taddDevice(devnode);\n> > +\n> > +\t\tudev_device_unref(dev);\n> > +\t}\n> > +done:\n> > +\tudev_enumerate_unref(udev_enum);\n> > +\treturn ret >= 0 ? 0 : ret;\n> > +}\n> > +\n> > +std::string DeviceEnumeratorUdev::lookupDevnode(int major, int minor)\n> > +{\n> > +\tstruct udev_device *device;\n> > +\tconst char *name;\n> > +\tdev_t devnum;\n> > +\tstd::string devnode(\"\");\n> \n> Wouldn't std::string devnode(); be a little more efficient as it won't need to \n> parse the const char * ?\n\nstd::string devnode();\n\nWould be considered a function declaration and is not valid, confusing I \nknow. One option is\n\nstd::string devnode = std::string()\n\nThis would create a copy, but IIRC the compiler is allowed to optimize \naway the copy. In any case it's better so I'm going with this for now.\n\n> \n> > +\n> > +\tdevnum = makedev(major, minor);\n> > +\tdevice = udev_device_new_from_devnum(udev_, 'c', devnum);\n> > +\tif (!device)\n> > +\t\treturn \"\";\n> \n> Same here, return std::string() ?\n\nHere it make sens, using this.\n\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nThanks!\n\n> \n> > +\n> > +\tname = udev_device_get_devnode(device);\n> > +\tif (name)\n> > +\t\tdevnode = name;\n> > +\n> > +\tudev_device_unref(device);\n> > +\n> > +\treturn devnode;\n> > +}\n> > +\n> >  } /* namespace libcamera */\n> > diff --git a/src/libcamera/include/device_enumerator.h\n> > b/src/libcamera/include/device_enumerator.h index\n> > 1f8cef3311012308..5348e6cf583dbd15 100644\n> > --- a/src/libcamera/include/device_enumerator.h\n> > +++ b/src/libcamera/include/device_enumerator.h\n> > @@ -75,6 +75,21 @@ private:\n> >  \tvirtual std::string lookupDevnode(int major, int minor) = 0;\n> >  };\n> > \n> > +class DeviceEnumeratorUdev: public DeviceEnumerator\n> > +{\n> > +public:\n> > +\tDeviceEnumeratorUdev();\n> > +\t~DeviceEnumeratorUdev();\n> > +\n> > +\tint init() final;\n> > +\tint enumerate() final;\n> > +\n> > +private:\n> > +\tstruct udev *udev_;\n> > +\n> > +\tstd::string lookupDevnode(int major, int minor) final;\n> > +};\n> > +\n> >  } /* namespace libcamera */\n> > \n> >  #endif\t/* __LIBCAMERA_DEVICE_ENUMERATOR_H__ */\n> \n> -- \n> Regards,\n> \n> Laurent Pinchart\n> \n> \n>","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-lj1-x242.google.com (mail-lj1-x242.google.com\n\t[IPv6:2a00:1450:4864:20::242])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C6E73600CC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 30 Dec 2018 22:00:55 +0100 (CET)","by mail-lj1-x242.google.com with SMTP id s5-v6so22513828ljd.12\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 30 Dec 2018 13:00:55 -0800 (PST)","from localhost (89-233-230-99.cust.bredband2.com. [89.233.230.99])\n\tby smtp.gmail.com with ESMTPSA id\n\ta20-v6sm9838493ljf.28.2018.12.30.13.00.54\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tSun, 30 Dec 2018 13:00:54 -0800 (PST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to\n\t:user-agent; bh=h4m36URPCYitQCoN0o5xoFbriJKmeJQLM1LRJYm6p5Y=;\n\tb=ZSn9D90eyDZsIlOkWpYWXUJYPxGmNfZTZSp2POLwfFyYPAkskqyOLhKw32NNBJQT7e\n\tuzxa03OW1zRNzBe3+EEl+kUkdSCzBvCH4jrboA204Y94EM0dfOdTcF+RQXXYxYt3EDCJ\n\thx914E2m/SNKnGuW7ShqsODsDamUJXwaWqqidmHV8+9gBNvxn5NgXdDLrKeryx07Xyrs\n\tsMg0EwB1+nz5dsy9D6YSQIL+rHF+Ezl361Pyn0GKlon4LTW266D319MwVmAvOiPRGl8y\n\tndk/pwT1R9bL1Ie7Qnu1mWgBhS+wV9RTe05RnDXDZYg1DQK5f64OyDE2z9E5BgfRZ5gt\n\tTkoA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to:user-agent;\n\tbh=h4m36URPCYitQCoN0o5xoFbriJKmeJQLM1LRJYm6p5Y=;\n\tb=EHjBts2AH0vRQkYts9SnrhAb8lrDvHKsREB6RrkMKI3rnw5No3zIXPhIv08s+KpAwP\n\tsYvA5W39VcQkHavBaBNLGUxxjOnfsQE1hra0UsoW3Go8HTZZUE7yOGmXyqCIxA9nIqo3\n\tuh8pJe8n3awIHcCV71wW39kNxKvUQ1Z8D1PYIjruEJZT34vhTecbVlbIxjG4pevQs0l9\n\tmQWRXIrq6EWfFZ5taE0/hiTvFGPt19pjNOO2cvqwMAnrCG93FV7oDJVjPgs8szGqhAvF\n\tWwrAJ/jLaTiLqFzuvC+7fiuWudZk6juNpFxAJRUuEPj0MKqlrevJX2pLJWi3HgORvmex\n\tb0gA==","X-Gm-Message-State":"AJcUukcRIcvouar85G2EunWYioOX3UjQoBGs3Ir4qpMK3hKIvSxpY6Mz\n\ti3Ihye0oz2EB9gMPsPeTzbQNlw==","X-Google-Smtp-Source":"ALg8bN7hYonmd90tsMSuEEd/tD3HhFmnG/zGPe11udeFpHVeS79HoLc8IqB6RuStNW4du76dwEb1pg==","X-Received":"by 2002:a2e:9715:: with SMTP id\n\tr21-v6mr20120665lji.30.1546203655054; \n\tSun, 30 Dec 2018 13:00:55 -0800 (PST)","Date":"Sun, 30 Dec 2018 22:00:53 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20181230210053.GE31866@bigcity.dyn.berto.se>","References":"<20181229032855.26249-1-niklas.soderlund@ragnatech.se>\n\t<20181229032855.26249-7-niklas.soderlund@ragnatech.se>\n\t<6641997.szHRQQ79HW@avalon>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<6641997.szHRQQ79HW@avalon>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v2 06/12] libcamera:\n\tdevice_enumerator: add DeviceEnumeratorUdev class","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Sun, 30 Dec 2018 21:00:56 -0000"}}]