That solution looks interesting. Does it work?
I'm not sure about the defcfun error handling on CMUCL, sorry. I'd have to try it out.
Cheers, Luís
On Mon, May 29, 2017, 03:48 Anton Vodonosov avodonosov@yandex.ru wrote:
29.05.2017, 05:42, "Luís Oliveira" luismbo@gmail.com:
foreign-symbol-pointer should work on Corman, yes.
If so, maybe this is the best solution?
(if (cffi:foreign-symbol-pointer "OpenSSL_version_num") (cffi:defcfun ("OpenSSL_version_num" ssleay) :long) (cffi:defcfun ("SSLeay" ssleay) :long))
Hopefully defcfun-ing an unexisting function won't yield an error.
Some alternative ideas, if that doesn't work:
- Handle/ignore the defcfun error.
At what time? (compile, load time, invocation time?) I was thinking about handling defcfun error but can't understand how to do that correctly?
- Implement foreign-funcall on Corman Lisp (src/cffi-corman.lisp has
some suggestions on how to do that)
- Ask the Corman Lisp developers to implement foreign-funcall(-pointer).
- Ignore the problem until #2 or #3 are implemented. (Possibly not a
big issue since Corman Lisp is not as widely used as other Lisps.)
Cheers, Luís
On Mon, May 29, 2017, 03:25 Anton Vodonosov avodonosov@yandex.ru
wrote:
Luis, thanks for the response
29.05.2017, 05:18, "Luís Oliveira" luismbo@gmail.com:
You can look up both functions using foreign-symbol-pointer to decide which one to call. You'd usually call the right one using foreign-funcall-pointer, but perhaps you can defcfun both and call the right one based on the lookup.
Will that work on Corman?
defcfun-ing non-existent functions will yield runtime warnings on some
implementations
(notably SBCL) so perhaps you might want to implement both the
foreign-funcall-pointer
and defcfun approaches and conditionalise them accordingly.
BTW, CMUCL fails with error in this case.
HTH, Luís
On Mon, May 29, 2017, 02:56 Anton Vodonosov avodonosov@yandex.ru
wrote:
Hello,
OpenSSL renamed function SSLeay to OpenSSL_version_num. So, so depending on what version of library we work with we need to call either SSLeay or OpenSSL_version_num.
What is the best way to do it?
The following is one approach:
(or (ignore-errors (cffi:foreign-funcall "OpenSSL_version_num" :long)) (ignore-errors (cffi:foreign-funcall "SSLeay" :long)))
but it won't work on Corman Lisp because it doesn't support cffi:foreign-funcall.
I would like to be fully portable. Is there a better way?
Best regards,
- Anton