summaryrefslogtreecommitdiff
path: root/tissue/web/server.scm
diff options
context:
space:
mode:
Diffstat (limited to 'tissue/web/server.scm')
-rw-r--r--tissue/web/server.scm51
1 files changed, 30 insertions, 21 deletions
diff --git a/tissue/web/server.scm b/tissue/web/server.scm
index e7b2019..e794ed0 100644
--- a/tissue/web/server.scm
+++ b/tissue/web/server.scm
@@ -208,24 +208,33 @@ list containing parameters for that host."
;; Unix socket
((= (sockaddr:fam socket-address) AF_UNIX)
(sockaddr:path socket-address))))
- (run-server (lambda (request body)
- ;; Explicitly dereference the module and handler
- ;; variable each time so as to support live hacking.
- ((module-ref (resolve-module '(tissue web server))
- 'handler)
- request body hosts))
- 'http
- (cond
- ;; IPv4 or IPv6 address
- ((or (= (sockaddr:fam socket-address) AF_INET)
- (= (sockaddr:fam socket-address) AF_INET6))
- (list #:family (sockaddr:fam socket-address)
- #:addr (sockaddr:addr socket-address)
- #:port (sockaddr:port socket-address)))
- ;; Unix socket
- ((= (sockaddr:fam socket-address) AF_UNIX)
- (let ((socket (make-unix-domain-server-socket
- #:path (sockaddr:path socket-address))))
- ;; Grant read-write permissions to all users.
- (chmod (sockaddr:path socket-address) #o666)
- (list #:socket socket))))))
+ (let ((unix-socket #f))
+ (dynamic-wind
+ (lambda ()
+ (when (= (sockaddr:fam socket-address) AF_UNIX)
+ (set! socket (make-unix-domain-server-socket
+ #:path (sockaddr:path socket-address)))
+ ;; Grant read-write permissions to all users.
+ (chmod (sockaddr:path socket-address) #o666)))
+ (cut run-server
+ (lambda (request body)
+ ;; Explicitly dereference the module and handler
+ ;; variable each time so as to support live hacking.
+ ((module-ref (resolve-module '(tissue web server))
+ 'handler)
+ request body hosts))
+ 'http
+ (cond
+ ;; IPv4 or IPv6 address
+ ((or (= (sockaddr:fam socket-address) AF_INET)
+ (= (sockaddr:fam socket-address) AF_INET6))
+ (list #:family (sockaddr:fam socket-address)
+ #:addr (sockaddr:addr socket-address)
+ #:port (sockaddr:port socket-address)))
+ ;; Unix socket
+ ((= (sockaddr:fam socket-address) AF_UNIX)
+ (list #:socket socket))))
+ (lambda ()
+ ;; Clean up socket file if Unix socket.
+ (when (= (sockaddr:fam socket-address) AF_UNIX)
+ (delete-file (sockaddr:path socket-address)))))))