<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>diff inline and attached<br><br>Index: m3core.h<br>===================================================================<br>RCS file: /usr/cvs/cm3/m3-libs/m3core/src/m3core.h,v<br>retrieving revision 1.75<br>diff -u -r1.75 m3core.h<br>--- m3core.h    23 Jun 2012 07:08:25 -0000    1.75<br>+++ m3core.h    15 Aug 2012 05:17:30 -0000<br>@@ -461,8 +461,8 @@<br> int __cdecl Unix__ftruncate(int fd, m3_off_t length);<br> m3_off_t __cdecl Unix__lseek(int fd, m3_off_t offset, int whence);<br> m3_off_t __cdecl Unix__tell(int fd);<br>-int __cdecl Unix__fcntl(int fd, int request, int arg);<br>-int __cdecl Unix__ioctl(int fd, int request, void* argp);<br>+int __cdecl Unix__fcntl(int fd, INTEGER request, void* arg);<br>+int __cdecl Unix__ioctl(int fd, INTEGER request, void* argp);<br> int __cdecl Unix__mknod(const char* path, m3_mode_t mode, m3_dev_t dev);<br> m3_mode_t __cdecl Unix__umask(m3_mode_t newmask);<br> <br>Index: unix/Common/Uconstants.c<br>===================================================================<br>RCS file: /usr/cvs/cm3/m3-libs/m3core/src/unix/Common/Uconstants.c,v<br>retrieving revision 1.52<br>diff -u -r1.52 Uconstants.c<br>--- unix/Common/Uconstants.c    12 Jan 2011 07:00:34 -0000    1.52<br>+++ unix/Common/Uconstants.c    15 Aug 2012 05:17:31 -0000<br>@@ -208,6 +208,14 @@<br> X(F_SETFD) /* Set close-on-exec flag */<br> X(F_GETFL) /* Get fd status flags */<br> X(F_SETFL) /* Set fd status flags */<br>+X(F_DUPFD)  /* Duplicate fd */<br>+X(F_GETFD)  /* Get close-on-exec flag */<br>+X(F_GETOWN) /* Set owner */<br>+X(F_SETOWN) /* Get owner */<br>+X(F_GETLK)  /* Get file lock */<br>+X(F_SETLK)  /* Set file lock */<br>+X(F_SETLKW) /* Set file lock and wait */<br>+X(FD_CLOEXEC)   /* Close file descriptor on exec() */<br> <br> Y(MSETUID, S_ISUID) /* set user id on execution */<br> Y(MSETGID, S_ISGID) /* set group id on execution */<br>Index: unix/Common/Unix.i3<br>===================================================================<br>RCS file: /usr/cvs/cm3/m3-libs/m3core/src/unix/Common/Unix.i3,v<br>retrieving revision 1.37<br>diff -u -r1.37 Unix.i3<br>--- unix/Common/Unix.i3    23 Apr 2011 10:08:00 -0000    1.37<br>+++ unix/Common/Unix.i3    15 Aug 2012 05:17:31 -0000<br>@@ -50,11 +50,29 @@<br> <*EXTERNAL "Unix__underscore_exit"*>PROCEDURE underscore_exit (i: int);<br> <br> (*CONST*)<br>-<*EXTERNAL "Unix__F_SETFD"*> VAR F_SETFD: int; (* Set close-on-exec flag *)<br>-<*EXTERNAL "Unix__F_GETFL"*> VAR F_GETFL: int; (* Get fd status flags *)<br>-<*EXTERNAL "Unix__F_SETFL"*> VAR F_SETFL: int; (* Set fd status flags *)<br>+<*EXTERNAL "Unix__F_DUPFD"*> VAR F_DUPFD: int;      (* Duplicate fd *)<br>+<*EXTERNAL "Unix__F_GETFD"*> VAR F_GETFD: int;      (* Get close-on-exec flag *)<br>+<*EXTERNAL "Unix__F_SETFD"*> VAR F_SETFD: int;      (* Set close-on-exec flag *)<br>+<*EXTERNAL "Unix__F_GETFL"*> VAR F_GETFL: int;      (* Get fd status flags *)<br>+<*EXTERNAL "Unix__F_SETFL"*> VAR F_SETFL: int;      (* Set fd status flags *)<br>+<*EXTERNAL "Unix__F_GETOWN"*> VAR F_GETOWN: int;    (* Set owner *)<br>+<*EXTERNAL "Unix__F_SETOWN"*> VAR F_SETOWN: int;    (* Get owner *)<br>+<*EXTERNAL "Unix__F_GETLK"*> VAR F_GETLK: int;      (* Get file lock *)<br>+<*EXTERNAL "Unix__F_SETLK"*> VAR F_SETLK: int;      (* Set file lock *)<br>+<*EXTERNAL "Unix__F_SETLKW"*> VAR F_SETLKW: int;    (* Set file lock and wait *)<br>+<*EXTERNAL "Unix__FD_CLOEXEC"*> VAR FD_CLOEXEC: int; (* Close file descriptor on exec() *)<br>+<br>+TYPE struct_flock = RECORD<br>+(* sorted by size and then name<br>+   This must match between Unix.i3 and UnixC.c. *)<br>+  l_len:    LONGINT := 0L;<br>+  l_start:  LONGINT := 0L;<br>+  l_pid:    INTEGER := 0;<br>+  l_type:   INTEGER := 0;<br>+  l_whence: INTEGER := 0;<br>+END;<br> <br>-<*EXTERNAL "Unix__fcntl"*>PROCEDURE fcntl (fd, request, arg: int): int;<br>+<*EXTERNAL "Unix__fcntl"*>PROCEDURE fcntl (fd: int; request, arg: INTEGER): int;<br> <br> <*EXTERNAL "Unix__fsync"*>PROCEDURE fsync (fd: int): int;<br> <*EXTERNAL "Unix__getdtablesize"*>PROCEDURE getdtablesize (): int;<br>@@ -65,7 +83,7 @@<br> (*CONST*) <*EXTERNAL "Unix__FIONREAD"*> VAR FIONREAD: int;<br> <br> <*EXTERNAL "Unix__ioctl"*><br>-PROCEDURE ioctl (d, request: int; argp: ADDRESS): int;<br>+PROCEDURE ioctl (d: int; request: INTEGER; argp: ADDRESS): int;<br> <br> <*EXTERNAL "Unix__lseek"*><br> PROCEDURE lseek (d: int; offset: off_t; whence: int): off_t;<br>Index: unix/Common/UnixC.c<br>===================================================================<br>RCS file: /usr/cvs/cm3/m3-libs/m3core/src/unix/Common/UnixC.c,v<br>retrieving revision 1.67<br>diff -u -r1.67 UnixC.c<br>--- unix/Common/UnixC.c    23 Apr 2011 10:08:00 -0000    1.67<br>+++ unix/Common/UnixC.c    15 Aug 2012 05:17:31 -0000<br>@@ -206,37 +206,71 @@<br> <br> #else<br> <br>+typedef struct m3_flock_t {<br>+/* sorted by size and then name<br>+   This must match between Unix.i3 and UnixC.c. */<br>+  LONGINT len;<br>+  LONGINT start;<br>+  INTEGER pid;<br>+  INTEGER type;<br>+  INTEGER whence;<br>+} m3_flock_t;<br>+<br> M3_DLL_EXPORT int __cdecl<br>-Unix__fcntl(int fd, int request, int arg)<br>+Unix__fcntl(int fd, INTEGER request, void* m3_arg)<br> /* fcntl is actually fcntl(fd, request, ...).<br>  * Wrapper is needed on some systems to handle varargs.<br>  * See http://edoofus.blogspot.com/2008/08/interesting-bug-unbreaking-cvsupamd64.html.<br>  */<br> {<br>-#ifdef __sun<br>-/*<br>- * This is to work around a bug in the Solaris-2 'libsocket' library <br>+/* Errno preservation for success:<br>+ * work around a bug in the Solaris-2 'libsocket' library <br>  * which redefines 'fcntl' in such a way as to zero out 'errno' if the<br>  * call is successful.<br>  * See m3-libs/m3core/src/unix/solaris-2-x/Unix.m3.<br>  */<br>     int e = errno;<br>-    int r = fcntl(fd, request, arg);<br>+    struct flock native_lock = { 0 };<br>+    m3_flock_t* m3_lock = { 0 };<br>+    void* native_arg = m3_arg;<br>+    int r = { 0 };<br>+<br>+    memset(&native_lock, 0, sizeof(native_lock));<br>+    if (m3_arg)<br>+    {<br>+      switch (request)<br>+      {<br>+      case F_GETLK: case F_SETLK: case F_SETLKW:<br>+        m3_lock = (m3_flock_t*)m3_arg;<br>+        native_lock.l_len = m3_lock->len;<br>+        native_lock.l_pid = m3_lock->pid;<br>+        native_lock.l_start = m3_lock->start;<br>+        native_lock.l_type = m3_lock->type;<br>+        native_lock.l_whence = m3_lock->whence;<br>+        native_arg = &native_lock;<br>+        break;<br>+      }<br>+    }<br>+    r = fcntl(fd, request, native_arg);<br>     if (r == 0)<br>         errno = e;<br>+   if (m3_lock)<br>+   {<br>+      m3_lock->len = native_lock.l_len;<br>+      m3_lock->pid = native_lock.l_pid;<br>+      m3_lock->start = native_lock.l_start;<br>+      m3_lock->type = native_lock.l_type;<br>+      m3_lock->whence = native_lock.l_whence;<br>+    }<br>     return r;<br>-#else<br>-    return fcntl(fd, request, arg);<br>-#endif<br> }<br> <br> M3_DLL_EXPORT int __cdecl<br>-Unix__ioctl(int fd, int request, void* argp)<br>+Unix__ioctl(int fd, INTEGER request, void* argp)<br> /* ioctl is varargs. See fcntl. */<br> {<br>-#ifdef __sun<br>-/*<br>- * This is to work around a bug in the Solaris-2 'libsocket' library <br>+/* Errno preservation for success:<br>+ * Work around a bug in the Solaris-2 'libsocket' library <br>  * which redefines 'ioctl' in such a way as to zero out 'errno' if the<br>  * call is successful.<br>  * See m3-libs/m3core/src/unix/solaris-2-x/Unix.m3.<br>@@ -246,9 +280,6 @@<br>     if (r == 0)<br>         errno = e;<br>     return r;<br>-#else<br>-    return ioctl(fd, request, argp);<br>-#endif<br> }<br> <br> #endif<br><br><br><br><br><br><div><div id="SkyDrivePlaceholder"></div>> Date: Wed, 15 Aug 2012 07:18:56 +0000<br>> To: m3commit@elegosoft.com<br>> From: jkrell@elego.de<br>> Subject: [M3commit] CVS Update: cm3<br>> <br>> CVSROOT:      /usr/cvs<br>> Changes by:      jkrell@birch.   12/08/15 07:18:56<br>> <br>> Modified files:<br>>    cm3/m3-libs/m3core/src/: m3core.h <br>>        ./: m3core.h <br>>     cm3/m3-libs/m3core/src/unix/Common/: Uconstants.c Unix.i3 <br>>                                             UnixC.c <br>> <br>> Log message:<br>>   add back:<br>>         Unix.F_DUPFD<br>>      Unix.F_GETFD<br>>      Unix.F_GETOWN<br>>     Unix.F_SETOWN<br>>     Unix.F_GETLK<br>>      Unix.F_SETLK<br>>      Unix.F_SETLKW<br>>     Unix.FD_CLOEXEC<br>>   Unix.struct_flock idealized/portable sorted by size and then name,<br>>        making len/start LONGINT<br>>  <br>>  change ioctl int request to INTEGER -- Darwin uses unsigned long<br>>  change fnctl int request and arg from int to INTEGER<br>>      no clear rationale to change request, but it is reasonable<br>>        arg changed to accommodate GETLK/SETLK/SETKLW struct_flock<br>>        expectation is a pointer will be passed via LOOPHOLE,<br>>     and passing it as an int instead of INTEGER is wrong for 64bit systems<br>>    <br>>  In the C code, change fnctl and ioctl last parameter to void*<br>>     void* vs. INTEGER, eh, if just passing it on, same thing really<br>>   <br>>  In Unix__fcntl:<br>>   handle F_GETLK, F_SETLK, F_SETLKW in fnctl, via copy to/from portable struct<br>>      not actually tested<br>>       This was because someone complained about the loss<br>>        of compatibility in m3core/src/unix.<br>>      It probably works now.<br>>    <br>>  In Unix__fcntl, Unix__ioctl:<br>>      make the #ifdef __sun errno preservation workaround not #ifdef'ed,<br>>        on the principle that more #ifdef is worse; the workaround is present<br>>     for all platforms now, it should be harmless where not needed<br>> <br></div>                                        </div></body>
</html>