[PATCH 09/18] test: add -L support to test if it's a symbolic link

Jean-Christophe PLAGNIOL-VILLARD plagnioj at jcrosoft.com
Sat Sep 1 08:37:24 EDT 2012


Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
---
 commands/test.c |   11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/commands/test.c b/commands/test.c
index 9ffa892..56e8c52 100644
--- a/commands/test.c
+++ b/commands/test.c
@@ -44,6 +44,7 @@ typedef enum {
 	OPT_FILE,
 	OPT_EXISTS,
 	OPT_MAX,
+	OPT_SYMBOLIC_LINK,
 } test_opts;
 
 static char *test_options[] = {
@@ -62,6 +63,7 @@ static char *test_options[] = {
 	[OPT_FILE]			= "-f",
 	[OPT_DIRECTORY]			= "-d",
 	[OPT_EXISTS]			= "-e",
+	[OPT_SYMBOLIC_LINK]		= "-L",
 };
 
 static int parse_opt(const char *opt)
@@ -140,9 +142,10 @@ static int do_test(int argc, char *argv[])
 		case OPT_FILE:
 		case OPT_DIRECTORY:
 		case OPT_EXISTS:
+		case OPT_SYMBOLIC_LINK:
 			adv = 2;
 			if (ap[1] && *ap[1] != ']' && strlen(ap[1])) {
-				expr = stat(ap[1], &statbuf);
+				expr = (opt == OPT_SYMBOLIC_LINK ? lstat : stat)(ap[1], &statbuf);
 				if (expr < 0) {
 					expr = 0;
 					break;
@@ -160,6 +163,10 @@ static int do_test(int argc, char *argv[])
 					expr = 1;
 					break;
 				}
+				if (opt == OPT_SYMBOLIC_LINK && S_ISLNK(statbuf.st_mode)) {
+					expr = 1;
+					break;
+				}
 			}
 			break;
 
@@ -224,7 +231,7 @@ static const char *test_aliases[] = { "[", NULL};
 
 static const __maybe_unused char cmd_test_help[] =
 "Usage: test [OPTIONS]\n"
-"options: !, =, !=, -eq, -ne, -ge, -gt, -le, -lt, -o, -a, -z, -n, -d, -e, -f\n"
+"options: !, =, !=, -eq, -ne, -ge, -gt, -le, -lt, -o, -a, -z, -n, -d, -e, -f, -L\n"
 "see 'man test' on your PC for more information.\n";
 
 static const __maybe_unused char cmd_test_usage[] = "minimal test like /bin/sh";
-- 
1.7.10.4




More information about the barebox mailing list