diff options
author | Richard Jones <rjones@redhat.com> | 2009-10-30 16:10:45 +0000 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2009-11-02 16:37:51 +0000 |
commit | 2eb19f526164a978c373a760deb30854d56b62ce (patch) | |
tree | 33798414007f6d8bdf78e6cef6a354efad642f18 /daemon/utimens.c | |
parent | 00425c073e5c0743ef425cd12108a85ac36b15f4 (diff) | |
download | libguestfs-2eb19f526164a978c373a760deb30854d56b62ce.tar.gz libguestfs-2eb19f526164a978c373a760deb30854d56b62ce.tar.xz libguestfs-2eb19f526164a978c373a760deb30854d56b62ce.zip |
New API calls: truncate, truncate_size, mkdir_mode, utimens, lchown.
truncate, truncate_size: Used to truncate files to a particular
size, or to zero bytes.
mkdir_mode: Like mkdir but allows you to also specify the
initial permissions for the new directory.
utimens: Set timestamp on a file with nanosecond accuracy.
lchown: Corresponding to lchown(2) syscall (we already have chown).
The implementation is complicated by the fact that we had to
add an Int64 parameter type to the generator.
Diffstat (limited to 'daemon/utimens.c')
-rw-r--r-- | daemon/utimens.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/daemon/utimens.c b/daemon/utimens.c new file mode 100644 index 00000000..2d0e3bfc --- /dev/null +++ b/daemon/utimens.c @@ -0,0 +1,81 @@ +/* libguestfs - the guestfsd daemon + * Copyright (C) 2009 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/stat.h> + +#include "../src/guestfs_protocol.h" +#include "daemon.h" +#include "actions.h" + +int +do_utimens (const char *path, + int64_t atsecs, int64_t atnsecs, + int64_t mtsecs, int64_t mtnsecs) +{ +#ifndef HAVE_FUTIMENS + reply_with_error ("utimens: not supported in this appliance"); + return -1; +#else + int fd; + int r; + + CHROOT_IN; + fd = open (path, O_WRONLY | O_NOCTTY); + CHROOT_OUT; + + if (fd == -1) { + reply_with_perror ("open: %s", path); + return -1; + } + + if (atnsecs == -1) + atnsecs = UTIME_NOW; + if (atnsecs == -2) + atnsecs = UTIME_OMIT; + if (mtnsecs == -1) + mtnsecs = UTIME_NOW; + if (mtnsecs == -2) + mtnsecs = UTIME_OMIT; + + struct timespec times[2]; + times[0].tv_sec = atsecs; + times[0].tv_nsec = atnsecs; + 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; + } + + if (close (fd) == -1) { + reply_with_perror ("close: %s", path); + return -1; + } + + return 0; +#endif /* HAVE_FUTIMENS */ +} |