From b3bed2223afced37e4794e05d8d85259eb2c5cda Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 23 May 2018 10:37:18 -0500 Subject: [PATCH] msg/msg_types: entity_addrvec_t parse() and operator<< Signed-off-by: Sage Weil --- src/msg/msg_types.cc | 20 ++++++++++++++++++++ src/msg/msg_types.h | 12 ++++++++++++ src/test/test_addrs.cc | 27 +++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/src/msg/msg_types.cc b/src/msg/msg_types.cc index cc706822284af..525661e52d9b0 100644 --- a/src/msg/msg_types.cc +++ b/src/msg/msg_types.cc @@ -220,6 +220,26 @@ ostream& operator<<(ostream& out, const sockaddr *sa) // entity_addrvec_t +bool entity_addrvec_t::parse(const char *s, const char **end) +{ + v.clear(); + while (*s) { + entity_addr_t a; + bool r = a.parse(s, end); + if (!r) { + break; + } + v.push_back(a); + s = *end; + while (*s == ',' || + *s == ' ' || + *s == ';') { + ++s; + } + } + return !v.empty(); +} + void entity_addrvec_t::encode(bufferlist& bl, uint64_t features) const { using ceph::encode; diff --git a/src/msg/msg_types.h b/src/msg/msg_types.h index 8b115affb661c..ccbcd377f0e6c 100644 --- a/src/msg/msg_types.h +++ b/src/msg/msg_types.h @@ -535,10 +535,22 @@ struct entity_addrvec_t { unsigned size() const { return v.size(); } bool empty() const { return v.empty(); } + bool parse(const char *s, const char **end = 0); + void encode(bufferlist& bl, uint64_t features) const; void decode(bufferlist::const_iterator& bl); void dump(Formatter *f) const; static void generate_test_instances(list& ls); + + friend ostream& operator<<(ostream& out, const entity_addrvec_t& av) { + if (av.v.empty()) { + return out; + } else if (av.v.size() == 1) { + return out << av.v[0]; + } else { + return out << av.v; + } + } }; WRITE_CLASS_ENCODER_FEATURES(entity_addrvec_t); diff --git a/src/test/test_addrs.cc b/src/test/test_addrs.cc index 9e672315fb331..24db6cdd2fa85 100644 --- a/src/test/test_addrs.cc +++ b/src/test/test_addrs.cc @@ -13,6 +13,7 @@ */ #include "include/types.h" +#include "include/stringify.h" #include "msg/msg_types.h" #include "gtest/gtest.h" @@ -237,3 +238,29 @@ TEST(Msgr, TestAddrvecEncodeAddrDecode3) ASSERT_NE(addr, addrvec.v[0]); // it's not the first addr(which is non-legacy) ASSERT_NE(addr, entity_addr_t(1, 0)); // it's not a blank addr either } + +const char *addrvec_parse_checks[][3] = { + { "127.0.0.1", "127.0.0.1:0/0", "" }, + { "127.0.0.1 foo", "127.0.0.1:0/0", " foo" }, + { "127.0.0.1 1.2.3.4 foo", "[127.0.0.1:0/0,1.2.3.4:0/0]", " foo" }, + { "127.0.0.1 :: - foo", "[127.0.0.1:0/0,[::]:0/0,-]", " foo" }, + { NULL, NULL, NULL }, +}; + +TEST(entity_addrvec_t, parse) +{ + entity_addrvec_t addrvec; + + for (auto v : { addr_checks, addr_checks2, addrvec_parse_checks }) { + for (unsigned i = 0; v[i][0]; ++i) { + const char *end = ""; + addrvec.parse(v[i][0], &end); + string out = stringify(addrvec); + string left = end; + cout << "'" << v[i][0] << "' -> '" << out << "' + '" << left << "'" + << std::endl; + ASSERT_EQ(out, v[i][1]); + ASSERT_EQ(left, v[i][2]); + } + } +} -- 2.39.5