@@ -49,22 +49,15 @@ class OPENDHT_PUBLIC SockAddr {
49
49
public:
50
50
SockAddr () {}
51
51
SockAddr (const SockAddr& o) {
52
- len = o.len ;
53
- if (len) {
54
- addr.reset ((sockaddr*)std::malloc (len));
55
- std::memcpy ((uint8_t *)addr.get (), (const uint8_t *)o.get (), len);
56
- } else
57
- addr.reset ();
52
+ set (o.get (), o.getLength ());
58
53
}
59
54
SockAddr (SockAddr&& o) : len(o.len), addr(std::move(o.addr)) {
60
55
o.len = 0 ;
61
56
}
62
57
SockAddr (const sockaddr* sa, socklen_t length) {
63
58
if (length > sizeof (sockaddr_storage))
64
59
throw std::runtime_error (" Socket address length is too large" );
65
- len = length;
66
- addr.reset ((sockaddr*)std::malloc (len));
67
- std::memcpy ((uint8_t *)get (), (const uint8_t *)sa, len);
60
+ set (sa, length);
68
61
}
69
62
SockAddr (const sockaddr_storage& ss, socklen_t len) : SockAddr((const sockaddr*)&ss, len) {}
70
63
@@ -76,14 +69,10 @@ class OPENDHT_PUBLIC SockAddr {
76
69
77
70
bool equals (const SockAddr& o) const {
78
71
return len == o.len
79
- && std::memcmp ((uint8_t *)get (), (uint8_t *)o.get (), len) == 0 ;
72
+ && std::memcmp ((const uint8_t *)get (), (const uint8_t *)o.get (), len) == 0 ;
80
73
}
81
74
SockAddr& operator =(const SockAddr& o) {
82
- if (len != o.len ) {
83
- len = o.len ;
84
- addr.reset ((sockaddr*)std::realloc (addr.release (), len));
85
- }
86
- std::memcpy ((uint8_t *)get (), (const uint8_t *)o.get (), len);
75
+ set (o.get (), o.getLength ());
87
76
return *this ;
88
77
}
89
78
SockAddr& operator =(SockAddr&& o) {
@@ -204,6 +193,17 @@ class OPENDHT_PUBLIC SockAddr {
204
193
socklen_t len {0 };
205
194
struct free_delete { void operator ()(void * p) { std::free (p); } };
206
195
std::unique_ptr<sockaddr, free_delete> addr {};
196
+
197
+ void set (const sockaddr* sa, socklen_t length) {
198
+ if (len != length) {
199
+ len = length;
200
+ if (len) addr.reset ((sockaddr*)std::malloc (len));
201
+ else addr.reset ();
202
+ }
203
+ if (len)
204
+ std::memcpy ((uint8_t *)get (), (const uint8_t *)sa, len);
205
+ }
206
+
207
207
};
208
208
209
209
OPENDHT_PUBLIC bool operator ==(const SockAddr& a, const SockAddr& b);
0 commit comments