1 (in-package :sb-bsd-sockets
)
3 ;;; System call helpers
5 (declaim (inline interrupted-p
))
6 (defun interrupted-p (errno)
7 (or (= errno sockint
::EAGAIN
) (= errno sockint
::EINTR
)))
9 (defmacro syscall-error-case
((form result-var-or-vars test-form errno-form
)
10 &optional no-error-form
12 (let ((interrupted-case nil
)
14 (no-error-case `(,no-error-form
)))
15 (dolist (clause clauses
)
18 (setf interrupted-case
(rest clause
)))
20 (setf error-case
(rest clause
)))))
21 `(multiple-value-bind ,(sb-int:ensure-list result-var-or-vars
) ,form
23 ,@(when interrupted-case
24 `(((and ,test-form
(interrupted-p ,errno-form
))
30 `((t ,@no-error-case
)))))))
32 (defmacro socket-error-case
((context form
34 (result-var-or-vars (gensym "RESULT"))
35 (test-form `(= ,(first (sb-int:ensure-list
38 (errno-form `(socket-errno)))
39 &optional no-error-form
41 `(syscall-error-case (,form
,result-var-or-vars
,test-form
,errno-form
)
43 ,@(unless (find :error clauses
:key
#'first
)
44 `((:error
(socket-error ,context
))))
47 (defmacro addrinfo-error-case
((context form
49 (result-var (gensym "RESULT"))
50 (test-form `(not (zerop ,result-var
))))
51 &optional no-error-form
53 `(syscall-error-case (,form
,result-var
,test-form nil
)
55 ,@(unless (find :error clauses
:key
#'first
)
56 `((:error
(name-service-error ,context
,result-var
))))