clasp.lisp - clic - Clic is an command line interactive client for gopher written in Common LISP
HTML git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/
DIR Log
DIR Files
DIR Refs
DIR Tags
DIR README
DIR LICENSE
---
clasp.lisp (5221B)
---
1 (in-package :usocket)
2
3 #-clasp
4 (progn
5 #-:wsock
6 (ffi:clines
7 "#include <errno.h>"
8 "#include <sys/socket.h>"
9 "#include <unistd.h>")
10 #+:wsock
11 (ffi:clines
12 "#ifndef FD_SETSIZE"
13 "#define FD_SETSIZE 1024"
14 "#endif"
15 "#include <winsock2.h>")
16 (ffi:clines
17 #+:msvc "#include <time.h>"
18 #-:msvc "#include <sys/time.h>"
19 "#include <ecl/ecl-inl.h>"))
20 (progn
21 #-clasp
22 (defun cerrno ()
23 (ffi:c-inline () () :int
24 "errno" :one-liner t))
25 #+clasp
26 (defun cerrno ()
27 (sockets-internal:errno))
28
29 #-clasp
30 (defun fd-setsize ()
31 (ffi:c-inline () () :fixnum
32 "FD_SETSIZE" :one-liner t))
33 #+clasp
34 (defun fd-setsize () (sockets-internal:fd-setsize))
35
36 #-clasp
37 (defun fdset-alloc ()
38 (ffi:c-inline () () :pointer-void
39 "ecl_alloc_atomic(sizeof(fd_set))" :one-liner t))
40 #+clasp (defun fdset-alloc () (sockets-internal::alloc-atomic-sizeof-fd-set))
41
42 #-clasp
43 (defun fdset-zero (fdset)
44 (ffi:c-inline (fdset) (:pointer-void) :void
45 "FD_ZERO((fd_set*)#0)" :one-liner t))
46 #+clasp(defun fdset-zero (fdset) (sockets-internal:fdset-zero fdset))
47
48 #-clasp
49 (defun fdset-set (fdset fd)
50 (ffi:c-inline (fdset fd) (:pointer-void :fixnum) :void
51 "FD_SET(#1,(fd_set*)#0)" :one-liner t))
52 #+clasp(defun fdset-set (fdset fd) (sockets-internal:fdset-set fd fdset))
53
54 #-clasp
55 (defun fdset-clr (fdset fd)
56 (ffi:c-inline (fdset fd) (:pointer-void :fixnum) :void
57 "FD_CLR(#1,(fd_set*)#0)" :one-liner t))
58 #+clasp(defun fdset-clr (fdset fd) (sockets-internal:fdset-clr fd fdset))
59
60 #-clasp
61 (defun fdset-fd-isset (fdset fd)
62 (ffi:c-inline (fdset fd) (:pointer-void :fixnum) :bool
63 "FD_ISSET(#1,(fd_set*)#0)" :one-liner t))
64 #+clasp(defun fdset-fd-isset (fdset fd) (sockets-internal:fdset-isset fd fdset))
65
66 (declaim (inline cerrno
67 fd-setsize
68 fdset-alloc
69 fdset-zero
70 fdset-set
71 fdset-clr
72 fdset-fd-isset))
73 #-clasp
74 (defun get-host-name ()
75 (ffi:c-inline
76 () () :object
77 "{ char *buf = (char *) ecl_alloc_atomic(257);
78
79 if (gethostname(buf,256) == 0)
80 @(return) = make_simple_base_string(buf);
81 else
82 @(return) = Cnil;
83 }" :one-liner nil :side-effects nil))
84
85 #+clasp
86 (defun get-host-name ()
87 (sockets-internal:get-host-name))
88
89 #-clasp
90 (defun read-select (wl to-secs &optional (to-musecs 0))
91 (let* ((sockets (wait-list-waiters wl))
92 (rfds (wait-list-%wait wl))
93 (max-fd (reduce #'(lambda (x y)
94 (let ((sy (sb-bsd-sockets:socket-file-descriptor
95 (socket y))))
96 (if (< x sy) sy x)))
97 (cdr sockets)
98 :initial-value (sb-bsd-sockets:socket-file-descriptor
99 (socket (car sockets))))))
100 (fdset-zero rfds)
101 (dolist (sock sockets)
102 (fdset-set rfds (sb-bsd-sockets:socket-file-descriptor
103 (socket sock))))
104 (let ((count
105 (ffi:c-inline (to-secs to-musecs rfds max-fd)
106 (t :unsigned-int :pointer-void :int)
107 :int
108 "
109 int count;
110 struct timeval tv;
111
112 if (#0 != Cnil) {
113 tv.tv_sec = fixnnint(#0);
114 tv.tv_usec = #1;
115 }
116 @(return) = select(#3 + 1, (fd_set*)#2, NULL, NULL,
117 (#0 != Cnil) ? &tv : NULL);
118 " :one-liner nil)))
119 (cond
120 ((= 0 count)
121 (values nil nil))
122 ((< count 0)
123 ;; check for EINTR and EAGAIN; these should not err
124 (values nil (cerrno)))
125 (t
126 (dolist (sock sockets)
127 (when (fdset-fd-isset rfds (sb-bsd-sockets:socket-file-descriptor
128 (socket sock)))
129 (setf (state sock) :READ))))))))
130
131 #+clasp
132 (defun read-select (wl to-secs &optional (to-musecs 0))
133 (let* ((sockets (wait-list-waiters wl))
134 (rfds (wait-list-%wait wl))
135 (max-fd (reduce #'(lambda (x y)
136 (let ((sy (sb-bsd-sockets:socket-file-descriptor
137 (socket y))))
138 (if (< x sy) sy x)))
139 (cdr sockets)
140 :initial-value (sb-bsd-sockets:socket-file-descriptor
141 (socket (car sockets))))))
142 (fdset-zero rfds)
143 (dolist (sock sockets)
144 (fdset-set rfds (sb-bsd-sockets:socket-file-descriptor
145 (socket sock))))
146 (let ((count (sockets-internal:do-select to-secs to-musecs rfds max-fd)))
147 (cond
148 ((= 0 count)
149 (values nil nil))
150 ((< count 0)
151 ;; check for EINTR and EAGAIN; these should not err
152 (values nil (cerrno)))
153 (t
154 (dolist (sock sockets)
155 (when (fdset-fd-isset rfds (sb-bsd-sockets:socket-file-descriptor
156 (socket sock)))
157 (setf (state sock) :READ))))))))
158 )