Try to find udevadm both in /bin/ and in /sbin/
authorStas Cymbalov <dummyunit@gmail.com>
Sun, 2 Apr 2017 22:02:27 +0000 (01:02 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sun, 16 Apr 2017 08:09:29 +0000 (11:09 +0300)
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

diff --git a/main.c b/main.c
index 241a0b407e213e36544e23b647fbc485ab1c4c10..8f939e60696764d39be3e56558026a779a20d8c5 100644 (file)
--- 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)