Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 2 Dec 2017 07:29:25 +0000 (UTC)
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r326459 - head/usr.sbin/efidp
Message-ID:  <201712020729.vB27TPSv015152@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: imp
Date: Sat Dec  2 07:29:24 2017
New Revision: 326459
URL: https://svnweb.freebsd.org/changeset/base/326459

Log:
  Add -u (--to-unix) and -e (--to-efi) to convert unix or efi paths to
  the other.
  
  Sponsored by: Netflix

Modified:
  head/usr.sbin/efidp/Makefile
  head/usr.sbin/efidp/efidp.8
  head/usr.sbin/efidp/efidp.c

Modified: head/usr.sbin/efidp/Makefile
==============================================================================
--- head/usr.sbin/efidp/Makefile	Sat Dec  2 07:29:19 2017	(r326458)
+++ head/usr.sbin/efidp/Makefile	Sat Dec  2 07:29:24 2017	(r326459)
@@ -3,6 +3,6 @@
 PROG=	efidp
 MAN=	efidp.8
 
-LIBADD= efivar
+LIBADD= efivar geom
 
 .include <bsd.prog.mk>

Modified: head/usr.sbin/efidp/efidp.8
==============================================================================
--- head/usr.sbin/efidp/efidp.8	Sat Dec  2 07:29:19 2017	(r326458)
+++ head/usr.sbin/efidp/efidp.8	Sat Dec  2 07:29:24 2017	(r326459)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd November 21, 2017
+.Dd December 1, 2017
 .Dt EFIDP 8
 .Os
 .Sh NAME
@@ -46,15 +46,24 @@ Specification.
 .Bl -tag -width 20m
 .It Fl f Fl -format
 Formats a binary UEFI Device Path into its canonical UTF-8 textual form.
-A binary Device Path can be no longer than 8192 bytes.
-The textual form must fit into 4096 bytes.
+A binary Device Path can be no longer than 65536 bytes.
+The textual form must fit into 65536 bytes.
+Multiple binary device paths may be specified.
 .It Fl p Fl -parse
 Parses a UEFI Device Path UTF-8 specification and outputs the binary
 Device Path form.
 Only one device path is parsed, even if there are multiple present in
 the input.
 Leading white space is ignored.
-The resulting binary Device Path can be no longer than 8192 bytes.
+The resulting binary Device Path can be no longer than 65536 bytes.
+Multiple lines may be specified.
+Each one will be translated.
+.It Fl e Fl --to-efi
+Translate a Unix file path to an EFI Device Path.
+The output is the textual representation of the EFI Device Path.
+.It Fl u Fl --to-unix
+Translate an EFI device path to a Unix file path.
+The input is the textual representation of the EFI Device Path.
 .El
 .Sh SEE ALSO
 Appendix A of the UEFI specification has the format for GUIDs.

Modified: head/usr.sbin/efidp/efidp.c
==============================================================================
--- head/usr.sbin/efidp/efidp.c	Sat Dec  2 07:29:19 2017	(r326458)
+++ head/usr.sbin/efidp/efidp.c	Sat Dec  2 07:29:24 2017	(r326459)
@@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$");
 #include <efivar.h>
 #include <efivar-dp.h>
 #include <err.h>
+#include <errno.h>
 #include <getopt.h>
 #include <stddef.h>
 #include <stdio.h>
@@ -42,19 +43,21 @@ __FBSDID("$FreeBSD$");
 
 /* options descriptor */
 static struct option longopts[] = {
+	{ "to-unix",		no_argument,		NULL,	'u' },
+	{ "to-efi",		no_argument,		NULL,	'e' },
 	{ "format",		no_argument,		NULL,	'f' },
 	{ "parse",		no_argument,		NULL,	'p' },
 	{ NULL,			0,			NULL,	0 }
 };
 
 
-static int flag_format, flag_parse;
+static int flag_format, flag_parse, flag_unix, flag_efi;
 
 static void
 usage(void)
 {
 
-	errx(1, "efidp [-fp]");
+	errx(1, "efidp [-efpu]");
 }
 
 static ssize_t
@@ -86,15 +89,21 @@ parse_args(int argc, char **argv)
 {
 	int ch;
 
-	while ((ch = getopt_long(argc, argv, "fp",
+	while ((ch = getopt_long(argc, argv, "efpu",
 		    longopts, NULL)) != -1) {
 		switch (ch) {
+		case 'e':
+			flag_efi++;
+			break;
 		case 'f':
 			flag_format++;
 			break;
 		case 'p':
 			flag_parse++;
 			break;
+		case 'u':
+			flag_unix++;
+			break;
 		default:
 			usage();
 		}
@@ -105,7 +114,7 @@ parse_args(int argc, char **argv)
 	if (argc >= 1)
 		usage();
 	
-	if (flag_parse + flag_format != 1) {
+	if (flag_parse + flag_format + flag_efi + flag_unix != 1) {
 		warnx("Can only use one of -p (--parse), "
 		    "and -f (--format)");
 		usage();
@@ -125,49 +134,115 @@ trim(char *s)
 	return s;
 }
 
-int
-main(int argc, char **argv)
+static void
+unix_to_efi(void)
 {
 	char buffer[MAXSIZE];
+	char efi[MAXSIZE];
+	efidp dp;
+	char *walker;
+	int rv;
 
-	parse_args(argc, argv);
-	if (flag_format) {
-		ssize_t fmtlen;
-		ssize_t len;
-		void *data;
-		size_t dplen;
-		const_efidp dp;
-
-		len = read_file(STDIN_FILENO, &data);
-		if (len == -1)
-			err(1, "read");
-		dp = (const_efidp)data;
-		while (len > 0) {
-			dplen = efidp_size(dp);
-			fmtlen = efidp_format_device_path(buffer, sizeof(buffer),
-			    dp, dplen);
-			if (fmtlen > 0)
-				printf("%s\n", buffer);
-			len -= dplen;
-			dp = (const_efidp)((const char *)dp + dplen);
+	while (fgets(buffer, sizeof(buffer), stdin)) {
+		walker= trim(buffer);
+		rv = efivar_unix_path_to_device_path(walker, &dp);
+		if (rv != 0) {
+			errno = rv;
+			warn("Can't convert '%s' to efi", walker);
+			continue;
 		}
-		free(data);
-	} else if (flag_parse) {
-		efidp dp;
-		ssize_t dplen;
-		char *walker;
+		if (efidp_format_device_path(efi, sizeof(efi),
+		    dp, efidp_size(dp)) < 0) {
+			warnx("Can't format dp for '%s'", walker);
+			continue;
+		}
+		printf("%s\n", efi);
+	}
+}
 
-		dplen = MAXSIZE;
-		dp = malloc(dplen);
-		if (dp == NULL)
-			errx(1, "Can't allocate memory.");
-		while (fgets(buffer, sizeof(buffer), stdin)) {
-			walker= trim(buffer);
-			dplen = efidp_parse_device_path(walker, dp, dplen);
-			if (dplen == -1)
-				errx(1, "Can't parse %s", walker);
-			write(STDOUT_FILENO, dp, dplen);
+static void
+efi_to_unix(void)
+{
+	char buffer[MAXSIZE];
+	char dpbuf[MAXSIZE];
+	efidp dp;
+	size_t dplen;
+	char *walker, *dev, *relpath, *abspath;
+	int rv;
+
+	dp = (efidp)dpbuf;
+	while (fgets(buffer, sizeof(buffer), stdin)) {
+		walker= trim(buffer);
+		dplen = efidp_parse_device_path(walker, dp, sizeof(dpbuf));
+		rv = efivar_device_path_to_unix_path(dp, &dev, &relpath, &abspath);
+		if (rv == 0)
+			printf("%s:%s %s\n", dev, relpath, abspath);
+		else {
+			errno = rv;
+			warn("Can't convert '%s' to unix", walker);
 		}
-		free(dp);
 	}
+}
+
+static void
+format(void)
+{
+	char buffer[MAXSIZE];
+	ssize_t fmtlen;
+	ssize_t len;
+	void *data;
+	size_t dplen;
+	const_efidp dp;
+
+	len = read_file(STDIN_FILENO, &data);
+	if (len == -1)
+		err(1, "read");
+	dp = (const_efidp)data;
+	while (len > 0) {
+		dplen = efidp_size(dp);
+		fmtlen = efidp_format_device_path(buffer, sizeof(buffer),
+		    dp, dplen);
+		if (fmtlen > 0)
+			printf("%s\n", buffer);
+		len -= dplen;
+		dp = (const_efidp)((const char *)dp + dplen);
+	}
+	free(data);
+}
+
+static void
+parse(void)
+{
+	char buffer[MAXSIZE];
+	efidp dp;
+	ssize_t dplen;
+	char *walker;
+
+	dplen = MAXSIZE;
+	dp = malloc(dplen);
+	if (dp == NULL)
+		errx(1, "Can't allocate memory.");
+	while (fgets(buffer, sizeof(buffer), stdin)) {
+		walker= trim(buffer);
+		dplen = efidp_parse_device_path(walker, dp, dplen);
+		if (dplen == -1)
+			errx(1, "Can't parse %s", walker);
+		write(STDOUT_FILENO, dp, dplen);
+	}
+	free(dp);
+}
+
+int
+main(int argc, char **argv)
+{
+
+	parse_args(argc, argv);
+	if (flag_unix)
+		efi_to_unix();
+	else if (flag_efi)
+		unix_to_efi();
+	else if (flag_format)
+		format();
+	else if (flag_parse)
+		parse();
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201712020729.vB27TPSv015152>