summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2011-12-08 11:39:58 +0000
committerRichard W.M. Jones <rjones@redhat.com>2011-12-09 15:35:40 +0000
commit87e972e69487564f44b20ea5dcfc3eadf5b34c74 (patch)
tree1295c0a03d8839df435525e5ae855de5216b8aec
parent289645e80aebef0378ce69db5b0e847e8d6a28c6 (diff)
downloadlibguestfs-87e972e69487564f44b20ea5dcfc3eadf5b34c74.tar.gz
libguestfs-87e972e69487564f44b20ea5dcfc3eadf5b34c74.tar.xz
libguestfs-87e972e69487564f44b20ea5dcfc3eadf5b34c74.zip
daemon: Fix utimens so it doesn't hang on named pipes (RHBZ#761460).
This also adds comprehensive tests for utimens on regular files, directories (RHBZ#761451), named pipes (RHBZ#761460), symbolic links, block and char devices. Note that there is a small change in the (previously undefined) semantics of this call: It now sets the time on a symbolic link itself, not on what the symbolic link points to. (cherry picked from commit 19e2f5aa4fd4ed70b505661d918b5575616ad441)
-rw-r--r--daemon/utimens.c23
-rw-r--r--generator/generator_actions.ml27
2 files changed, 29 insertions, 21 deletions
diff --git a/daemon/utimens.c b/daemon/utimens.c
index a9857db7..2df6fc71 100644
--- a/daemon/utimens.c
+++ b/daemon/utimens.c
@@ -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;
}
diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml
index d3fa3e0b..ece471fc 100644
--- a/generator/generator_actions.ml
+++ b/generator/generator_actions.ml
@@ -4812,10 +4812,31 @@ for the file until you write to it). To create a non-sparse
file of zeroes, use C<guestfs_fallocate64> instead.");
("utimens", (RErr, [Pathname "path"; Int64 "atsecs"; Int64 "atnsecs"; Int64 "mtsecs"; Int64 "mtnsecs"], []), 201, [],
+ (* Test directories, named pipes etc (RHBZ#761451, RHBZ#761460) *)
[InitScratchFS, Always, TestOutputStruct (
- [["touch"; "/utimens"];
- ["utimens"; "/utimens"; "12345"; "67890"; "9876"; "5432"];
- ["stat"; "/utimens"]], [CompareWithInt ("mtime", 9876)])],
+ [["touch"; "/utimens-file"];
+ ["utimens"; "/utimens-file"; "12345"; "67890"; "9876"; "5432"];
+ ["stat"; "/utimens-file"]], [CompareWithInt ("mtime", 9876)]);
+ InitScratchFS, Always, TestOutputStruct (
+ [["mkdir"; "/utimens-dir"];
+ ["utimens"; "/utimens-dir"; "12345"; "67890"; "9876"; "5432"];
+ ["stat"; "/utimens-dir"]], [CompareWithInt ("mtime", 9876)]);
+ InitScratchFS, Always, TestOutputStruct (
+ [["mkfifo"; "0o644"; "/utimens-fifo"];
+ ["utimens"; "/utimens-fifo"; "12345"; "67890"; "9876"; "5432"];
+ ["stat"; "/utimens-fifo"]], [CompareWithInt ("mtime", 9876)]);
+ InitScratchFS, Always, TestOutputStruct (
+ [["ln_sf"; "/utimens-file"; "/utimens-link"];
+ ["utimens"; "/utimens-link"; "12345"; "67890"; "9876"; "5432"];
+ ["stat"; "/utimens-link"]], [CompareWithInt ("mtime", 9876)]);
+ InitScratchFS, Always, TestOutputStruct (
+ [["mknod_b"; "0o644"; "8"; "0"; "/utimens-block"];
+ ["utimens"; "/utimens-block"; "12345"; "67890"; "9876"; "5432"];
+ ["stat"; "/utimens-block"]], [CompareWithInt ("mtime", 9876)]);
+ InitScratchFS, Always, TestOutputStruct (
+ [["mknod_c"; "0o644"; "1"; "3"; "/utimens-char"];
+ ["utimens"; "/utimens-char"; "12345"; "67890"; "9876"; "5432"];
+ ["stat"; "/utimens-char"]], [CompareWithInt ("mtime", 9876)])],
"set timestamp of a file with nanosecond precision",
"\
This command sets the timestamps of a file with nanosecond