Coverage Report

Created: 2026-03-01 07:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/poco/Net/src/SocketAddressImpl.cpp
Line
Count
Source
1
//
2
// SocketAddressImpl.cpp
3
//
4
// Library: Net
5
// Package: NetCore
6
// Module:  SocketAddressImpl
7
//
8
// Copyright (c) 2005-2011, Applied Informatics Software Engineering GmbH.
9
// and Contributors.
10
//
11
// SPDX-License-Identifier: BSL-1.0
12
//
13
14
15
#include "Poco/Net/SocketAddressImpl.h"
16
#include "Poco/Net/SocketDefs.h"
17
#include "Poco/NumberFormatter.h"
18
#include <cstring>
19
20
21
namespace Poco {
22
namespace Net {
23
namespace Impl {
24
25
26
//
27
// SocketAddressImpl
28
//
29
30
31
SocketAddressImpl::SocketAddressImpl()
32
0
{
33
0
}
34
35
36
SocketAddressImpl::~SocketAddressImpl()
37
0
{
38
0
}
39
40
41
//
42
// IPv4SocketAddressImpl
43
//
44
45
46
IPv4SocketAddressImpl::IPv4SocketAddressImpl()
47
0
{
48
0
  std::memset(&_addr, 0, sizeof(_addr));
49
0
  _addr.sin_family = AF_INET;
50
0
  poco_set_sin_len(&_addr);
51
0
}
52
53
54
IPv4SocketAddressImpl::IPv4SocketAddressImpl(const struct sockaddr_in* addr)
55
0
{
56
0
  std::memcpy(&_addr, addr, sizeof(_addr));
57
0
}
58
59
60
IPv4SocketAddressImpl::IPv4SocketAddressImpl(const void* addr, UInt16 port)
61
0
{
62
0
  std::memset(&_addr, 0, sizeof(_addr));
63
0
  _addr.sin_family = AF_INET;
64
0
  poco_set_sin_len(&_addr);
65
0
  std::memcpy(&_addr.sin_addr, addr, sizeof(_addr.sin_addr));
66
0
  _addr.sin_port = port;
67
0
}
68
69
70
std::string IPv4SocketAddressImpl::toString() const
71
0
{
72
0
  std::string result;
73
0
  result.append(host().toString());
74
0
  result.append(":");
75
0
  NumberFormatter::append(result, ntohs(port()));
76
0
  return result;
77
0
}
78
79
80
#if defined(POCO_HAVE_IPv6)
81
82
83
//
84
// IPv6SocketAddressImpl
85
//
86
87
88
IPv6SocketAddressImpl::IPv6SocketAddressImpl(const struct sockaddr_in6* addr)
89
0
{
90
0
  std::memcpy(&_addr, addr, sizeof(_addr));
91
0
}
92
93
94
IPv6SocketAddressImpl::IPv6SocketAddressImpl(const void* addr, UInt16 port)
95
0
{
96
0
  std::memset(&_addr, 0, sizeof(_addr));
97
0
  _addr.sin6_family = AF_INET6;
98
0
  poco_set_sin6_len(&_addr);
99
0
  std::memcpy(&_addr.sin6_addr, addr, sizeof(_addr.sin6_addr));
100
0
  _addr.sin6_port = port;
101
0
}
102
103
104
IPv6SocketAddressImpl::IPv6SocketAddressImpl(const void* addr, UInt16 port, UInt32 scope)
105
0
{
106
0
  std::memset(&_addr, 0, sizeof(_addr));
107
0
  _addr.sin6_family = AF_INET6;
108
0
  poco_set_sin6_len(&_addr);
109
0
  std::memcpy(&_addr.sin6_addr, addr, sizeof(_addr.sin6_addr));
110
0
  _addr.sin6_port = port;
111
0
  _addr.sin6_scope_id = scope;
112
0
}
113
114
115
std::string IPv6SocketAddressImpl::toString() const
116
0
{
117
0
  std::string result;
118
0
  result.append("[");
119
0
  result.append(host().toString());
120
0
  result.append("]");
121
0
  result.append(":");
122
0
  NumberFormatter::append(result, ntohs(port()));
123
0
  return result;
124
0
}
125
126
127
#endif // POCO_HAVE_IPv6
128
129
130
#if defined(POCO_HAS_UNIX_SOCKET)
131
132
133
//
134
// LocalSocketAddressImpl
135
//
136
137
138
LocalSocketAddressImpl::LocalSocketAddressImpl(const struct sockaddr_un* addr)
139
0
{
140
0
  _pAddr = new sockaddr_un;
141
0
  std::memcpy(_pAddr, addr, sizeof(struct sockaddr_un));
142
0
}
143
144
145
LocalSocketAddressImpl::LocalSocketAddressImpl(const char* path)
146
0
{
147
0
  poco_assert (std::strlen(path) < sizeof(_pAddr->sun_path));
148
149
#if POCO_OS != POCO_OS_LINUX
150
  if (path[0] == 0)
151
    throw Poco::InvalidArgumentException("LocalSocketAddressImpl(): "
152
      "abstract sockets are only supported on Linux");
153
#endif
154
155
0
  _pAddr = new sockaddr_un;
156
0
  std::memset(_pAddr, 0, sizeof(sockaddr_un));
157
0
  std::size_t length = strlen(path);
158
0
  poco_set_sun_len(_pAddr, length + sizeof(struct sockaddr_un) - sizeof(_pAddr->sun_path) + 1);
159
0
  _pAddr->sun_family = AF_UNIX;
160
0
  std::memcpy(&_pAddr->sun_path, path, length);
161
0
}
162
163
164
LocalSocketAddressImpl::LocalSocketAddressImpl(const char* path, std::size_t length)
165
0
{
166
0
  poco_assert (length && length < sizeof(_pAddr->sun_path));
167
168
#if POCO_OS != POCO_OS_LINUX
169
  if (path[0] == 0)
170
    throw Poco::InvalidArgumentException("LocalSocketAddressImpl(): "
171
      "abstract sockets are only supported on Linux");
172
#endif
173
174
0
  _pAddr = new sockaddr_un;
175
0
  std::memset(_pAddr, 0, sizeof(sockaddr_un));
176
0
  poco_set_sun_len(_pAddr, length + sizeof(struct sockaddr_un) - sizeof(_pAddr->sun_path) + 1);
177
0
  _pAddr->sun_family = AF_UNIX;
178
0
  std::memcpy(&_pAddr->sun_path, path, length);
179
0
}
180
181
182
LocalSocketAddressImpl::~LocalSocketAddressImpl()
183
0
{
184
0
  delete _pAddr;
185
0
}
186
187
188
std::string LocalSocketAddressImpl::toString() const
189
0
{
190
0
  std::string result(path());
191
0
  return result;
192
0
}
193
194
195
#endif // POCO_HAS_UNIX_SOCKET
196
197
198
} } } // namespace Poco::Net::Impl