changeset 16199:162e917fdda6

canonicalize: only stat() when required * lib/canonicalize.c (canonicalize_filename_mode): Avoid calling l?stat() when both CAN_MISSING, and CAN_NOLINKS are set, as then we neither need to resolve symlinks or test component existence.
author Pádraig Brady <P@draigBrady.com>
date Sat, 31 Dec 2011 11:03:58 +0000
parents 79e42746e843
children 146843414cf0
files ChangeLog lib/canonicalize.c
diffstat 2 files changed, 16 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2011-12-31  Pádraig Brady  <P@draigBrady.com>
+
+	canonicalize: only stat() if required
+	* lib/canonicalize.c (canonicalize_filename_mode):
+	Avoid calling l?stat() when both CAN_MISSING,
+	and CAN_NOLINKS are set, as we neither need
+	to resolve symlinks or test component existence.
+
 2011-12-31  Paul Eggert  <eggert@cs.ucla.edu>
 
 	doc: cover st_ino issues once; add OpenVMS etc.
--- a/lib/canonicalize.c
+++ b/lib/canonicalize.c
@@ -198,7 +198,14 @@
           dest += end - start;
           *dest = '\0';
 
-          if ((logical ? stat (rname, &st) : lstat (rname, &st)) != 0)
+          if (logical && (can_mode == CAN_MISSING))
+            {
+              /* Avoid the stat in this case as it's inconsequential.
+                 i.e. we're neither resolving symlinks or testing
+                 component existence.  */
+              st.st_mode = 0;
+            }
+          else if ((logical ? stat (rname, &st) : lstat (rname, &st)) != 0)
             {
               saved_errno = errno;
               if (can_mode == CAN_EXISTING)