git: 77378d79f165 - main - stand/efi: Move to using common devparse()

From: Warner Losh <imp_at_FreeBSD.org>
Date: Wed, 30 Nov 2022 22:31:16 UTC
The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=77378d79f165b59296a0133eb910af55c8b2b600

commit 77378d79f165b59296a0133eb910af55c8b2b600
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2022-11-30 22:08:55 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2022-11-30 22:30:32 +0000

    stand/efi: Move to using common devparse()
    
    We no longer need to have to hand-code this for each boot loader since
    devparse() handles them all with dv_parsedev().
    
    Sponsored by:           Netflix
    Differential Revision:  https://reviews.freebsd.org/D37340
---
 stand/efi/libefi/devicename.c | 105 ++----------------------------------------
 1 file changed, 3 insertions(+), 102 deletions(-)

diff --git a/stand/efi/libefi/devicename.c b/stand/efi/libefi/devicename.c
index 73b1d783c01f..83f4e6e99201 100644
--- a/stand/efi/libefi/devicename.c
+++ b/stand/efi/libefi/devicename.c
@@ -39,8 +39,6 @@ __FBSDID("$FreeBSD$");
 #include <efilib.h>
 #include <efizfs.h>
 
-static int efi_parsedev(struct devdesc **, const char *, const char **);
-
 /*
  * Point (dev) at an allocated device specifier for the device matching the
  * path in (devspec). If it contains an explicit device specification,
@@ -57,110 +55,13 @@ efi_getdev(void **vdev, const char *devspec, const char **path)
 	 * use the current device instead.
 	 */
 	if (devspec == NULL || *devspec == '/' || !strchr(devspec, ':')) {
-		rv = efi_parsedev(dev, getenv("currdev"), NULL);
+		rv = devparse(dev, getenv("currdev"), NULL);
 		if (rv == 0 && path != NULL)
 			*path = devspec;
 		return (rv);
 	}
 
-	/* Parse the device name off the beginning of the devspec. */
-	return (efi_parsedev(dev, devspec, path));
-}
-
-/*
- * Point (dev) at an allocated device specifier matching the string version
- * at the beginning of (devspec).  Return a pointer to the remaining
- * text in (path).
- *
- * In all cases, the beginning of (devspec) is compared to the names
- * of known devices in the device switch, and then any following text
- * is parsed according to the rules applied to the device type.
- *
- * For disk-type devices, the syntax is:
- *
- * fs<unit>:
- */
-static int
-efi_parsedev(struct devdesc **dev, const char *devspec, const char **path)
-{
-	struct devdesc *idev;
-	struct devsw *dv;
-	int i, unit, err;
-	char *cp;
-	const char *np;
-
-	/* minimum length check */
-	if (strlen(devspec) < 2)
-		return (EINVAL);
-
-	/* look for a device that matches */
-	for (i = 0; devsw[i] != NULL; i++) {
-		dv = devsw[i];
-		if (!strncmp(devspec, dv->dv_name, strlen(dv->dv_name)))
-			break;
-	}
-	if (devsw[i] == NULL)
-		return (ENOENT);
-
-	np = devspec + strlen(dv->dv_name);
-	idev = NULL;
-	err = 0;
-
-	switch (dv->dv_type) {
-	case DEVT_NONE:
-		break;
-
-	case DEVT_DISK:
-		err = disk_parsedev(&idev, np, path);
-		if (err != 0)
-			goto fail;
-		break;
-
-#ifdef EFI_ZFS_BOOT
-	case DEVT_ZFS:
-		err = zfs_parsedev(&idev, np, path);
-		if (err != 0)
-			goto fail;
-		break;
-#endif
-	default:
-		idev = malloc(sizeof(struct devdesc));
-		if (idev == NULL)
-			return (ENOMEM);
-
-		unit = 0;
-		cp = (char *)np;
-
-		if (*np != '\0' && *np != ':') {
-			errno = 0;
-			unit = strtol(np, &cp, 0);
-			if (errno != 0 || cp == np) {
-				err = EUNIT;
-				goto fail;
-			}
-		}
-		if (*cp != '\0' && *cp != ':') {
-			err = EINVAL;
-			goto fail;
-		}
-
-		idev->d_unit = unit;
-		if (path != NULL)
-			*path = (*cp == 0) ? cp : cp + 1;
-		break;
-	}
-
-	idev->d_dev = dv;
-
-	if (dev != NULL)
-		*dev = idev;
-	else
-		free(idev);
-	return (0);
-
-fail:
-	free(idev);
-	return (err);
+	return (devparse(dev, devspec, path));
 }
 
 /*
@@ -172,7 +73,7 @@ efi_setcurrdev(struct env_var *ev, int flags, const void *value)
 	struct devdesc *ncurr;
 	int rv;
 
-	rv = efi_parsedev(&ncurr, value, NULL);
+	rv = devparse(&ncurr, value, NULL);
 	if (rv != 0)
 		return (rv);
 	free(ncurr);