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 void Encode12(char * dst, const char * src, size_t srcLen)
352 for (size_t i = 0; i <= srcLen; i++)
354 char c1 = src[i] & 0x0f;
355 char c2 = (src[i] & 0xf0) >> 4;
365 //---------------------------------------------------------------------------
366 void Decode21(char * dst, const char * src)
368 for (size_t i = 0; ; i++)
373 char c1 = src[i * 2];
374 char c2 = src[i * 2 + 1];
379 dst[i] = static_cast<char>(c1 + (c2 << 4));
381 dst[strlen(src) / 2] = 0;
383 //---------------------------------------------------------------------------
384 int ParseIPString(const char * str, uint32_t * ips, int maxIP)
387 *Function Name:ParseIPString
390 ÓÔÒÏËÁ ÄÌÑ ÒÁÚÂÏÒÁ É ÍÁÓÓÉ× ËÕÄÁ ÚÁÎÏÓÉÔØ ÐÏÌÕÞÅÎÎÙÅ ÁÄÒÅÓÁ
393 îÁ ×ÈÏÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÁ ×ÉÄÁ "ip1,ip2,ip3" ÉÌÉ "*"
394 ÷ ÐÅÒ×ÏÍ ÓÌÕÞÁÅ × ÍÁÓÓÉ× ÚÁÎÏÓÑÔÓÑ ÒÁÚÏÂÒÁÎÎÙÅ ÁÄÒÅÓÁ.
395 åÓÌÉ ÉÈ ÍÅÎØÛÅ MAX_IP?, ÔÏ ÐÏÓÌÅÄÎÉÊ ÁÄÒÅÓ ÂÕÄÅÔ 255.255.255.255
396 åÓÌÉ ÓÔÒÏËÁ * , ÔÏ ÐÅÒ×ÁÙÊ ÁÄÒÅÓ ÂÕÄÅÔ 0.0.0.0, Ô.Å. ÌÀÂÏÊ
398 *Returns: 0 ÅÓÌÉ ×ÓÅ ïë
406 strncpy(p, str, 254);
409 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
411 if (str[0] == '*' && strlen(str) == 1)
417 for (int i = 0; i < maxIP; i++)
419 p1 = strtok(pp, ",\n ");
422 if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
433 if (inet_pton(AF_INET, p1, &in) != 1)
435 //printf("INADDR_NONE\n");
441 /*if (ips[n] == INADDR_NONE)
453 //-----------------------------------------------------------------------------
454 int DaysInCurrentMonth()
456 time_t t = time(NULL);
458 struct tm * lt = localtime(&t);
460 return DaysInMonth(lt->tm_year, lt->tm_mon);
462 //-----------------------------------------------------------------------------
463 int DaysInMonth(unsigned year, unsigned mon)
465 assert(mon < 12 && "Month number should be 0 - 11");
468 case 0: return 31; //jan
470 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
473 case 2: return 31; //mar
474 case 3: return 30; //apr
475 case 4: return 31; //may
476 case 5: return 30; //june
477 case 6: return 31; //jule
478 case 7: return 31; //aug
479 case 8: return 30; //sep
480 case 9: return 31; //oct
481 case 10: return 30; //nov
482 case 11: return 31; //dec
484 return -1; // We will never reach here
486 //-----------------------------------------------------------------------------
490 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
495 return a + (8 - a % 8);
497 //-----------------------------------------------------------------------------
498 /*char * inet_ntostr(unsigned long ip)
500 struct in_addr addr = {ip};
501 return inet_ntoa(addr);
503 //-----------------------------------------------------------------------------
504 std::string inet_ntostring(uint32_t ip)
506 char buf[INET_ADDRSTRLEN + 1];
507 return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
509 //-----------------------------------------------------------------------------
510 uint32_t inet_strington(const std::string & value)
514 if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
519 //-----------------------------------------------------------------------------
520 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
522 char hs1[10], ms1[10], hs2[10], ms2[10];
527 strncpy(ss, str, 48);
529 p1 = strtok(ss, "-");
535 p2 = strtok(NULL, "-");
541 p1 = strtok(s1, ":");
547 p2 = strtok(NULL, ":");
553 p1 = strtok(s2, ":");
559 p2 = strtok(NULL, ":");
565 if (str2x(hs1, h1) != 0)
568 if (str2x(ms1, m1) != 0)
571 if (str2x(hs2, h2) != 0)
574 if (str2x(ms2, m2) != 0)
579 /*//---------------------------------------------------------------------------
582 if (c >= '0' && c <= '9')
586 //-----------------------------------------------------------------------------
589 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
593 //-----------------------------------------------------------------------------
594 const char * LogDate(time_t t)
597 struct tm * tt = localtime(&t);
599 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
601 tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
602 tt->tm_mday < 10 ? "0" : "", tt->tm_mday,
603 tt->tm_hour < 10 ? "0" : "", tt->tm_hour,
604 tt->tm_min < 10 ? "0" : "", tt->tm_min,
605 tt->tm_sec < 10 ? "0" : "", tt->tm_sec);
609 //-----------------------------------------------------------------------------
610 uint32_t CalcMask(uint32_t msk)
612 if (msk >= 32) return 0xFFffFFff;
613 if (msk == 0) return 0;
614 return htonl(0xFFffFFff << (32 - msk));
616 //---------------------------------------------------------------------------
617 void TouchFile(const std::string & fileName)
619 FILE * f = fopen(fileName.c_str(), "w");
623 //---------------------------------------------------------------------------
625 void EncodeStr(char * str, unsigned long serial, int useHDD)
627 int len = strlen(str);
631 char serial_c[sizeof(serial)];
632 memcpy(serial_c, &serial, sizeof(serial));
634 for (i = 0; i < len; i++)
640 str[i] = str[i]^serial_c[j%sizeof(serial)];
645 for (i = 0; i < 2*len; i++)
649 c1 = (str[i/2] >> 4);
655 c2 = (str[i/2] & 0x0f);
663 //---------------------------------------------------------------------------
664 void DecodeStr(char * str, unsigned long serial, int useHDD)
666 int len = strlen(str);
670 char serial_c[sizeof(serial)];
671 memcpy(serial_c, &serial, sizeof(serial));
673 for (i = 0; i < len; i += 2)
676 c2 = (str[i+1] - 50)<<4;
679 for (i = 0; i < len/2; i++)
682 strdc[i] = strdc[i]^49;
685 strdc[i] = strdc[i]^serial_c[j%sizeof(serial)];
692 //---------------------------------------------------------------------------
694 void SwapBytes(uint16_t & value)
696 value = static_cast<uint16_t>((value >> 8) |
699 //---------------------------------------------------------------------------
700 void SwapBytes(uint32_t & value)
702 value = static_cast<uint32_t>((value >> 24) |
703 ((value << 8) & 0x00FF0000L) |
704 ((value >> 8) & 0x0000FF00L) |
707 //---------------------------------------------------------------------------
708 void SwapBytes(uint64_t & value)
710 value = static_cast<uint64_t>((value >> 56) |
711 ((value << 40) & 0x00FF000000000000LL) |
712 ((value << 24) & 0x0000FF0000000000LL) |
713 ((value << 8) & 0x000000FF00000000LL) |
714 ((value >> 8) & 0x00000000FF000000LL) |
715 ((value >> 24) & 0x0000000000FF0000LL) |
716 ((value >> 40) & 0x000000000000FF00LL) |
719 //---------------------------------------------------------------------------
720 void SwapBytes(int16_t & value)
722 uint16_t temp = value;
726 //---------------------------------------------------------------------------
727 void SwapBytes(int32_t & value)
729 uint32_t temp = value;
733 //---------------------------------------------------------------------------
734 void SwapBytes(int64_t & value)
736 uint64_t temp = value;
740 //---------------------------------------------------------------------------
741 int str2x(const std::string & str, int32_t & x)
743 x = static_cast<int32_t>(strtol(str.c_str(), NULL, 10));
750 //---------------------------------------------------------------------------
751 int str2x(const std::string & str, uint32_t & x)
753 x = static_cast<uint32_t>(strtoul(str.c_str(), NULL, 10));
761 //---------------------------------------------------------------------------
762 int str2x(const std::string & str, int64_t & x)
764 x = strtoll(str.c_str(), NULL, 10);
771 //---------------------------------------------------------------------------
772 int str2x(const std::string & str, uint64_t & x)
774 x = strtoull(str.c_str(), NULL, 10);
782 //---------------------------------------------------------------------------
783 const std::string & x2str(uint32_t x, std::string & s)
785 return unsigned2str(x, s);
787 //---------------------------------------------------------------------------
788 const std::string & x2str(uint64_t x, std::string & s)
790 return unsigned2str(x, s);
792 //---------------------------------------------------------------------------
793 const std::string & x2str(double x, std::string & s)
796 snprintf(buf, sizeof(buf), "%f", x);
800 //---------------------------------------------------------------------------
801 std::string & TrimL(std::string & val)
803 size_t pos = val.find_first_not_of(" \t");
804 if (pos == std::string::npos)
806 val.erase(val.begin(), val.end());
814 //---------------------------------------------------------------------------
815 std::string & TrimR(std::string & val)
817 size_t pos = val.find_last_not_of(" \t");
818 if (pos != std::string::npos)
824 //---------------------------------------------------------------------------
825 std::string & Trim(std::string & val)
827 return TrimR(TrimL(val));
829 //---------------------------------------------------------------------------
831 static int is_leap(unsigned y)
834 return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
837 //---------------------------------------------------------------------------
839 time_t stg_timegm(struct tm * brokenTime)
842 static const unsigned ndays[2][12] ={
843 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
844 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
846 for (int i = 70; i < brokenTime->tm_year; ++i)
847 res += is_leap(i) ? 366 : 365;
848 for (int i = 0; i < brokenTime->tm_mon; ++i)
849 res += ndays[is_leap(brokenTime->tm_year)][i];
850 res += brokenTime->tm_mday - 1;
852 res += brokenTime->tm_hour;
854 res += brokenTime->tm_min;
856 res += brokenTime->tm_sec;
860 return timegm(brokenTime);
867 ret = mktime(brokenTime);
874 #endif // HAVE_TIMEGM
877 //---------------------------------------------------------------------------
878 std::string IconvString(const std::string & source,
879 const std::string & from,
880 const std::string & to)
883 return std::string();
885 size_t inBytesLeft = source.length() + 1;
886 size_t outBytesLeft = source.length() * 2 + 1;
888 char * inBuf = new char[inBytesLeft];
889 char * outBuf = new char[outBytesLeft];
891 strncpy(inBuf, source.c_str(), source.length());
893 inBuf[source.length()] = 0;
895 #if defined(FREE_BSD) || defined(FREE_BSD5) || defined(WIN32)
896 const char * srcPos = inBuf;
898 char * srcPos = inBuf;
900 char * dstPos = outBuf;
902 iconv_t handle = iconv_open(to.c_str(),
905 if (handle == iconv_t(-1))
909 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
915 printfd(__FILE__, "IconvString(): iconv_open error\n");
922 size_t res = iconv(handle,
923 &srcPos, &inBytesLeft,
924 &dstPos, &outBytesLeft);
926 if (res == size_t(-1))
928 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
938 std::string dst(outBuf);
948 int ParseYesNo(const std::string & str, bool * val)
950 if (0 == strncasecmp(str.c_str(), "yes", 3))
956 if (0 == strncasecmp(str.c_str(), "no", 2))
965 int ParseInt(const std::string & str, int * val)
967 if (str2x<int>(str, *val))
972 int ParseUnsigned(const std::string & str, unsigned * val)
974 if (str2x<unsigned>(str, *val))
979 int ParseIntInRange(const std::string & str, int min, int max, int * val)
981 if (ParseInt(str, val) != 0)
984 if (*val < min || *val > max)
990 int ParseUnsignedInRange(const std::string & str, unsigned min,
991 unsigned max, unsigned * val)
993 if (ParseUnsigned(str, val) != 0)
996 if (*val < min || *val > max)
1002 bool WaitPackets(int sd)
1010 tv.tv_usec = 500000;
1012 int res = select(sd + 1, &rfds, NULL, NULL, &tv);
1013 if (res == -1) // Error
1016 printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
1020 if (res == 0) // Timeout