? 1.txt ? 2.txt ? RTTest.i3 ? RTTest.m3 ? convert/CConvertTest.i3 ? convert/CConvertTest.m3 ? convert/CConvertTest.mc ? unix/1.c ? unix/1.s ? unix/1.txt Index: m3core.h =================================================================== RCS file: /usr/cvs/cm3/m3-libs/m3core/src/m3core.h,v retrieving revision 1.75 diff -u -r1.75 m3core.h --- m3core.h 23 Jun 2012 07:08:25 -0000 1.75 +++ m3core.h 15 Aug 2012 05:17:30 -0000 @@ -461,8 +461,8 @@ int __cdecl Unix__ftruncate(int fd, m3_off_t length); m3_off_t __cdecl Unix__lseek(int fd, m3_off_t offset, int whence); m3_off_t __cdecl Unix__tell(int fd); -int __cdecl Unix__fcntl(int fd, int request, int arg); -int __cdecl Unix__ioctl(int fd, int request, void* argp); +int __cdecl Unix__fcntl(int fd, INTEGER request, void* arg); +int __cdecl Unix__ioctl(int fd, INTEGER request, void* argp); int __cdecl Unix__mknod(const char* path, m3_mode_t mode, m3_dev_t dev); m3_mode_t __cdecl Unix__umask(m3_mode_t newmask); Index: unix/Common/Uconstants.c =================================================================== RCS file: /usr/cvs/cm3/m3-libs/m3core/src/unix/Common/Uconstants.c,v retrieving revision 1.52 diff -u -r1.52 Uconstants.c --- unix/Common/Uconstants.c 12 Jan 2011 07:00:34 -0000 1.52 +++ unix/Common/Uconstants.c 15 Aug 2012 05:17:31 -0000 @@ -208,6 +208,14 @@ X(F_SETFD) /* Set close-on-exec flag */ X(F_GETFL) /* Get fd status flags */ X(F_SETFL) /* Set fd status flags */ +X(F_DUPFD) /* Duplicate fd */ +X(F_GETFD) /* Get close-on-exec flag */ +X(F_GETOWN) /* Set owner */ +X(F_SETOWN) /* Get owner */ +X(F_GETLK) /* Get file lock */ +X(F_SETLK) /* Set file lock */ +X(F_SETLKW) /* Set file lock and wait */ +X(FD_CLOEXEC) /* Close file descriptor on exec() */ Y(MSETUID, S_ISUID) /* set user id on execution */ Y(MSETGID, S_ISGID) /* set group id on execution */ Index: unix/Common/Unix.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-libs/m3core/src/unix/Common/Unix.i3,v retrieving revision 1.37 diff -u -r1.37 Unix.i3 --- unix/Common/Unix.i3 23 Apr 2011 10:08:00 -0000 1.37 +++ unix/Common/Unix.i3 15 Aug 2012 05:17:31 -0000 @@ -50,11 +50,29 @@ <*EXTERNAL "Unix__underscore_exit"*>PROCEDURE underscore_exit (i: int); (*CONST*) -<*EXTERNAL "Unix__F_SETFD"*> VAR F_SETFD: int; (* Set close-on-exec flag *) -<*EXTERNAL "Unix__F_GETFL"*> VAR F_GETFL: int; (* Get fd status flags *) -<*EXTERNAL "Unix__F_SETFL"*> VAR F_SETFL: int; (* Set fd status flags *) +<*EXTERNAL "Unix__F_DUPFD"*> VAR F_DUPFD: int; (* Duplicate fd *) +<*EXTERNAL "Unix__F_GETFD"*> VAR F_GETFD: int; (* Get close-on-exec flag *) +<*EXTERNAL "Unix__F_SETFD"*> VAR F_SETFD: int; (* Set close-on-exec flag *) +<*EXTERNAL "Unix__F_GETFL"*> VAR F_GETFL: int; (* Get fd status flags *) +<*EXTERNAL "Unix__F_SETFL"*> VAR F_SETFL: int; (* Set fd status flags *) +<*EXTERNAL "Unix__F_GETOWN"*> VAR F_GETOWN: int; (* Set owner *) +<*EXTERNAL "Unix__F_SETOWN"*> VAR F_SETOWN: int; (* Get owner *) +<*EXTERNAL "Unix__F_GETLK"*> VAR F_GETLK: int; (* Get file lock *) +<*EXTERNAL "Unix__F_SETLK"*> VAR F_SETLK: int; (* Set file lock *) +<*EXTERNAL "Unix__F_SETLKW"*> VAR F_SETLKW: int; (* Set file lock and wait *) +<*EXTERNAL "Unix__FD_CLOEXEC"*> VAR FD_CLOEXEC: int; (* Close file descriptor on exec() *) + +TYPE struct_flock = RECORD +(* sorted by size and then name + This must match between Unix.i3 and UnixC.c. *) + l_len: LONGINT := 0L; + l_start: LONGINT := 0L; + l_pid: INTEGER := 0; + l_type: INTEGER := 0; + l_whence: INTEGER := 0; +END; -<*EXTERNAL "Unix__fcntl"*>PROCEDURE fcntl (fd, request, arg: int): int; +<*EXTERNAL "Unix__fcntl"*>PROCEDURE fcntl (fd: int; request, arg: INTEGER): int; <*EXTERNAL "Unix__fsync"*>PROCEDURE fsync (fd: int): int; <*EXTERNAL "Unix__getdtablesize"*>PROCEDURE getdtablesize (): int; @@ -65,7 +83,7 @@ (*CONST*) <*EXTERNAL "Unix__FIONREAD"*> VAR FIONREAD: int; <*EXTERNAL "Unix__ioctl"*> -PROCEDURE ioctl (d, request: int; argp: ADDRESS): int; +PROCEDURE ioctl (d: int; request: INTEGER; argp: ADDRESS): int; <*EXTERNAL "Unix__lseek"*> PROCEDURE lseek (d: int; offset: off_t; whence: int): off_t; Index: unix/Common/UnixC.c =================================================================== RCS file: /usr/cvs/cm3/m3-libs/m3core/src/unix/Common/UnixC.c,v retrieving revision 1.67 diff -u -r1.67 UnixC.c --- unix/Common/UnixC.c 23 Apr 2011 10:08:00 -0000 1.67 +++ unix/Common/UnixC.c 15 Aug 2012 05:17:31 -0000 @@ -206,37 +206,71 @@ #else +typedef struct m3_flock_t { +/* sorted by size and then name + This must match between Unix.i3 and UnixC.c. */ + LONGINT len; + LONGINT start; + INTEGER pid; + INTEGER type; + INTEGER whence; +} m3_flock_t; + M3_DLL_EXPORT int __cdecl -Unix__fcntl(int fd, int request, int arg) +Unix__fcntl(int fd, INTEGER request, void* m3_arg) /* fcntl is actually fcntl(fd, request, ...). * Wrapper is needed on some systems to handle varargs. * See http://edoofus.blogspot.com/2008/08/interesting-bug-unbreaking-cvsupamd64.html. */ { -#ifdef __sun -/* - * This is to work around a bug in the Solaris-2 'libsocket' library +/* Errno preservation for success: + * work around a bug in the Solaris-2 'libsocket' library * which redefines 'fcntl' in such a way as to zero out 'errno' if the * call is successful. * See m3-libs/m3core/src/unix/solaris-2-x/Unix.m3. */ int e = errno; - int r = fcntl(fd, request, arg); + struct flock native_lock = { 0 }; + m3_flock_t* m3_lock = { 0 }; + void* native_arg = m3_arg; + int r = { 0 }; + + memset(&native_lock, 0, sizeof(native_lock)); + if (m3_arg) + { + switch (request) + { + case F_GETLK: case F_SETLK: case F_SETLKW: + m3_lock = (m3_flock_t*)m3_arg; + native_lock.l_len = m3_lock->len; + native_lock.l_pid = m3_lock->pid; + native_lock.l_start = m3_lock->start; + native_lock.l_type = m3_lock->type; + native_lock.l_whence = m3_lock->whence; + native_arg = &native_lock; + break; + } + } + r = fcntl(fd, request, native_arg); if (r == 0) errno = e; + if (m3_lock) + { + m3_lock->len = native_lock.l_len; + m3_lock->pid = native_lock.l_pid; + m3_lock->start = native_lock.l_start; + m3_lock->type = native_lock.l_type; + m3_lock->whence = native_lock.l_whence; + } return r; -#else - return fcntl(fd, request, arg); -#endif } M3_DLL_EXPORT int __cdecl -Unix__ioctl(int fd, int request, void* argp) +Unix__ioctl(int fd, INTEGER request, void* argp) /* ioctl is varargs. See fcntl. */ { -#ifdef __sun -/* - * This is to work around a bug in the Solaris-2 'libsocket' library +/* Errno preservation for success: + * Work around a bug in the Solaris-2 'libsocket' library * which redefines 'ioctl' in such a way as to zero out 'errno' if the * call is successful. * See m3-libs/m3core/src/unix/solaris-2-x/Unix.m3. @@ -246,9 +280,6 @@ if (r == 0) errno = e; return r; -#else - return ioctl(fd, request, argp); -#endif } #endif