From 1c8c2316f98c2e4894c4c1686f0aa7937fcc0a17 Mon Sep 17 00:00:00 2001
From: Natanael Copa <ncopa@alpinelinux.org>
Date: Fri, 25 Jul 2014 15:28:33 +0200
Subject: [PATCH 10/16] Add flag for not following symlinks when recursing

function                                             old     new   delta
.rodata                                             7934    7967     +33
diff_longopts                                        253     270     +17
packed_usage                                        1704    1720     +16
diff_main                                           1665    1662      -3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/1 up/down: 66/-3)              Total: 63 bytes
---
 editors/diff.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/editors/diff.c b/editors/diff.c
index 1462a9b18..2c899578e 100644
--- a/editors/diff.c
+++ b/editors/diff.c
@@ -113,6 +113,9 @@
 //usage:     "\n	-N	Treat absent files as empty"
 //usage:     "\n	-q	Output only whether files differ"
 //usage:     "\n	-r	Recurse"
+//usage:        IF_LONG_OPTS(
+//usage:     "\n        --no-dereference Don't follow symlinks"
+//usage:        )
 //usage:     "\n	-S	Start with FILE when comparing directories"
 //usage:     "\n	-T	Make tabs line up by prefixing a tab when necessary"
 //usage:     "\n	-s	Report when two files are the same"
@@ -154,6 +157,7 @@ enum {                  /* Commandline flags */
 	FLAG_p,         /* not implemented */
 	FLAG_B,
 	FLAG_E,         /* not implemented */
+	FLAG_no_deref,
 };
 #define FLAG(x) (1 << FLAG_##x)
 
@@ -867,7 +871,8 @@ static void diffdir(char *p[2], const char *s_start)
 		 * Using list.len to specify its length,
 		 * add_to_dirlist will remove it. */
 		list[i].len = strlen(p[i]);
-		recursive_action(p[i], ACTION_RECURSE | ACTION_FOLLOWLINKS,
+		recursive_action(p[i], ACTION_RECURSE |
+			((option_mask32 & FLAG(no_deref)) ? 0 : ACTION_FOLLOWLINKS),
 				add_to_dirlist, skip_dir, &list[i], 0);
 		/* Sort dl alphabetically.
 		 * GNU diff does this ignoring any number of trailing dots.
@@ -964,6 +969,7 @@ static const char diff_longopts[] ALIGN1 =
 	"report-identical-files\0"   No_argument       "s"
 	"starting-file\0"            Required_argument "S"
 	"minimal\0"                  No_argument       "d"
+	"no-dereference\0"           No_argument       "\xff"
 	;
 # define GETOPT32 getopt32long
 # define LONGOPTS ,diff_longopts
-- 
2.16.2