]> granicus.if.org Git - shadow/commitdiff
libmisc/btrfs: find btrfs command
authorSerge Hallyn <shallyn@cisco.com>
Sat, 4 May 2019 02:33:23 +0000 (19:33 -0700)
committerSerge Hallyn <shallyn@cisco.com>
Sat, 4 May 2019 05:39:53 +0000 (22:39 -0700)
Ubuntu for instance keeps it in /bin, not /sbin.  So look
for it in our usual places.

Signed-off-by: Serge Hallyn <shallyn@cisco.com>
libmisc/btrfs.c

index 7236454a058db73976ad96fc5273f145fa632972..f6024bfb6d7995f687db98c7161a5ea9f733cebf 100644 (file)
@@ -1,14 +1,36 @@
 #include <linux/btrfs_tree.h>
 #include <linux/magic.h>
 #include <sys/statfs.h>
+#include <stdbool.h>
 
 #include "prototypes.h"
 
+static bool path_exists(const char *p)
+{
+       int ret;
+       struct stat sb;
+
+       return stat(p, &sb) == 0;
+}
+
+static const char *btrfs_cmd(void)
+{
+       const char *btrfs_paths[] = {"/sbin/btrfs",
+               "/bin/btrfs", "/usr/sbin/btrfs", "/usr/bin/btrfs", NULL};
+       const char *p;
+       int i;
+
+       for (i = 0, p = btrfs_paths[i]; p; i++, p = btrfs_paths[i])
+               if (path_exists(p))
+                       return p;
+
+       return NULL;
+}
 
 static int run_btrfs_subvolume_cmd(const char *subcmd, const char *arg1, const char *arg2)
 {
        int status = 0;
-       const char *cmd = "/sbin/btrfs";
+       const char *cmd = btrfs_cmd();
        const char *argv[] = {
                strrchr(cmd, '/'),
                "subvolume",