{
try {
Translate = new ErrorTranslator (strerror_r);
- string ignore = Translate (Error.EPERM);
+ Translate (Error.ERANGE);
HaveStrerror_r = true;
}
- catch (MissingMethodException e) {
+ catch (EntryPointNotFoundException e) {
Translate = new ErrorTranslator (strerror);
HaveStrerror_r = false;
}
private static string strerror (Error errno)
{
- return Syscall.strerror (errno);
+ return Stdlib.strerror (errno);
}
private static string strerror_r (Error errno)
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) + "**";
private static int CountStrings (IntPtr stringArray)
{
- int count = -1;
- IntPtr item = Marshal.ReadIntPtr (stringArray, count * IntPtr.Size);
- do {
+ int count = 0;
+ while (Marshal.ReadIntPtr (stringArray, count*IntPtr.Size) != IntPtr.Zero)
++count;
- } while (Marshal.ReadIntPtr (stringArray, count * IntPtr.Size) != IntPtr.Zero);
return count;
}
public static bool ShouldRetrySyscall (int r)
{
- if (r == -1 && Syscall.GetLastError () == Error.EINTR)
+ if (r == -1 && Stdlib.GetLastError () == Error.EINTR)
return true;
return false;
}
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;
}
- private static Exception CreateExceptionForError (Error errno)
+ // we can't permit any printf(3)-style formatting information, since that
+ // would kill the stack. However, replacing %% is silly, and some %* are
+ // permitted (such as %m in syslog to print strerror(errno)).
+ internal static string EscapeFormatString (string message,
+ char [] permitted)
+ {
+ if (message == null)
+ return "";
+ StringBuilder sb = new StringBuilder (message.Length);
+ for (int i = 0; i < message.Length; ++i) {
+ char c = message [i];
+ sb.Append (c);
+ if (c == '%' && (i+1) < message.Length) {
+ char n = message [i+1];
+ if (n == '%' || IsCharPresent (permitted, n))
+ sb.Append (n);
+ else
+ sb.Append ('%').Append (n);
+ ++i;
+ }
+ // invalid format string: % at EOS.
+ else if (c == '%')
+ sb.Append ('%');
+ }
+ return sb.ToString ();
+ }
+
+ private static bool IsCharPresent (char[] array, char c)
+ {
+ if (array == null)
+ return false;
+ for (int i = 0; i < array.Length; ++i)
+ if (array [i] == c)
+ return true;
+ return false;
+ }
+
+ internal static Exception CreateExceptionForError (Error errno)
{
string message = GetErrorDescription (errno);
UnixIOException p = new UnixIOException (errno);
return p;
}
+ internal static Exception CreateExceptionForLastError ()
+ {
+ return CreateExceptionForError (Stdlib.GetLastError());
+ }
+
public static void ThrowExceptionForError (Error errno)
{
throw CreateExceptionForError (errno);
public static void ThrowExceptionForLastError ()
{
- throw CreateExceptionForError (Syscall.GetLastError());
+ throw CreateExceptionForLastError ();
}
public static void ThrowExceptionForErrorIf (int retval, Error errno)