Merge pull request #5668 from kumpera/wasm-work-p4
[mono.git] / support / sys-time.c
index 0b41489463f7bb78acdc53219af005b48d5cf06c..83afa0c8466b65f1a565d529cd01af9a7a728510 100644 (file)
@@ -4,7 +4,7 @@
  * Authors:
  *   Jonathan Pryor (jonpryor@vt.edu)
  *
- * Copyright (C) 2004 Jonathan Pryor
+ * Copyright (C) 2004-2006 Jonathan Pryor
  */
 
 #include <sys/types.h>
 
 G_BEGIN_DECLS
 
-struct Mono_Posix_Syscall_Timeval {
-       /* time_t */      mph_time_t  tv_sec;   /* seconds */
-       /* suseconds_t */ gint64      tv_usec;  /* microseconds */
-};
-
-struct Mono_Posix_Syscall_Timezone {
-       int tz_minuteswest;  /* minutes W of Greenwich */
-       int tz_dsttime;      /* ignored */
-};
-
 gint32
 Mono_Posix_Syscall_gettimeofday (
-       struct Mono_Posix_Syscall_Timeval *tv,
-       struct Mono_Posix_Syscall_Timezone *tz)
+       struct Mono_Posix_Timeval *tv,
+       void *tz)
 {
        struct timeval _tv;
        struct timezone _tz;
@@ -43,8 +33,9 @@ Mono_Posix_Syscall_gettimeofday (
                        tv->tv_usec = _tv.tv_usec;
                }
                if (tz) {
-                       tz->tz_minuteswest = _tz.tz_minuteswest;
-                       tz->tz_dsttime     = 0;
+                       struct Mono_Posix_Timezone *tz_ = (struct Mono_Posix_Timezone *) tz;
+                       tz_->tz_minuteswest = _tz.tz_minuteswest;
+                       tz_->tz_dsttime     = 0;
                }
        }
 
@@ -53,9 +44,14 @@ Mono_Posix_Syscall_gettimeofday (
 
 gint32
 Mono_Posix_Syscall_settimeofday (
-       const struct Mono_Posix_Syscall_Timeval *tv,
-       const struct Mono_Posix_Syscall_Timezone *tz)
+       struct Mono_Posix_Timeval *tv,
+       struct Mono_Posix_Timezone *tz)
 {
+#if defined(__HAIKU__)
+       /* FIXME: Haiku doesn't support this either, consider
+           using set_real_time_clock instead? */
+       return -1;
+#else
        struct timeval _tv   = {0};
        struct timeval *ptv  = NULL;
        struct timezone _tz  = {0};
@@ -76,24 +72,60 @@ Mono_Posix_Syscall_settimeofday (
        r = settimeofday (ptv, ptz);
 
        return r;
+#endif
+}
+
+static inline struct timeval*
+copy_utimes (struct timeval* to, struct Mono_Posix_Timeval *from)
+{
+       if (from) {
+               to[0].tv_sec  = from[0].tv_sec;
+               to[0].tv_usec = from[0].tv_usec;
+               to[1].tv_sec  = from[1].tv_sec;
+               to[1].tv_usec = from[1].tv_usec;
+               return to;
+       }
+
+       return NULL;
 }
 
 gint32
-Mono_Posix_Syscall_utimes (const char *filename,
-       struct Mono_Posix_Syscall_Timeval *tv)
+Mono_Posix_Syscall_utimes(const char *filename, struct Mono_Posix_Timeval *tv)
 {
-       struct timeval _tv;
-       struct timeval *ptv = NULL;
+       struct timeval _tv[2];
+       struct timeval *ptv;
 
-       if (tv) {
-               _tv.tv_sec  = tv->tv_sec;
-               _tv.tv_usec = tv->tv_usec;
-               ptv = &_tv;
-       }
+       ptv = copy_utimes (_tv, tv);
 
        return utimes (filename, ptv);
 }
 
+#ifdef HAVE_LUTIMES
+gint32
+Mono_Posix_Syscall_lutimes(const char *filename, struct Mono_Posix_Timeval *tv)
+{
+       struct timeval _tv[2];
+       struct timeval *ptv;
+
+       ptv = copy_utimes (_tv, tv);
+
+       return lutimes (filename, ptv);
+}
+#endif /* def HAVE_LUTIMES */
+
+#if HAVE_FUTIMES
+gint32
+Mono_Posix_Syscall_futimes(int fd, struct Mono_Posix_Timeval *tv)
+{
+       struct timeval _tv[2];
+       struct timeval *ptv;
+
+       ptv = copy_utimes (_tv, tv);
+
+       return futimes (fd, ptv);
+}
+#endif  /* def HAVE_FUTIMES */
+
 G_END_DECLS
 
 /*