Returning errno as a second value

Felix Filozov ffilozov at gmail.com
Fri Aug 23 16:36:19 UTC 2013


With Allegro CL, there's an option you can pass (:error-value :os-specific)
where it will give you errno or GetLastError() depending on what OS you're
on.


On Thu, Aug 15, 2013 at 12:48 PM, Mark Cox <markcox80 at gmail.com> wrote:

> G'day Everyone,
>
> On 13/08/2013, at 6:54 AM, Luís Oliveira wrote:
>
> > How about an interface like this?
> >
> >  (with-errno
> >    (some-foreign-function-with-the-errno-option-on)
> >    (get-errno))
> >
> > or perhaps
> >
> >  (with-errno (errno)
> >    (some-foreign-function-with-the-errno-option-on)
> >    errno)
>
> Isn't this problem more general than just errno? For example, the
> functions WSAGetLastError() and GetLastError() on Windows.
>
>  // On Posix based systems:
>    ssize_t rv = read(fd, buffer, buffer_size);
>    if (rv == -1) {
>      printf("ERROR: %s\n", strerror(errno));
>      return FAILED;
>    }
>
>  // On Windows (Winsock):
>    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
>    if (s == INVALID_SOCKET) {
>      int last_error = WSAGetLastError();
>      WCHAR buffer[1024];
>      FormatMessage(FORMAT_MESSAGE_FROM_STRING |
> FORMAT_MESSAGE_IGNORE_INSERTS,
>                    0, last_error, 0, buffer, 1024, NULL);
>      return FAILED;
>    }
>
>  // On Windows (Named Pipes)
>    HANDLE h = CreateFileA(pipe_name, GENERIC_READ | GENERIC_WRITE, ... );
>    if (h == INVALID_HANDLE_ERROR) {
>      DWORD last_error = GetLastError();
>      WCHAR buffer[1024];
>      FormatMessage(FORMAT_MESSAGE_FROM_STRING |
> FORMAT_MESSAGE_IGNORE_INSERTS,
>                    0, last_error, 0, buffer, 1024, NULL);
>      return FAILED;
>    }
>
> This entire thread has been enlightening.
>
> Thanks
> Mark
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cffi-devel/attachments/20130823/ea916568/attachment.html>


More information about the cffi-devel mailing list