(in-package #:cffi-additions) (defun foreign-function-exists-p (name) (when (cffi:foreign-symbol-pointer name) t)) (defun choose-foreign-function (&rest names) (loop for name in names when (foreign-function-exists-p name) do (return name))) (defvar *libc-implementation-memoized*) (defvar *libc-version-memoized*) (defun libc-implementation () (when (boundp '*libc-implementation-memoized*) (return-from libc-implementation *libc-implementation-memoized*)) (setq *libc-implementation-memoized* (cond ((foreign-function-exists-p "gnu_get_libc_version") :gnu)))) (defun libc-version () (when (boundp '*libc-version-memoized*) (return-from libc-version *libc-version-memoized*)) (setq *libc-version-memoized* (case (libc-implementation) (:gnu (foreign-funcall "gnu_get_libc_version" :string)))))