2  *    This program is free software; you can redistribute it and/or modify
 
   3  *    it under the terms of the GNU General Public License as published by
 
   4  *    the Free Software Foundation; either version 2 of the License, or
 
   5  *    (at your option) any later version.
 
   7  *    This program is distributed in the hope that it will be useful,
 
   8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
   9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  10  *    GNU General Public License for more details.
 
  12  *    You should have received a copy of the GNU General Public License
 
  13  *    along with this program; if not, write to the Free Software
 
  14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
  22  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
 
  27  $Date: 2010/11/08 10:11:19 $
 
  31 // For old and dub systems
 
  33 #include <sys/types.h>
 
  37 #include <sys/select.h>
 
  42 #include <sys/socket.h>
 
  43 #include <netinet/in.h>
 
  44 #include <arpa/inet.h>
 
  45 #include <sys/select.h>
 
  57 #include "stg/common.h"
 
  59 #ifndef INET_ADDRSTRLEN
 
  60 #   define INET_ADDRSTRLEN 16
 
  65 //---------------------------------------------------------------------------
 
  66 unsigned char koi2win[] = {
 
  67         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
 
  68         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
 
  69         0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
 
  70         0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
 
  71         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
 
  72         0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
 
  73         0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
 
  74         0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
 
  75         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
 
  76         0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
 
  77         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
 
  78         0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
 
  79         0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
 
  80         0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
 
  81         0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
 
  82         0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
 
  83         0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
 
  84         0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
 
  85         0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
 
  86         0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
 
  87         0xA0, 0xA1, 0xA2, 0xB8, 0xBA, 0xA5, 0xB3, 0xBF,
 
  88         0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB4, 0xAE, 0xAF,
 
  89         0xB0, 0xB1, 0xB2, 0xA8, 0xAA, 0xB5, 0xB2, 0xAF,
 
  90         0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xA5, 0xBE, 0xBF,
 
  91         0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
 
  92         0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
 
  93         0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
 
  94         0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
 
  95         0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
 
  96         0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
 
  97         0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
 
  98         0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA};
 
 101 unsigned char win2koi[] = {
 
 102         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
 
 103         0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
 
 104         0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
 
 105         0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
 
 106         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
 
 107         0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
 
 108         0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
 
 109         0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
 
 110         0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
 
 111         0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
 
 112         0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
 
 113         0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
 
 114         0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
 
 115         0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
 
 116         0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
 
 117         0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
 
 118         0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
 
 119         0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
 
 120         0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
 
 121         0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
 
 122         0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xBD, 0xA6, 0xA7,
 
 123         0xB3, 0xA9, 0xB4, 0xAB, 0xAC, 0xAD, 0xAE, 0xB7,
 
 124         0xB0, 0xB1, 0xB6, 0xA6, 0xAD, 0xB5, 0xB6, 0xB7,
 
 125         0xA3, 0xB9, 0xA4, 0xBB, 0xBC, 0xBD, 0xBE, 0xA7,
 
 126         0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
 
 127         0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
 
 128         0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
 
 129         0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
 
 130         0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
 
 131         0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
 
 132         0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
 
 133         0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1};
 
 137 //-----------------------------------------------------------------------------
 
 138 const char * inet_ntop(int af, const void * src, char * dst, unsigned long length)
 
 140 struct sockaddr_in addr;
 
 141 addr.sin_family = af;
 
 143 memcpy(&addr.sin_addr.s_addr, src, sizeof(addr.sin_addr.s_addr));
 
 144 if (WSAAddressToStringA(reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr), 0, dst, &length))
 
 150 //-----------------------------------------------------------------------------
 
 151 int inet_pton(int af, const char * src, void * dst)
 
 153 // Fuck you Microsoft!
 
 154 // Why the hell not to use const char *?
 
 155 size_t slen = strlen(src);
 
 156 char * buf = new char[slen + 1];
 
 157 strncpy(buf, src, slen + 1);
 
 159 struct sockaddr_in addr;
 
 160 addr.sin_family = af;
 
 162 addr.sin_addr.s_addr = 0;
 
 163 int length = sizeof(addr);
 
 164 if (WSAStringToAddressA(buf, af, 0, reinterpret_cast<struct sockaddr *>(&addr), &length))
 
 169 memcpy(dst, &addr, sizeof(addr));
 
 174 //-----------------------------------------------------------------------------
 
 175 int strtodouble2(const char * s, double &a)
 
 186 //-----------------------------------------------------------------------------
 
 188 int printfd(const char * __file__, const char * fmt, ...)
 
 190 int printfd(const char *, const char *, ...)
 
 196 time_t t = time(NULL);
 
 200 vsnprintf(buff, sizeof(buff), fmt, vl);
 
 203 printf("%18s > %s > ", __file__, LogDate(t)+11);
 
 209 //-----------------------------------------------------------------------------
 
 210 int strprintf(std::string * str, const char * fmt, ...)
 
 216 int n = vsnprintf(buff, sizeof(buff), fmt, vl);
 
 223 //-----------------------------------------------------------------------------
 
 224 const char *IntToKMG(int64_t a, int stat)
 
 226 static const double K = 1024;
 
 227 static const double M = 1024 * 1024;
 
 228 static const double G = 1024 * 1024 * 1024;
 
 236         sprintf(str, "%Ld", a);
 
 238         sprintf(str, "%lld", a);
 
 242         sprintf(str, "%.2f kb", value / K);
 
 245         sprintf(str, "%.2f Mb", value / M);
 
 250             sprintf(str, "%.2f Gb", value / G);
 
 255             sprintf(str, "%.2f Gb", value / G);
 
 260             sprintf(str, "%.2f Mb", value / M);
 
 265             sprintf(str, "%.2f Mb", value / M);
 
 269         sprintf(str, "%.2f kb", value / K);
 
 274 //---------------------------------------------------------------------------
 
 275 void KOIToWin(const char * s1, char * s2, int l)
 
 277 for (int j = 0; j < l; j++)
 
 279     unsigned char t = s1[j];
 
 286 //---------------------------------------------------------------------------
 
 287 void WinToKOI(const char * s1, char * s2, int l)
 
 289 for (int j = 0; j < l; j++)
 
 291     unsigned char t = s1[j];
 
 298 //---------------------------------------------------------------------------
 
 299 void KOIToWin(const std::string & s1, std::string * s2)
 
 301 s2->erase(s2->begin(), s2->end());
 
 302 s2->reserve(s1.length());
 
 303 for (int j = 0; j < (int)s1.length(); j++)
 
 305     unsigned char t = s1[j];
 
 306     s2->push_back(koi2win[t]);
 
 309 //---------------------------------------------------------------------------
 
 310 void WinToKOI(const std::string & s1, std::string * s2)
 
 312 s2->erase(s2->begin(), s2->end());
 
 313 s2->reserve(s1.length());
 
 314 for (int j = 0; j < (int)s1.length(); j++)
 
 316     unsigned char t = s1[j];
 
 317     s2->push_back(win2koi[t]);
 
 320 //---------------------------------------------------------------------------
 
 321 void Encode12str(std::string & dst, const std::string & src)
 
 323 dst.erase(dst.begin(), dst.end());
 
 324 for (size_t i = 0; i < src.length(); i++)
 
 326     dst.push_back('a' + (src[i] & 0x0f));
 
 327     dst.push_back('a' + ((src[i] & 0xf0) >> 4));
 
 330 //---------------------------------------------------------------------------
 
 331 void Decode21str(std::string & dst, const std::string & src)
 
 333 dst.erase(dst.begin(), dst.end());
 
 334 for (size_t i = 0; i < src.length() / 2; i++)
 
 336     char c1 = src[i * 2];
 
 337     char c2 = src[i * 2 + 1];
 
 342     dst.push_back(static_cast<char>(c1 + (c2 << 4)));
 
 345 //---------------------------------------------------------------------------
 
 346 std::string Encode12str(const std::string & src)
 
 349 Encode12str(res, src);
 
 352 //---------------------------------------------------------------------------
 
 353 std::string Decode21str(const std::string & src)
 
 356 Decode21str(res, src);
 
 359 //---------------------------------------------------------------------------
 
 360 void Encode12(char * dst, const char * src, size_t srcLen)
 
 362 for (size_t i = 0; i <= srcLen; i++)
 
 364     char c1 = src[i] & 0x0f;
 
 365     char c2 = (src[i] & 0xf0) >> 4;
 
 375 //---------------------------------------------------------------------------
 
 376 void Decode21(char * dst, const char * src)
 
 378 for (size_t i = 0; ; i++)
 
 383     char c1 = src[i * 2];
 
 384     char c2 = src[i * 2 + 1];
 
 389     dst[i] = static_cast<char>(c1 + (c2 << 4));
 
 391 dst[strlen(src) / 2] = 0;
 
 393 //---------------------------------------------------------------------------
 
 394 int ParseIPString(const char * str, uint32_t * ips, int maxIP)
 
 397  *Function Name:ParseIPString
 
 400  ÓÔÒÏËÁ ÄÌÑ ÒÁÚÂÏÒÁ É ÍÁÓÓÉ× ËÕÄÁ ÚÁÎÏÓÉÔØ ÐÏÌÕÞÅÎÎÙÅ ÁÄÒÅÓÁ
 
 403  îÁ ×ÈÏÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÁ ×ÉÄÁ "ip1,ip2,ip3" ÉÌÉ "*"
 
 404  ÷ ÐÅÒ×ÏÍ ÓÌÕÞÁÅ × ÍÁÓÓÉ× ÚÁÎÏÓÑÔÓÑ ÒÁÚÏÂÒÁÎÎÙÅ ÁÄÒÅÓÁ.
 
 405  åÓÌÉ ÉÈ ÍÅÎØÛÅ MAX_IP?, ÔÏ ÐÏÓÌÅÄÎÉÊ ÁÄÒÅÓ ÂÕÄÅÔ 255.255.255.255
 
 406  åÓÌÉ ÓÔÒÏËÁ * , ÔÏ ÐÅÒ×ÁÙÊ ÁÄÒÅÓ ÂÕÄÅÔ 0.0.0.0, Ô.Å. ÌÀÂÏÊ
 
 408  *Returns: 0 ÅÓÌÉ ×ÓÅ ïë
 
 415 strncpy(p, str, 254);
 
 418 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
 
 420 if (str[0] == '*' && strlen(str) == 1)
 
 426 for (int i = 0; i < maxIP; i++)
 
 428     char * p1 = strtok(pp, ",\n ");
 
 431     if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
 
 442     if (inet_pton(AF_INET, p1, &in) != 1)
 
 444         //printf("INADDR_NONE\n");
 
 450     /*if (ips[n] == INADDR_NONE)
 
 462 //-----------------------------------------------------------------------------
 
 463 int DaysInCurrentMonth()
 
 465 time_t t = time(NULL);
 
 467 struct tm * lt = localtime(&t);
 
 469 return DaysInMonth(lt->tm_year, lt->tm_mon);
 
 471 //-----------------------------------------------------------------------------
 
 472 int DaysInMonth(unsigned year, unsigned mon)
 
 474 assert(mon < 12 && "Month number should be 0 - 11");
 
 477     case 0: return 31;  //jan
 
 479         if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
 
 482     case 2: return 31;  //mar
 
 483     case 3: return 30;  //apr
 
 484     case 4: return 31;  //may
 
 485     case 5: return 30;  //june
 
 486     case 6: return 31;  //jule
 
 487     case 7: return 31;  //aug
 
 488     case 8: return 30;  //sep
 
 489     case 9: return 31;  //oct
 
 490     case 10: return 30; //nov
 
 491     case 11: return 31; //dec
 
 493 return -1; // We will never reach here
 
 495 //-----------------------------------------------------------------------------
 
 499 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
 
 504 return a + (8 - a % 8);
 
 506 //-----------------------------------------------------------------------------
 
 507 /*char * inet_ntostr(unsigned long ip)
 
 509 struct in_addr addr = {ip};
 
 510 return inet_ntoa(addr);
 
 512 //-----------------------------------------------------------------------------
 
 513 std::string inet_ntostring(uint32_t ip)
 
 515     char buf[INET_ADDRSTRLEN + 1];
 
 516     return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
 
 518 //-----------------------------------------------------------------------------
 
 519 uint32_t inet_strington(const std::string & value)
 
 523     if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
 
 528 //-----------------------------------------------------------------------------
 
 529 std::string TimeToString(time_t time)
 
 531 struct tm brokenTime;
 
 533 brokenTime.tm_wday = 0;
 
 534 brokenTime.tm_yday = 0;
 
 535 brokenTime.tm_isdst = 0;
 
 537 gmtime_r(&time, &brokenTime);
 
 540 strftime(buf, 32, "%Y-%m-%d %H:%M:%S", &brokenTime);
 
 544 //-----------------------------------------------------------------------------
 
 545 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
 
 547 char hs1[10], ms1[10], hs2[10], ms2[10];
 
 552 strncpy(ss, str, 48);
 
 554 p1 = strtok(ss, "-");
 
 560 p2 = strtok(NULL, "-");
 
 566 p1 = strtok(s1, ":");
 
 572 p2 = strtok(NULL, ":");
 
 578 p1 = strtok(s2, ":");
 
 584 p2 = strtok(NULL, ":");
 
 590 if (str2x(hs1, h1) != 0)
 
 593 if (str2x(ms1, m1) != 0)
 
 596 if (str2x(hs2, h2) != 0)
 
 599 if (str2x(ms2, m2) != 0)
 
 604 /*//---------------------------------------------------------------------------
 
 607 if (c >= '0' && c <= '9')
 
 611 //-----------------------------------------------------------------------------
 
 614 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
 
 618 //-----------------------------------------------------------------------------
 
 619 const char * LogDate(time_t t)
 
 622 struct tm * tt = localtime(&t);
 
 624 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
 
 626          tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
 
 627          tt->tm_mday    < 10 ? "0" : "", tt->tm_mday,
 
 628          tt->tm_hour    < 10 ? "0" : "", tt->tm_hour,
 
 629          tt->tm_min     < 10 ? "0" : "", tt->tm_min,
 
 630          tt->tm_sec     < 10 ? "0" : "", tt->tm_sec);
 
 634 //-----------------------------------------------------------------------------
 
 635 uint32_t CalcMask(uint32_t msk)
 
 637 if (msk >= 32) return 0xFFffFFff;
 
 638 if (msk == 0) return 0;
 
 639 return htonl(0xFFffFFff << (32 - msk));
 
 641 //---------------------------------------------------------------------------
 
 642 void TouchFile(const std::string & fileName)
 
 644 FILE * f = fopen(fileName.c_str(), "w");
 
 648 //---------------------------------------------------------------------------
 
 650 void EncodeStr(char * str, unsigned long serial, int useHDD)
 
 652 int len = strlen(str);
 
 656 char serial_c[sizeof(serial)];
 
 657 memcpy(serial_c, &serial, sizeof(serial));
 
 659 for (i = 0; i < len; i++)
 
 665         str[i] = str[i]^serial_c[j%sizeof(serial)];
 
 670 for (i = 0; i < 2*len; i++)
 
 674         c1 = (str[i/2] >> 4);
 
 680         c2 = (str[i/2] & 0x0f);
 
 688 //---------------------------------------------------------------------------
 
 689 void DecodeStr(char * str, unsigned long serial, int useHDD)
 
 691 size_t len = strlen(str);
 
 693 char serial_c[sizeof(serial)];
 
 694 memcpy(serial_c, &serial, sizeof(serial));
 
 696 for (size_t i = 0; i < len; i += 2)
 
 698     char c1 = (str[i] - 50);
 
 699     char c2 = (str[i+1] - 50)<<4;
 
 702 for (size_t i = 0; i < len/2; i++)
 
 705         strdc[i] = strdc[i]^49;
 
 708         strdc[i] = strdc[i]^serial_c[j%sizeof(serial)];
 
 715 //---------------------------------------------------------------------------
 
 717 void SwapBytes(uint16_t & value)
 
 719     value = static_cast<uint16_t>((value >> 8) |
 
 722 //---------------------------------------------------------------------------
 
 723 void SwapBytes(uint32_t & value)
 
 725     value = static_cast<uint32_t>((value >> 24) |
 
 726                                   ((value << 8) &  0x00FF0000L) |
 
 727                                   ((value >> 8) &  0x0000FF00L) |
 
 730 //---------------------------------------------------------------------------
 
 731 void SwapBytes(uint64_t & value)
 
 733     value = static_cast<uint64_t>((value >> 56) |
 
 734                                   ((value << 40) & 0x00FF000000000000LL) |
 
 735                                   ((value << 24) & 0x0000FF0000000000LL) |
 
 736                                   ((value << 8)  & 0x000000FF00000000LL) |
 
 737                                   ((value >> 8)  & 0x00000000FF000000LL) |
 
 738                                   ((value >> 24) & 0x0000000000FF0000LL) |
 
 739                                   ((value >> 40) & 0x000000000000FF00LL) |
 
 742 //---------------------------------------------------------------------------
 
 743 void SwapBytes(int16_t & value)
 
 745     uint16_t temp = value;
 
 749 //---------------------------------------------------------------------------
 
 750 void SwapBytes(int32_t & value)
 
 752     uint32_t temp = value;
 
 756 //---------------------------------------------------------------------------
 
 757 void SwapBytes(int64_t & value)
 
 759     uint64_t temp = value;
 
 763 //---------------------------------------------------------------------------
 
 764 int str2x(const std::string & str, int32_t & x)
 
 766 x = static_cast<int32_t>(strtol(str.c_str(), NULL, 10));
 
 773 //---------------------------------------------------------------------------
 
 774 int str2x(const std::string & str, uint32_t & x)
 
 776 x = static_cast<uint32_t>(strtoul(str.c_str(), NULL, 10));
 
 784 //---------------------------------------------------------------------------
 
 785 int str2x(const std::string & str, int64_t & x)
 
 787 x = strtoll(str.c_str(), NULL, 10);
 
 794 //---------------------------------------------------------------------------
 
 795 int str2x(const std::string & str, uint64_t & x)
 
 797 x = strtoull(str.c_str(), NULL, 10);
 
 805 //---------------------------------------------------------------------------
 
 806 const std::string & x2str(uint32_t x, std::string & s)
 
 808 return unsigned2str(x, s);
 
 810 //---------------------------------------------------------------------------
 
 811 const std::string & x2str(uint64_t x, std::string & s)
 
 813 return unsigned2str(x, s);
 
 815 //---------------------------------------------------------------------------
 
 816 const std::string & x2str(double x, std::string & s)
 
 819 snprintf(buf, sizeof(buf), "%f", x);
 
 823 //---------------------------------------------------------------------------
 
 824 std::string & TrimL(std::string & val)
 
 826 size_t pos = val.find_first_not_of(" \t");
 
 827 if (pos == std::string::npos)
 
 829     val.erase(val.begin(), val.end());
 
 837 //---------------------------------------------------------------------------
 
 838 std::string & TrimR(std::string & val)
 
 840 size_t pos = val.find_last_not_of(" \t");
 
 841 if (pos != std::string::npos)
 
 847 //---------------------------------------------------------------------------
 
 848 std::string & Trim(std::string & val)
 
 850 return TrimR(TrimL(val));
 
 852 //---------------------------------------------------------------------------
 
 853 std::string Trim(const std::string & val)
 
 855 std::string res(val);
 
 856 return TrimR(TrimL(res));
 
 858 //---------------------------------------------------------------------------
 
 859 std::string ToLower(const std::string & value)
 
 862     for (std::string::size_type pos = 0; pos < value.length(); ++pos)
 
 863         res += tolower(value[pos]);
 
 866 //---------------------------------------------------------------------------
 
 867 std::string ToUpper(const std::string & value)
 
 870     for (std::string::size_type pos = 0; pos < value.length(); ++pos)
 
 871         res += toupper(value[pos]);
 
 874 //---------------------------------------------------------------------------
 
 876 static int is_leap(unsigned y)
 
 879     return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
 
 882 //---------------------------------------------------------------------------
 
 884 time_t stg_timegm(struct tm * brokenTime)
 
 887 static const unsigned ndays[2][12] ={
 
 888     {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
 
 889     {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
 
 891 for (int i = 70; i < brokenTime->tm_year; ++i)
 
 892     res += is_leap(i) ? 366 : 365;
 
 893 for (int i = 0; i < brokenTime->tm_mon; ++i)
 
 894     res += ndays[is_leap(brokenTime->tm_year)][i];
 
 895 res += brokenTime->tm_mday - 1;
 
 897 res += brokenTime->tm_hour;
 
 899 res += brokenTime->tm_min;
 
 901 res += brokenTime->tm_sec;
 
 905 return timegm(brokenTime);
 
 912 ret = mktime(brokenTime);
 
 919 #endif // HAVE_TIMEGM
 
 922 //---------------------------------------------------------------------------
 
 923 std::string IconvString(const std::string & source,
 
 924                         const std::string & from,
 
 925                         const std::string & to)
 
 928     return std::string();
 
 930 size_t inBytesLeft = source.length() + 1;
 
 931 size_t outBytesLeft = source.length() * 2 + 1;
 
 933 char * inBuf = new char[inBytesLeft];
 
 934 char * outBuf = new char[outBytesLeft];
 
 936 strncpy(inBuf, source.c_str(), source.length());
 
 938 inBuf[source.length()] = 0;
 
 940 #if defined(FREE_BSD) || defined(FREE_BSD5) || defined(WIN32)
 
 941 const char * srcPos = inBuf;
 
 943 char * srcPos = inBuf;
 
 945 char * dstPos = outBuf;
 
 947 iconv_t handle = iconv_open(to.c_str(),
 
 950 if (handle == iconv_t(-1))
 
 954         printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
 
 960         printfd(__FILE__, "IconvString(): iconv_open error\n");
 
 967 size_t res = iconv(handle,
 
 968                    &srcPos, &inBytesLeft,
 
 969                    &dstPos, &outBytesLeft);
 
 971 if (res == size_t(-1))
 
 973     printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
 
 983 std::string dst(outBuf);
 
 993 int ParseYesNo(const std::string & str, bool * val)
 
 995 if (0 == strncasecmp(str.c_str(), "yes", 3))
 
1001 if (0 == strncasecmp(str.c_str(), "no", 2))
 
1010 int ParseInt(const std::string & str, int * val)
 
1012 if (str2x<int>(str, *val))
 
1017 int ParseUnsigned(const std::string & str, unsigned * val)
 
1019 if (str2x<unsigned>(str, *val))
 
1024 int ParseIntInRange(const std::string & str, int min, int max, int * val)
 
1026 if (ParseInt(str, val) != 0)
 
1029 if (*val < min || *val > max)
 
1035 int ParseUnsignedInRange(const std::string & str, unsigned min,
 
1036                          unsigned max, unsigned * val)
 
1038 if (ParseUnsigned(str, val) != 0)
 
1041 if (*val < min || *val > max)
 
1047 bool WaitPackets(int sd)
 
1055 tv.tv_usec = 500000;
 
1057 int res = select(sd + 1, &rfds, NULL, NULL, &tv);
 
1058 if (res == -1) // Error
 
1061         printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
 
1065 if (res == 0) // Timeout
 
1071 bool ReadAll(int sd, void * dest, size_t size)
 
1074 char * ptr = static_cast<char *>(dest);
 
1077     if (!WaitPackets(sd))
 
1079     ssize_t res = read(sd, ptr + done, size - done);
 
1089 bool WriteAll(int sd, const void * source, size_t size)
 
1092 const char * ptr = static_cast<const char *>(source);
 
1095     ssize_t res = write(sd, ptr + done, size - done);
 
1103 std::string ToPrintable(const std::string & src)
 
1107     for (size_t i = 0; i < src.size(); ++i)
 
1108         if (std::isprint(src[i]))
 
1111             dest += "\\" + x2str(src[i]);