From 924352921ad2f8be051da18701d97c03714f7289 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Sun, 14 Jul 2013 18:40:23 +0900 Subject: [PATCH] Adding sockaddr-port. --- examples/echo-server.scm | 4 +++- lib/chibi/accept.c | 7 +++++++ lib/chibi/net.sld | 2 +- lib/chibi/net.stub | 5 +++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/examples/echo-server.scm b/examples/echo-server.scm index ca7be695..88506310 100644 --- a/examples/echo-server.scm +++ b/examples/echo-server.scm @@ -11,7 +11,9 @@ ((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 " from ") + (display (sockaddr-name (address-info-address addr))) + (display ":") (write (sockaddr-port (address-info-address addr))) (newline) ;; write and flush the response (display line out) diff --git a/lib/chibi/accept.c b/lib/chibi/accept.c index 0d73352d..b9ec5d0d 100644 --- a/lib/chibi/accept.c +++ b/lib/chibi/accept.c @@ -40,6 +40,8 @@ sexp sexp_listen (sexp ctx, sexp self, sexp fileno, sexp backlog) { return (res == 0) ? SEXP_TRUE : SEXP_FALSE; } +/* Additional utilities. */ + sexp sexp_sockaddr_name (sexp ctx, sexp self, struct sockaddr* addr) { char buf[20]; struct sockaddr_in *sa = (struct sockaddr_in *)addr; @@ -47,3 +49,8 @@ sexp sexp_sockaddr_name (sexp ctx, sexp self, struct sockaddr* addr) { sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]); return sexp_c_string(ctx, buf, -1); } + +int sexp_sockaddr_port (sexp ctx, sexp self, struct sockaddr* addr) { + struct sockaddr_in *sa = (struct sockaddr_in *)addr; + return sa->sin_port; +} diff --git a/lib/chibi/net.sld b/lib/chibi/net.sld index 6a24e035..e13b28c3 100644 --- a/lib/chibi/net.sld +++ b/lib/chibi/net.sld @@ -2,7 +2,7 @@ (define-library (chibi net) (export sockaddr? address-info? get-address-info make-address-info socket connect bind accept listen open-socket-pair - sockaddr-name + sockaddr-name sockaddr-port with-net-io open-net-io make-listener-socket address-info-family address-info-socket-type address-info-protocol address-info-address address-info-address-length address-info-next diff --git a/lib/chibi/net.stub b/lib/chibi/net.stub index e6fe6c3f..9c3b28e4 100644 --- a/lib/chibi/net.stub +++ b/lib/chibi/net.stub @@ -61,6 +61,11 @@ (define-c sexp (sockaddr-name "sexp_sockaddr_name") ((value ctx sexp) (value self sexp) sockaddr)) +;;> Return the port a sockaddr is connected on. + +(define-c int (sockaddr-port "sexp_sockaddr_port") + ((value ctx sexp) (value self sexp) sockaddr)) + (define-c-const int (address-family/unspecified "AF_UNSPEC")) (define-c-const int (address-family/unix "AF_UNIX")) (define-c-const int (address-family/inet "AF_INET"))