devctl: add getpath command

Retrieves that path for a device. Different methods to enumerat the path
are supported, called locators.

Sponsored by:		Netflix
Reviewed by:		jhb
Differential Revision:	https://reviews.freebsd.org/D32747
This commit is contained in:
Warner Losh
2022-02-28 14:27:35 -07:00
parent b01f409ffe
commit f5366026ad
2 changed files with 39 additions and 1 deletions
+23 -1
View File
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd June 1, 2021
.Dd October 31, 2021
.Dt DEVCTL 8
.Os
.Sh NAME
@@ -74,6 +74,10 @@
.Cm reset
.Op Fl d
.Ar device
.Nm
.Cm getpath
.Ar locator
.Ar device
.Sh DESCRIPTION
The
.Nm
@@ -214,6 +218,24 @@ tried first; if failed or not implemented, power reset is tried.
.Pp
If you have detached or suspended a child device explicitly and then
do a reset, the child device will end up attached.
.It Xo Cm getpath
.Ar locator
.Ar device
.Xc
Prints the full path to the
.Ar device
using the
.Ar locator
method to get the path name.
Currently, only the
.Dq UEFI
and
.Dq FreeBSD
locators are implemented.
The UEFI locator constructs a path to the device using the rules
outlines for DEVICE_PATH in the UEFI standard.
The FreeBSD locator constructs a path back to the root of the tree
with the nodes separated by slashes.
.El
.Sh SEE ALSO
.Xr devctl 3 ,
+16
View File
@@ -84,6 +84,7 @@ usage(void)
" devctl freeze\n"
" devctl thaw\n"
" devctl reset [-d] device\n"
" devctl getpath locator device\n"
);
exit(1);
}
@@ -420,6 +421,21 @@ reset(int ac, char **av)
}
DEVCTL_COMMAND(top, reset, reset);
static int
getpath(int ac, char **av)
{
char *buffer = NULL;
if (ac != 3)
usage();
if (devctl_getpath(av[2], av[1], &buffer) < 0)
err(1, "Failed to get path via %s to %s", av[1], av[2]);
printf("%s\n", buffer);
free(buffer);
return (0);
}
DEVCTL_COMMAND(top, getpath, getpath);
int
main(int ac, char *av[])
{