summaryrefslogtreecommitdiffstats
path: root/oslib-posix.c
diff options
context:
space:
mode:
authorMarcelo Tosatti <[email protected]>2011-01-06 19:19:20 -0200
committerMarcelo Tosatti <[email protected]>2011-01-06 19:19:20 -0200
commit3393ee074f89bbd827a2c5737f5bec365e8460a5 (patch)
treebc681098e4ee34c28437d9995d3cc542263b39de /oslib-posix.c
parentea59ccd22c3957f9ef8c7828b5c1e778ab35b302 (diff)
parente024e881bb1a8b5085026589360d26ed97acdd64 (diff)
downloadqemu-kvm-3393ee074f89bbd827a2c5737f5bec365e8460a5.tar.gz
qemu-kvm-3393ee074f89bbd827a2c5737f5bec365e8460a5.tar.bz2
qemu-kvm-3393ee074f89bbd827a2c5737f5bec365e8460a5.zip
Merge commit 'e024e881bb1a8b5085026589360d26ed97acdd64' into upstream-merge
* commit 'e024e881bb1a8b5085026589360d26ed97acdd64': (133 commits) target-ppc: Implement correct NaN propagation rules target-mips: Implement correct NaN propagation rules softfloat: use float{32,64,x80,128}_maybe_silence_nan() softfloat: add float{x80,128}_maybe_silence_nan() softfloat: fix float{32,64}_maybe_silence_nan() for MIPS softfloat: rename *IsNaN variables to *IsQuietNaN softfloat: remove HPPA specific code target-ppc: use float32_is_any_nan() target-ppc: fix default qNaN target-ppc: remove PRECISE_EMULATION define microblaze: Use more TB chaining cirrus_vga: fix division by 0 for color expansion rop Fix curses on big endian hosts noaudio: correctly account acquired samples target-arm: Implement correct NaN propagation rules softfloat: abstract out target-specific NaN propagation rules softfloat: Rename float*_is_nan() functions to float*_is_quiet_nan() TCG: Improve tb_phys_hash_func() target-arm: fix UMAAL instruction Fix translation of unary PPC/SPE instructions (efdneg etc.). ... Signed-off-by: Marcelo Tosatti <[email protected]>
Diffstat (limited to 'oslib-posix.c')
-rw-r--r--oslib-posix.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/oslib-posix.c b/oslib-posix.c
index 727dee1c2..edd4ddfe9 100644
--- a/oslib-posix.c
+++ b/oslib-posix.c
@@ -111,3 +111,51 @@ int qemu_pipe(int pipefd[2])
return ret;
}
+
+int qemu_utimensat(int dirfd, const char *path, const struct timespec *times,
+ int flags)
+{
+ struct timeval tv[2], tv_now;
+ struct stat st;
+ int i;
+#ifdef CONFIG_UTIMENSAT
+ int ret;
+
+ ret = utimensat(dirfd, path, times, flags);
+ if (ret != -1 || errno != ENOSYS) {
+ return ret;
+ }
+#endif
+ /* Fallback: use utimes() instead of utimensat() */
+
+ /* happy if special cases */
+ if (times[0].tv_nsec == UTIME_OMIT && times[1].tv_nsec == UTIME_OMIT) {
+ return 0;
+ }
+ if (times[0].tv_nsec == UTIME_NOW && times[1].tv_nsec == UTIME_NOW) {
+ return utimes(path, NULL);
+ }
+
+ /* prepare for hard cases */
+ if (times[0].tv_nsec == UTIME_NOW || times[1].tv_nsec == UTIME_NOW) {
+ gettimeofday(&tv_now, NULL);
+ }
+ if (times[0].tv_nsec == UTIME_OMIT || times[1].tv_nsec == UTIME_OMIT) {
+ stat(path, &st);
+ }
+
+ for (i = 0; i < 2; i++) {
+ if (times[i].tv_nsec == UTIME_NOW) {
+ tv[i].tv_sec = tv_now.tv_sec;
+ tv[i].tv_usec = tv_now.tv_usec;
+ } else if (times[i].tv_nsec == UTIME_OMIT) {
+ tv[i].tv_sec = (i == 0) ? st.st_atime : st.st_mtime;
+ tv[i].tv_usec = 0;
+ } else {
+ tv[i].tv_sec = times[i].tv_sec;
+ tv[i].tv_usec = times[i].tv_nsec / 1000;
+ }
+ }
+
+ return utimes(path, &tv[0]);
+}