[PATCH xorg-gtest 3/6] device: split device comparison into a helper function

Chase Douglas chase.douglas at canonical.com
Wed Aug 29 13:07:31 PDT 2012


On 08/28/2012 11:14 PM, Peter Hutterer wrote:
> No functional changes, we'll re-use this though.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
>   src/device.cpp | 38 +++++++++++++++++++++++---------------
>   1 file changed, 23 insertions(+), 15 deletions(-)
>
> diff --git a/src/device.cpp b/src/device.cpp
> index ffe33c6..5868036 100644
> --- a/src/device.cpp
> +++ b/src/device.cpp
> @@ -62,6 +62,26 @@ static int _event_device_filter(const struct dirent *d) {
>     return (strncmp("event", d->d_name, sizeof("event") - 1) == 0);
>   }
>
> +static bool event_is_device(const std::string &path,
> +                            const std::string &devname,
> +                            time_t ctime) {
> +    char device_name[256];
> +    bool equal = false;
> +    int fd = open(path.c_str(), O_RDONLY);

There's no error check here. It's possible that the path has ceased to 
exist or can't be opened for some other reason.

In fact, in patch 6 there's the possibility of wait_for_notify() 
returning an empty string, which would be passed directly into this 
function.

> +
> +    if (ioctl(fd, EVIOCGNAME(sizeof(device_name)), device_name) != -1 &&
> +        devname.compare(device_name) == 0) {
> +      struct stat buf;
> +
> +      if (fstat(fd, &buf) == 0)
> +        if (buf.st_ctime >= ctime)
> +          equal = true;
> +    }
> +    close(fd);
> +
> +    return equal;
> +}
> +
>   void xorg::testing::evemu::Device::GuessDeviceNode(time_t ctime) {
>     struct dirent **event_devices = NULL;
>     int n_event_devices;
> @@ -73,21 +93,9 @@ void xorg::testing::evemu::Device::GuessDeviceNode(time_t ctime) {
>     for (int i = 0; i < n_event_devices && !found; i++) {
>       std::stringstream s;
>       s << DEV_INPUT_DIR << event_devices[i]->d_name;
> -
> -    int fd = open(s.str().c_str(), O_RDONLY);
> -    char device_name[256];
> -
> -    if (ioctl(fd, EVIOCGNAME(sizeof(device_name)), device_name) != -1 &&
> -        strcmp(device_name, evemu_get_name(d_->device)) == 0) {
> -      struct stat buf;
> -      if (fstat(fd, &buf) == 0) {
> -        if (buf.st_ctime >= ctime) {
> -          d_->device_node = s.str();
> -          found = true;
> -        }
> -      }
> -    }
> -    close(fd);
> +    found = event_is_device(s.str(), evemu_get_name(d_->device), ctime);
> +    if (found)
> +      d_->device_node = s.str();
>     }
>
>     if (!found)
>



More information about the xorg-devel mailing list