mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-25 04:55:04 +02:00
Bug fixes, added accept
This commit is contained in:
parent
a34fa03608
commit
33003a5813
1 changed files with 25 additions and 9 deletions
34
srfi/106.sld
34
srfi/106.sld
|
@ -116,7 +116,8 @@
|
||||||
(set! socktype (cadr opts))
|
(set! socktype (cadr opts))
|
||||||
(when (> (length opts) 2)
|
(when (> (length opts) 2)
|
||||||
(set! proto (caddr opts)))))
|
(set! proto (caddr opts)))))
|
||||||
(%make-server-socket service family socktype proto)))
|
(let ((sock-fd (%make-server-socket service family socktype proto)))
|
||||||
|
(cons *socket-object-type* sock-fd))))
|
||||||
|
|
||||||
(define-c %make-server-socket
|
(define-c %make-server-socket
|
||||||
"(void *data, int argc, closure _, object k,
|
"(void *data, int argc, closure _, object k,
|
||||||
|
@ -163,22 +164,37 @@
|
||||||
|
|
||||||
freeaddrinfo(servinfo); // all done with this structure
|
freeaddrinfo(servinfo); // all done with this structure
|
||||||
|
|
||||||
if (listen(sockfd, 20) < 0)
|
if (listen(sockfd, 20) < 0) {
|
||||||
Cyc_rt_raise_msg(data, \"Unable to listen on socket\");
|
Cyc_rt_raise_msg(data, \"Unable to listen on socket\");
|
||||||
}
|
}
|
||||||
return_closcall1(data, k, obj_int2obj(sockfd)); ")
|
return_closcall1(data, k, obj_int2obj(sockfd)); ")
|
||||||
|
|
||||||
;; See: http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#accept
|
;; See: http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#accept
|
||||||
; TODO: (define (socket-accept sock))
|
(define (socket-accept sock)
|
||||||
; struct sockaddr_storage their_addr;
|
(when (not (socket? sock))
|
||||||
; addr_size = sizeof their_addr;
|
(error "Expected socket but received" sock))
|
||||||
; new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &addr_size);
|
|
||||||
|
(let ((sockfd (%socket-accept sock)))
|
||||||
|
(if (= sockfd -1)
|
||||||
|
(error "An error occurred accepting a socket connection")
|
||||||
|
(cons *socket-object-type* sockfd))))
|
||||||
|
|
||||||
|
(define-c %socket-accept
|
||||||
|
"(void *data, int argc, closure _, object k, object sockfd)"
|
||||||
|
" int new_fd;
|
||||||
|
struct sockaddr_storage their_addr;
|
||||||
|
socklen_t addr_size;
|
||||||
|
addr_size = sizeof(their_addr);
|
||||||
|
|
||||||
|
set_thread_blocked(data, k);
|
||||||
|
new_fd = accept(obj_obj2int(sockfd), (struct sockaddr *)&their_addr, &addr_size);
|
||||||
|
return_thread_runnable(data, obj_int2obj(new_fd)); ")
|
||||||
|
|
||||||
(define (socket-send sock bv . opts)
|
(define (socket-send sock bv . opts)
|
||||||
(let ((flags 0))
|
(let ((flags 0))
|
||||||
(if (not (null? opts))
|
(if (not (null? opts))
|
||||||
(set! flags (car opts)))
|
(set! flags (car opts)))
|
||||||
(%socket-send sock bv flags)))
|
(%socket-send (socket->fd sock) bv flags)))
|
||||||
|
|
||||||
(define-c %socket-send
|
(define-c %socket-send
|
||||||
"(void *data, int argc, closure _, object k, object sockfd, object bvobj, object flags)"
|
"(void *data, int argc, closure _, object k, object sockfd, object bvobj, object flags)"
|
||||||
|
@ -192,7 +208,7 @@
|
||||||
(let ((flags 0))
|
(let ((flags 0))
|
||||||
(if (not (null? opts))
|
(if (not (null? opts))
|
||||||
(set! flags (car opts)))
|
(set! flags (car opts)))
|
||||||
(%socket-recv sock size flags)))
|
(%socket-recv (socket->fd sock) size flags)))
|
||||||
|
|
||||||
(define-c %socket-recv
|
(define-c %socket-recv
|
||||||
"(void *data, int argc, closure _, object k, object sockfd, object size, object flags)"
|
"(void *data, int argc, closure _, object k, object sockfd, object size, object flags)"
|
||||||
|
|
Loading…
Add table
Reference in a new issue