1 (in-package :sb-bsd-sockets
)
3 ;;; System call helpers
5 (defun interrupted-p (errno)
6 (member errno
`(,sockint
::EAGAIN
,sockint
::EINTR
) :test
#'=))
8 (defmacro syscall-error-case
((form result-var test-form errno-form
)
9 &optional no-error-form
11 (let ((interrupted-case nil
)
13 (no-error-case `(,no-error-form
)))
14 (dolist (clause clauses
)
17 (setf interrupted-case
(rest clause
)))
19 (setf error-case
(rest clause
)))))
20 `(let ((,result-var
,form
))
22 ,@(when interrupted-case
23 `(((and ,test-form
(interrupted-p ,errno-form
))
29 `((t ,@no-error-case
)))))))
31 (defmacro socket-error-case
((context form
33 (result-var (gensym "RESULT"))
34 (test-form `(= ,result-var -
1))
35 (errno-form `(socket-errno)))
36 &optional no-error-form
38 `(syscall-error-case (,form
,result-var
,test-form
,errno-form
)
40 ,@(unless (find :error clauses
:key
#'first
)
41 `((:error
(socket-error ,context
))))
44 (defmacro addrinfo-error-case
((context form
46 (result-var (gensym "RESULT"))
47 (test-form `(not (zerop ,result-var
))))
48 &optional no-error-form
50 `(syscall-error-case (,form
,result-var
,test-form nil
)
52 ,@(unless (find :error clauses
:key
#'first
)
53 `((:error
(addrinfo-error ,context
,result-var
))))