scsh-users
[Top] [All Lists]

0.3 network support broken for non-connected sockets.

To: scsh-bugs@martigny.ai.mit.edu
Subject: 0.3 network support broken for non-connected sockets.
From: sommerfeld@orchard.medford.ma.us (Bill Sommerfeld)
Date: Wed, 25 Oct 1995 15:25:32 GMT
-----BEGIN PGP SIGNED MESSAGE-----

I wrote the following trivial test program to try out UDP/IP datagram
sockets in scsh, and found that the send-message/receive-message family
of functions were broken.  

Here's the test case which I just got to work:

(define (make-udp-socket port)
  (let ((sock (create-socket protocol-family/internet
                             socket-type/datagram))
        (addr (and port (internet-address->socket-address internet-address/any 
port))))
    (set-socket-option sock level/socket socket/reuse-address #t)
    (and addr
         (bind-socket sock addr))
    sock))


(define ping-port 8973)

(define host-port internet-address->socket-address)

(define (ping addr)
  (format #t "Hi...~%")
  (let ((udps (make-udp-socket #f))
        (peer-addr (host-port addr ping-port)))
    (format #t "Sending...~%")
    (send-message/partial udps "abcdefgh" 0 8 0 peer-addr)
    (format #t "Sent...~%")
    (receive (msg from-addr)
             (receive-message/partial udps 1024)
       (format #t "Recieved `~a'" msg))))            

(define (pong)
  (let loop ((udps (make-udp-socket ping-port)))
    (format #t "top of loop~%")
    (receive (msg from-addr)
             (receive-message/partial udps 1024)
             (format #t "Message is `~a'~%" msg)
             (send-message/partial udps msg 0 (string-length msg) 0 from-addr)
             (loop udps))))

- ---
fire up two copies of scsh & load the above code into both of them.

in one, run (pong)
in the other, run (ping internet-address/loopback)

Here are the changes I needed to make to scsh to get the above test case
to work; I suspect the non /partial routines may be broken as well but
haven't tried them yet..

*** network.scm 1995/10/24 01:56:25     1.1
- --- network.scm       1995/10/25 15:07:43
***************
*** 366,372 ****
          (else 
           (let ((s (make-string len)))
             (receive (nread from)
!                     (receive-message! socket flags s 0 len)
                 (values
                (cond ((not nread) #f)  ; EOF
                      ((= nread len) s)
- --- 366,372 ----
          (else 
           (let ((s (make-string len)))
             (receive (nread from)
!                     (receive-message! socket s 0 len flags)
                 (values
                (cond ((not nread) #f)  ; EOF
                      ((= nread len) s)
***************
*** 374,394 ****
                from)))))))
  
  (define (receive-message! socket s . maybe-args)
!   (receive (start end flags)
!          (parse-optionals maybe-args 0 (string-length s) 0)
!     (cond ((not (socket? socket))
!          (error "receive-message!: socket expected"))
!         ((not (or (integer? flags)
!                   (integer? start)
!                   (integer? end)))
!          (error "receive-message!: integer expected"))
!         ((not (string? s))
!          (error "receive-message!: string expected"))
!         (else 
!            (generic-receive-message! (socket->fdes socket) flags
!                                s start end 
!                                recv-substring!/errno
!                                (socket:family socket))))))
  
  (define (generic-receive-message! sockfd flags s start end reader from)
    (if (bogus-substring-spec? s start end)
- --- 374,394 ----
                from)))))))
  
  (define (receive-message! socket s . maybe-args)
!   (if (not (string? s))
!       (error "receive-message!: string expected")
!       (receive (start end flags)
!              (parse-optionals maybe-args 0 (string-length s) 0)
!              (cond ((not (socket? socket))
!                     (error "receive-message!: socket expected"))
!                    ((not (or (integer? flags)
!                              (integer? start)
!                              (integer? end)))
!                     (error "receive-message!: integer expected"))
!                    (else 
!                     (generic-receive-message! (socket->fdes socket) flags
!                                               s start end 
!                                               recv-substring!/errno
!                                               (socket:family socket)))))))
  
  (define (generic-receive-message! sockfd flags s start end reader from)
    (if (bogus-substring-spec? s start end)
***************
*** 421,446 ****
               (not (integer? len)))
           (error "receive-message/partial: integer expected"))
          (else 
!          (let* ((s (make-string len))
!                 (nread (receive-message!/partial socket flags s 0 len )))
!            (cond ((not nread) #f)     ; EOF
!                  ((= nread len) s)
!                  (else (substring s 0 nread))))))))
  
  (define (receive-message!/partial socket s . maybe-args)
!   (receive (start end flags)
!          (parse-optionals maybe-args 0 (string-length s) 0)
!     (cond ((not (socket? socket))
!          (error "receive-message!/partial: socket expected"))
!         ((not (integer? flags))
!          (error "receive-message!/partial: integer expected"))
!         ((not (string? s))
!          (error "receive-message!/partial: string expected"))
!         (else 
!          (generic-receive-message!/partial (socket->fdes socket) flags 
!                                            s start end
!                                            recv-substring!/errno
!                                            (socket:family socket))))))
  
  (define (generic-receive-message!/partial sockfd flags s start end reader 
from)
    (if (bogus-substring-spec? s start end)
- --- 421,450 ----
               (not (integer? len)))
           (error "receive-message/partial: integer expected"))
          (else 
!          (let ((s (make-string len)))
!            (receive (nread addr)
!                     (receive-message!/partial socket s 0 len flags)
!                     (values 
!                      (cond ((not nread) #f)   ; EOF
!                            ((= nread len) s)
!                            (else (substring s 0 nread)))
!                      addr)))))))
  
  (define (receive-message!/partial socket s . maybe-args)
!   (if (not (string? s))
!       (error "receive-message!/partial: string expected")
!       (receive (start end flags)
!              (parse-optionals maybe-args 0 (string-length s) 0)
!              (cond ((not (socket? socket))
!                     (error "receive-message!/partial: socket expected"))
!                    ((not (integer? flags))
!                     (error "receive-message!/partial: integer expected"))
!                    (else 
!                     (generic-receive-message!/partial (socket->fdes socket)
!                                                       flags 
!                                                       s start end
!                                                       recv-substring!/errno
!                                                       (socket:family 
socket)))))))
  
  (define (generic-receive-message!/partial sockfd flags s start end reader 
from)
    (if (bogus-substring-spec? s start end)
***************
*** 460,466 ****
                                      s start start end addr)))
                 (values
                  (and (not (zero? nread)) nread)
!                 from)))))))
  
  (define-foreign recv-substring!/errno
    (recv_substring (integer sockfd)
- --- 464,470 ----
                                      s start start end addr)))
                 (values
                  (and (not (zero? nread)) nread)
!                 (make-socket-address from addr))))))))
  
  (define-foreign recv-substring!/errno
    (recv_substring (integer sockfd)
***************
*** 525,533 ****
                                         s start end
                                         send-substring/errno
                                         (if addr (socket-address:family addr) 
0)
!                                        (and addr 
!                                             (socket-address:family 
!                                              addr)))))))
  
  (define (generic-send-message/partial sockfd flags s start end writer family 
addr)
    (if (bogus-substring-spec? s start end)
- --- 529,535 ----
                                         s start end
                                         send-substring/errno
                                         (if addr (socket-address:family addr) 
0)
!                                        (if addr (socket-address:address 
addr)))))))
  
  (define (generic-send-message/partial sockfd flags s start end writer family 
addr)
    (if (bogus-substring-spec? s start end)
***************
*** 536,552 ****
             s start end writer))
  
    (if (= start end) 0                 ; Vacuous request.
!       (let ((addr (if addr (make-addr family) "")))
!       (let loop ()
!         (receive (err nwritten) 
!                  (writer sockfd flags s start end family addr)
!            (if err
!                (case err
!                  ((errno/intr) (loop))
!                  ((errno/again errno/wouldblock) 0)
!                  (else (errno-error err sockfd flags family addr
!                                     s start start end writer)))
!                nwritten))))))
  
  (define-foreign send-substring/errno
    (send_substring (integer sockfd)
- --- 538,553 ----
             s start end writer))
  
    (if (= start end) 0                 ; Vacuous request.
!       (let loop ()
!       (receive (err nwritten) 
!                (writer sockfd flags s start end family addr)
!                (if err
!                    (case err
!                      ((errno/intr) (loop))
!                      ((errno/again errno/wouldblock) 0)
!                      (else (errno-error err sockfd flags family addr
!                                         s start start end writer)))
!                    nwritten)))))
  
  (define-foreign send-substring/errno
    (send_substring (integer sockfd)

*** network1.c  1995/10/24 02:59:02     1.1
- --- network1.c        1995/10/25 15:14:01
***************
*** 50,55 ****
- --- 50,56 ----
  
        u_long  addr=GET_LONG(scheme_name,0);
        u_short port=htons((u_short)ntohl(GET_LONG(scheme_name,1)));
+       memset(&name, 0, sizeof(name));
        name.sin_family=AF_INET;
        name.sin_addr.s_addr=addr;
        name.sin_port=port;
***************
*** 88,93 ****
- --- 89,95 ----
        u_long addr=GET_LONG(scheme_name,0);
        u_short port=htons((u_short)ntohl(GET_LONG(scheme_name,1)));
  
+       memset(&name, 0, sizeof(name));
        name.sin_family=AF_INET;
        name.sin_addr.s_addr=addr;
        name.sin_port=port;
***************
*** 123,129 ****
        {
        struct sockaddr_in name;
        int namelen=sizeof(name);
!       int newsockfd=accept(sockfd,(struct sockaddr *)&name,&namelen);
        
        if (newsockfd < 0)
          return(-1);
- --- 125,133 ----
        {
        struct sockaddr_in name;
        int namelen=sizeof(name);
!       int newsockfd;
!       memset(&name, 0, sizeof(name));
!       newsockfd=accept(sockfd,(struct sockaddr *)&name,&namelen);
        
        if (newsockfd < 0)
          return(-1);
***************
*** 146,152 ****
        {
        struct sockaddr_in name;
        int namelen=sizeof(name);
!       int value=getpeername(sockfd,(struct sockaddr *)&name,&namelen);
        
        if (value < 0)
          return(-1);
- --- 150,158 ----
        {
        struct sockaddr_in name;
        int namelen=sizeof(name);
!       int value;
!       memset(&name, 0, sizeof(name));
!       value=getpeername(sockfd,(struct sockaddr *)&name,&namelen);
        
        if (value < 0)
          return(-1);
***************
*** 169,175 ****
        {
        struct sockaddr_in name;
        int namelen=sizeof(name);
!       int value=getsockname(sockfd,(struct sockaddr *)&name,&namelen);
        
        if (value < 0)
          return(-1);
- --- 175,183 ----
        {
        struct sockaddr_in name;
        int namelen=sizeof(name);
!       int value;
!       memset(&name, 0, sizeof(name));
!       value=getsockname(sockfd,(struct sockaddr *)&name,&namelen);
        
        if (value < 0)
          return(-1);
***************
*** 213,226 ****
        return recv(s, StrByte(buf,start), end-start, flags);
        }
  #endif
!     case 6:                   /* AF_INET */
        {
        struct sockaddr_in name;
        int namelen=sizeof(name);
!       int cc=recvfrom(s, 
!                       StrByte(buf,start), end-start, 
!                       flags,
!                       (struct sockaddr *)&name, &namelen);
        if (cc < 0)
          return(-1);
        SET_LONG(scheme_name,0,name.sin_addr.s_addr);
- --- 221,235 ----
        return recv(s, StrByte(buf,start), end-start, flags);
        }
  #endif
!     case 8:                   /* AF_INET */
        {
        struct sockaddr_in name;
        int namelen=sizeof(name);
!       int cc;
!       memset(&name, 0, sizeof(name));
!       cc=recvfrom(s, StrByte(buf,start), end-start, 
!                   flags,
!                   (struct sockaddr *)&name, &namelen);
        if (cc < 0)
          return(-1);
        SET_LONG(scheme_name,0,name.sin_addr.s_addr);
***************
*** 229,234 ****
- --- 238,244 ----
        break;
        }
      default:
+       errno = EPFNOSUPPORT;
        return(-1);             /* error unknown address family */
      }
  }
***************
*** 272,277 ****
- --- 282,288 ----
        struct sockaddr_in name;
        u_long  addr=GET_LONG(scheme_name,0);
        u_short port=htons((u_short)ntohl(GET_LONG(scheme_name,1)));
+       memset(&name, 0, sizeof(name));
        name.sin_family=AF_INET;
        name.sin_addr.s_addr=addr;
        name.sin_port=port;
***************
*** 578,584 ****
  void set_longvec_carriers(scheme_value svec, const long** cvec)
  {
    int svec_len = VECTOR_LENGTH(svec);
!   long **cv = cvec;
    scheme_value *sv = &VECTOR_REF(svec,0);
  
    for(; svec_len > 0; cv++, sv++, svec_len-- ) {
- --- 589,595 ----
  void set_longvec_carriers(scheme_value svec, const long** cvec)
  {
    int svec_len = VECTOR_LENGTH(svec);
!   const long **cv = cvec;
    scheme_value *sv = &VECTOR_REF(svec,0);
  
    for(; svec_len > 0; cv++, sv++, svec_len-- ) {

-----BEGIN PGP SIGNATURE-----
Version: 2.6.1

iQCVAwUBMI5W6LT+rHlVUGpxAQEO1AQAimugNdqln+v02Ys2omafSzTWHeQfcM2R
bcFYA3xzKc45mNhPT7/0jZJoe79jslzpqJva9kItWa0l6cJBwwVryLNdgtUECbbQ
m66WNapSSoxTD6OWPd3EQztW4oLfSW5+m3Pw8nK3ExI5W4YMkkXGPkUcjfmmb/Wa
OrtD2ylOh08=
=Im57
-----END PGP SIGNATURE-----

<Prev in Thread] Current Thread [Next in Thread>
  • 0.3 network support broken for non-connected sockets., Bill Sommerfeld <=