From c82820575ca9b801689e878974af15565075ae49 Mon Sep 17 00:00:00 2001 From: Stas Cymbalov Date: Mon, 3 Apr 2017 01:02:27 +0300 Subject: [PATCH] Try to find udevadm both in /bin/ and in /sbin/ Determine where udevadm is located (/bin/ or /sbin/) on the first call to get_device_propertties(). Report error if exec() for udevadm fails. --- main.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index 241a0b4..8f939e6 100644 --- a/main.c +++ b/main.c @@ -83,6 +83,7 @@ the array. */ Property *get_device_properties(char *node) { + static const char *udevadm_path = NULL; int pid; int pipe_fd[2]; char *buf; @@ -92,6 +93,21 @@ Property *get_device_properties(char *node) Property *props = NULL; int n_props = 0; + if(!udevadm_path) + { + udevadm_path = "/bin/udevadm"; + if(access(udevadm_path, X_OK)<0) + { + udevadm_path = "/sbin/udevadm"; + if(access(udevadm_path, X_OK)<0) + { + udevadm_path = NULL; + perror("Unable to find udevadm"); + return NULL; + } + } + } + pipe(pipe_fd); pid = fork(); @@ -104,7 +120,9 @@ Property *get_device_properties(char *node) close(pipe_fd[0]); dup2(pipe_fd[1], 1); - execl("/sbin/udevadm", "udevadm", "info", "-q", "property", "-n", node, NULL); + if(execl(udevadm_path, "udevadm", "info", "-q", "property", "-n", node, NULL)<0) + fprintf(stderr, "Unable to execute %s: %s\n", udevadm_path, strerror(errno)); + _exit(1); } else if(pid<0) -- 2.45.2