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]);