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)
278 for (int j = 0; j < l; j++)
287 //---------------------------------------------------------------------------
288 void WinToKOI(const char * s1, char * s2, int l)
291 for (int j = 0; j < l; j++)
300 //---------------------------------------------------------------------------
301 void KOIToWin(const std::string & s1, std::string * s2)
303 s2->erase(s2->begin(), s2->end());
305 s2->reserve(s1.length());
306 for (int j = 0; j < (int)s1.length(); j++)
309 s2->push_back(koi2win[t]);
312 //---------------------------------------------------------------------------
313 void WinToKOI(const std::string & s1, std::string * s2)
315 s2->erase(s2->begin(), s2->end());
317 s2->reserve(s1.length());
318 for (int j = 0; j < (int)s1.length(); j++)
321 s2->push_back(win2koi[t]);
324 //---------------------------------------------------------------------------
325 void Encode12str(std::string & dst, const std::string & src)
327 dst.erase(dst.begin(), dst.end());
328 for (size_t i = 0; i < src.length(); i++)
330 dst.push_back('a' + (src[i] & 0x0f));
331 dst.push_back('a' + ((src[i] & 0xf0) >> 4));
334 //---------------------------------------------------------------------------
335 void Decode21str(std::string & dst, const std::string & src)
337 dst.erase(dst.begin(), dst.end());
338 for (size_t i = 0; i < src.length() / 2; i++)
340 char c1 = src[i * 2];
341 char c2 = src[i * 2 + 1];
346 dst.push_back(static_cast<char>(c1 + (c2 << 4)));
349 //---------------------------------------------------------------------------
350 std::string Encode12str(const std::string & src)
353 Encode12str(res, src);
356 //---------------------------------------------------------------------------
357 std::string Decode21str(const std::string & src)
360 Decode21str(res, src);
363 //---------------------------------------------------------------------------
364 void Encode12(char * dst, const char * src, size_t srcLen)
366 for (size_t i = 0; i <= srcLen; i++)
368 char c1 = src[i] & 0x0f;
369 char c2 = (src[i] & 0xf0) >> 4;
379 //---------------------------------------------------------------------------
380 void Decode21(char * dst, const char * src)
382 for (size_t i = 0; ; i++)
387 char c1 = src[i * 2];
388 char c2 = src[i * 2 + 1];
393 dst[i] = static_cast<char>(c1 + (c2 << 4));
395 dst[strlen(src) / 2] = 0;
397 //---------------------------------------------------------------------------
398 int ParseIPString(const char * str, uint32_t * ips, int maxIP)
401 *Function Name:ParseIPString
404 ÓÔÒÏËÁ ÄÌÑ ÒÁÚÂÏÒÁ É ÍÁÓÓÉ× ËÕÄÁ ÚÁÎÏÓÉÔØ ÐÏÌÕÞÅÎÎÙÅ ÁÄÒÅÓÁ
407 îÁ ×ÈÏÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÁ ×ÉÄÁ "ip1,ip2,ip3" ÉÌÉ "*"
408 ÷ ÐÅÒ×ÏÍ ÓÌÕÞÁÅ × ÍÁÓÓÉ× ÚÁÎÏÓÑÔÓÑ ÒÁÚÏÂÒÁÎÎÙÅ ÁÄÒÅÓÁ.
409 åÓÌÉ ÉÈ ÍÅÎØÛÅ MAX_IP?, ÔÏ ÐÏÓÌÅÄÎÉÊ ÁÄÒÅÓ ÂÕÄÅÔ 255.255.255.255
410 åÓÌÉ ÓÔÒÏËÁ * , ÔÏ ÐÅÒ×ÁÙÊ ÁÄÒÅÓ ÂÕÄÅÔ 0.0.0.0, Ô.Å. ÌÀÂÏÊ
412 *Returns: 0 ÅÓÌÉ ×ÓÅ ïë
420 strncpy(p, str, 254);
423 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
425 if (str[0] == '*' && strlen(str) == 1)
431 for (int i = 0; i < maxIP; i++)
433 p1 = strtok(pp, ",\n ");
436 if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
447 if (inet_pton(AF_INET, p1, &in) != 1)
449 //printf("INADDR_NONE\n");
455 /*if (ips[n] == INADDR_NONE)
467 //-----------------------------------------------------------------------------
468 int DaysInCurrentMonth()
470 time_t t = time(NULL);
472 struct tm * lt = localtime(&t);
474 return DaysInMonth(lt->tm_year, lt->tm_mon);
476 //-----------------------------------------------------------------------------
477 int DaysInMonth(unsigned year, unsigned mon)
479 assert(mon < 12 && "Month number should be 0 - 11");
482 case 0: return 31; //jan
484 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
487 case 2: return 31; //mar
488 case 3: return 30; //apr
489 case 4: return 31; //may
490 case 5: return 30; //june
491 case 6: return 31; //jule
492 case 7: return 31; //aug
493 case 8: return 30; //sep
494 case 9: return 31; //oct
495 case 10: return 30; //nov
496 case 11: return 31; //dec
498 return -1; // We will never reach here
500 //-----------------------------------------------------------------------------
504 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
509 return a + (8 - a % 8);
511 //-----------------------------------------------------------------------------
512 /*char * inet_ntostr(unsigned long ip)
514 struct in_addr addr = {ip};
515 return inet_ntoa(addr);
517 //-----------------------------------------------------------------------------
518 std::string inet_ntostring(uint32_t ip)
520 char buf[INET_ADDRSTRLEN + 1];
521 return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
523 //-----------------------------------------------------------------------------
524 uint32_t inet_strington(const std::string & value)
528 if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
533 //-----------------------------------------------------------------------------
534 std::string TimeToString(time_t time)
536 struct tm brokenTime;
538 brokenTime.tm_wday = 0;
539 brokenTime.tm_yday = 0;
540 brokenTime.tm_isdst = 0;
542 gmtime_r(&time, &brokenTime);
545 strftime(buf, 32, "%Y-%m-%d %H:%M:%S", &brokenTime);
549 //-----------------------------------------------------------------------------
550 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
552 char hs1[10], ms1[10], hs2[10], ms2[10];
557 strncpy(ss, str, 48);
559 p1 = strtok(ss, "-");
565 p2 = strtok(NULL, "-");
571 p1 = strtok(s1, ":");
577 p2 = strtok(NULL, ":");
583 p1 = strtok(s2, ":");
589 p2 = strtok(NULL, ":");
595 if (str2x(hs1, h1) != 0)
598 if (str2x(ms1, m1) != 0)
601 if (str2x(hs2, h2) != 0)
604 if (str2x(ms2, m2) != 0)
609 /*//---------------------------------------------------------------------------
612 if (c >= '0' && c <= '9')
616 //-----------------------------------------------------------------------------
619 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
623 //-----------------------------------------------------------------------------
624 const char * LogDate(time_t t)
627 struct tm * tt = localtime(&t);
629 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
631 tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
632 tt->tm_mday < 10 ? "0" : "", tt->tm_mday,
633 tt->tm_hour < 10 ? "0" : "", tt->tm_hour,
634 tt->tm_min < 10 ? "0" : "", tt->tm_min,
635 tt->tm_sec < 10 ? "0" : "", tt->tm_sec);
639 //-----------------------------------------------------------------------------
640 uint32_t CalcMask(uint32_t msk)
642 if (msk >= 32) return 0xFFffFFff;
643 if (msk == 0) return 0;
644 return htonl(0xFFffFFff << (32 - msk));
646 //---------------------------------------------------------------------------
647 void TouchFile(const std::string & fileName)
649 FILE * f = fopen(fileName.c_str(), "w");
653 //---------------------------------------------------------------------------
655 void EncodeStr(char * str, unsigned long serial, int useHDD)
657 int len = strlen(str);
661 char serial_c[sizeof(serial)];
662 memcpy(serial_c, &serial, sizeof(serial));
664 for (i = 0; i < len; i++)
670 str[i] = str[i]^serial_c[j%sizeof(serial)];
675 for (i = 0; i < 2*len; i++)
679 c1 = (str[i/2] >> 4);
685 c2 = (str[i/2] & 0x0f);
693 //---------------------------------------------------------------------------
694 void DecodeStr(char * str, unsigned long serial, int useHDD)
696 int len = strlen(str);
700 char serial_c[sizeof(serial)];
701 memcpy(serial_c, &serial, sizeof(serial));
703 for (i = 0; i < len; i += 2)
706 c2 = (str[i+1] - 50)<<4;
709 for (i = 0; i < len/2; i++)
712 strdc[i] = strdc[i]^49;
715 strdc[i] = strdc[i]^serial_c[j%sizeof(serial)];
722 //---------------------------------------------------------------------------
724 void SwapBytes(uint16_t & value)
726 value = static_cast<uint16_t>((value >> 8) |
729 //---------------------------------------------------------------------------
730 void SwapBytes(uint32_t & value)
732 value = static_cast<uint32_t>((value >> 24) |
733 ((value << 8) & 0x00FF0000L) |
734 ((value >> 8) & 0x0000FF00L) |
737 //---------------------------------------------------------------------------
738 void SwapBytes(uint64_t & value)
740 value = static_cast<uint64_t>((value >> 56) |
741 ((value << 40) & 0x00FF000000000000LL) |
742 ((value << 24) & 0x0000FF0000000000LL) |
743 ((value << 8) & 0x000000FF00000000LL) |
744 ((value >> 8) & 0x00000000FF000000LL) |
745 ((value >> 24) & 0x0000000000FF0000LL) |
746 ((value >> 40) & 0x000000000000FF00LL) |
749 //---------------------------------------------------------------------------
750 void SwapBytes(int16_t & value)
752 uint16_t temp = value;
756 //---------------------------------------------------------------------------
757 void SwapBytes(int32_t & value)
759 uint32_t temp = value;
763 //---------------------------------------------------------------------------
764 void SwapBytes(int64_t & value)
766 uint64_t temp = value;
770 //---------------------------------------------------------------------------
771 int str2x(const std::string & str, int32_t & x)
773 x = static_cast<int32_t>(strtol(str.c_str(), NULL, 10));
780 //---------------------------------------------------------------------------
781 int str2x(const std::string & str, uint32_t & x)
783 x = static_cast<uint32_t>(strtoul(str.c_str(), NULL, 10));
791 //---------------------------------------------------------------------------
792 int str2x(const std::string & str, int64_t & x)
794 x = strtoll(str.c_str(), NULL, 10);
801 //---------------------------------------------------------------------------
802 int str2x(const std::string & str, uint64_t & x)
804 x = strtoull(str.c_str(), NULL, 10);
812 //---------------------------------------------------------------------------
813 const std::string & x2str(uint32_t x, std::string & s)
815 return unsigned2str(x, s);
817 //---------------------------------------------------------------------------
818 const std::string & x2str(uint64_t x, std::string & s)
820 return unsigned2str(x, s);
822 //---------------------------------------------------------------------------
823 const std::string & x2str(double x, std::string & s)
826 snprintf(buf, sizeof(buf), "%f", x);
830 //---------------------------------------------------------------------------
831 std::string & TrimL(std::string & val)
833 size_t pos = val.find_first_not_of(" \t");
834 if (pos == std::string::npos)
836 val.erase(val.begin(), val.end());
844 //---------------------------------------------------------------------------
845 std::string & TrimR(std::string & val)
847 size_t pos = val.find_last_not_of(" \t");
848 if (pos != std::string::npos)
854 //---------------------------------------------------------------------------
855 std::string & Trim(std::string & val)
857 return TrimR(TrimL(val));
859 //---------------------------------------------------------------------------
860 std::string Trim(const std::string & val)
862 std::string res(val);
863 return TrimR(TrimL(res));
865 //---------------------------------------------------------------------------
866 std::string ToLower(const std::string & value)
869 for (std::string::size_type pos = 0; pos < value.length(); ++pos)
870 res += tolower(value[pos]);
873 //---------------------------------------------------------------------------
874 std::string ToUpper(const std::string & value)
877 for (std::string::size_type pos = 0; pos < value.length(); ++pos)
878 res += toupper(value[pos]);
881 //---------------------------------------------------------------------------
883 static int is_leap(unsigned y)
886 return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
889 //---------------------------------------------------------------------------
891 time_t stg_timegm(struct tm * brokenTime)
894 static const unsigned ndays[2][12] ={
895 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
896 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
898 for (int i = 70; i < brokenTime->tm_year; ++i)
899 res += is_leap(i) ? 366 : 365;
900 for (int i = 0; i < brokenTime->tm_mon; ++i)
901 res += ndays[is_leap(brokenTime->tm_year)][i];
902 res += brokenTime->tm_mday - 1;
904 res += brokenTime->tm_hour;
906 res += brokenTime->tm_min;
908 res += brokenTime->tm_sec;
912 return timegm(brokenTime);
919 ret = mktime(brokenTime);
926 #endif // HAVE_TIMEGM
929 //---------------------------------------------------------------------------
930 std::string IconvString(const std::string & source,
931 const std::string & from,
932 const std::string & to)
935 return std::string();
937 size_t inBytesLeft = source.length() + 1;
938 size_t outBytesLeft = source.length() * 2 + 1;
940 char * inBuf = new char[inBytesLeft];
941 char * outBuf = new char[outBytesLeft];
943 strncpy(inBuf, source.c_str(), source.length());
945 inBuf[source.length()] = 0;
947 #if defined(FREE_BSD) || defined(FREE_BSD5) || defined(WIN32)
948 const char * srcPos = inBuf;
950 char * srcPos = inBuf;
952 char * dstPos = outBuf;
954 iconv_t handle = iconv_open(to.c_str(),
957 if (handle == iconv_t(-1))
961 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
967 printfd(__FILE__, "IconvString(): iconv_open error\n");
974 size_t res = iconv(handle,
975 &srcPos, &inBytesLeft,
976 &dstPos, &outBytesLeft);
978 if (res == size_t(-1))
980 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
990 std::string dst(outBuf);
1000 int ParseYesNo(const std::string & str, bool * val)
1002 if (0 == strncasecmp(str.c_str(), "yes", 3))
1008 if (0 == strncasecmp(str.c_str(), "no", 2))
1017 int ParseInt(const std::string & str, int * val)
1019 if (str2x<int>(str, *val))
1024 int ParseUnsigned(const std::string & str, unsigned * val)
1026 if (str2x<unsigned>(str, *val))
1031 int ParseIntInRange(const std::string & str, int min, int max, int * val)
1033 if (ParseInt(str, val) != 0)
1036 if (*val < min || *val > max)
1042 int ParseUnsignedInRange(const std::string & str, unsigned min,
1043 unsigned max, unsigned * val)
1045 if (ParseUnsigned(str, val) != 0)
1048 if (*val < min || *val > max)
1054 bool WaitPackets(int sd)
1062 tv.tv_usec = 500000;
1064 int res = select(sd + 1, &rfds, NULL, NULL, &tv);
1065 if (res == -1) // Error
1068 printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
1072 if (res == 0) // Timeout