The attached client.scm will crash with a SIGPIPE (based on strace) when run. It should raise an error instead.

The error happens when we try to send over socket that is closed on the other side.

Happens on 2.0 and master.

--
Amirouche ~ amz3 ~ http://www.hyperdev.fr
(define-module (client))

(use-modules (shared))

(define (client)
  (define socket (make-client-socket 12348))
  (pk (send socket (list->u64vector (iota 3))))
  (pk (recv socket))
  (pk "sleeping")
  (sleep 15)
  (pk (send socket (list->u64vector (iota 3))))
  (pk (send socket (list->u64vector (iota 3))))
  (pk (close socket))
  (pk "bye"))


(client)
(pk "end of program")
(define-module (shared))

(use-modules (rnrs io ports))

(define-public (recv port)
  (let next ((out '()))
    (if (char-ready? port)
        (let ((byte (get-u8 port)))
          (if (eof-object? byte)
              (reverse out)
              (next (cons byte out))))
        (reverse out))))

(define make-socket socket)

(define-public (make-client-socket port)
  (let ((socket (make-socket PF_INET SOCK_STREAM 0)))
    (connect socket AF_INET INADDR_LOOPBACK port)
    socket))

(define-public (make-server-socket port)
  (let ((socket (make-socket PF_INET SOCK_STREAM 0)))
    (bind socket (make-socket-address AF_INET INADDR_ANY port))
    (listen socket 128)
    socket))
(define-module (server))

(use-modules (shared))

(define (server)
  (let* ((sock (make-server-socket 12348))
         (client (car (accept sock))))
    (pk (recv client))
    (close client)
    (close sock)))

(server)

Reply via email to