> On May 21, 2020, at 12:55 AM, Mike Alexander <m...@umich.edu> wrote:
>
> I've had some fixes in binreloc.c for some time that I'm trying to clean up
> and commit. Part of the problem is that _br_find_exe doesn't work at all for
> non-Aqua Mac builds (i.e. using X11). I've fixed this by calling
> _NSGetExecutablePath if GNC_PLATFORM_OSX is set and MAC_INTEGRATION is not
> set. This has been working for me for several years. It shouldn't affect
> any other platforms.
>
> The other problem is that it doesn't resolve symlinks properly. There are
> bugs in that code that mean it never works, even in the simple case. I can
> make simple cases (where the last path component is a symlink) work easily
> enough, but the general case is a bit more complicated if you limit yourself
> to using only readlink. Is there any reason that we don't use the realpath
> function for this? I think it exists in all non-Windows systems GnuCash
> cares about (Windows is a completely separate implementation of
> _br_find_exe). It is in MacOS since 10.4, in Posix since POSIX.1-2001, in
> BSD4.4, and in Linux. It's essentially trivial to call and will solve the
> problem.
>
OK.
The code that we have is gnomified from the original autopackage.org version. I
agree it's pretty awful; the comparison of sizeof(ptr) to SSIZE_MAX
particularly so; trying to allocate SSIZE_MAX-1 in the impossible case that
sizeof(ptr) > SSIZE_MAX borders on comical. I suggest that rather than
allocating the path buffers you just create two char[PATH_MAX +1] buffers on
the stack.
There's another problem though, /proc/self/exe is Linux-only so it still won't
work for the BSDs. They don't all have proc (OpenBSD doesn't, it's optional on
FreeBSD; NetBSD has procfs and uses /proc/curproc/exe; DragonFly BSD uses
/proc/curproc/file [1]). The most general solution is to store argv[0] in
inner_main and then look for that file in $PATH. I dunno if it's that prominent
a use case. There have been only 2 bugs about binreloc ever and neither of them
is that it doesn't work.
Regards,
John Ralls
[1]
https://stackoverflow.com/questions/1023306/finding-current-executables-path-without-proc-self-exe
_______________________________________________
gnucash-devel mailing list
gnucash-devel@gnucash.org
https://lists.gnucash.org/mailman/listinfo/gnucash-devel