diff --git a/include/libzutil.h b/include/libzutil.h
index 5b09279618..ef17bd5426 100644
--- a/include/libzutil.h
+++ b/include/libzutil.h
@@ -160,6 +160,9 @@ _LIBZUTIL_H void color_start(char *color);
_LIBZUTIL_H void color_end(void);
_LIBZUTIL_H int printf_color(char *color, char *format, ...);
+_LIBZUTIL_H const char *zfs_basename(const char *path);
+_LIBZUTIL_H ssize_t zfs_dirnamelen(const char *path);
+
#ifdef __cplusplus
}
#endif
diff --git a/lib/libzfs_core/libzfs_core.abi b/lib/libzfs_core/libzfs_core.abi
index f397929e1a..c54a994f79 100644
--- a/lib/libzfs_core/libzfs_core.abi
+++ b/lib/libzfs_core/libzfs_core.abi
@@ -253,11 +253,13 @@
+
+
@@ -1747,22 +1749,32 @@
-
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
@@ -1770,11 +1782,11 @@
-
-
+
+
-
+
@@ -1795,11 +1807,11 @@
-
+
-
+
@@ -1811,14 +1823,14 @@
-
+
-
+
-
+
@@ -1829,16 +1841,16 @@
-
+
-
+
-
+
-
+
@@ -1850,20 +1862,20 @@
-
+
-
+
-
+
-
-
-
+
+
+
-
+
@@ -1872,10 +1884,10 @@
-
+
-
+
@@ -1883,74 +1895,73 @@
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
+
-
+
@@ -1960,24 +1971,24 @@
-
-
+
+
-
+
-
+
-
+
-
+
@@ -2001,27 +2012,27 @@
-
-
-
+
+
+
-
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
@@ -2030,27 +2041,27 @@
-
+
-
+
-
+
-
-
+
+
-
+
-
+
@@ -2061,66 +2072,66 @@
-
+
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
+
+
+
+
+
-
+
-
+
-
-
+
+
@@ -2166,8 +2177,8 @@
-
-
+
+
@@ -2181,8 +2192,8 @@
-
-
+
+
@@ -2194,42 +2205,42 @@
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
@@ -2244,12 +2255,12 @@
-
+
-
-
+
+
@@ -2272,21 +2283,21 @@
-
-
+
+
-
+
-
+
-
+
-
+
-
+
@@ -2295,31 +2306,31 @@
-
-
-
+
+
+
-
-
+
+
-
+
-
+
-
+
-
+
@@ -2328,28 +2339,28 @@
-
+
-
+
-
+
-
-
+
+
-
+
@@ -2359,7 +2370,7 @@
-
+
@@ -2370,37 +2381,37 @@
-
-
+
+
-
+
-
+
-
+
-
+
-
+
@@ -2426,25 +2437,25 @@
-
-
-
-
+
+
+
+
-
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
@@ -2459,21 +2470,21 @@
-
-
+
+
-
-
+
+
-
+
@@ -2488,15 +2499,15 @@
-
+
-
+
-
+
-
+
@@ -2505,10 +2516,10 @@
-
+
-
-
+
+
@@ -2524,7 +2535,7 @@
-
+
@@ -2538,16 +2549,16 @@
-
+
-
+
-
+
-
+
@@ -2556,27 +2567,27 @@
-
+
-
+
-
+
-
-
-
-
+
+
+
+
-
+
-
+
@@ -2588,65 +2599,65 @@
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
+
-
+
@@ -2657,27 +2668,27 @@
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
@@ -2686,21 +2697,21 @@
-
+
-
+
-
+
-
-
+
+
@@ -2709,113 +2720,113 @@
-
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -2832,145 +2843,145 @@
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -2994,39 +3005,39 @@
-
-
-
-
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -3035,19 +3046,19 @@
-
+
-
+
-
+
-
+
-
-
+
+
@@ -3056,212 +3067,212 @@
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
-
-
+
+
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
-
-
-
-
-
+
-
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
+
-
+
@@ -3269,56 +3280,56 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
@@ -3327,603 +3338,602 @@
-
-
+
+
-
+
-
-
-
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
+
-
+
-
-
-
-
+
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
+
@@ -4006,16 +4016,16 @@
-
+
-
+
-
+
@@ -4030,7 +4040,7 @@
-
+
@@ -4045,7 +4055,7 @@
-
+
@@ -4149,7 +4159,7 @@
-
+
@@ -4179,13 +4189,13 @@
-
+
-
+
-
+
@@ -4199,7 +4209,7 @@
-
+
@@ -4214,10 +4224,10 @@
-
+
-
+
@@ -4236,8 +4246,8 @@
-
-
+
+
@@ -4330,7 +4340,7 @@
-
+
@@ -4351,23 +4361,23 @@
-
+
-
-
+
+
-
-
+
+
@@ -4447,7 +4457,7 @@
-
+
@@ -4456,7 +4466,7 @@
-
+
@@ -4469,7 +4479,7 @@
-
+
@@ -4505,7 +4515,7 @@
-
+
diff --git a/lib/libzutil/zutil_device_path.c b/lib/libzutil/zutil_device_path.c
index bcdc72baa6..435c444b24 100644
--- a/lib/libzutil/zutil_device_path.c
+++ b/lib/libzutil/zutil_device_path.c
@@ -31,6 +31,22 @@
#include
+/* Substring from after the last slash, or the string itself if none */
+const char *
+zfs_basename(const char *path)
+{
+ const char *bn = strrchr(path, '/');
+ return (bn ? bn + 1 : path);
+}
+
+/* Return index of last slash or -1 if none */
+ssize_t
+zfs_dirnamelen(const char *path)
+{
+ const char *end = strrchr(path, '/');
+ return (end ? end - path : -1);
+}
+
/*
* Given a shorthand device name check if a file by that name exists in any
* of the 'zpool_default_import_path' or ZPOOL_IMPORT_PATH directories. If