From: Bartosz Golaszewski <bartosz.golaszewski@xxxxxxxxxx> While we can get the list of requested offsets from a line-request object, this information lacks context if we don't provide any data about the GPIO chip the request was made on. Add a helper allowing users to get the path to the character device used to create the parent chip. Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@xxxxxxxxxx> --- include/gpiod.h | 9 +++++++++ lib/chip.c | 2 +- lib/internal.h | 3 ++- lib/line-request.c | 20 +++++++++++++++++++- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/include/gpiod.h b/include/gpiod.h index 3c13783..61f8ef1 100644 --- a/include/gpiod.h +++ b/include/gpiod.h @@ -1007,6 +1007,15 @@ gpiod_request_config_get_event_buffer_size(struct gpiod_request_config *config); */ void gpiod_line_request_release(struct gpiod_line_request *request); +/** + * @brief Get the path to the chip this request was made on. + * @param request Line request object. + * @return Path to the GPIO chip device. The returned pointer is valid for the + * lifetime of the request object and must not be freed by the caller. + */ +const char * +gpiod_line_request_get_chip_path(struct gpiod_line_request *request); + /** * @brief Get the number of lines in the request. * @param request Line request object. diff --git a/lib/chip.c b/lib/chip.c index 7d4d21e..e94d750 100644 --- a/lib/chip.c +++ b/lib/chip.c @@ -237,7 +237,7 @@ gpiod_chip_request_lines(struct gpiod_chip *chip, if (ret < 0) return NULL; - request = gpiod_line_request_from_uapi(&uapi_req); + request = gpiod_line_request_from_uapi(&uapi_req, chip->path); if (!request) { close(uapi_req.fd); return NULL; diff --git a/lib/internal.h b/lib/internal.h index ef9b17e..e9ada42 100644 --- a/lib/internal.h +++ b/lib/internal.h @@ -26,7 +26,8 @@ void gpiod_request_config_to_uapi(struct gpiod_request_config *config, int gpiod_line_config_to_uapi(struct gpiod_line_config *config, struct gpio_v2_line_request *uapi_cfg); struct gpiod_line_request * -gpiod_line_request_from_uapi(struct gpio_v2_line_request *uapi_req); +gpiod_line_request_from_uapi(struct gpio_v2_line_request *uapi_req, + const char *chip_path); int gpiod_edge_event_buffer_read_fd(int fd, struct gpiod_edge_event_buffer *buffer, size_t max_events); diff --git a/lib/line-request.c b/lib/line-request.c index e536355..99cbe2c 100644 --- a/lib/line-request.c +++ b/lib/line-request.c @@ -13,13 +13,15 @@ #include "internal.h" struct gpiod_line_request { + char *chip_path; unsigned int offsets[GPIO_V2_LINES_MAX]; size_t num_lines; int fd; }; struct gpiod_line_request * -gpiod_line_request_from_uapi(struct gpio_v2_line_request *uapi_req) +gpiod_line_request_from_uapi(struct gpio_v2_line_request *uapi_req, + const char *chip_path) { struct gpiod_line_request *request; @@ -28,6 +30,13 @@ gpiod_line_request_from_uapi(struct gpio_v2_line_request *uapi_req) return NULL; memset(request, 0, sizeof(*request)); + + request->chip_path = strdup(chip_path); + if (!request->chip_path) { + free(request); + return NULL; + } + request->fd = uapi_req->fd; request->num_lines = uapi_req->num_lines; memcpy(request->offsets, uapi_req->offsets, @@ -42,9 +51,18 @@ GPIOD_API void gpiod_line_request_release(struct gpiod_line_request *request) return; close(request->fd); + free(request->chip_path); free(request); } +GPIOD_API const char * +gpiod_line_request_get_chip_path(struct gpiod_line_request *request) +{ + assert(request); + + return request->chip_path; +} + GPIOD_API size_t gpiod_line_request_get_num_requested_lines(struct gpiod_line_request *request) { -- 2.39.2