<div dir="ltr">Hi all,<div><br></div><div>In Allegro CL, the only safe way to get errno after a foreign function call is to configure the foreign function definition to return it as a second value.</div><div><br></div><div>
CFFI doesn't deal with errno. There has been some previous discussion (<a href="http://lists.common-lisp.net/pipermail/cffi-devel/2009-January/003017.html">http://lists.common-lisp.net/pipermail/cffi-devel/2009-January/003017.html</a>) to return errno safely, but doesn't seem like it went anywhere.</div>
<div><br></div><div>So any library that tries to get errno is potentially broken in Allegro CL. I'm seeing this in practice with lisp-zmq, for example.</div><div><br></div><div>I'd like to introduce a new option to defcfun and foreign-funcall called :errno.</div>
<div><br></div><div>It would look like this: <span style="background-color:rgb(251,251,251);color:rgb(51,51,51);font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13px;line-height:22px">(foreign-funcall ("strlen" :errno t) :string "foo" :int), or (defcfun (strlen "strlen" :errno t) :int (s :string)).</span></div>
<div><span style="background-color:rgb(251,251,251);color:rgb(51,51,51);font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13px;line-height:22px"><br></span></div><div><span style="background-color:rgb(251,251,251);color:rgb(51,51,51);font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13px;line-height:22px">Calling (strlen) would return two values, the return value of the foreign call, and errno.</span></div>
<div><br></div><div>In some Lisps, the only way to get errno is to make an additional foreign call. Then perhaps that call could be made by CFFI and returns as the second value.</div><div><br></div><div><span style="color:rgb(51,51,51);font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13px;line-height:22px;background-color:rgb(251,251,251)">I've created a pull request (</span><a href="https://github.com/cffi/cffi/pull/28">https://github.com/cffi/cffi/pull/28</a>) with a very rudimentary implementation for Allegro CL.</div>
<div><br></div><div>Since CFFI delegates the handling of errno to the implementation, perhaps we could preserve the status quo and not get bugged down in grandiose plans of portability.</div><div><br></div><div>Thoughts and suggestions are welcome. </div>
<div><br></div><div>Thanks,</div><div>Felix</div></div>