Skip to content

Commit

Permalink
Format sstuff.hh
Browse files Browse the repository at this point in the history
  • Loading branch information
omoerbeek committed Jun 26, 2024
1 parent d321bdb commit d7d1ba2
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 89 deletions.
1 change: 0 additions & 1 deletion .not-formatted
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,6 @@
./pdns/snmp-agent.cc
./pdns/snmp-agent.hh
./pdns/speedtest.cc
./pdns/sstuff.hh
./pdns/standalone_fuzz_target_runner.cc
./pdns/stat_t.hh
./pdns/statbag.cc
Expand Down
175 changes: 87 additions & 88 deletions pdns/sstuff.hh
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,15 @@ using ProtocolType = int; //!< Supported protocol types
class Socket : public boost::noncopyable
{
public:
Socket(int fd): d_socket(fd)
Socket(int fd) :
d_socket(fd)
{
}

//! Construct a socket of specified address family and socket type.
Socket(int af, int st, ProtocolType pt=0)
Socket(int af, int st, ProtocolType pt = 0)
{
if((d_socket=socket(af, st, pt))<0)
if ((d_socket = socket(af, st, pt)) < 0)
throw NetworkError(stringerror());
setCloseOnExec(d_socket);
}
Expand Down Expand Up @@ -82,35 +83,36 @@ public:
closesocket(d_socket);
}
}
catch(const PDNSException& e) {
catch (const PDNSException& e) {
}
}

//! If the socket is capable of doing so, this function will wait for a connection
std::unique_ptr<Socket> accept()
{
struct sockaddr_in remote;
socklen_t remlen=sizeof(remote);
socklen_t remlen = sizeof(remote);
memset(&remote, 0, sizeof(remote));
int s=::accept(d_socket, reinterpret_cast<sockaddr *>(&remote), &remlen);
if(s<0) {
if(errno==EAGAIN)
int s = ::accept(d_socket, reinterpret_cast<sockaddr*>(&remote), &remlen);
if (s < 0) {
if (errno == EAGAIN)
return nullptr;

throw NetworkError("Accepting a connection: "+stringerror());
throw NetworkError("Accepting a connection: " + stringerror());
}

return std::make_unique<Socket>(s);
}

//! Get remote address
bool getRemote(ComboAddress &remote) {
socklen_t remotelen=sizeof(remote);
return (getpeername(d_socket, reinterpret_cast<struct sockaddr *>(&remote), &remotelen) >= 0);
bool getRemote(ComboAddress& remote)
{
socklen_t remotelen = sizeof(remote);
return (getpeername(d_socket, reinterpret_cast<struct sockaddr*>(&remote), &remotelen) >= 0);
}

//! Check remote address against netmaskgroup ng
bool acl(const NetmaskGroup &ng)
bool acl(const NetmaskGroup& ng)
{
ComboAddress remote;
if (getRemote(remote))
Expand All @@ -135,7 +137,8 @@ public:
{
try {
::setReuseAddr(d_socket);
} catch (const PDNSException &e) {
}
catch (const PDNSException& e) {
throw NetworkError(e.reason);
}
}
Expand All @@ -148,40 +151,39 @@ public:
throw NetworkError("While setting TCP_FASTOPEN_CONNECT: " + stringerror());
}
#else
throw NetworkError("While setting TCP_FASTOPEN_CONNECT: not compiled in");
throw NetworkError("While setting TCP_FASTOPEN_CONNECT: not compiled in");
#endif
}

//! Bind the socket to a specified endpoint
void bind(const ComboAddress &local, bool reuseaddr=true)
void bind(const ComboAddress& local, bool reuseaddr = true)
{
int tmp=1;
if(reuseaddr && setsockopt(d_socket, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char*>(&tmp), sizeof tmp)<0)
throw NetworkError("Setsockopt failed: "+stringerror());
int tmp = 1;
if (reuseaddr && setsockopt(d_socket, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char*>(&tmp), sizeof tmp) < 0)
throw NetworkError("Setsockopt failed: " + stringerror());

if(::bind(d_socket, reinterpret_cast<const struct sockaddr *>(&local), local.getSocklen())<0)
throw NetworkError("While binding: "+stringerror());
if (::bind(d_socket, reinterpret_cast<const struct sockaddr*>(&local), local.getSocklen()) < 0)
throw NetworkError("While binding: " + stringerror());
}

//! Connect the socket to a specified endpoint
void connect(const ComboAddress &ep, int timeout=0)
void connect(const ComboAddress& ep, int timeout = 0)
{
SConnectWithTimeout(d_socket, ep, timeval{timeout,0});
SConnectWithTimeout(d_socket, ep, timeval{timeout, 0});
}


//! For datagram sockets, receive a datagram and learn where it came from
/** For datagram sockets, receive a datagram and learn where it came from
\param dgram Will be filled with the datagram
\param ep Will be filled with the origin of the datagram */
void recvFrom(string &dgram, ComboAddress& remote)
void recvFrom(string& dgram, ComboAddress& remote)
{
socklen_t remlen = sizeof(remote);
if (dgram.size() < s_buflen) {
dgram.resize(s_buflen);
}
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
auto bytes = recvfrom(d_socket, dgram.data(), dgram.size(), 0, reinterpret_cast<sockaddr *>(&remote) , &remlen);
auto bytes = recvfrom(d_socket, dgram.data(), dgram.size(), 0, reinterpret_cast<sockaddr*>(&remote), &remlen);
if (bytes < 0) {
throw NetworkError("After recvfrom: " + stringerror());
}
Expand All @@ -195,7 +197,7 @@ public:
dgram.resize(s_buflen);
}
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
auto bytes = recvfrom(d_socket, dgram.data(), dgram.size(), 0, reinterpret_cast<sockaddr *>(&remote), &remlen);
auto bytes = recvfrom(d_socket, dgram.data(), dgram.size(), 0, reinterpret_cast<sockaddr*>(&remote), &remlen);
if (bytes < 0) {
if (errno != EAGAIN) {
throw NetworkError("After async recvfrom: " + stringerror());
Expand All @@ -212,7 +214,7 @@ public:
void sendTo(const char* msg, size_t len, const ComboAddress& remote)
{
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
if (sendto(d_socket, msg, len, 0, reinterpret_cast<const sockaddr *>(&remote), remote.getSocklen()) < 0) {
if (sendto(d_socket, msg, len, 0, reinterpret_cast<const sockaddr*>(&remote), remote.getSocklen()) < 0) {
throw NetworkError("After sendto: " + stringerror());
}
}
Expand All @@ -221,11 +223,10 @@ public:
void send(const std::string& msg)
{
if (::send(d_socket, msg.data(), msg.size(), 0) < 0) {
throw NetworkError("After send: "+stringerror());
throw NetworkError("After send: " + stringerror());
}
}


/** For datagram sockets, send a datagram to a destination
\param dgram The datagram
\param remote The intended destination of the datagram */
Expand All @@ -234,82 +235,80 @@ public:
sendTo(dgram.data(), dgram.length(), remote);
}


//! Write this data to the socket, taking care that all bytes are written out
void writen(const string &data)
void writen(const string& data)
{
if(data.empty())
if (data.empty())
return;

size_t toWrite=data.length();
size_t toWrite = data.length();
ssize_t res;
const char *ptr=data.c_str();
const char* ptr = data.c_str();

do {
res=::send(d_socket, ptr, toWrite, 0);
if(res<0)
throw NetworkError("Writing to a socket: "+stringerror());
if(!res)
res = ::send(d_socket, ptr, toWrite, 0);
if (res < 0)
throw NetworkError("Writing to a socket: " + stringerror());
if (!res)
throw NetworkError("EOF on socket");
toWrite -= static_cast<size_t>(res);
ptr += static_cast<size_t>(res);
} while(toWrite);

} while (toWrite);
}

//! tries to write toWrite bytes from ptr to the socket
/** tries to write toWrite bytes from ptr to the socket, but does not make sure they al get written out
\param ptr Location to write from
\param toWrite number of bytes to try
*/
size_t tryWrite(const char *ptr, size_t toWrite)
size_t tryWrite(const char* ptr, size_t toWrite)
{
ssize_t res;
res=::send(d_socket,ptr,toWrite,0);
if(res==0)
res = ::send(d_socket, ptr, toWrite, 0);
if (res == 0)
throw NetworkError("EOF on writing to a socket");

if(res>0)
if (res > 0)
return res;

if(errno==EAGAIN)
if (errno == EAGAIN)
return 0;

throw NetworkError("Writing to a socket: "+stringerror());
throw NetworkError("Writing to a socket: " + stringerror());
}

//! Writes toWrite bytes from ptr to the socket
/** Writes toWrite bytes from ptr to the socket. Returns how many bytes were written */
size_t write(const char *ptr, size_t toWrite)
size_t write(const char* ptr, size_t toWrite)
{
ssize_t res;
res=::send(d_socket,ptr,toWrite,0);
if(res<0) {
throw NetworkError("Writing to a socket: "+stringerror());
res = ::send(d_socket, ptr, toWrite, 0);
if (res < 0) {
throw NetworkError("Writing to a socket: " + stringerror());
}
return res;
}

void writenWithTimeout(const void *buffer, size_t n, int timeout)
void writenWithTimeout(const void* buffer, size_t n, int timeout)
{
size_t bytes=n;
const char *ptr = reinterpret_cast<const char*>(buffer);
size_t bytes = n;
const char* ptr = reinterpret_cast<const char*>(buffer);
ssize_t ret;
while(bytes) {
ret=::write(d_socket, ptr, bytes);
if(ret < 0) {
if(errno == EAGAIN) {
ret=waitForRWData(d_socket, false, timeout, 0);
if(ret < 0)
while (bytes) {
ret = ::write(d_socket, ptr, bytes);
if (ret < 0) {
if (errno == EAGAIN) {
ret = waitForRWData(d_socket, false, timeout, 0);
if (ret < 0)
throw NetworkError("Waiting for data write");
if(!ret)
if (!ret)
throw NetworkError("Timeout writing data");
continue;
}
else
throw NetworkError("Writing data: "+stringerror());
throw NetworkError("Writing data: " + stringerror());
}
if(!ret) {
if (!ret) {
throw NetworkError("Did not fulfill TCP write due to EOF");
}

Expand All @@ -323,64 +322,64 @@ public:
{
char c;

ssize_t res=::recv(d_socket,&c,1,0);
if(res)
ssize_t res = ::recv(d_socket, &c, 1, 0);
if (res)
return c;
return -1;
}

void getline(string &data)
void getline(string& data)
{
data="";
data = "";
int c;
while((c=getChar())!=-1) {
data+=(char)c;
if(c=='\n')
while ((c = getChar()) != -1) {
data += (char)c;
if (c == '\n')
break;
}
}

//! Reads a block of data from the socket to a string
void read(string &data)
void read(string& data)
{
d_buffer.resize(s_buflen);
ssize_t res=::recv(d_socket, &d_buffer[0], s_buflen, 0);
if(res<0)
throw NetworkError("Reading from a socket: "+stringerror());
ssize_t res = ::recv(d_socket, &d_buffer[0], s_buflen, 0);
if (res < 0)
throw NetworkError("Reading from a socket: " + stringerror());
data.assign(d_buffer, 0, static_cast<size_t>(res));
}

//! Reads a block of data from the socket to a block of memory
size_t read(char *buffer, size_t bytes)
size_t read(char* buffer, size_t bytes)
{
ssize_t res=::recv(d_socket, buffer, bytes, 0);
if(res<0)
throw NetworkError("Reading from a socket: "+stringerror());
ssize_t res = ::recv(d_socket, buffer, bytes, 0);
if (res < 0)
throw NetworkError("Reading from a socket: " + stringerror());
return static_cast<size_t>(res);
}

/** Read a bock of data from the socket to a block of memory,
* waiting at most 'timeout' seconds for the data to become
* available. Be aware that this does _NOT_ handle partial reads
* for you.
*/
* waiting at most 'timeout' seconds for the data to become
* available. Be aware that this does _NOT_ handle partial reads
* for you.
*/
ssize_t readWithTimeout(char* buffer, size_t n, int timeout)
{
int err = waitForRWData(d_socket, true, timeout, 0);

if(err == 0)
if (err == 0)
throw NetworkError("timeout reading");
if(err < 0)
throw NetworkError("nonblocking read failed: "+stringerror());
if (err < 0)
throw NetworkError("nonblocking read failed: " + stringerror());

return read(buffer, n);
}

//! Sets the socket to listen with a default listen backlog of 10 pending connections
void listen(unsigned int length=10)
void listen(unsigned int length = 10)
{
if(::listen(d_socket,length)<0)
throw NetworkError("Setting socket to listen: "+stringerror());
if (::listen(d_socket, length) < 0)
throw NetworkError("Setting socket to listen: " + stringerror());
}

//! Returns the internal file descriptor of the socket
Expand Down

0 comments on commit d7d1ba2

Please sign in to comment.