There are many ways to get errno. With the very cool cffi-wrappers you can use (include "errno.h") (defwrapper* "get_errno" :int () "return errno;") which finesses the point about whether or not errno is a real variable or a thread-local variable or something else. However, there is no guarantee that between calling your function and getting the errno, the Lisp environment will not call a C function that resets errno. (progn (open ...) ;; something can happen here (get-errno)) In practice, we have observed this problem. Each Lisp might have a different way of handing it. In Allegro CL it is possible to build the wrapper for the foreign function so it collects the errno in a safe way, using def-foreign-call with :ERROR-VALUE :ERRNO. In SBCL there is a native get-errno function to get the errno. Is there any plan to add a semi-portable wrapper to this functionality for CFFI? If not, would you accept a patch for it? I guess the obvious way is to modify (cffi:defcfun ...) to take a :after-collect-value argument, so that it could work not only for errno On most Lisps I guess it might translate to something like this (defmacro defcfun-with-collect-value ((name &key after-collect-value) ...) `(without-interrupts (values (call-foreign-function ,name ...) (funcall ,after-collect-value)))) Suggestions for better names and interfaces much appreciated.