Skip to content

Commit

Permalink
Workaround to cope with the dl crowd and the libc crowd
Browse files Browse the repository at this point in the history
  • Loading branch information
migueldeicaza committed Feb 24, 2018
1 parent c3e45f7 commit 6edcc82
Showing 1 changed file with 27 additions and 5 deletions.
32 changes: 27 additions & 5 deletions Terminal.Gui/MonoCurses/binding.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,23 @@ internal struct MouseEvent {

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");
Expand Down Expand Up @@ -320,11 +333,20 @@ public static int addch (int ch)
[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;
Expand Down

0 comments on commit 6edcc82

Please sign in to comment.