Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Sep 2020 13:19:15 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r365037 - in head/bin/sh: . tests/builtins
Message-ID:  <202009011319.081DJFlS020384@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Tue Sep  1 13:19:15 2020
New Revision: 365037
URL: https://svnweb.freebsd.org/changeset/base/365037

Log:
  sh: Write absolute path in command -vV and type
  
  POSIX is pretty clear that command -v, command -V and type shall write
  absolute pathnames. Therefore, we need to prepend the current directory's
  name to relative pathnames.
  
  This can happen either when PATH contains a relative pathname or when the
  operand contains a slash but is not an absolute pathname.

Added:
  head/bin/sh/tests/builtins/command13.0   (contents, props changed)
  head/bin/sh/tests/builtins/command14.0   (contents, props changed)
  head/bin/sh/tests/builtins/type4.0   (contents, props changed)
Modified:
  head/bin/sh/exec.c
  head/bin/sh/tests/builtins/Makefile

Modified: head/bin/sh/exec.c
==============================================================================
--- head/bin/sh/exec.c	Tue Sep  1 12:21:17 2020	(r365036)
+++ head/bin/sh/exec.c	Tue Sep  1 13:19:15 2020	(r365037)
@@ -679,6 +679,21 @@ isfunc(const char *name)
 }
 
 
+static void
+print_absolute_path(const char *name)
+{
+	const char *pwd;
+
+	if (*name != '/' && (pwd = lookupvar("PWD")) != NULL && *pwd != '\0') {
+		out1str(pwd);
+		if (strcmp(pwd, "/") != 0)
+			outcslow('/', out1);
+	}
+	out1str(name);
+	outcslow('\n', out1);
+}
+
+
 /*
  * Shared code for the following builtin commands:
  *    type, command -v, command -V
@@ -745,20 +760,16 @@ typecmd_impl(int argc, char **argv, int cmd, const cha
 					name = padvance(&path2, &opt2, argv[i]);
 					stunalloc(name);
 				} while (--j >= 0);
-				if (cmd == TYPECMD_SMALLV)
-					out1fmt("%s\n", name);
-				else
-					out1fmt("%s is%s %s\n", argv[i],
+				if (cmd != TYPECMD_SMALLV)
+					out1fmt("%s is%s ", argv[i],
 					    (cmdp && cmd == TYPECMD_TYPE) ?
-						" a tracked alias for" : "",
-					    name);
+						" a tracked alias for" : "");
+				print_absolute_path(name);
 			} else {
 				if (eaccess(argv[i], X_OK) == 0) {
-					if (cmd == TYPECMD_SMALLV)
-						out1fmt("%s\n", argv[i]);
-					else
-						out1fmt("%s is %s\n", argv[i],
-						    argv[i]);
+					if (cmd != TYPECMD_SMALLV)
+						out1fmt("%s is ", argv[i]);
+					print_absolute_path(argv[i]);
 				} else {
 					if (cmd != TYPECMD_SMALLV)
 						outfmt(out2, "%s: %s\n",

Modified: head/bin/sh/tests/builtins/Makefile
==============================================================================
--- head/bin/sh/tests/builtins/Makefile	Tue Sep  1 12:21:17 2020	(r365036)
+++ head/bin/sh/tests/builtins/Makefile	Tue Sep  1 13:19:15 2020	(r365037)
@@ -69,6 +69,8 @@ ${PACKAGE}FILES+=		command9.0
 ${PACKAGE}FILES+=		command10.0
 ${PACKAGE}FILES+=		command11.0
 ${PACKAGE}FILES+=		command12.0
+${PACKAGE}FILES+=		command13.0
+${PACKAGE}FILES+=		command14.0
 ${PACKAGE}FILES+=		dot1.0
 ${PACKAGE}FILES+=		dot2.0
 ${PACKAGE}FILES+=		dot3.0
@@ -170,6 +172,7 @@ ${PACKAGE}FILES+=		trap9.0
 ${PACKAGE}FILES+=		type1.0 type1.0.stderr
 ${PACKAGE}FILES+=		type2.0
 ${PACKAGE}FILES+=		type3.0
+${PACKAGE}FILES+=		type4.0
 ${PACKAGE}FILES+=		unalias.0
 ${PACKAGE}FILES+=		var-assign.0
 ${PACKAGE}FILES+=		var-assign2.0

Added: head/bin/sh/tests/builtins/command13.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/bin/sh/tests/builtins/command13.0	Tue Sep  1 13:19:15 2020	(r365037)
@@ -0,0 +1,21 @@
+# $FreeBSD$
+
+failures=0
+
+check() {
+	if [ "$1" != "$2" ] && { [ "$#" -lt 3 ] || [ "$1" != "$3" ]; } then
+		echo "Mismatch found"
+		echo "Expected: $2"
+		if [ "$#" -ge 3 ]; then
+			echo "Alternative expected: $3"
+		fi
+		echo "Actual: $1"
+		: $((failures += 1))
+	fi
+}
+
+check "$(cd /bin && PATH=. command -v ls)" /bin/ls /bin/./ls
+check "$(cd /bin && PATH=:/var/empty/nosuch command -v ls)" /bin/ls /bin/./ls
+check "$(cd / && PATH=bin command -v ls)" /bin/ls
+check "$(cd / && command -v bin/ls)" /bin/ls
+check "$(cd /bin && command -v ./ls)" /bin/ls /bin/./ls

Added: head/bin/sh/tests/builtins/command14.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/bin/sh/tests/builtins/command14.0	Tue Sep  1 13:19:15 2020	(r365037)
@@ -0,0 +1,9 @@
+# $FreeBSD$
+
+r=`cd /bin && PATH=. command -V ls`
+case $r in
+*/bin/ls*|*/bin/./ls*) ;;
+*)
+	echo "Unexpected result: $r"
+	exit 1
+esac

Added: head/bin/sh/tests/builtins/type4.0
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/bin/sh/tests/builtins/type4.0	Tue Sep  1 13:19:15 2020	(r365037)
@@ -0,0 +1,9 @@
+# $FreeBSD$
+
+r=`cd /bin && PATH=. type ls`
+case $r in
+*/bin/ls*|*/bin/./ls*) ;;
+*)
+	echo "Unexpected result: $r"
+	exit 1
+esac



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