about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--io/test-utime.c49
-rw-r--r--sysdeps/unix/sysv/syscalls.list4
2 files changed, 51 insertions, 2 deletions
diff --git a/io/test-utime.c b/io/test-utime.c
index 32e14bd161..8dbbcf990d 100644
--- a/io/test-utime.c
+++ b/io/test-utime.c
@@ -22,6 +22,7 @@
 #include <sys/stat.h>
 #include <unistd.h>
 #include <utime.h>
+#include <time.h>
 
 int
 main (int argc, char *argv[])
@@ -29,6 +30,8 @@ main (int argc, char *argv[])
   char file[L_tmpnam];
   struct utimbuf ut;
   struct stat st;
+  struct stat stnow;
+  time_t now1, now2;
   int fd;
 
   if (tmpnam (file) == 0)
@@ -45,6 +48,7 @@ main (int argc, char *argv[])
     }
   close (fd);
 
+  /* Test utime with arg */
   ut.actime = 500000000;
   ut.modtime = 500000001;
   if (utime (file, &ut))
@@ -61,6 +65,39 @@ main (int argc, char *argv[])
       exit (1);
     }
 
+  /* Test utime with NULL.
+     Since there's a race condition possible here, we check
+     the time before and after the call to utime.  */
+  now1 = time (NULL);
+  if (now1 == (time_t)-1)
+    {
+      perror ("time");
+      remove (file);
+      exit (1);
+    }
+
+  if (utime (file, NULL))
+    {
+      perror ("utime NULL");
+      remove (file);
+      exit (1);
+    }
+
+  now2 = time (NULL);
+  if (now2 == (time_t)-1)
+    {
+      perror ("time");
+      remove (file);
+      exit (1);
+    }
+
+  if (stat (file, &stnow))
+    {
+      perror ("stat");
+      remove (file);
+      exit (1);
+    }
+
   remove (file);
 
   if (st.st_mtime != ut.modtime)
@@ -75,6 +112,18 @@ main (int argc, char *argv[])
       exit (1);
     }
 
+  if (stnow.st_mtime < now1 || stnow.st_mtime > now2)
+    {
+      printf ("modtime %ld <%ld >%ld\n", st.st_mtime, now1, now2);
+      exit (1);
+    }
+
+  if (stnow.st_atime < now1 || stnow.st_atime > now2)
+    {
+      printf ("actime %ld <%ld >%ld\n", st.st_atime, now1, now2);
+      exit (1);
+    }
+
   puts ("Test succeeded.");
   exit (0);
 }
diff --git a/sysdeps/unix/sysv/syscalls.list b/sysdeps/unix/sysv/syscalls.list
index 2525bae2ea..2652153181 100644
--- a/sysdeps/unix/sysv/syscalls.list
+++ b/sysdeps/unix/sysv/syscalls.list
@@ -10,7 +10,7 @@ setrlimit	-	setrlimit	i:ip	setrlimit
 settimeofday	-	settimeofday	i:PP	__settimeofday	settimeofday
 signal		-	signal		i:ii	signal
 stime		-	stime		i:p	stime
-time		-	time		i:p	time
+time		-	time		i:P	time
 times		-	times		i:p	__times	times
 ulimit		-	ulimit		i:ii	ulimit
-utime		-	utime		i:pp	utime
+utime		-	utime		i:sP	utime