event: improve gpiod_line_event_get_fd()
authorBartosz Golaszewski <bartekgola@gmail.com>
Wed, 18 Oct 2017 15:16:07 +0000 (17:16 +0200)
committerBartosz Golaszewski <bartekgola@gmail.com>
Wed, 18 Oct 2017 15:16:07 +0000 (17:16 +0200)
Set errno to EINVAL when the user calls this routine for a line
requested for values. Verify correct behavior with a test case.

Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
src/lib/core.c
tests/tests-event.c

index d5bbe08447ca40b267c41850c84f0076827d07f4..fec7944ea3f13515541cc1198baaa3cf594c94cd 100644 (file)
@@ -988,7 +988,12 @@ int gpiod_line_event_read(struct gpiod_line *line,
 
 int gpiod_line_event_get_fd(struct gpiod_line *line)
 {
-       return line_get_state(line) == LINE_REQUESTED_EVENTS ? line->fd : -1;
+       if (line_get_state(line) != LINE_REQUESTED_EVENTS) {
+               errno = EINVAL;
+               return -1;
+       }
+
+       return line->fd;
 }
 
 int gpiod_line_event_read_fd(int fd, struct gpiod_line_event *event)
index 423c6d0d684b27e97c3030bb95cae30a8045de47..b4e3419ed645ea160fcedf0be54768221219878c 100644 (file)
@@ -12,6 +12,8 @@
 
 #include "gpiod-test.h"
 
+#include <errno.h>
+
 static void event_rising_edge_good(void)
 {
        TEST_CLEANUP(test_close_chip) struct gpiod_chip *chip = NULL;
@@ -203,3 +205,26 @@ static void event_wait_multiple(void)
 TEST_DEFINE(event_wait_multiple,
            "events - wait for events on multiple lines",
            0, { 8 });
+
+static void event_get_fd_when_values_requested(void)
+{
+       TEST_CLEANUP(test_close_chip) struct gpiod_chip *chip = NULL;
+       struct gpiod_line *line;
+       int rv, fd;
+
+       chip = gpiod_chip_open(test_chip_path(0));
+       TEST_ASSERT_NOT_NULL(chip);
+
+       line = gpiod_chip_get_line(chip, 3);
+       TEST_ASSERT_NOT_NULL(line);
+
+       rv = gpiod_line_request_input(line, TEST_CONSUMER);
+       TEST_ASSERT_RET_OK(rv);
+
+       fd = gpiod_line_event_get_fd(line);
+       TEST_ASSERT_EQ(fd, -1);
+       TEST_ASSERT_ERRNO_IS(EINVAL);
+}
+TEST_DEFINE(event_get_fd_when_values_requested,
+           "events - gpiod_line_event_get_fd(): line requested for values",
+           0, { 8 });