From 6edcc8240bed91832b5d3eb78ba653001a3f00ce Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Fri, 23 Feb 2018 23:16:16 -0500 Subject: [PATCH] Workaround to cope with the dl crowd and the libc crowd --- Terminal.Gui/MonoCurses/binding.cs | 32 +++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/Terminal.Gui/MonoCurses/binding.cs b/Terminal.Gui/MonoCurses/binding.cs index 60fab808a..cc3d462c5 100644 --- a/Terminal.Gui/MonoCurses/binding.cs +++ b/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;