return count;
}
-size_t readn2(int fd, void* buffer, size_t len)
+size_t readn2(int fileDesc, void* buffer, size_t len)
{
- size_t pos=0;
- ssize_t res;
- for(;;) {
- res = read(fd, (char*)buffer + pos, len - pos);
- if(res == 0)
+ size_t pos = 0;
+
+ for (;;) {
+ auto res = read(fileDesc, static_cast<char *>(buffer) + pos, len - pos); // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic): it's the API
+ if (res == 0) {
throw runtime_error("EOF while reading message");
- if(res < 0) {
- if (errno == EAGAIN)
+ }
+ if (res < 0) {
+ if (errno == EAGAIN) {
throw std::runtime_error("used readn2 on non-blocking socket, got EAGAIN");
- else
- unixDie("failed in readn2");
+ }
+ unixDie("failed in readn2");
}
- pos+=(size_t)res;
- if(pos == len)
+ pos += static_cast<size_t>(res);
+ if (pos == len) {
break;
+ }
}
return len;
}
size_t writen2(int fd, const void *buf, size_t count);
inline size_t writen2(int fd, const std::string &s) { return writen2(fd, s.data(), s.size()); }
-size_t readn2(int fd, void* buffer, size_t len);
+size_t readn2(int fileDesc, void* buffer, size_t len);
size_t readn2WithTimeout(int fd, void* buffer, size_t len, const struct timeval& idleTimeout, const struct timeval& totalTimeout={0,0}, bool allowIncomplete=false);
size_t writen2WithTimeout(int fd, const void * buffer, size_t len, const struct timeval& timeout);
return now.tv_sec+now.tv_usec/1000000.0;
}
-inline void unixDie(const string &why)
+[[noreturn]] inline void unixDie(const string &why)
{
- throw runtime_error(why+": "+stringerror());
+ throw runtime_error(why + ": " + stringerror(errno));
}
string makeHexDump(const string& str);