Chaos Eternal <chaoseter...@shlug.org> writes: > i wrote a FFI to inotify system call. > > https://github.com/ChaosEternal/guile-inotify2 > > procedures: > * inotify-init > * inotify-init1 > * inotify-add-watch > * inotify-rm-watch > * inotify-read-port > > the errno handle is unreliable, use with caution. > > License: LGPL v3
and later, he wrote: > and it is not very portable. Thanks for working on this, but as you pointed out, the method you use to check 'errno' is extremely unportable and also quite fragile. It makes assumptions about internal details of the C library and Guile, and is likely to break in future versions of glibc and/or Guile. It might not even work properly with current versions. There are many things that could happen between the call to the C function and checking 'errno' that might disturb the value of 'errno'. Unfortunately, there's currently no proper way to check 'errno' using the Dynamic FFI. For now, the only proper solution is to write a C extension as described in: http://www.gnu.org/software/guile/manual/html_node/C-Extensions.html Your C wrapper should call the relevant C function and then immediately read the value of 'errno' if the return value indicates an error. You should not make any calls to libguile before reading 'errno'. Hopefully, Guile 2.0.12 will include a way to check 'errno' after calls to the Dynamic FFI. Most likely, this will involve adding a keyword argument to 'pointer->procedure' that causes the generated wrapper to check 'errno' immediately after the C function returns. The ticket for this issue is here: http://bugs.gnu.org/18592 Regards, Mark