mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 07:33:01 +00:00 
			
		
		
		
	Always return port in peername and localname
This commit is contained in:
		| @@ -649,7 +649,7 @@ struct sockaddr_in6 *sin6;     // IPv6 address + port | |||||||
| struct sockaddr_un *sun;       // Unix Domain Socket Address | struct sockaddr_un *sun;       // Unix Domain Socket Address | ||||||
| */ | */ | ||||||
|  |  | ||||||
| /* Turn a socket address into a host, port pair (port is optional). | /* Turn a socket address into a host, port pair. | ||||||
|  * For unix domain sockets, returned tuple will have only a single element, the path string. */ |  * For unix domain sockets, returned tuple will have only a single element, the path string. */ | ||||||
| static Janet janet_so_getname(const void *sa_any) { | static Janet janet_so_getname(const void *sa_any) { | ||||||
|     const struct sockaddr *sa = sa_any; |     const struct sockaddr *sa = sa_any; | ||||||
| @@ -663,7 +663,7 @@ static Janet janet_so_getname(const void *sa_any) { | |||||||
|                 janet_panic("unable to decode ipv4 host address"); |                 janet_panic("unable to decode ipv4 host address"); | ||||||
|             } |             } | ||||||
|             Janet pair[2] = {janet_cstringv(buffer), janet_wrap_integer(ntohs(sai->sin_port))}; |             Janet pair[2] = {janet_cstringv(buffer), janet_wrap_integer(ntohs(sai->sin_port))}; | ||||||
|             return janet_wrap_tuple(janet_tuple_n(pair, sai->sin_port ? 2 : 1)); |             return janet_wrap_tuple(janet_tuple_n(pair, 2)); | ||||||
|         } |         } | ||||||
|         case AF_INET6: { |         case AF_INET6: { | ||||||
|             const struct sockaddr_in6 *sai6 = sa_any; |             const struct sockaddr_in6 *sai6 = sa_any; | ||||||
| @@ -671,7 +671,7 @@ static Janet janet_so_getname(const void *sa_any) { | |||||||
|                 janet_panic("unable to decode ipv4 host address"); |                 janet_panic("unable to decode ipv4 host address"); | ||||||
|             } |             } | ||||||
|             Janet pair[2] = {janet_cstringv(buffer), janet_wrap_integer(ntohs(sai6->sin6_port))}; |             Janet pair[2] = {janet_cstringv(buffer), janet_wrap_integer(ntohs(sai6->sin6_port))}; | ||||||
|             return janet_wrap_tuple(janet_tuple_n(pair, sai6->sin6_port ? 2 : 1)); |             return janet_wrap_tuple(janet_tuple_n(pair, 2)); | ||||||
|         } |         } | ||||||
| #ifndef JANET_WINDOWS | #ifndef JANET_WINDOWS | ||||||
|         case AF_UNIX: { |         case AF_UNIX: { | ||||||
| @@ -695,6 +695,7 @@ JANET_CORE_FN(cfun_net_getsockname, | |||||||
|               "Gets the local address and port in a tuple in that order.") { |               "Gets the local address and port in a tuple in that order.") { | ||||||
|     janet_fixarity(argc, 1); |     janet_fixarity(argc, 1); | ||||||
|     JanetStream *js = janet_getabstract(argv, 0, &janet_stream_type); |     JanetStream *js = janet_getabstract(argv, 0, &janet_stream_type); | ||||||
|  |     if (js->flags & JANET_STREAM_CLOSED) janet_panic("stream closed"); | ||||||
|     struct sockaddr_storage ss; |     struct sockaddr_storage ss; | ||||||
|     socklen_t slen = sizeof(ss); |     socklen_t slen = sizeof(ss); | ||||||
|     memset(&ss, 0, slen); |     memset(&ss, 0, slen); | ||||||
| @@ -710,6 +711,7 @@ JANET_CORE_FN(cfun_net_getpeername, | |||||||
|               "Gets the remote peer's address and port in a tuple in that order.") { |               "Gets the remote peer's address and port in a tuple in that order.") { | ||||||
|     janet_fixarity(argc, 1); |     janet_fixarity(argc, 1); | ||||||
|     JanetStream *js = janet_getabstract(argv, 0, &janet_stream_type); |     JanetStream *js = janet_getabstract(argv, 0, &janet_stream_type); | ||||||
|  |     if (js->flags & JANET_STREAM_CLOSED) janet_panic("stream closed"); | ||||||
|     struct sockaddr_storage ss; |     struct sockaddr_storage ss; | ||||||
|     socklen_t slen = sizeof(ss); |     socklen_t slen = sizeof(ss); | ||||||
|     memset(&ss, 0, slen); |     memset(&ss, 0, slen); | ||||||
|   | |||||||
| @@ -79,9 +79,9 @@ int janet_dobytes(JanetTable *env, const uint8_t *bytes, int32_t len, const char | |||||||
|                 const char *e = janet_parser_error(&parser); |                 const char *e = janet_parser_error(&parser); | ||||||
|                 errflags |= 0x04; |                 errflags |= 0x04; | ||||||
|                 ret = janet_cstringv(e); |                 ret = janet_cstringv(e); | ||||||
|                 int32_t line = parser.line; |                 size_t line = parser.line; | ||||||
|                 int32_t col = parser.column; |                 size_t col = parser.column; | ||||||
|                 janet_eprintf("%s:%d:%d: parse error: %s\n", sourcePath, line, col, e); |                 janet_eprintf("%s:%lu:%lu: parse error: %s\n", sourcePath, line, col, e); | ||||||
|                 done = 1; |                 done = 1; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -151,36 +151,35 @@ | |||||||
|  |  | ||||||
|   (:close s)) |   (:close s)) | ||||||
|  |  | ||||||
|  | (defn check-matching-names [stream] | ||||||
|  |   (def [my-ip my-port] (net/localname stream)) | ||||||
|  |   (def [remote-ip remote-port] (net/peername stream)) | ||||||
|  |   (def msg (string my-ip " " my-port " " remote-ip " " remote-port)) | ||||||
|  |   (def buf @"") | ||||||
|  |   (ev/gather | ||||||
|  |     (net/write stream msg) | ||||||
|  |     (net/read stream 1024 buf)) | ||||||
|  |   (def comparison (string/split " " buf)) | ||||||
|  |   (assert (and (= my-ip (get comparison 2)) | ||||||
|  |                (= (string my-port) (get comparison 3)) | ||||||
|  |                (= remote-ip (get comparison 0)) | ||||||
|  |                (= (string remote-port) (get comparison 1))) | ||||||
|  |           "localname should match peername")) | ||||||
|  |  | ||||||
|  | # Test on both server and client | ||||||
|  | (defn names-handler | ||||||
|  |   [stream] | ||||||
|  |   (defer (:close stream) | ||||||
|  |     (check-matching-names stream))) | ||||||
|  |  | ||||||
| # Test localname and peername | # Test localname and peername | ||||||
| (repeat 20 | (repeat 20 | ||||||
|  |  | ||||||
|   (defn check-matching-names [stream] |  | ||||||
|     (def [my-ip my-port] (net/localname stream)) |  | ||||||
|     (def [remote-ip remote-port] (net/peername stream)) |  | ||||||
|     (def msg (string my-ip " " my-port " " remote-ip " " remote-port)) |  | ||||||
|     (def buf @"") |  | ||||||
|     (ev/gather |  | ||||||
|       (net/write stream msg) |  | ||||||
|       (net/read stream 1024 buf)) |  | ||||||
|     (def comparison (string/split " " buf)) |  | ||||||
|     (assert (and (= my-ip (get comparison 2)) |  | ||||||
|                  (= (string my-port) (get comparison 3)) |  | ||||||
|                  (= remote-ip (get comparison 0)) |  | ||||||
|                  (= (string remote-port) (get comparison 1))) |  | ||||||
|             "localname should match peername")) |  | ||||||
|  |  | ||||||
|   # Test on both server and client |  | ||||||
|   (defn names-handler |  | ||||||
|     [stream] |  | ||||||
|     (defer (:close stream) |  | ||||||
|       (check-matching-names stream))) |  | ||||||
|   (with [s (net/server "127.0.0.1" "8000" names-handler)] |   (with [s (net/server "127.0.0.1" "8000" names-handler)] | ||||||
|     (defn test-names [] |     (defn test-names [] | ||||||
|       (with [conn (net/connect "127.0.0.1" "8000")] |       (with [conn (net/connect "127.0.0.1" "8000")] | ||||||
|         (check-matching-names conn))) |         (check-matching-names conn))) | ||||||
|     (test-names) |     (test-names) | ||||||
|     (test-names)) |     (test-names)) | ||||||
|  |  | ||||||
|   (gccollect)) |   (gccollect)) | ||||||
|  |  | ||||||
| # Create pipe | # Create pipe | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose