Kaynağa Gözat

udevmonitor: NCDUdevMonitor: use badvpn_find_program() to find stdbuf and udevadm programs. Fixes breakage on Arch
Linux where udevadm moved from /sbin to /usr/bin.

ambrop7 14 yıl önce
ebeveyn
işleme
0256a55928
1 değiştirilmiş dosya ile 22 ekleme ve 6 silme
  1. 22 6
      udevmonitor/NCDUdevMonitor.c

+ 22 - 6
udevmonitor/NCDUdevMonitor.c

@@ -30,13 +30,12 @@
 #include <stddef.h>
 
 #include <base/BLog.h>
+#include <misc/find_program.h>
 
 #include <udevmonitor/NCDUdevMonitor.h>
 
 #include <generated/blog_channel_NCDUdevMonitor.h>
 
-#define STDBUF_EXEC "/usr/bin/stdbuf"
-#define UDEVADM_EXEC "/sbin/udevadm"
 #define PARSER_BUF_SIZE 16384
 #define PARSER_MAX_PROPERTIES 256
 
@@ -112,10 +111,22 @@ int NCDUdevMonitor_Init (NCDUdevMonitor *o, BReactor *reactor, BProcessManager *
     o->handler_event = handler_event;
     o->handler_error = handler_error;
     
+    // find programs
+    char *stdbuf_exec = badvpn_find_program("stdbuf");
+    char *udevadm_exec = badvpn_find_program("udevadm");
+    if (!stdbuf_exec) {
+        BLog(BLOG_ERROR, "failed to find stdbuf program");
+        goto fail0;
+    }
+    if (!udevadm_exec) {
+        BLog(BLOG_ERROR, "failed to find udevadm program");
+        goto fail0;
+    }
+    
     // construct arguments
-    const char *argv_monitor_udev[] = {STDBUF_EXEC, "-o", "L", UDEVADM_EXEC, "monitor", "--udev", "--environment", NULL};
-    const char *argv_monitor_kernel[] = {STDBUF_EXEC, "-o", "L", UDEVADM_EXEC, "monitor", "--kernel", "--environment", NULL};
-    const char *argv_info[] = {STDBUF_EXEC, "-o", "L", UDEVADM_EXEC, "info", "--query", "all", "--export-db", NULL};
+    const char *argv_monitor_udev[] = {stdbuf_exec, "-o", "L", udevadm_exec, "monitor", "--udev", "--environment", NULL};
+    const char *argv_monitor_kernel[] = {stdbuf_exec, "-o", "L", udevadm_exec, "monitor", "--kernel", "--environment", NULL};
+    const char *argv_info[] = {stdbuf_exec, "-o", "L", udevadm_exec, "info", "--query", "all", "--export-db", NULL};
     
     // choose arguments based on mode
     const char **argv;
@@ -149,7 +160,7 @@ int NCDUdevMonitor_Init (NCDUdevMonitor *o, BReactor *reactor, BProcessManager *
     }
     
     // start process
-    if (!BInputProcess_Start(&o->process, STDBUF_EXEC, (char **)argv, NULL)) {
+    if (!BInputProcess_Start(&o->process, stdbuf_exec, (char **)argv, NULL)) {
         BLog(BLOG_ERROR, "BInputProcess_Start failed");
         goto fail2;
     }
@@ -158,6 +169,9 @@ int NCDUdevMonitor_Init (NCDUdevMonitor *o, BReactor *reactor, BProcessManager *
     o->process_running = 1;
     o->input_running = 1;
     
+    free(udevadm_exec);
+    free(stdbuf_exec);
+    
     DebugError_Init(&o->d_err, BReactor_PendingGroup(reactor));
     DebugObject_Init(&o->d_obj);
     return 1;
@@ -168,6 +182,8 @@ fail1:
     StreamRecvConnector_Free(&o->connector);
     BInputProcess_Free(&o->process);
 fail0:
+    free(udevadm_exec);
+    free(stdbuf_exec);
     return 0;
 }