daemon: Fix utimens so it doesn't hang on named pipes (RHBZ#761460).
[libguestfs.git] / daemon / utimens.c
index a9857db..2df6fc7 100644 (file)
@@ -33,18 +33,8 @@ do_utimens (const char *path,
             int64_t atsecs, int64_t atnsecs,
             int64_t mtsecs, int64_t mtnsecs)
 {
-  int fd;
   int r;
 
-  CHROOT_IN;
-  fd = open (path, O_RDONLY | O_NOCTTY);
-  CHROOT_OUT;
-
-  if (fd == -1) {
-    reply_with_perror ("open: %s", path);
-    return -1;
-  }
-
   if (atnsecs == -1)
     atnsecs = UTIME_NOW;
   if (atnsecs == -2)
@@ -60,15 +50,12 @@ do_utimens (const char *path,
   times[1].tv_sec = mtsecs;
   times[1].tv_nsec = mtnsecs;
 
-  r = futimens (fd, times);
-  if (r == -1) {
-    reply_with_perror ("futimens: %s", path);
-    close (fd);
-    return -1;
-  }
+  CHROOT_IN;
+  r = utimensat (-1, path, times, AT_SYMLINK_NOFOLLOW);
+  CHROOT_OUT;
 
-  if (close (fd) == -1) {
-    reply_with_perror ("close: %s", path);
+  if (r == -1) {
+    reply_with_perror ("utimensat: %s", path);
     return -1;
   }