Check-in [c7ecd28930]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:added EINTR support on connect/inet and accept
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: c7ecd28930666b0b5c04d2b55873804ca46a31aa
User & Date: aldo 2016-12-12 15:32:59
Context
2016-12-12
16:01
added better errno support check-in: e0957430e1 user: aldo tags: trunk
15:32
added EINTR support on connect/inet and accept check-in: c7ecd28930 user: aldo tags: trunk
14:05
ops missing ) on previous commit check-in: 8c6adf71a2 user: aldo tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to socket.sls.

122
123
124
125
126
127
128

129
130
131
132
133
134
135
136
...
161
162
163
164
165
166
167

168

169


170

171
172
173
174
175
176
177
178
	      (foreign-ref 'void* (ftype-ref hostent (h_addr_list) server) 0)
	      (ftype-ref hostent (h_length) server))
      (ftype-set! sockaddr_in (sin_port) addr (htons port))
      (let ([r (connect* (port-file-descriptor socket)
			 addr (ftype-sizeof sockaddr_in))])
	(foreign-free (ftype-pointer-address addr))
	(when (< r 0)

	      (errorf 'connect/inet "failed: ~a" (strerror)))))) 

  (define (bind/inet socket address port)
    (define SO_REUSEADDR 2)
    (define SOL_SOCKET 1)
    (define setsockopt* (foreign-procedure "setsockopt" (int int int u8* socklen_t) int))
    (define bind* (foreign-procedure "bind" (int (* sockaddr_in) socklen_t) int))
    (define opt (make-bytevector (ftype-sizeof int)))
................................................................................
      (when (< r 0)
	    (errorf 'listen "failed: ~a" (strerror)))
      r))
  
  (define (accept s)
    (define accept* (foreign-procedure "accept" (int void* void*) int))
    ;; TODO: get the client address!

    (let ([r (accept* (port-file-descriptor s) 0 0)])

      (when (< r 0)


	    (errorf 'accept "failed: ~a" (strerror)))

      (open-fd-input/output-port r)))
  )


#|
;Example:

(load "socket.sls")







>
|







 







>

>
|
>
>
|
>
|







122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
...
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
	      (foreign-ref 'void* (ftype-ref hostent (h_addr_list) server) 0)
	      (ftype-ref hostent (h_length) server))
      (ftype-set! sockaddr_in (sin_port) addr (htons port))
      (let ([r (connect* (port-file-descriptor socket)
			 addr (ftype-sizeof sockaddr_in))])
	(foreign-free (ftype-pointer-address addr))
	(when (< r 0)
	    (if (= (errno) EINTR) (connect/inet socket address port)
		(errorf 'connect/inet "failed: ~a" (strerror)))))))

  (define (bind/inet socket address port)
    (define SO_REUSEADDR 2)
    (define SOL_SOCKET 1)
    (define setsockopt* (foreign-procedure "setsockopt" (int int int u8* socklen_t) int))
    (define bind* (foreign-procedure "bind" (int (* sockaddr_in) socklen_t) int))
    (define opt (make-bytevector (ftype-sizeof int)))
................................................................................
      (when (< r 0)
	    (errorf 'listen "failed: ~a" (strerror)))
      r))
  
  (define (accept s)
    (define accept* (foreign-procedure "accept" (int void* void*) int))
    ;; TODO: get the client address!
    
    (let ([r (accept* (port-file-descriptor s) 0 0)])
      (cond
       [(< r 0)
	(if (= (errno) EINTR)
	    (accept s)
	    (errorf 'accept "failed: ~a" (strerror)))]
       [else
	(open-fd-input/output-port r)])))
  )


#|
;Example:

(load "socket.sls")