Author: jonpryor
Date: 2005-03-17 07:10:40 -0500 (Thu, 17 Mar 2005)
New Revision: 41939

Modified:
   trunk/mcs/class/Mono.Posix/Mono.Unix/ChangeLog
   trunk/mcs/class/Mono.Posix/Mono.Unix/Stdlib.cs
   trunk/mcs/class/Mono.Posix/Mono.Unix/Syscall.cs
   trunk/mcs/class/Mono.Posix/Mono.Unix/UnixMarshal.cs
Log:
        * Stdlib.cs: Move Errno-related functionality into Stdlib from Syscall,
          since (1) errno is part of C89, and (2) StdioFileStream will need it, 
and
          StdioFileStream shouldn't use Syscall.  Add [UnmanagedFunctionPointer]
                attribute to SignalHandler for .NET 2.0 (since signal handlers 
use C
                calling convention, not Stdcall).
        * Syscall.cs: Move Errno-related functionality into Stdlib.
        * UnixMarshal.cs: Use ERANGE not EPERM when figuring out appropriate
          translator, since ERANGE is part of C99 and EPERM isn't.  Use Stdlib
          instead of Syscall for Errno-related functionality.


Modified: trunk/mcs/class/Mono.Posix/Mono.Unix/ChangeLog
===================================================================
--- trunk/mcs/class/Mono.Posix/Mono.Unix/ChangeLog      2005-03-17 11:44:28 UTC 
(rev 41938)
+++ trunk/mcs/class/Mono.Posix/Mono.Unix/ChangeLog      2005-03-17 12:10:40 UTC 
(rev 41939)
@@ -1,3 +1,15 @@
+2005-03-17  Jonathan Pryor <[EMAIL PROTECTED]>
+
+       * Stdlib.cs: Move Errno-related functionality into Stdlib from Syscall,
+         since (1) errno is part of C89, and (2) StdioFileStream will need it, 
and
+         StdioFileStream shouldn't use Syscall.  Add [UnmanagedFunctionPointer]
+               attribute to SignalHandler for .NET 2.0 (since signal handlers 
use C
+               calling convention, not Stdcall).
+       * Syscall.cs: Move Errno-related functionality into Stdlib.
+       * UnixMarshal.cs: Use ERANGE not EPERM when figuring out appropriate
+         translator, since ERANGE is part of C99 and EPERM isn't.  Use Stdlib
+         instead of Syscall for Errno-related functionality.
+
 2005-02-02  Jonathan Pryor <[EMAIL PROTECTED]>
 
        * UnixFile.cs: Cope with changes in UnixStream.

Modified: trunk/mcs/class/Mono.Posix/Mono.Unix/Stdlib.cs
===================================================================
--- trunk/mcs/class/Mono.Posix/Mono.Unix/Stdlib.cs      2005-03-17 11:44:28 UTC 
(rev 41938)
+++ trunk/mcs/class/Mono.Posix/Mono.Unix/Stdlib.cs      2005-03-17 12:10:40 UTC 
(rev 41939)
@@ -34,8 +34,146 @@
 
 namespace Mono.Unix {
 
-       public delegate void SignalHandler (int signal);
+       #region Enumerations
 
+       [Map]
+       public enum Error : int {
+               // errors & their values liberally copied from
+               // FC2 /usr/include/asm/errno.h
+               
+               EPERM           =   1, // Operation not permitted 
+               ENOENT          =   2, // No such file or directory 
+               ESRCH           =   3, // No such process 
+               EINTR           =   4, // Interrupted system call 
+               EIO             =   5, // I/O error 
+               ENXIO           =   6, // No such device or address 
+               E2BIG           =   7, // Arg list too long 
+               ENOEXEC         =   8, // Exec format error 
+               EBADF           =   9, // Bad file number 
+               ECHILD          =  10, // No child processes 
+               EAGAIN          =  11, // Try again 
+               ENOMEM          =  12, // Out of memory 
+               EACCES          =  13, // Permission denied 
+               EFAULT          =  14, // Bad address 
+               ENOTBLK         =  15, // Block device required 
+               EBUSY           =  16, // Device or resource busy 
+               EEXIST          =  17, // File exists 
+               EXDEV           =  18, // Cross-device link 
+               ENODEV          =  19, // No such device 
+               ENOTDIR         =  20, // Not a directory 
+               EISDIR          =  21, // Is a directory 
+               EINVAL          =  22, // Invalid argument 
+               ENFILE          =  23, // File table overflow 
+               EMFILE          =  24, // Too many open files 
+               ENOTTY          =  25, // Not a typewriter 
+               ETXTBSY         =  26, // Text file busy 
+               EFBIG           =  27, // File too large 
+               ENOSPC          =  28, // No space left on device 
+               ESPIPE          =  29, // Illegal seek 
+               EROFS           =  30, // Read-only file system 
+               EMLINK          =  31, // Too many links 
+               EPIPE           =  32, // Broken pipe 
+               EDOM            =  33, // Math argument out of domain of func 
+               ERANGE          =  34, // Math result not representable 
+               EDEADLK         =  35, // Resource deadlock would occur 
+               ENAMETOOLONG    =  36, // File name too long 
+               ENOLCK          =  37, // No record locks available 
+               ENOSYS          =  38, // Function not implemented 
+               ENOTEMPTY       =  39, // Directory not empty 
+               ELOOP           =  40, // Too many symbolic links encountered 
+               EWOULDBLOCK     =  EAGAIN, // Operation would block 
+               ENOMSG          =  42, // No message of desired type 
+               EIDRM           =  43, // Identifier removed 
+               ECHRNG          =  44, // Channel number out of range 
+               EL2NSYNC        =  45, // Level 2 not synchronized 
+               EL3HLT          =  46, // Level 3 halted 
+               EL3RST          =  47, // Level 3 reset 
+               ELNRNG          =  48, // Link number out of range 
+               EUNATCH         =  49, // Protocol driver not attached 
+               ENOCSI          =  50, // No CSI structure available 
+               EL2HLT          =  51, // Level 2 halted 
+               EBADE           =  52, // Invalid exchange 
+               EBADR           =  53, // Invalid request descriptor 
+               EXFULL          =  54, // Exchange full 
+               ENOANO          =  55, // No anode 
+               EBADRQC         =  56, // Invalid request code 
+               EBADSLT         =  57, // Invalid slot 
+                      
+               EDEADLOCK             =  EDEADLK,
+                      
+               EBFONT          =  59, // Bad font file format 
+               ENOSTR          =  60, // Device not a stream 
+               ENODATA         =  61, // No data available 
+               ETIME           =  62, // Timer expired 
+               ENOSR           =  63, // Out of streams resources 
+               ENONET          =  64, // Machine is not on the network 
+               ENOPKG          =  65, // Package not installed 
+               EREMOTE         =  66, // Object is remote 
+               ENOLINK         =  67, // Link has been severed 
+               EADV            =  68, // Advertise error 
+               ESRMNT          =  69, // Srmount error 
+               ECOMM           =  70, // Communication error on send 
+               EPROTO          =  71, // Protocol error 
+               EMULTIHOP       =  72, // Multihop attempted 
+               EDOTDOT         =  73, // RFS specific error 
+               EBADMSG         =  74, // Not a data message 
+               EOVERFLOW       =  75, // Value too large for defined data type 
+               ENOTUNIQ        =  76, // Name not unique on network 
+               EBADFD          =  77, // File descriptor in bad state 
+               EREMCHG         =  78, // Remote address changed 
+               ELIBACC         =  79, // Can not access a needed shared 
library 
+               ELIBBAD         =  80, // Accessing a corrupted shared library 
+               ELIBSCN         =  81, // .lib section in a.out corrupted 
+               ELIBMAX         =  82, // Attempting to link in too many shared 
libraries 
+               ELIBEXEC        =  83, // Cannot exec a shared library directly 
+               EILSEQ          =  84, // Illegal byte sequence 
+               ERESTART        =  85, // Interrupted system call should be 
restarted 
+               ESTRPIPE        =  86, // Streams pipe error 
+               EUSERS          =  87, // Too many users 
+               ENOTSOCK        =  88, // Socket operation on non-socket 
+               EDESTADDRREQ    =  89, // Destination address required 
+               EMSGSIZE        =  90, // Message too long 
+               EPROTOTYPE      =  91, // Protocol wrong type for socket 
+               ENOPROTOOPT     =  92, // Protocol not available 
+               EPROTONOSUPPORT =  93, // Protocol not supported 
+               ESOCKTNOSUPPORT =  94, // Socket type not supported 
+               EOPNOTSUPP      =  95, // Operation not supported on transport 
endpoint 
+               EPFNOSUPPORT    =  96, // Protocol family not supported 
+               EAFNOSUPPORT    =  97, // Address family not supported by 
protocol 
+               EADDRINUSE      =  98, // Address already in use 
+               EADDRNOTAVAIL   =  99, // Cannot assign requested address 
+               ENETDOWN        = 100, // Network is down 
+               ENETUNREACH     = 101, // Network is unreachable 
+               ENETRESET       = 102, // Network dropped connection because of 
reset 
+               ECONNABORTED    = 103, // Software caused connection abort 
+               ECONNRESET      = 104, // Connection reset by peer 
+               ENOBUFS         = 105, // No buffer space available 
+               EISCONN         = 106, // Transport endpoint is already 
connected 
+               ENOTCONN        = 107, // Transport endpoint is not connected 
+               ESHUTDOWN       = 108, // Cannot send after transport endpoint 
shutdown 
+               ETOOMANYREFS    = 109, // Too many references: cannot splice 
+               ETIMEDOUT       = 110, // Connection timed out 
+               ECONNREFUSED    = 111, // Connection refused 
+               EHOSTDOWN       = 112, // Host is down 
+               EHOSTUNREACH    = 113, // No route to host 
+               EALREADY        = 114, // Operation already in progress 
+               EINPROGRESS     = 115, // Operation now in progress 
+               ESTALE          = 116, // Stale NFS file handle 
+               EUCLEAN         = 117, // Structure needs cleaning 
+               ENOTNAM         = 118, // Not a XENIX named type file 
+               ENAVAIL         = 119, // No XENIX semaphores available 
+               EISNAM          = 120, // Is a named type file 
+               EREMOTEIO       = 121, // Remote I/O error 
+               EDQUOT          = 122, // Quota exceeded 
+
+               ENOMEDIUM       = 123, // No medium found 
+               EMEDIUMTYPE     = 124, // Wrong medium type 
+       }
+
+       #endregion
+
+       #region Classes
+
        public sealed class FilePosition : IDisposable {
 
                private HandleRef pos;
@@ -72,6 +210,11 @@
                }
        }
 
+#if NET_2_0
+       [UnmanagedFunctionPointer (CallingConvention.Cdecl)]
+#endif
+       public delegate void SignalHandler (int signal);
+
        internal sealed class SignalWrapper {
                private IntPtr handler;
 
@@ -132,7 +275,29 @@
 
                internal Stdlib () {}
 
+               #region <errno.h> Declarations
                //
+               // <errno.h>  -- COMPLETE
+               //
+
+               public static Error GetLastError ()
+               {
+                       int errno = Marshal.GetLastWin32Error ();
+                       return UnixConvert.ToError (errno);
+               }
+
+               [DllImport (MPH, CallingConvention=CallingConvention.Cdecl,
+                               EntryPoint="Mono_Posix_Stdlib_SetLastError")]
+               private static extern void SetLastError (int error);
+
+               public static void SetLastError (Error error)
+               {
+                       int _error = UnixConvert.FromError (error);
+                       SetLastError (_error);
+               }
+               #endregion
+
+               //
                // <signal.h>
                //
                [DllImport (MPH, CallingConvention=CallingConvention.Cdecl,
@@ -680,6 +845,8 @@
                        return UnixMarshal.PtrToString (r);
                }
        }
+
+       #endregion // Classes
 }
 
 // vim: noexpandtab

Modified: trunk/mcs/class/Mono.Posix/Mono.Unix/Syscall.cs
===================================================================
--- trunk/mcs/class/Mono.Posix/Mono.Unix/Syscall.cs     2005-03-17 11:44:28 UTC 
(rev 41938)
+++ trunk/mcs/class/Mono.Posix/Mono.Unix/Syscall.cs     2005-03-17 12:10:40 UTC 
(rev 41939)
@@ -68,140 +68,6 @@
 
        #region Enumerations
 
-       [Map]
-       public enum Error : int {
-               // errors & their values liberally copied from
-               // FC2 /usr/include/asm/errno.h
-               
-               EPERM           =   1, // Operation not permitted 
-               ENOENT          =   2, // No such file or directory 
-               ESRCH           =   3, // No such process 
-               EINTR           =   4, // Interrupted system call 
-               EIO             =   5, // I/O error 
-               ENXIO           =   6, // No such device or address 
-               E2BIG           =   7, // Arg list too long 
-               ENOEXEC         =   8, // Exec format error 
-               EBADF           =   9, // Bad file number 
-               ECHILD          =  10, // No child processes 
-               EAGAIN          =  11, // Try again 
-               ENOMEM          =  12, // Out of memory 
-               EACCES          =  13, // Permission denied 
-               EFAULT          =  14, // Bad address 
-               ENOTBLK         =  15, // Block device required 
-               EBUSY           =  16, // Device or resource busy 
-               EEXIST          =  17, // File exists 
-               EXDEV           =  18, // Cross-device link 
-               ENODEV          =  19, // No such device 
-               ENOTDIR         =  20, // Not a directory 
-               EISDIR          =  21, // Is a directory 
-               EINVAL          =  22, // Invalid argument 
-               ENFILE          =  23, // File table overflow 
-               EMFILE          =  24, // Too many open files 
-               ENOTTY          =  25, // Not a typewriter 
-               ETXTBSY         =  26, // Text file busy 
-               EFBIG           =  27, // File too large 
-               ENOSPC          =  28, // No space left on device 
-               ESPIPE          =  29, // Illegal seek 
-               EROFS           =  30, // Read-only file system 
-               EMLINK          =  31, // Too many links 
-               EPIPE           =  32, // Broken pipe 
-               EDOM            =  33, // Math argument out of domain of func 
-               ERANGE          =  34, // Math result not representable 
-               EDEADLK         =  35, // Resource deadlock would occur 
-               ENAMETOOLONG    =  36, // File name too long 
-               ENOLCK          =  37, // No record locks available 
-               ENOSYS          =  38, // Function not implemented 
-               ENOTEMPTY       =  39, // Directory not empty 
-               ELOOP           =  40, // Too many symbolic links encountered 
-               EWOULDBLOCK     =  EAGAIN, // Operation would block 
-               ENOMSG          =  42, // No message of desired type 
-               EIDRM           =  43, // Identifier removed 
-               ECHRNG          =  44, // Channel number out of range 
-               EL2NSYNC        =  45, // Level 2 not synchronized 
-               EL3HLT          =  46, // Level 3 halted 
-               EL3RST          =  47, // Level 3 reset 
-               ELNRNG          =  48, // Link number out of range 
-               EUNATCH         =  49, // Protocol driver not attached 
-               ENOCSI          =  50, // No CSI structure available 
-               EL2HLT          =  51, // Level 2 halted 
-               EBADE           =  52, // Invalid exchange 
-               EBADR           =  53, // Invalid request descriptor 
-               EXFULL          =  54, // Exchange full 
-               ENOANO          =  55, // No anode 
-               EBADRQC         =  56, // Invalid request code 
-               EBADSLT         =  57, // Invalid slot 
-                      
-               EDEADLOCK             =  EDEADLK,
-                      
-               EBFONT          =  59, // Bad font file format 
-               ENOSTR          =  60, // Device not a stream 
-               ENODATA         =  61, // No data available 
-               ETIME           =  62, // Timer expired 
-               ENOSR           =  63, // Out of streams resources 
-               ENONET          =  64, // Machine is not on the network 
-               ENOPKG          =  65, // Package not installed 
-               EREMOTE         =  66, // Object is remote 
-               ENOLINK         =  67, // Link has been severed 
-               EADV            =  68, // Advertise error 
-               ESRMNT          =  69, // Srmount error 
-               ECOMM           =  70, // Communication error on send 
-               EPROTO          =  71, // Protocol error 
-               EMULTIHOP       =  72, // Multihop attempted 
-               EDOTDOT         =  73, // RFS specific error 
-               EBADMSG         =  74, // Not a data message 
-               EOVERFLOW       =  75, // Value too large for defined data type 
-               ENOTUNIQ        =  76, // Name not unique on network 
-               EBADFD          =  77, // File descriptor in bad state 
-               EREMCHG         =  78, // Remote address changed 
-               ELIBACC         =  79, // Can not access a needed shared 
library 
-               ELIBBAD         =  80, // Accessing a corrupted shared library 
-               ELIBSCN         =  81, // .lib section in a.out corrupted 
-               ELIBMAX         =  82, // Attempting to link in too many shared 
libraries 
-               ELIBEXEC        =  83, // Cannot exec a shared library directly 
-               EILSEQ          =  84, // Illegal byte sequence 
-               ERESTART        =  85, // Interrupted system call should be 
restarted 
-               ESTRPIPE        =  86, // Streams pipe error 
-               EUSERS          =  87, // Too many users 
-               ENOTSOCK        =  88, // Socket operation on non-socket 
-               EDESTADDRREQ    =  89, // Destination address required 
-               EMSGSIZE        =  90, // Message too long 
-               EPROTOTYPE      =  91, // Protocol wrong type for socket 
-               ENOPROTOOPT     =  92, // Protocol not available 
-               EPROTONOSUPPORT =  93, // Protocol not supported 
-               ESOCKTNOSUPPORT =  94, // Socket type not supported 
-               EOPNOTSUPP      =  95, // Operation not supported on transport 
endpoint 
-               EPFNOSUPPORT    =  96, // Protocol family not supported 
-               EAFNOSUPPORT    =  97, // Address family not supported by 
protocol 
-               EADDRINUSE      =  98, // Address already in use 
-               EADDRNOTAVAIL   =  99, // Cannot assign requested address 
-               ENETDOWN        = 100, // Network is down 
-               ENETUNREACH     = 101, // Network is unreachable 
-               ENETRESET       = 102, // Network dropped connection because of 
reset 
-               ECONNABORTED    = 103, // Software caused connection abort 
-               ECONNRESET      = 104, // Connection reset by peer 
-               ENOBUFS         = 105, // No buffer space available 
-               EISCONN         = 106, // Transport endpoint is already 
connected 
-               ENOTCONN        = 107, // Transport endpoint is not connected 
-               ESHUTDOWN       = 108, // Cannot send after transport endpoint 
shutdown 
-               ETOOMANYREFS    = 109, // Too many references: cannot splice 
-               ETIMEDOUT       = 110, // Connection timed out 
-               ECONNREFUSED    = 111, // Connection refused 
-               EHOSTDOWN       = 112, // Host is down 
-               EHOSTUNREACH    = 113, // No route to host 
-               EALREADY        = 114, // Operation already in progress 
-               EINPROGRESS     = 115, // Operation now in progress 
-               ESTALE          = 116, // Stale NFS file handle 
-               EUCLEAN         = 117, // Structure needs cleaning 
-               ENOTNAM         = 118, // Not a XENIX named type file 
-               ENAVAIL         = 119, // No XENIX semaphores available 
-               EISNAM          = 120, // Is a named type file 
-               EREMOTEIO       = 121, // Remote I/O error 
-               EDQUOT          = 122, // Quota exceeded 
-
-               ENOMEDIUM       = 123, // No medium found 
-               EMEDIUMTYPE     = 124, // Wrong medium type 
-       }
-
        [Flags][Map]
        public enum SyslogOptions {
                LOG_PID    = 0x01,  // log the pid with each message
@@ -1151,27 +1017,6 @@
                public static extern int dirfd (IntPtr dir);
                #endregion
 
-               #region <errno.h> Declarations
-               //
-               // <errno.h>  -- COMPLETE
-               //
-
-               public static Error GetLastError ()
-               {
-                       int errno = Marshal.GetLastWin32Error ();
-                       return UnixConvert.ToError (errno);
-               }
-
-               [DllImport (MPH, EntryPoint="Mono_Posix_Syscall_SetLastError")]
-               private static extern void SetLastError (int error);
-
-               public static void SetLastError (Error error)
-               {
-                       int _error = UnixConvert.FromError (error);
-                       SetLastError (_error);
-               }
-               #endregion
-
                #region <fcntl.h> Declarations
                //
                // <fcntl.h> -- COMPLETE

Modified: trunk/mcs/class/Mono.Posix/Mono.Unix/UnixMarshal.cs
===================================================================
--- trunk/mcs/class/Mono.Posix/Mono.Unix/UnixMarshal.cs 2005-03-17 11:44:28 UTC 
(rev 41938)
+++ trunk/mcs/class/Mono.Posix/Mono.Unix/UnixMarshal.cs 2005-03-17 12:10:40 UTC 
(rev 41939)
@@ -66,7 +66,7 @@
                {
                        try {
                                Translate = new ErrorTranslator (strerror_r);
-                               string ignore = Translate (Error.EPERM);
+                               string ignore = Translate (Error.ERANGE);
                                ignore = ignore;
                                HaveStrerror_r = true;
                        }
@@ -78,7 +78,7 @@
 
                private static string strerror (Error errno)
                {
-                       return Syscall.strerror (errno);
+                       return Stdlib.strerror (errno);
                }
 
                private static string strerror_r (Error errno)
@@ -88,7 +88,7 @@
                        do {
                                buf.Capacity *= 2;
                                r = Syscall.strerror_r (errno, buf);
-                       } while (r == -1 && Syscall.GetLastError() == 
Error.ERANGE);
+                       } while (r == -1 && Stdlib.GetLastError() == 
Error.ERANGE);
 
                        if (r == -1)
                                return "** Unknown error code: " + ((int) 
errno) + "**";
@@ -195,7 +195,7 @@
 
                public static bool ShouldRetrySyscall (int r)
                {
-                       if (r == -1 && Syscall.GetLastError () == Error.EINTR)
+                       if (r == -1 && Stdlib.GetLastError () == Error.EINTR)
                                return true;
                        return false;
                }
@@ -203,7 +203,7 @@
                public static bool ShouldRetrySyscall (int r, out Error error)
                {
                        error = (Error) 0;
-                       if (r == -1 && (error = Syscall.GetLastError ()) == 
Error.EINTR)
+                       if (r == -1 && (error = Stdlib.GetLastError ()) == 
Error.EINTR)
                                return true;
                        return false;
                }
@@ -267,6 +267,11 @@
                        return p;
                }
 
+               internal static Exception CreateExceptionForLastError ()
+               {
+                       return CreateExceptionForError (Stdlib.GetLastError());
+               }
+
                public static void ThrowExceptionForError (Error errno)
                {
                        throw CreateExceptionForError (errno);
@@ -274,7 +279,7 @@
 
                public static void ThrowExceptionForLastError ()
                {
-                       throw CreateExceptionForError (Syscall.GetLastError());
+                       throw CreateExceptionForLastError ();
                }
 
                public static void ThrowExceptionForErrorIf (int retval, Error 
errno)

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to