diff --git a/examples/echo-server-inet6.scm b/examples/echo-server-inet6.scm new file mode 100644 index 00000000..2a853d19 --- /dev/null +++ b/examples/echo-server-inet6.scm @@ -0,0 +1,29 @@ +#!/usr/bin/env chibi-scheme + +(import (scheme base) (scheme write) (chibi net) (chibi net server)) + +;; Copy each input line to output. +(define (echo-handler in out sock addr) + (let ((line (read-line in))) + (cond + ((not (or (eof-object? line) (equal? line ""))) + ;; log the request to stdout + (display "read: ") (write line) + (display " from ") + (display (sockaddr-name (address-info-address addr))) + (display " port ") (write (sockaddr-port (address-info-address addr))) + (newline) + ;; write and flush the response + (display line out) + (newline out) + (flush-output-port out) + (echo-handler in out sock addr))))) + +(define (get-inet6-address-info host service) + (let ((hints (make-address-info address-family/inet6 + socket-type/stream + ip-proto/tcp))) + (get-address-info host service hints))) + +;; Start the server on local ipv6 addresses on port 5556. +(run-net-server (get-inet6-address-info #f 5556) echo-handler) diff --git a/lib/chibi/accept.c b/lib/chibi/accept.c index 63cd7510..e9642153 100644 --- a/lib/chibi/accept.c +++ b/lib/chibi/accept.c @@ -81,10 +81,15 @@ sexp sexp_listen (sexp ctx, sexp self, sexp fileno, sexp backlog) { /* Additional utilities. */ sexp sexp_sockaddr_name (sexp ctx, sexp self, struct sockaddr* addr) { - char buf[20]; - struct sockaddr_in *sa = (struct sockaddr_in *)addr; - unsigned char *ptr = (unsigned char *)&(sa->sin_addr); - sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]); + char buf[24]; + /* struct sockaddr_in *sa = (struct sockaddr_in *)addr; */ + /* unsigned char *ptr = (unsigned char *)&(sa->sin_addr); */ + /* sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]); */ + inet_ntop(addr->sa_family, + (addr->sa_family == AF_INET6 ? + (void*)(&(((struct sockaddr_in6 *)addr)->sin6_addr)) : + (void*)(&(((struct sockaddr_in *)addr)->sin_addr))), + buf, 24); return sexp_c_string(ctx, buf, -1); } diff --git a/lib/chibi/net.stub b/lib/chibi/net.stub index e9adfac9..e319ba16 100644 --- a/lib/chibi/net.stub +++ b/lib/chibi/net.stub @@ -1,4 +1,5 @@ +(c-system-include "arpa/inet.h") (c-system-include "sys/types.h") (c-system-include "sys/socket.h") (c-system-include "netinet/in.h")