From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
To: tarantool-patches@freelists.org
Cc: kostja@tarantool.org
Subject: [tarantool-patches] [PATCH 3/5] sio: return 'no host' flag from sio_uri_to_addr()
Date: Wed, 1 May 2019 01:31:25 +0300 [thread overview]
Message-ID: <63aba61c1059b8ff4b77ed6895dca24d4efbd7ea.1556663421.git.v.shpilevoy@tarantool.org> (raw)
In-Reply-To: <cover.1556663421.git.v.shpilevoy@tarantool.org>
Results of sio_uri_to_addr("0.0.0.0:port") and
sio_uri_to_addr("port") are indistinguishable - both fill
sockaddr_in.sin_addr as INADDR_ANY. But SWIM wants to forbid the
former, and allow the latter. In case if only port is specified,
host will be 'localhost'.
This commit returns a flag from sio_uri_to_addr() signaling if a
host was specified.
---
src/lib/core/sio.c | 3 ++-
src/lib/core/sio.h | 2 +-
src/lib/swim/swim.c | 4 +++-
test/unit/sio.c | 29 ++++++++++++++++++++---------
test/unit/sio.result | 32 ++++++++++++++++++--------------
5 files changed, 44 insertions(+), 26 deletions(-)
diff --git a/src/lib/core/sio.c b/src/lib/core/sio.c
index 28aef1d6c..97a512eee 100644
--- a/src/lib/core/sio.c
+++ b/src/lib/core/sio.c
@@ -344,11 +344,12 @@ sio_strfaddr(const struct sockaddr *addr, socklen_t addrlen)
}
int
-sio_uri_to_addr(const char *uri, struct sockaddr *addr)
+sio_uri_to_addr(const char *uri, struct sockaddr *addr, bool *is_host_empty)
{
struct uri u;
if (uri_parse(&u, uri) != 0 || u.service == NULL)
goto invalid_uri;
+ *is_host_empty = u.host_len == 0;
if (u.host_len == strlen(URI_HOST_UNIX) &&
memcmp(u.host, URI_HOST_UNIX, u.host_len) == 0) {
struct sockaddr_un *un = (struct sockaddr_un *) addr;
diff --git a/src/lib/core/sio.h b/src/lib/core/sio.h
index 093b5f5ba..db2e3281f 100644
--- a/src/lib/core/sio.h
+++ b/src/lib/core/sio.h
@@ -223,7 +223,7 @@ ssize_t sio_recvfrom(int fd, void *buf, size_t len, int flags,
* sockaddr_in/un structure.
*/
int
-sio_uri_to_addr(const char *uri, struct sockaddr *addr);
+sio_uri_to_addr(const char *uri, struct sockaddr *addr, bool *is_host_empty);
#if defined(__cplusplus)
} /* extern "C" */
diff --git a/src/lib/swim/swim.c b/src/lib/swim/swim.c
index 941214289..22dfc3d2a 100644
--- a/src/lib/swim/swim.c
+++ b/src/lib/swim/swim.c
@@ -1686,7 +1686,9 @@ swim_uri_to_addr(const char *uri, struct sockaddr_in *addr,
const char *prefix)
{
struct sockaddr_storage storage;
- if (sio_uri_to_addr(uri, (struct sockaddr *) &storage) != 0)
+ bool is_host_empty;
+ if (sio_uri_to_addr(uri, (struct sockaddr *) &storage,
+ &is_host_empty) != 0)
return -1;
if (storage.ss_family != AF_INET) {
diag_set(IllegalParams, "%s only IP sockets are supported",
diff --git a/test/unit/sio.c b/test/unit/sio.c
index dffdd5592..4ded96f4a 100644
--- a/test/unit/sio.c
+++ b/test/unit/sio.c
@@ -39,40 +39,49 @@ static void
check_uri_to_addr(void)
{
header();
- plan(18);
+ plan(22);
+ bool is_host_empty;
struct sockaddr_storage storage;
struct sockaddr *addr = (struct sockaddr *) &storage;
struct sockaddr_un *un = (struct sockaddr_un *) addr;
struct sockaddr_in *in = (struct sockaddr_in *) addr;
- isnt(0, sio_uri_to_addr("invalid uri", addr),
+ isnt(0, sio_uri_to_addr("invalid uri", addr, &is_host_empty),
"invalid uri is detected");
char long_path[1000];
char *pos = long_path + sprintf(long_path, "unix/:/");
memset(pos, 'a', 900);
pos[900] = 0;
- isnt(0, sio_uri_to_addr(long_path, addr), "too long UNIX path");
+ isnt(0, sio_uri_to_addr(long_path, addr, &is_host_empty),
+ "too long UNIX path");
- is(0, sio_uri_to_addr("unix/:/normal_path", addr), "UNIX");
+ is(0, sio_uri_to_addr("unix/:/normal_path", addr, &is_host_empty),
+ "UNIX");
is(0, strcmp(un->sun_path, "/normal_path"), "UNIX path");
is(AF_UNIX, un->sun_family, "UNIX family");
+ ok(! is_host_empty, "unix host is not empty");
- is(0, sio_uri_to_addr("localhost:1234", addr), "localhost");
+ is(0, sio_uri_to_addr("localhost:1234", addr, &is_host_empty),
+ "localhost");
is(AF_INET, in->sin_family, "localhost family");
is(htonl(INADDR_LOOPBACK), in->sin_addr.s_addr, "localhost address");
is(htons(1234), in->sin_port, "localhost port");
+ ok(! is_host_empty, "'localhost' host is not empty");
- is(0, sio_uri_to_addr("5678", addr), "'any'");
+ is(0, sio_uri_to_addr("5678", addr, &is_host_empty), "'any'");
is(AF_INET, in->sin_family, "'any' family");
is(htonl(INADDR_ANY), in->sin_addr.s_addr, "'any' address");
is(htons(5678), in->sin_port, "'any' port");
+ ok(is_host_empty, "only port specified - host is empty");
- is(0, sio_uri_to_addr("192.168.0.1:9101", addr), "IP");
+ is(0, sio_uri_to_addr("192.168.0.1:9101", addr, &is_host_empty), "IP");
is(AF_INET, in->sin_family, "IP family");
is(inet_addr("192.168.0.1"), in->sin_addr.s_addr, "IP address");
is(htons(9101), in->sin_port, "IP port");
+ ok(! is_host_empty, "IPv4 host is not empty");
- isnt(0, sio_uri_to_addr("192.168.0.300:1112", addr), "invalid IP");
+ isnt(0, sio_uri_to_addr("192.168.0.300:1112", addr, &is_host_empty),
+ "invalid IP");
check_plan();
footer();
@@ -84,9 +93,11 @@ check_auto_bind(void)
header();
plan(3);
+ bool is_host_empty;
struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr);
- sio_uri_to_addr("127.0.0.1:0", (struct sockaddr *) &addr);
+ sio_uri_to_addr("127.0.0.1:0", (struct sockaddr *) &addr,
+ &is_host_empty);
int fd = sio_socket(AF_INET, SOCK_STREAM, 0);
is(sio_bind(fd, (struct sockaddr *) &addr, sizeof(addr)), 0,
"bind to 0 works");
diff --git a/test/unit/sio.result b/test/unit/sio.result
index e5712ad3c..896736bf9 100644
--- a/test/unit/sio.result
+++ b/test/unit/sio.result
@@ -1,25 +1,29 @@
*** main ***
1..2
*** check_uri_to_addr ***
- 1..18
+ 1..22
ok 1 - invalid uri is detected
ok 2 - too long UNIX path
ok 3 - UNIX
ok 4 - UNIX path
ok 5 - UNIX family
- ok 6 - localhost
- ok 7 - localhost family
- ok 8 - localhost address
- ok 9 - localhost port
- ok 10 - 'any'
- ok 11 - 'any' family
- ok 12 - 'any' address
- ok 13 - 'any' port
- ok 14 - IP
- ok 15 - IP family
- ok 16 - IP address
- ok 17 - IP port
- ok 18 - invalid IP
+ ok 6 - unix host is not empty
+ ok 7 - localhost
+ ok 8 - localhost family
+ ok 9 - localhost address
+ ok 10 - localhost port
+ ok 11 - 'localhost' host is not empty
+ ok 12 - 'any'
+ ok 13 - 'any' family
+ ok 14 - 'any' address
+ ok 15 - 'any' port
+ ok 16 - only port specified - host is empty
+ ok 17 - IP
+ ok 18 - IP family
+ ok 19 - IP address
+ ok 20 - IP port
+ ok 21 - IPv4 host is not empty
+ ok 22 - invalid IP
ok 1 - subtests
*** check_uri_to_addr: done ***
*** check_auto_bind ***
--
2.20.1 (Apple Git-117)
next prev parent reply other threads:[~2019-04-30 22:31 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-30 22:31 [tarantool-patches] [PATCH 0/5] swim lua preparation Vladislav Shpilevoy
2019-04-30 22:31 ` [tarantool-patches] [PATCH 1/5] swim: do not use ev_timer_start Vladislav Shpilevoy
2019-05-01 5:09 ` [tarantool-patches] " Konstantin Osipov
2019-04-30 22:31 ` [tarantool-patches] [PATCH 2/5] swim: introduce member reference API Vladislav Shpilevoy
2019-05-01 5:15 ` [tarantool-patches] " Konstantin Osipov
2019-05-02 15:10 ` Vladislav Shpilevoy
2019-05-02 15:46 ` Konstantin Osipov
2019-05-02 17:32 ` Vladislav Shpilevoy
2019-04-30 22:31 ` Vladislav Shpilevoy [this message]
2019-05-01 5:18 ` [tarantool-patches] Re: [PATCH 3/5] sio: return 'no host' flag from sio_uri_to_addr() Konstantin Osipov
2019-04-30 22:31 ` [tarantool-patches] [PATCH 4/5] swim: allow to omit host in URI Vladislav Shpilevoy
2019-05-01 5:20 ` [tarantool-patches] " Konstantin Osipov
2019-05-02 15:10 ` Vladislav Shpilevoy
2019-04-30 22:31 ` [tarantool-patches] [PATCH 5/5] swim: explicitly stop old ev_io input/output on rebind Vladislav Shpilevoy
2019-05-01 5:21 ` [tarantool-patches] " Konstantin Osipov
2019-05-02 17:32 ` [tarantool-patches] Re: [PATCH 0/5] swim lua preparation Vladislav Shpilevoy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=63aba61c1059b8ff4b77ed6895dca24d4efbd7ea.1556663421.git.v.shpilevoy@tarantool.org \
--to=v.shpilevoy@tarantool.org \
--cc=kostja@tarantool.org \
--cc=tarantool-patches@freelists.org \
--subject='Re: [tarantool-patches] [PATCH 3/5] sio: return '\''no host'\'' flag from sio_uri_to_addr()' \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox