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 std::string & TrimL(std::string & val)
795 size_t pos = val.find_first_not_of(" \t");
796 if (pos == std::string::npos)
798 val.erase(val.begin(), val.end());
806 //---------------------------------------------------------------------------
807 std::string & TrimR(std::string & val)
809 size_t pos = val.find_last_not_of(" \t");
810 if (pos != std::string::npos)
816 //---------------------------------------------------------------------------
817 std::string & Trim(std::string & val)
819 return TrimR(TrimL(val));
821 //---------------------------------------------------------------------------
822 std::string ToLower(const std::string & value)
825 for (std::string::size_type pos = 0; pos < value.length(); ++pos)
826 res += tolower(value[pos]);
829 //---------------------------------------------------------------------------
830 std::string ToUpper(const std::string & value)
833 for (std::string::size_type pos = 0; pos < value.length(); ++pos)
834 res += toupper(value[pos]);
837 //---------------------------------------------------------------------------
839 static int is_leap(unsigned y)
842 return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
845 //---------------------------------------------------------------------------
847 time_t stg_timegm(struct tm * brokenTime)
850 static const unsigned ndays[2][12] ={
851 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
852 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
854 for (int i = 70; i < brokenTime->tm_year; ++i)
855 res += is_leap(i) ? 366 : 365;
856 for (int i = 0; i < brokenTime->tm_mon; ++i)
857 res += ndays[is_leap(brokenTime->tm_year)][i];
858 res += brokenTime->tm_mday - 1;
860 res += brokenTime->tm_hour;
862 res += brokenTime->tm_min;
864 res += brokenTime->tm_sec;
868 return timegm(brokenTime);
875 ret = mktime(brokenTime);
882 #endif // HAVE_TIMEGM
885 //---------------------------------------------------------------------------
886 std::string IconvString(const std::string & source,
887 const std::string & from,
888 const std::string & to)
891 return std::string();
893 size_t inBytesLeft = source.length() + 1;
894 size_t outBytesLeft = source.length() * 2 + 1;
896 char * inBuf = new char[inBytesLeft];
897 char * outBuf = new char[outBytesLeft];
899 strncpy(inBuf, source.c_str(), source.length());
901 inBuf[source.length()] = 0;
903 #if defined(FREE_BSD) || defined(FREE_BSD5) || defined(WIN32)
904 const char * srcPos = inBuf;
906 char * srcPos = inBuf;
908 char * dstPos = outBuf;
910 iconv_t handle = iconv_open(to.c_str(),
913 if (handle == iconv_t(-1))
917 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
923 printfd(__FILE__, "IconvString(): iconv_open error\n");
930 size_t res = iconv(handle,
931 &srcPos, &inBytesLeft,
932 &dstPos, &outBytesLeft);
934 if (res == size_t(-1))
936 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
946 std::string dst(outBuf);
956 int ParseYesNo(const std::string & str, bool * val)
958 if (0 == strncasecmp(str.c_str(), "yes", 3))
964 if (0 == strncasecmp(str.c_str(), "no", 2))
973 int ParseInt(const std::string & str, int * val)
975 if (str2x<int>(str, *val))
980 int ParseUnsigned(const std::string & str, unsigned * val)
982 if (str2x<unsigned>(str, *val))
987 int ParseIntInRange(const std::string & str, int min, int max, int * val)
989 if (ParseInt(str, val) != 0)
992 if (*val < min || *val > max)
998 int ParseUnsignedInRange(const std::string & str, unsigned min,
999 unsigned max, unsigned * val)
1001 if (ParseUnsigned(str, val) != 0)
1004 if (*val < min || *val > max)
1010 bool WaitPackets(int sd)
1018 tv.tv_usec = 500000;
1020 int res = select(sd + 1, &rfds, NULL, NULL, &tv);
1021 if (res == -1) // Error
1024 printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
1028 if (res == 0) // Timeout