diff options
author | Jonathan Pryor <jpryor@novell.com> | 2008-10-16 00:20:57 +0400 |
---|---|---|
committer | Jonathan Pryor <jpryor@novell.com> | 2008-10-16 00:20:57 +0400 |
commit | 4f57ed04a91f45ba007f615e3a5802d4c3e5442c (patch) | |
tree | 0a8f548ad20a88aa3043409c94c8ee99d8adae25 /support | |
parent | 7c2e41d7ae676fc38a981e4c81cb7dd2769cb2f2 (diff) |
* configure.in: Add checks for `struct flock`, `struct timespec`.
* support/fcntl.c: Use Mono_Posix_{From,To}Flock() for flock conversion.
* support/Makefile.am: Include <time.h> in map.c.
* support/map.c, support/map.h: Flush; adds Flock, Timespec support.
svn path=/trunk/mono/; revision=115916
Diffstat (limited to 'support')
-rw-r--r-- | support/ChangeLog | 6 | ||||
-rw-r--r-- | support/Makefile.am | 1 | ||||
-rw-r--r-- | support/fcntl.c | 19 | ||||
-rw-r--r-- | support/map.c | 85 | ||||
-rw-r--r-- | support/map.h | 21 |
5 files changed, 116 insertions, 16 deletions
diff --git a/support/ChangeLog b/support/ChangeLog index 7e899286d09..7cf8746d893 100644 --- a/support/ChangeLog +++ b/support/ChangeLog @@ -1,3 +1,9 @@ +2008-10-15 Jonathan Pryor <jpryor@novell.com> + + * fcntl.c: Use Mono_Posix_{From,To}Flock() for flock conversion. + * Makefile.am: Include <time.h> in map.c. + * map.c, map.h: Flush; adds Flock, Timespec support. + 2008-09-14 Carlos Alberto Cortez <calberto.cortez@gmail.com> * serial.c: When writing bytes and polling, take into account negative diff --git a/support/Makefile.am b/support/Makefile.am index 8be4b797844..29c5ddfdca1 100644 --- a/support/Makefile.am +++ b/support/Makefile.am @@ -138,6 +138,7 @@ refresh: --autoconf-header="<syslog.h>" \ --impl-header="<dirent.h>" \ --impl-header="<utime.h>" \ + --impl-header="<time.h>" \ --impl-header="\"mph.h\"" \ --rename-member=st_atime=st_atime_ \ --rename-member=st_ctime=st_ctime_ \ diff --git a/support/fcntl.c b/support/fcntl.c index 7914e41dd57..d7e9c481180 100644 --- a/support/fcntl.c +++ b/support/fcntl.c @@ -66,26 +66,13 @@ Mono_Posix_Syscall_fcntl_lock (gint32 fd, gint32 cmd, struct Mono_Posix_Flock *l return -1; } - mph_return_if_off_t_overflow (lock->l_start); - mph_return_if_off_t_overflow (lock->l_len); - - if (Mono_Posix_FromLockType (lock->l_type, &lock->l_type) == -1) + if (Mono_Posix_FromFlock (lock, &_lock) == -1) return -1; - _lock.l_type = lock->l_type; - _lock.l_whence = lock->l_whence; - _lock.l_start = lock->l_start; - _lock.l_len = lock->l_len; - _lock.l_pid = lock->l_pid; r = fcntl (fd, cmd, &_lock); - if (Mono_Posix_ToLockType (_lock.l_type, &_lock.l_type) == -1) - r = -1; - lock->l_type = _lock.l_type; - lock->l_whence = _lock.l_whence; - lock->l_start = _lock.l_start; - lock->l_len = _lock.l_len; - lock->l_pid = _lock.l_pid; + if (Mono_Posix_ToFlock (&_lock, lock) == -1) + return -1; return r; } diff --git a/support/map.c b/support/map.c index c4e56d64b55..d4f6b217217 100644 --- a/support/map.c +++ b/support/map.c @@ -58,6 +58,7 @@ #endif /* ndef HAVE_SYSLOG_H */ #include <dirent.h> #include <utime.h> +#include <time.h> #include "mph.h" #include "map.h" @@ -2523,6 +2524,56 @@ int Mono_Posix_ToFilePermissions (unsigned int x, unsigned int *r) return 0; } +#ifdef HAVE_STRUCT_FLOCK +int +Mono_Posix_FromFlock (struct Mono_Posix_Flock *from, struct flock *to) +{ + _cnm_return_val_if_overflow (off_t, from->l_start, -1); + _cnm_return_val_if_overflow (off_t, from->l_len, -1); + _cnm_return_val_if_overflow (pid_t, from->l_pid, -1); + + memset (to, 0, sizeof(*to)); + + if (Mono_Posix_FromLockType (from->l_type, &to->l_type) != 0) { + return -1; + } + if (Mono_Posix_FromSeekFlags (from->l_whence, &to->l_whence) != 0) { + return -1; + } + to->l_start = from->l_start; + to->l_len = from->l_len; + to->l_pid = from->l_pid; + + return 0; +} +#endif /* ndef HAVE_STRUCT_FLOCK */ + + +#ifdef HAVE_STRUCT_FLOCK +int +Mono_Posix_ToFlock (struct flock *from, struct Mono_Posix_Flock *to) +{ + _cnm_return_val_if_overflow (gint64, from->l_start, -1); + _cnm_return_val_if_overflow (gint64, from->l_len, -1); + _cnm_return_val_if_overflow (int, from->l_pid, -1); + + memset (to, 0, sizeof(*to)); + + if (Mono_Posix_ToLockType (from->l_type, &to->l_type) != 0) { + return -1; + } + if (Mono_Posix_ToSeekFlags (from->l_whence, &to->l_whence) != 0) { + return -1; + } + to->l_start = from->l_start; + to->l_len = from->l_len; + to->l_pid = from->l_pid; + + return 0; +} +#endif /* ndef HAVE_STRUCT_FLOCK */ + + int Mono_Posix_FromLockType (short x, short *r) { *r = 0; @@ -6739,6 +6790,40 @@ int Mono_Posix_ToSyslogOptions (int x, int *r) return 0; } +#ifdef HAVE_STRUCT_TIMESPEC +int +Mono_Posix_FromTimespec (struct Mono_Posix_Timespec *from, struct timespec *to) +{ + _cnm_return_val_if_overflow (time_t, from->tv_sec, -1); + _cnm_return_val_if_overflow (gint64, from->tv_nsec, -1); + + memset (to, 0, sizeof(*to)); + + to->tv_sec = from->tv_sec; + to->tv_nsec = from->tv_nsec; + + return 0; +} +#endif /* ndef HAVE_STRUCT_TIMESPEC */ + + +#ifdef HAVE_STRUCT_TIMESPEC +int +Mono_Posix_ToTimespec (struct timespec *from, struct Mono_Posix_Timespec *to) +{ + _cnm_return_val_if_overflow (gint64, from->tv_sec, -1); + _cnm_return_val_if_overflow (gint64, from->tv_nsec, -1); + + memset (to, 0, sizeof(*to)); + + to->tv_sec = from->tv_sec; + to->tv_nsec = from->tv_nsec; + + return 0; +} +#endif /* ndef HAVE_STRUCT_TIMESPEC */ + + #ifdef HAVE_STRUCT_TIMEVAL int Mono_Posix_FromTimeval (struct Mono_Posix_Timeval *from, struct timeval *to) diff --git a/support/map.h b/support/map.h index c8fc8ece817..c913c60eb35 100644 --- a/support/map.h +++ b/support/map.h @@ -1379,6 +1379,7 @@ struct Mono_Posix_Syscall__Fstab; struct Mono_Posix_Syscall__Group; struct Mono_Posix_Syscall__Passwd; struct Mono_Posix_Syscall__Utsname; +struct Mono_Posix_Timespec; struct Mono_Posix_Timeval; struct Mono_Posix_Timezone; struct Mono_Posix_Utimbuf; @@ -1388,8 +1389,10 @@ struct Mono_Unix_UnixSignal_SignalInfo; * Inferred Structure Declarations */ +struct flock; struct pollfd; struct stat; +struct timespec; struct timeval; struct timezone; struct utimbuf; @@ -1411,6 +1414,12 @@ struct Mono_Posix_Flock { int l_pid; /* pid_t */ }; +int +Mono_Posix_FromFlock (struct Mono_Posix_Flock* from, struct flock *to); +int +Mono_Posix_ToFlock (struct flock *from, struct Mono_Posix_Flock* to); + + struct Mono_Posix_Pollfd { int fd; short events; @@ -1509,6 +1518,17 @@ struct Mono_Posix_Syscall__Utsname { void* _buf_; }; +struct Mono_Posix_Timespec { + gint64 tv_sec; /* time_t */ + gint64 tv_nsec; +}; + +int +Mono_Posix_FromTimespec (struct Mono_Posix_Timespec* from, struct timespec *to); +int +Mono_Posix_ToTimespec (struct timespec *from, struct Mono_Posix_Timespec* to); + + struct Mono_Posix_Timeval { gint64 tv_sec; /* time_t */ gint64 tv_usec; /* suseconds_t */ @@ -1663,6 +1683,7 @@ void* Mono_Posix_Syscall_mremap (void* old_address, guint64 old_size, guint64 ne int Mono_Posix_Syscall_msync (void* start, guint64 len, int flags); int Mono_Posix_Syscall_munlock (void* start, guint64 len); int Mono_Posix_Syscall_munmap (void* start, guint64 length); +int Mono_Posix_Syscall_nanosleep (struct Mono_Posix_Timespec* req, struct Mono_Posix_Timespec* rem); int Mono_Posix_Syscall_open (const char* pathname, int flags); int Mono_Posix_Syscall_open_mode (const char* pathname, int flags, unsigned int mode); int Mono_Posix_Syscall_openlog (void* ident, int option, int facility); |