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 #include <sys/select.h>
33 // For old and dub systems
35 #include <sys/types.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
66 //-----------------------------------------------------------------------------
67 const char * inet_ntop(int af, const void * src, char * dst, unsigned long length)
69 struct sockaddr_in addr;
72 memcpy(&addr.sin_addr.s_addr, src, sizeof(addr.sin_addr.s_addr));
73 if (WSAAddressToStringA(reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr), 0, dst, &length))
79 //-----------------------------------------------------------------------------
80 int inet_pton(int af, const char * src, void * dst)
82 // Fuck you Microsoft!
83 // Why the hell not to use const char *?
84 size_t slen = strlen(src);
85 char * buf = new char[slen + 1];
86 strncpy(buf, src, slen + 1);
88 struct sockaddr_in addr;
91 addr.sin_addr.s_addr = 0;
92 int length = sizeof(addr);
93 if (WSAStringToAddressA(buf, af, 0, reinterpret_cast<struct sockaddr *>(&addr), &length))
98 memcpy(dst, &addr, sizeof(addr));
103 //-----------------------------------------------------------------------------
104 int strtodouble2(const char * s, double &a)
115 //-----------------------------------------------------------------------------
117 int printfd(const char * __file__, const char * fmt, ...)
119 int printfd(const char *, const char *, ...)
125 time_t t = time(NULL);
129 vsnprintf(buff, sizeof(buff), fmt, vl);
132 printf("%18s > %s > ", __file__, LogDate(t)+11);
138 //-----------------------------------------------------------------------------
139 int strprintf(string * str, const char * fmt, ...)
145 int n = vsnprintf(buff, sizeof(buff), fmt, vl);
152 //-----------------------------------------------------------------------------
153 const char *IntToKMG(long long a, int stat)
155 static int64_t M = 1024*1024;
156 static int64_t G = 1024*1024*1024;
163 sprintf(str, "%Ld", a);
165 sprintf(str, "%lld", a);
169 sprintf(str, "%.2f kb", double(a)/1024.0);
172 sprintf(str, "%.2f Mb", double(a)/(1024.0*1024.0));
177 sprintf(str, "%.2f Gb", double(a)/double(G));
182 sprintf(str, "%.2f Gb", double(a)/double(G));
187 sprintf(str, "%.2f Mb", double(a)/double(M));
192 sprintf(str, "%.2f Mb", double(a)/double(M));
196 sprintf(str, "%.2f kb", double(a)/1024.0);
201 //---------------------------------------------------------------------------
202 unsigned char koi2win[] = {
203 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
204 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
205 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
206 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
207 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
208 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
209 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
210 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
211 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
212 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
213 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
214 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
215 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
216 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
217 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
218 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
219 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
220 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
221 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
222 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
223 0xA0, 0xA1, 0xA2, 0xB8, 0xBA, 0xA5, 0xB3, 0xBF,
224 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB4, 0xAE, 0xAF,
225 0xB0, 0xB1, 0xB2, 0xA8, 0xAA, 0xB5, 0xB2, 0xAF,
226 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xA5, 0xBE, 0xBF,
227 0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
228 0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
229 0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
230 0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
231 0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
232 0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
233 0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
234 0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA};
237 unsigned char win2koi[] = {
238 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
239 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
240 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
241 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
242 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
243 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
244 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
245 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
246 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
247 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
248 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
249 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
250 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
251 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
252 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
253 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
254 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
255 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
256 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
257 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
258 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xBD, 0xA6, 0xA7,
259 0xB3, 0xA9, 0xB4, 0xAB, 0xAC, 0xAD, 0xAE, 0xB7,
260 0xB0, 0xB1, 0xB6, 0xA6, 0xAD, 0xB5, 0xB6, 0xB7,
261 0xA3, 0xB9, 0xA4, 0xBB, 0xBC, 0xBD, 0xBE, 0xA7,
262 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
263 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
264 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
265 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
266 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
267 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
268 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
269 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1};
270 //---------------------------------------------------------------------------
271 void KOIToWin(const char * s1, char * s2, int l)
274 for (int j = 0; j < l; j++)
283 //---------------------------------------------------------------------------
284 void WinToKOI(const char * s1, char * s2, int l)
287 for (int j = 0; j < l; j++)
296 //---------------------------------------------------------------------------
297 void KOIToWin(const string & s1, string * s2)
299 s2->erase(s2->begin(), s2->end());
301 s2->reserve(s1.length());
302 for (int j = 0; j < (int)s1.length(); j++)
305 s2->push_back(koi2win[t]);
308 //---------------------------------------------------------------------------
309 void WinToKOI(const string & s1, string * s2)
311 s2->erase(s2->begin(), s2->end());
313 s2->reserve(s1.length());
314 for (int j = 0; j < (int)s1.length(); j++)
317 s2->push_back(win2koi[t]);
320 //---------------------------------------------------------------------------
321 void Encode12str(string & dst, const 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(c1 + (c2 << 4));
345 //---------------------------------------------------------------------------
346 void Encode12(char * dst, const char * src, size_t srcLen)
348 for (size_t i = 0; i <= srcLen; i++)
350 char c1 = src[i] & 0x0f;
351 char c2 = (src[i] & 0xf0) >> 4;
361 //---------------------------------------------------------------------------
362 void Decode21(char * dst, const char * src)
364 for (size_t i = 0; ; i++)
369 char c1 = src[i * 2];
370 char c2 = src[i * 2 + 1];
375 dst[i] = c1 + (c2 << 4);
377 dst[strlen(src) / 2] = 0;
379 //---------------------------------------------------------------------------
380 int ParseIPString(const char * str, uint32_t * ips, int maxIP)
383 *Function Name:ParseIPString
386 ÓÔÒÏËÁ ÄÌÑ ÒÁÚÂÏÒÁ É ÍÁÓÓÉ× ËÕÄÁ ÚÁÎÏÓÉÔØ ÐÏÌÕÞÅÎÎÙÅ ÁÄÒÅÓÁ
389 îÁ ×ÈÏÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÁ ×ÉÄÁ "ip1,ip2,ip3" ÉÌÉ "*"
390 ÷ ÐÅÒ×ÏÍ ÓÌÕÞÁÅ × ÍÁÓÓÉ× ÚÁÎÏÓÑÔÓÑ ÒÁÚÏÂÒÁÎÎÙÅ ÁÄÒÅÓÁ.
391 åÓÌÉ ÉÈ ÍÅÎØÛÅ MAX_IP?, ÔÏ ÐÏÓÌÅÄÎÉÊ ÁÄÒÅÓ ÂÕÄÅÔ 255.255.255.255
392 åÓÌÉ ÓÔÒÏËÁ * , ÔÏ ÐÅÒ×ÁÙÊ ÁÄÒÅÓ ÂÕÄÅÔ 0.0.0.0, Ô.Å. ÌÀÂÏÊ
394 *Returns: 0 ÅÓÌÉ ×ÓÅ ïë
402 strncpy(p, str, 254);
405 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
407 if (str[0] == '*' && strlen(str) == 1)
413 for (int i = 0; i < maxIP; i++)
415 p1 = strtok(pp, ",\n ");
418 if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
429 if (inet_pton(AF_INET, p1, &in) != 1)
431 //printf("INADDR_NONE\n");
437 /*if (ips[n] == INADDR_NONE)
449 //-----------------------------------------------------------------------------
450 int DaysInCurrentMonth()
452 time_t t = time(NULL);
454 struct tm * lt = localtime(&t);
456 return DaysInMonth(lt->tm_year, lt->tm_mon);
458 //-----------------------------------------------------------------------------
459 int DaysInMonth(unsigned year, unsigned mon)
461 assert(mon < 12 && "Month number should be 0 - 11");
464 case 0: return 31; //jan
466 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
469 case 2: return 31; //mar
470 case 3: return 30; //apr
471 case 4: return 31; //may
472 case 5: return 30; //june
473 case 6: return 31; //jule
474 case 7: return 31; //aug
475 case 8: return 30; //sep
476 case 9: return 31; //oct
477 case 10: return 30; //nov
478 case 11: return 31; //dec
480 return -1; // We will never reach here
482 //-----------------------------------------------------------------------------
486 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
491 return a + (8 - a % 8);
493 //-----------------------------------------------------------------------------
494 /*char * inet_ntostr(unsigned long ip)
496 struct in_addr addr = {ip};
497 return inet_ntoa(addr);
499 //-----------------------------------------------------------------------------
500 std::string inet_ntostring(uint32_t ip)
502 char buf[INET_ADDRSTRLEN + 1];
503 return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
505 //-----------------------------------------------------------------------------
506 uint32_t inet_strington(const std::string & value)
510 if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
515 //-----------------------------------------------------------------------------
516 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
518 char hs1[10], ms1[10], hs2[10], ms2[10];
523 strncpy(ss, str, 48);
525 p1 = strtok(ss, "-");
531 p2 = strtok(NULL, "-");
537 p1 = strtok(s1, ":");
543 p2 = strtok(NULL, ":");
549 p1 = strtok(s2, ":");
555 p2 = strtok(NULL, ":");
561 if (str2x(hs1, h1) != 0)
564 if (str2x(ms1, m1) != 0)
567 if (str2x(hs2, h2) != 0)
570 if (str2x(ms2, m2) != 0)
575 /*//---------------------------------------------------------------------------
578 if (c >= '0' && c <= '9')
582 //-----------------------------------------------------------------------------
585 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
589 //-----------------------------------------------------------------------------
590 const char * LogDate(time_t t)
593 struct tm * tt = localtime(&t);
595 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
597 tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
598 tt->tm_mday < 10 ? "0" : "", tt->tm_mday,
599 tt->tm_hour < 10 ? "0" : "", tt->tm_hour,
600 tt->tm_min < 10 ? "0" : "", tt->tm_min,
601 tt->tm_sec < 10 ? "0" : "", tt->tm_sec);
605 //-----------------------------------------------------------------------------
606 uint32_t CalcMask(uint32_t msk)
608 if (msk >= 32) return 0xFFffFFff;
609 if (msk == 0) return 0;
610 return htonl(0xFFffFFff << (32 - msk));
612 //---------------------------------------------------------------------------
613 void TouchFile(const string & fileName)
615 FILE * f = fopen(fileName.c_str(), "w");
619 //---------------------------------------------------------------------------
621 void EncodeStr(char * str, unsigned long serial, int useHDD)
623 int len = strlen(str);
627 char serial_c[sizeof(serial)];
628 memcpy(serial_c, &serial, sizeof(serial));
630 for (i = 0; i < len; i++)
636 str[i] = str[i]^serial_c[j%sizeof(serial)];
641 for (i = 0; i < 2*len; i++)
645 c1 = (str[i/2] >> 4);
651 c2 = (str[i/2] & 0x0f);
659 //---------------------------------------------------------------------------
660 void DecodeStr(char * str, unsigned long serial, int useHDD)
662 int len = strlen(str);
666 char serial_c[sizeof(serial)];
667 memcpy(serial_c, &serial, sizeof(serial));
669 for (i = 0; i < len; i += 2)
672 c2 = (str[i+1] - 50)<<4;
675 for (i = 0; i < len/2; i++)
678 strdc[i] = strdc[i]^49;
681 strdc[i] = strdc[i]^serial_c[j%sizeof(serial)];
688 //---------------------------------------------------------------------------
690 void SwapBytes(uint16_t & value)
692 value = (value >> 8) |
695 //---------------------------------------------------------------------------
696 void SwapBytes(uint32_t & value)
698 value = (value >> 24) |
699 ((value << 8) & 0x00FF0000L)|
700 ((value >> 8) & 0x0000FF00L)|
703 //---------------------------------------------------------------------------
704 void SwapBytes(uint64_t & value)
706 value = (value >> 56) |
707 ((value << 40) & 0x00FF000000000000LL) |
708 ((value << 24) & 0x0000FF0000000000LL) |
709 ((value << 8) & 0x000000FF00000000LL) |
710 ((value >> 8) & 0x00000000FF000000LL) |
711 ((value >> 24) & 0x0000000000FF0000LL) |
712 ((value >> 40) & 0x000000000000FF00LL) |
715 //---------------------------------------------------------------------------
716 void SwapBytes(int16_t & value)
718 uint16_t temp = value;
722 //---------------------------------------------------------------------------
723 void SwapBytes(int32_t & value)
725 uint32_t temp = value;
729 //---------------------------------------------------------------------------
730 void SwapBytes(int64_t & value)
732 uint64_t temp = value;
736 //---------------------------------------------------------------------------
737 int str2x(const std::string & str, int & x)
739 x = strtol(str.c_str(), NULL, 10);
746 //---------------------------------------------------------------------------
747 int str2x(const std::string & str, unsigned & x)
749 x = strtoul(str.c_str(), NULL, 10);
756 //---------------------------------------------------------------------------
757 int str2x(const std::string & str, long & x)
759 x = strtol(str.c_str(), NULL, 10);
766 //---------------------------------------------------------------------------
767 int str2x(const std::string & str, unsigned long & x)
769 x = strtoul(str.c_str(), NULL, 10);
777 //---------------------------------------------------------------------------
778 int str2x(const std::string & str, long long & x)
780 x = strtoll(str.c_str(), NULL, 10);
787 //---------------------------------------------------------------------------
788 int str2x(const std::string & str, unsigned long long & x)
790 x = strtoull(str.c_str(), NULL, 10);
798 //---------------------------------------------------------------------------
799 const std::string & x2str(unsigned x, std::string & s)
801 return unsigned2str(x, s);
803 //---------------------------------------------------------------------------
804 const std::string & x2str(unsigned long x, std::string & s)
806 return unsigned2str(x, s);
808 //---------------------------------------------------------------------------
809 const std::string & x2str(unsigned long long x, std::string & s)
811 return unsigned2str(x, s);
813 //---------------------------------------------------------------------------
814 std::string & TrimL(std::string & val)
816 size_t pos = val.find_first_not_of(" \t");
817 if (pos == std::string::npos)
819 val.erase(val.begin(), val.end());
827 //---------------------------------------------------------------------------
828 std::string & TrimR(std::string & val)
830 size_t pos = val.find_last_not_of(" \t");
831 if (pos != std::string::npos)
837 //---------------------------------------------------------------------------
838 std::string & Trim(std::string & val)
840 return TrimR(TrimL(val));
842 //---------------------------------------------------------------------------
844 static int is_leap(unsigned y)
847 return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
850 //---------------------------------------------------------------------------
852 time_t stg_timegm(struct tm * brokenTime)
855 static const unsigned ndays[2][12] ={
856 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
857 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
859 for (int i = 70; i < brokenTime->tm_year; ++i)
860 res += is_leap(i) ? 366 : 365;
861 for (int i = 0; i < brokenTime->tm_mon; ++i)
862 res += ndays[is_leap(brokenTime->tm_year)][i];
863 res += brokenTime->tm_mday - 1;
865 res += brokenTime->tm_hour;
867 res += brokenTime->tm_min;
869 res += brokenTime->tm_sec;
873 return timegm(brokenTime);
880 ret = mktime(brokenTime);
887 #endif // HAVE_TIMEGM
890 //---------------------------------------------------------------------------
891 std::string IconvString(const std::string & source,
892 const std::string & from,
893 const std::string & to)
896 return std::string();
898 size_t inBytesLeft = source.length() + 1;
899 size_t outBytesLeft = source.length() * 2 + 1;
901 char * inBuf = new char[inBytesLeft];
902 char * outBuf = new char[outBytesLeft];
904 strncpy(inBuf, source.c_str(), source.length());
906 inBuf[source.length()] = 0;
908 #if defined(FREE_BSD) || defined(FREE_BSD5) || defined(WIN32)
909 const char * srcPos = inBuf;
911 char * srcPos = inBuf;
913 char * dstPos = outBuf;
915 iconv_t handle = iconv_open(to.c_str(),
918 if (handle == iconv_t(-1))
922 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
928 printfd(__FILE__, "IconvString(): iconv_open error\n");
935 size_t res = iconv(handle,
936 &srcPos, &inBytesLeft,
937 &dstPos, &outBytesLeft);
939 if (res == size_t(-1))
941 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
951 std::string dst(outBuf);
961 int ParseYesNo(const std::string & str, bool * val)
963 if (0 == strncasecmp(str.c_str(), "yes", 3))
969 if (0 == strncasecmp(str.c_str(), "no", 2))
978 int ParseInt(const std::string & str, int * val)
980 if (str2x<int>(str, *val))
985 int ParseUnsigned(const string & str, unsigned * val)
987 if (str2x<unsigned>(str, *val))
992 int ParseIntInRange(const string & str, int min, int max, int * val)
994 if (ParseInt(str, val) != 0)
997 if (*val < min || *val > max)
1003 int ParseUnsignedInRange(const string & str, unsigned min,
1004 unsigned max, unsigned * val)
1006 if (ParseUnsigned(str, val) != 0)
1009 if (*val < min || *val > max)
1015 bool WaitPackets(int sd)
1023 tv.tv_usec = 500000;
1025 int res = select(sd + 1, &rfds, NULL, NULL, &tv);
1026 if (res == -1) // Error
1029 printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
1033 if (res == 0) // Timeout