Kaynağa Gözat

Workaround to cope with the dl crowd and the libc crowd

Miguel de Icaza 7 yıl önce
ebeveyn
işleme
6edcc8240b
1 değiştirilmiş dosya ile 27 ekleme ve 5 silme
  1. 27 5
      Terminal.Gui/MonoCurses/binding.cs

+ 27 - 5
Terminal.Gui/MonoCurses/binding.cs

@@ -52,10 +52,23 @@ namespace Unix.Terminal {
 
 		static void FindNCurses ()
 		{
-			if (File.Exists ("/usr/lib/libncurses.dylib"))
-				curses_handle = dlopen ("libncurses.dylib", 1);
-			else
-				curses_handle = dlopen ("libncurses.so", 1);
+			try {
+				if (File.Exists ("/usr/lib/libncurses.dylib"))
+					curses_handle = dlopen ("libncurses.dylib", 1);
+				else
+					curses_handle = dlopen ("libncurses.so", 1);
+			} catch (DllNotFoundException) {
+				uselibc = true;
+				if (File.Exists ("/usr/lib/libncurses.dylib"))
+					curses_handle = libc_dlopen ("libncurses.dylib", 1);
+				else {
+					curses_handle = libc_dlopen ("libncurses.so", 1);
+					if (curses_handle == IntPtr.Zero) {
+						Console.WriteLine ("It is not possible to open libncurses.so, you might need to symlink libncurses.so.5 to libncurses.so");
+						Environment.Exit (1);
+					}
+				}
+			}
 			
 			if (curses_handle == IntPtr.Zero)
 				throw new Exception ("Could not dlopen ncurses");
@@ -320,11 +333,20 @@ namespace Unix.Terminal {
 		[DllImport ("dl")]
 		extern static IntPtr dlsym (IntPtr handle, string symbol);
 
+		[DllImport ("libc", EntryPoint="dlopen")]
+		extern static IntPtr libc_dlopen (string file, int mode);
+
+		[DllImport ("libc", EntryPoint ="dlsym")]
+		extern static IntPtr libc_dlsym (IntPtr handle, string symbol);
+
+		static bool uselibc;
+
 		static IntPtr stdscr;
 
 		static IntPtr get_ptr (string key)
 		{
-			var ptr = dlsym (curses_handle, key);
+			var ptr = uselibc ? libc_dlsym (curses_handle, key) : dlsym (curses_handle, key);
+
 			if (ptr == IntPtr.Zero)
 				throw new Exception ("Could not load the key " + key);
 			return ptr;