-----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-----
|