diff --git a/scsh/network.scm b/scsh/network.scm index 3a556f2..254bee2 100644 --- a/scsh/network.scm +++ b/scsh/network.scm @@ -216,7 +216,7 @@ ;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ;;; connect syscall ;;;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -(define (connect-socket sock name) +(define (connect-socket-no-wait sock name) (cond ((not (socket? sock)) (error "connect-socket: socket expected ~s" sock)) ((not (socket-address? name)) @@ -240,24 +240,30 @@ (socket-address:address name)))) (if (car error?.einprogress?) (if (cdr error?.einprogress?) - (begin - (select '#() - (vector (fdport-data:fd - (fdport-data - (socket:outport sock)))) - '#()) - ;; If connect returned EINPROGRESS, we can check - ;; it's success after the next success with getsockopt - (let ((val (socket-option sock - level/socket - socket/error))) - (if (not (zero? val)) - (errno-error val - (errno-msg val) - %connect - sock - name)))) - (loop))))))))))) + #f + (loop)) + #t))))))))) + +(define (connect-socket-successful? sock) + ;; If connect returned EINPROGRESS, we can check + ;; it's success after the next success with getsockopt + (zero? (socket-option sock level/socket socket/error))) + +(define (connect-socket sock name) + (let ((success? (connect-socket-no-wait sock name))) + (cond ((not success?) + (select '#() + (vector (fdport-data:fd + (fdport-data + (socket:outport sock)))) + '#()) + (if (not (connect-socket-successful? sock)) + (let ((errno (socket-option sock level/socket socket/error))) + (errno-error errno + (errno-msg errno) + %connect + sock + name))))))) (import-os-error-syscall %connect (sockfd family name) "scheme_connect")