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