// YYYY-mm-dd HH:MM:SS TZOFF
strftime(buffer, sizeof(buffer), "%F %T %z", tm);
buffer[sizeof(buffer)-1] = '\0';
- return buffer;
+ return string(buffer);
}
uint16_t getShort(const unsigned char *p)
if(gethostname(tmp, MAXHOSTNAMELEN))
return "UNKNOWN";
- return tmp;
+ return string(tmp);
}
string itoa(int i)
(val >> 16)&0xff,
(val >> 8)&0xff,
(val )&0xff);
- return tmp;
+ return string(tmp);
}
ret.reserve((int)(str.size()*2.2));
for(string::size_type n=0;n<str.size();++n) {
- sprintf(tmp,"%02x ", (unsigned char)str[n]);
+ snprintf(tmp, sizeof(tmp), "%02x ", (unsigned char)str[n]);
ret+=tmp;
}
return ret;
bool readFileIfThere(const char* fname, std::string* line)
{
line->clear();
- FILE* fp = fopen(fname, "r");
+ auto fp = std::unique_ptr<FILE, int(*)(FILE*)>(fopen(fname, "r"), fclose);
if(!fp)
return false;
- stringfgets(fp, *line);
- fclose(fp);
+ stringfgets(fp.get(), *line);
+ fp.reset();
+
return true;
}
return flags & O_NONBLOCK;
}
+bool setReceiveSocketErrors(int sock, int af)
+{
+#ifdef __linux__
+ int tmp = 1, ret;
+ if (af == AF_INET) {
+ ret = setsockopt(sock, IPPROTO_IP, IP_RECVERR, &tmp, sizeof(tmp));
+ } else {
+ ret = setsockopt(sock, IPPROTO_IPV6, IPV6_RECVERR, &tmp, sizeof(tmp));
+ }
+ if (ret < 0) {
+ throw PDNSException(string("Setsockopt failed: ") + strerror(errno));
+ }
+#endif
+ return true;
+}
+
// Closes a socket.
int closesocket( int socket )
{
uint64_t getRealMemoryUsage(const std::string&)
{
#ifdef __linux__
- ifstream ifs("/proc/"+std::to_string(getpid())+"/smaps");
+ ifstream ifs("/proc/self/statm");
+ if(!ifs)
+ return 0;
+
+ uint64_t size, resident, shared, text, lib, data;
+ ifs >> size >> resident >> shared >> text >> lib >> data;
+
+ return data * getpagesize();
+#else
+ struct rusage ru;
+ if (getrusage(RUSAGE_SELF, &ru) != 0)
+ return 0;
+ return ru.ru_maxrss * 1024;
+#endif
+}
+
+
+uint64_t getSpecialMemoryUsage(const std::string&)
+{
+#ifdef __linux__
+ ifstream ifs("/proc/self/smaps");
if(!ifs)
return 0;
string line;