Might be useful, particularly in scripting... Behaves like losetup.
Index: sbin/mount_vnd/mount_vnd.c =================================================================== RCS file: /cvs/src/sbin/mount_vnd/mount_vnd.c,v retrieving revision 1.20 diff -u -p -r1.20 mount_vnd.c --- sbin/mount_vnd/mount_vnd.c 24 Jan 2016 06:32:33 -0000 1.20 +++ sbin/mount_vnd/mount_vnd.c 28 Apr 2017 03:24:44 -0000 @@ -62,6 +62,7 @@ #define VND_CONFIG 1 #define VND_UNCONFIG 2 #define VND_GET 3 +#define VND_FIND 4 int verbose = 0; int run_mount_vnd = 0; @@ -70,12 +71,13 @@ __dead void usage(void); int config(char *, char *, int, struct disklabel *, char *, size_t); int getinfo(const char *); +int findfirst(void); char *get_pkcs_key(char *, char *); int main(int argc, char **argv) { - int ch, rv, action, opt_c, opt_k, opt_K, opt_l, opt_u; + int ch, rv, action, opt_c, opt_k, opt_K, opt_l, opt_u, opt_f = 0; char *key, *mntopts, *rounds, *saltopt; size_t keylen = 0; extern char *__progname; @@ -88,7 +90,7 @@ main(int argc, char **argv) key = mntopts = rounds = saltopt = NULL; action = VND_CONFIG; - while ((ch = getopt(argc, argv, "ckK:lo:S:t:uv")) != -1) { + while ((ch = getopt(argc, argv, "ckK:lo:S:t:uv:f")) != -1) { switch (ch) { case 'c': opt_c = 1; @@ -103,6 +105,9 @@ main(int argc, char **argv) case 'l': opt_l = 1; break; + case 'f': + opt_f = 1; + break; case 'o': mntopts = optarg; break; @@ -133,6 +138,8 @@ main(int argc, char **argv) if (opt_l) action = VND_GET; + else if (opt_f) + action = VND_FIND; else if (opt_u) action = VND_UNCONFIG; else @@ -173,6 +180,8 @@ main(int argc, char **argv) rv = config(argv[0], NULL, action, NULL, NULL, 0); else if (action == VND_GET) rv = getinfo(argc ? argv[0] : NULL); + else if (action == VND_FIND) + rv = findfirst(); else usage(); @@ -290,6 +299,35 @@ query: close(vd); return (0); +} + +int +findfirst(void) +{ + char *vname = DEFAULT_VND; + int vd; + struct vnd_user vnu; + + vd = opendev((char *)vname, O_RDONLY, OPENDEV_PART, NULL); + if (vd < 0) + err(1, "open: %s", vname); + + vnu.vnu_unit = -1; + +query: + if (ioctl(vd, VNDIOCGET, &vnu) == -1) + err(1, "ioctl: %s", vname); + + if (!vnu.vnu_ino) + fprintf(stdout, "vnd%d\n", vnu.vnu_unit); + else { + vnu.vnu_unit++; + goto query; + } + + close(vd); + + return (0); } int (cvs diff is dumb)