[hackers] [PATCH 8/8] touch: Avoid unnecessary call to stat

From: Michael Forney <mforney_AT_mforney.org>
Date: Fri, 8 Jul 2016 10:24:14 -0700

Now, we first try a utimensat. If it succeeds, we are done, if not (and no -c
flag), create the file, then set the times with futimens.
---
 touch.c | 23 +++++++++--------------
 1 file changed, 9 insertions(+), 14 deletions(-)
diff --git a/touch.c b/touch.c
index a187241..6e63bf8 100644
--- a/touch.c
+++ b/touch.c
_AT_@ -18,25 +18,20 @@ static struct timespec times[2] = {{.tv_nsec = UTIME_NOW}};
 static void
 touch(const char *file)
 {
-	int fd;
-	struct stat st;
+	int fd, ret;
 
-	if (stat(file, &st) < 0) {
-		if (errno != ENOENT)
-			eprintf("stat %s:", file);
-		if (cflag)
-			return;
-	} else {
-		if (utimensat(AT_FDCWD, file, times, 0) < 0)
-			eprintf("utimensat %s:", file);
+	if (utimensat(AT_FDCWD, file, times, 0) == 0)
+		return;
+	if (errno != ENOENT)
+		eprintf("utimensat %s:", file);
+	if (cflag)
 		return;
-	}
-
 	if ((fd = open(file, O_WRONLY | O_CREAT | O_EXCL, 0666)) < 0)
 		eprintf("open %s:", file);
+	ret = futimens(fd, times);
 	close(fd);
-
-	touch(file);
+	if (ret < 0)
+		eprintf("futimens %s:", file);
 }
 
 static time_t
-- 
2.6.2
Received on Fri Jul 08 2016 - 19:24:14 CEST

This archive was generated by hypermail 2.3.0 : Fri Jul 08 2016 - 19:36:40 CEST