Changeset 423


Ignore:
Timestamp:
Jan 30, 2004, 11:36:15 AM (21 years ago)
Author:
Gary Byers
Message:

SOCKET-ERROR is (simple) STREAM-ERROR. Change how it's signaled, and
define STREAM-IO-ERROR for SOCKET.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/level-1/l1-sockets.lisp

    r384 r423  
    114114  (require "DARWIN-SYSCALLS"))
    115115
    116 (define-condition socket-error (simple-error)
     116(define-condition socket-error (simple-stream-error)
    117117  ((code :initarg :code :reader socket-error-code)
    118118   (identifier :initform :unknown :initarg :identifier :reader socket-error-identifier)
     
    131131        #$EHOSTDOWN :host-down
    132132        #$ENETDOWN :network-down
    133         ;; ?? :address-not-available
    134         ;; ?? :network-reset
    135         ;; ?? :connection-reset
    136         ;; ?? :shutdown
     133        #$EADDRNOTAVAIL :address-not-available
     134        #$ENETRESET :network-reset
     135        #$ECONNRESET :connection-reset
     136        #$ESHUTDOWN :shutdown
    137137        #$EACCES :access-denied
    138138        #$EPERM :access-denied))
     
    140140
    141141(declaim (inline socket-call))
    142 (defun socket-call (where res)
     142(defun socket-call (stream where res)
    143143  (if (< res 0)
    144     (socket-error where res)
     144    (socket-error stream where res)
    145145    res))
    146146
     
    151151      (format nil "Nameserver error ~d" (abs h_errno)))))
    152152   
    153  
    154 (defun socket-error (where errno &optional nameserver-p)
     153
     154
     155
     156(defun socket-error (stream where errno &optional nameserver-p)
    155157  (when (< errno 0)
    156158    (setq errno (- errno)))
    157   (error (make-condition 'socket-error
    158                          :code errno
    159                          :identifier (getf *socket-error-identifiers* errno :unknown)
    160                          :situation where
    161                          ;; TODO: this is a constant arg, there is a way to put this
    162                          ;; in the class definition, just need to remember how...
    163                          :format-control "~a (error #~d) in ~a"
    164                          :format-arguments (list
    165                                             (if nameserver-p
    166                                               (%hstrerror errno)
    167                                               (%strerror errno))
    168                                             errno where))))
     159  (if stream
     160    (error (make-condition 'socket-error
     161                           :stream stream
     162                           :code errno
     163                           :identifier (getf *socket-error-identifiers* errno :unknown)
     164                           :situation where
     165                           ;; TODO: this is a constant arg, there is a way to put this
     166                           ;; in the class definition, just need to remember how...
     167                           :format-control "~a (error #~d) on ~s in ~a"
     168                           :format-arguments (list
     169                                              (if nameserver-p
     170                                                (%hstrerror errno)
     171                                                (%strerror errno))
     172                                              errno stream where)))
     173    (error "~a (error #~d) in ~a"
     174           (if nameserver-p
     175             (%hstrerror errno)
     176             (%strerror errno))
     177           errno where)))
     178   
     179
    169180
    170181;; If true, this will try to allow other processes to run while
     
    286297
    287298;; Returns nil for closed stream
    288 (defun local-socket-info (fd type)
     299(defun local-socket-info (fd type socket)
    289300  (and fd
    290301       (rlet ((sockaddr :sockaddr_in)
    291302              (namelen :signed))
    292303             (setf (pref namelen :signed) (record-length :sockaddr_in))
    293              (socket-call "getsockname" (c_getsockname fd sockaddr namelen))
     304             (socket-call socket "getsockname" (c_getsockname fd sockaddr namelen))
    294305             (when (= #$AF_INET (pref sockaddr :sockaddr_in.sin_family))
    295306               (ecase type
     
    305316    (%get-cstring (pref addr :sockaddr_un.sun_path))))
    306317
    307 (defun local-socket-filename (fd)
     318(defun local-socket-filename (fd socket)
    308319  (and fd
    309320       (rlet ((addr :sockaddr_un)
    310321              (namelen :signed))
    311322         (setf (pref namelen :signed) (record-length :sockaddr_un))
    312          (socket-call "getsockname" (c_getsockname fd addr namelen))
     323         (socket-call socket "getsockname" (c_getsockname fd addr namelen))
    313324         (path-from-unix-address addr))))
    314325
     
    340351
    341352(defmethod LOCAL-PORT ((socket socket))
    342   (local-socket-info (socket-device socket) :port))
     353  (local-socket-info (socket-device socket) :port socket))
    343354
    344355(defmethod LOCAL-HOST ((socket socket))
    345   (local-socket-info (socket-device socket) :host))
     356  (local-socket-info (socket-device socket) :host socket))
    346357
    347358(defmethod LOCAL-FILENAME ((socket socket))
    348   (local-socket-filename (socket-device socket)))
     359  (local-socket-filename (socket-device socket) socket))
    349360
    350361;; Returns NIL if socket is not connected
     
    385396    (setf (pref plinger :linger.l_onoff) (if linger 1 0)
    386397          (pref plinger :linger.l_linger) (or linger 0))
    387     (socket-call "setsockopt"
     398    (socket-call nil "setsockopt"
    388399                 (c_setsockopt fd #$SOL_SOCKET #$SO_LINGER plinger 8)))
    389400  (when (eq address-family :internet)
     
    406417                     (pref sockaddr :sockaddr_in.sin_port) port-n
    407418                     (pref sockaddr :sockaddr_in.sin_addr.s_addr) host-n)
    408                (socket-call "bind" (c_bind fd sockaddr (record-length :sockaddr_in)))))))
     419               (socket-call nil "bind" (c_bind fd sockaddr (record-length :sockaddr_in)))))))
    409420  (when (and (eq address-family :file)
    410421             (eq connect :passive)
     
    412423    (bind-unix-socket fd local-filename))   
    413424  (when *multiprocessing-socket-io*
    414     (socket-call "fcntl" (fd-set-flag fd #$O_NONBLOCK))))
     425    (socket-call nil "fcntl" (fd-set-flag fd #$O_NONBLOCK))))
    415426
    416427;; I hope the inline declaration makes the &rest/apply's go away...
     
    451462  (unwind-protect
    452463    (let (socket)
    453       (setq fd (socket-call "socket"
     464      (setq fd (socket-call nil "socket"
    454465                            (c_socket #$AF_INET #$SOCK_DGRAM #$IPPROTO_UDP)))
    455466      (apply #'set-socket-options fd keys)
     
    465476  (unwind-protect
    466477    (let (socket)
    467       (setq fd (socket-call "socket"
     478      (setq fd (socket-call nil "socket"
    468479                            (c_socket #$AF_INET #$SOCK_STREAM #$IPPROTO_TCP)))
    469480      (apply #'set-socket-options fd keys)
     
    480491  (unwind-protect
    481492    (let (socket)
    482       (setq fd (socket-call "socket" (c_socket #$PF_LOCAL #$SOCK_STREAM 0)))
     493      (setq fd (socket-call nil "socket" (c_socket #$PF_LOCAL #$SOCK_STREAM 0)))
    483494      (apply #'set-socket-options fd keys)
    484495      (setq socket
     
    557568
    558569(defun make-tcp-listener-socket (fd &rest keys &key backlog &allow-other-keys)
    559   (socket-call "listen" (c_listen fd (or backlog 5)))
     570  (socket-call nil "listen" (c_listen fd (or backlog 5)))
    560571  (make-instance 'listener-socket
    561572                 :device fd
     
    563574
    564575(defun make-file-listener-socket (fd &rest keys &key backlog &allow-other-keys)
    565   (socket-call "listen" (c_listen fd (or backlog 5)))
     576  (socket-call nil "listen" (c_listen fd (or backlog 5)))
    566577  (make-instance 'file-listener-socket
    567578                 :device fd
    568579                 :keys keys))
    569580
    570 (defun socket-accept (fd wait)
     581(defun socket-accept (fd wait socket)
    571582  (flet ((_accept (fd async)
    572583           (let ((res (c_accept fd (%null-ptr) (%null-ptr))))
     
    593604            (_accept fd t))
    594605          (t
    595             (let ((old (socket-call "fcntl" (fd-get-flags fd))))
     606            (let ((old (socket-call socket "fcntl" (fd-get-flags fd))))
    596607              (unwind-protect
    597608                  (progn
    598                     (socket-call "fcntl" (fd-set-flags fd (logior old #$O_NONBLOCK)))
     609                    (socket-call socket "fcntl" (fd-set-flags fd (logior old #$O_NONBLOCK)))
    599610                    (_accept fd t))
    600                 (socket-call "fcntl" (fd-set-flags fd old))))))))
     611                (socket-call socket "fcntl" (fd-set-flags fd old))))))))
    601612
    602613(defun accept-socket-connection (socket wait stream-create-function)
     
    605616    (unwind-protect
    606617      (progn
    607         (setq fd (socket-accept listen-fd wait))
     618        (setq fd (socket-accept listen-fd wait socket))
    608619        (cond ((>= fd 0)
    609620               (prog1 (apply stream-create-function fd (socket-keys socket))
     
    653664      (%stack-block ((bufptr size))
    654665        (%copy-ivector-to-ptr msg offset bufptr 0 size)
    655         (socket-call "sendto"
     666        (socket-call socket "sendto"
    656667          (with-eagain fd :output
    657668            (c_sendto fd bufptr size 0 sockaddr (record-length :sockaddr_in))))))))
     
    672683      (setf (pref namelen :signed) (record-length :sockaddr_in))
    673684      (%stack-block ((bufptr size))
    674         (setq ret-size (socket-call "recvfrom"
     685        (setq ret-size (socket-call socket "recvfrom"
    675686                         (with-eagain fd :input
    676687                           (c_recvfrom fd bufptr size 0 sockaddr namelen))))
     
    699710  ;; is a distinct, catchable error type).
    700711  (let ((fd (socket-device socket)))
    701     (socket-call "shutdown"
     712    (socket-call socket "shutdown"
    702713      (c_shutdown fd (ecase direction
    703714                       (:input 0)
     
    768779  (rlet ((valptr :signed))
    769780    (setf (pref valptr :signed) optval)
    770     (socket-call "setsockopt"
     781    (socket-call socket "setsockopt"
    771782      (c_setsockopt socket level optname valptr (record-length :signed)))))
    772783
     
    895906    (init-unix-sockaddr addr path)
    896907    (socket-call
     908     nil
    897909     "bind"
    898910     (c_bind socketfd
     
    11761188         
    11771189         
     1190(defmethod stream-io-error ((stream socket) errno where)
     1191  (socket-error stream where errno))
Note: See TracChangeset for help on using the changeset viewer.