From 05d01639ebf6bec5ab6e54bfec2ec4878c25da30 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Sun, 20 Nov 2011 15:41:23 -0800 Subject: [PATCH] adding make-listener-socket --- lib/chibi/net.scm | 31 +++++++++++++++++++++++++++++-- lib/chibi/net.sld | 2 +- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/lib/chibi/net.scm b/lib/chibi/net.scm index 7a448f92..31277648 100644 --- a/lib/chibi/net.scm +++ b/lib/chibi/net.scm @@ -14,8 +14,8 @@ (if (and (pair? o) (car o)) (car o) (make-address-info address-family/inet - socket-type/stream - ip-proto/tcp)))) + socket-type/stream + ip-proto/tcp)))) ;;> Opens a client net connection to @var{host}, a string, ;;> on port @var{service}, which can be a string such as @@ -59,3 +59,30 @@ (let ((res (proc (car io) (car (cdr io))))) (close-input-port (car io)) res)))) + +;;> @subsubsubsection{@scheme{(make-listener-socket addrinfo [max-conn])}} + +;;> Convenience wrapper to call socket, bind and listen to return +;;> a socket suitable for accepting connections on the given +;;> @var{addrinfo}. @var{max-conn} is the maximum number of pending +;;> connections, and defaults to 128. + +(define (make-listener-socket addrinfo . o) + (let* ((max-connections (if (pair? o) (car o) 128)) + (sock (socket (address-info-family addrinfo) + (address-info-socket-type addrinfo) + (address-info-protocol addrinfo)))) + (cond + ((negative? sock) + (error "couldn't create socket for: " addrinfo)) + ((negative? (bind sock + (address-info-address addrinfo) + (address-info-address-length addrinfo))) + (close-file-descriptor sock) + (error "couldn't bind socket for: " addrinfo)) + ((negative? (listen sock 100)) + (close-file-descriptor sock) + (error "couldn't listen on socket for: " addrinfo)) + (else + (set-file-descriptor-status! sock open/non-block) + sock)))) diff --git a/lib/chibi/net.sld b/lib/chibi/net.sld index e9794420..8953f664 100644 --- a/lib/chibi/net.sld +++ b/lib/chibi/net.sld @@ -2,7 +2,7 @@ (define-library (chibi net) (export sockaddr? address-info? get-address-info make-address-info socket connect bind accept listen - with-net-io open-net-io + with-net-io open-net-io make-listener-socket address-info-family address-info-socket-type address-info-protocol address-info-address address-info-address-length address-info-next address-family/unix address-family/inet