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.
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.
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
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
foreign-symbol-pointer should work on Corman, yes. Hopefully defcfun-ing an unexisting function won't yield an error.
Some alternative ideas, if that doesn't work:
1. Handle/ignore the defcfun error. 2. Implement foreign-funcall on Corman Lisp (src/cffi-corman.lisp has some suggestions on how to do that) 3. Ask the Corman Lisp developers to implement foreign-funcall(-pointer). 4. 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
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
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
It does on SBCL. Is it correct theoretically to call DEFCFUN from inside of IF?
Also, when somebody saves lisp image and the image opened next time, possibly different version of OpenSSL is loaded. The defcfun done before saving the image, will it conflict with the new library?
29.05.2017, 06:02, "Luís Oliveira" luismbo@gmail.com:
That solution looks interesting. Does it work?
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))
Good catch. That approach won't be very robust when saving images.
Luís
On Mon, May 29, 2017, 04:12 Anton Vodonosov avodonosov@yandex.ru wrote:
It does on SBCL. Is it correct theoretically to call DEFCFUN from inside of IF?
Also, when somebody saves lisp image and the image opened next time, possibly different version of OpenSSL is loaded. The defcfun done before saving the image, will it conflict with the new library?
29.05.2017, 06:02, "Luís Oliveira" luismbo@gmail.com:
That solution looks interesting. Does it work?
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))