2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / Mono.Posix / Mono.Unix / UnixMarshal.cs
index 7d89e8b24dd21bb2c361c70f3b8fcdf23d7a4984..302cc59f580ffbd50829e7c4e2726274e47f0337 100644 (file)
@@ -67,9 +67,10 @@ namespace Mono.Unix {
                        try {
                                Translate = new ErrorTranslator (strerror_r);
                                string ignore = Translate (Error.EPERM);
+                               ignore = ignore;
                                HaveStrerror_r = true;
                        }
-                       catch (MissingMethodException e) {
+                       catch (EntryPointNotFoundException e) {
                                Translate = new ErrorTranslator (strerror);
                                HaveStrerror_r = false;
                        }
@@ -161,11 +162,9 @@ namespace Mono.Unix {
 
                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;
                }
 
@@ -209,7 +208,44 @@ namespace Mono.Unix {
                        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);