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 $
32 #include <sys/types.h>
39 #include <sys/socket.h>
40 #include <netinet/in.h>
41 #include <arpa/inet.h>
42 #include <sys/select.h>
54 #include "stg/common.h"
56 #ifndef INET_ADDRSTRLEN
57 # define INET_ADDRSTRLEN 16
63 //-----------------------------------------------------------------------------
64 const char * inet_ntop(int af, const void * src, char * dst, unsigned long length)
66 struct sockaddr_in addr;
69 memcpy(&addr.sin_addr.s_addr, src, sizeof(addr.sin_addr.s_addr));
70 if (WSAAddressToStringA(reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr), 0, dst, &length))
76 //-----------------------------------------------------------------------------
77 int inet_pton(int af, const char * src, void * dst)
79 // Fuck you Microsoft!
80 // Why the hell not to use const char *?
81 size_t slen = strlen(src);
82 char * buf = new char[slen + 1];
83 strncpy(buf, src, slen + 1);
85 struct sockaddr_in addr;
88 addr.sin_addr.s_addr = 0;
89 int length = sizeof(addr);
90 if (WSAStringToAddressA(buf, af, 0, reinterpret_cast<struct sockaddr *>(&addr), &length))
95 memcpy(dst, &addr, sizeof(addr));
100 //-----------------------------------------------------------------------------
101 int strtodouble2(const char * s, double &a)
112 //-----------------------------------------------------------------------------
114 int printfd(const char * __file__, const char * fmt, ...)
116 int printfd(const char *, const char *, ...)
122 time_t t = time(NULL);
126 vsnprintf(buff, sizeof(buff), fmt, vl);
129 printf("%18s > %s > ", __file__, LogDate(t)+11);
135 //-----------------------------------------------------------------------------
136 int strprintf(string * str, const char * fmt, ...)
142 int n = vsnprintf(buff, sizeof(buff), fmt, vl);
149 //-----------------------------------------------------------------------------
150 const char *IntToKMG(long long a, int stat)
152 static int64_t M = 1024*1024;
153 static int64_t G = 1024*1024*1024;
160 sprintf(str, "%Ld", a);
162 sprintf(str, "%lld", a);
166 sprintf(str, "%.2f kb", double(a)/1024.0);
169 sprintf(str, "%.2f Mb", double(a)/(1024.0*1024.0));
174 sprintf(str, "%.2f Gb", double(a)/double(G));
179 sprintf(str, "%.2f Gb", double(a)/double(G));
184 sprintf(str, "%.2f Mb", double(a)/double(M));
189 sprintf(str, "%.2f Mb", double(a)/double(M));
193 sprintf(str, "%.2f kb", double(a)/1024.0);
198 //---------------------------------------------------------------------------
199 unsigned char koi2win[] = {
200 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
201 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
202 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
203 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
204 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
205 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
206 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
207 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
208 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
209 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
210 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
211 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
212 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
213 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
214 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
215 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
216 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
217 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
218 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
219 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
220 0xA0, 0xA1, 0xA2, 0xB8, 0xBA, 0xA5, 0xB3, 0xBF,
221 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB4, 0xAE, 0xAF,
222 0xB0, 0xB1, 0xB2, 0xA8, 0xAA, 0xB5, 0xB2, 0xAF,
223 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xA5, 0xBE, 0xBF,
224 0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
225 0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
226 0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
227 0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
228 0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
229 0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
230 0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
231 0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA};
234 unsigned char win2koi[] = {
235 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
236 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
237 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
238 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
239 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
240 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
241 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
242 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
243 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
244 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
245 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
246 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
247 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
248 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
249 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
250 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
251 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
252 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
253 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
254 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
255 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xBD, 0xA6, 0xA7,
256 0xB3, 0xA9, 0xB4, 0xAB, 0xAC, 0xAD, 0xAE, 0xB7,
257 0xB0, 0xB1, 0xB6, 0xA6, 0xAD, 0xB5, 0xB6, 0xB7,
258 0xA3, 0xB9, 0xA4, 0xBB, 0xBC, 0xBD, 0xBE, 0xA7,
259 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
260 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
261 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
262 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
263 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
264 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
265 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
266 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1};
267 //---------------------------------------------------------------------------
268 void KOIToWin(const char * s1, char * s2, int l)
271 for (int j = 0; j < l; j++)
280 //---------------------------------------------------------------------------
281 void WinToKOI(const char * s1, char * s2, int l)
284 for (int j = 0; j < l; j++)
293 //---------------------------------------------------------------------------
294 void KOIToWin(const string & s1, string * s2)
296 s2->erase(s2->begin(), s2->end());
298 s2->reserve(s1.length());
299 for (int j = 0; j < (int)s1.length(); j++)
302 s2->push_back(koi2win[t]);
305 //---------------------------------------------------------------------------
306 void WinToKOI(const string & s1, string * s2)
308 s2->erase(s2->begin(), s2->end());
310 s2->reserve(s1.length());
311 for (int j = 0; j < (int)s1.length(); j++)
314 s2->push_back(win2koi[t]);
317 //---------------------------------------------------------------------------
318 void Encode12str(string & dst, const string & src)
320 dst.erase(dst.begin(), dst.end());
321 for (size_t i = 0; i < src.length(); i++)
323 dst.push_back('a' + (src[i] & 0x0f));
324 dst.push_back('a' + ((src[i] & 0xf0) >> 4));
327 //---------------------------------------------------------------------------
328 void Decode21str(std::string & dst, const std::string & src)
330 dst.erase(dst.begin(), dst.end());
331 for (size_t i = 0; i < src.length() / 2; i++)
333 char c1 = src[i * 2];
334 char c2 = src[i * 2 + 1];
339 dst.push_back(c1 + (c2 << 4));
342 //---------------------------------------------------------------------------
343 void Encode12(char * dst, const char * src, size_t srcLen)
345 for (size_t i = 0; i <= srcLen; i++)
347 char c1 = src[i] & 0x0f;
348 char c2 = (src[i] & 0xf0) >> 4;
358 //---------------------------------------------------------------------------
359 void Decode21(char * dst, const char * src)
361 for (size_t i = 0; ; i++)
366 char c1 = src[i * 2];
367 char c2 = src[i * 2 + 1];
372 dst[i] = c1 + (c2 << 4);
374 dst[strlen(src) / 2] = 0;
376 //---------------------------------------------------------------------------
377 int ParseIPString(const char * str, uint32_t * ips, int maxIP)
380 *Function Name:ParseIPString
383 ÓÔÒÏËÁ ÄÌÑ ÒÁÚÂÏÒÁ É ÍÁÓÓÉ× ËÕÄÁ ÚÁÎÏÓÉÔØ ÐÏÌÕÞÅÎÎÙÅ ÁÄÒÅÓÁ
386 îÁ ×ÈÏÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÁ ×ÉÄÁ "ip1,ip2,ip3" ÉÌÉ "*"
387 ÷ ÐÅÒ×ÏÍ ÓÌÕÞÁÅ × ÍÁÓÓÉ× ÚÁÎÏÓÑÔÓÑ ÒÁÚÏÂÒÁÎÎÙÅ ÁÄÒÅÓÁ.
388 åÓÌÉ ÉÈ ÍÅÎØÛÅ MAX_IP?, ÔÏ ÐÏÓÌÅÄÎÉÊ ÁÄÒÅÓ ÂÕÄÅÔ 255.255.255.255
389 åÓÌÉ ÓÔÒÏËÁ * , ÔÏ ÐÅÒ×ÁÙÊ ÁÄÒÅÓ ÂÕÄÅÔ 0.0.0.0, Ô.Å. ÌÀÂÏÊ
391 *Returns: 0 ÅÓÌÉ ×ÓÅ ïë
399 strncpy(p, str, 254);
402 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
404 if (str[0] == '*' && strlen(str) == 1)
410 for (int i = 0; i < maxIP; i++)
412 p1 = strtok(pp, ",\n ");
415 if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
426 if (inet_pton(AF_INET, p1, &in) != 1)
428 //printf("INADDR_NONE\n");
434 /*if (ips[n] == INADDR_NONE)
446 //-----------------------------------------------------------------------------
447 int DaysInCurrentMonth()
449 time_t t = time(NULL);
451 struct tm * lt = localtime(&t);
453 return DaysInMonth(lt->tm_year, lt->tm_mon);
455 //-----------------------------------------------------------------------------
456 int DaysInMonth(unsigned year, unsigned mon)
458 assert(mon < 12 && "Month number should be 0 - 11");
461 case 0: return 31; //jan
463 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
466 case 2: return 31; //mar
467 case 3: return 30; //apr
468 case 4: return 31; //may
469 case 5: return 30; //june
470 case 6: return 31; //jule
471 case 7: return 31; //aug
472 case 8: return 30; //sep
473 case 9: return 31; //oct
474 case 10: return 30; //nov
475 case 11: return 31; //dec
477 return -1; // We will never reach here
479 //-----------------------------------------------------------------------------
483 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
488 return a + (8 - a % 8);
490 //-----------------------------------------------------------------------------
491 /*char * inet_ntostr(unsigned long ip)
493 struct in_addr addr = {ip};
494 return inet_ntoa(addr);
496 //-----------------------------------------------------------------------------
497 std::string inet_ntostring(uint32_t ip)
499 char buf[INET_ADDRSTRLEN + 1];
500 return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
502 //-----------------------------------------------------------------------------
503 uint32_t inet_strington(const std::string & value)
507 if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
512 //-----------------------------------------------------------------------------
513 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
515 char hs1[10], ms1[10], hs2[10], ms2[10];
520 strncpy(ss, str, 48);
522 p1 = strtok(ss, "-");
528 p2 = strtok(NULL, "-");
534 p1 = strtok(s1, ":");
540 p2 = strtok(NULL, ":");
546 p1 = strtok(s2, ":");
552 p2 = strtok(NULL, ":");
558 if (str2x(hs1, h1) != 0)
561 if (str2x(ms1, m1) != 0)
564 if (str2x(hs2, h2) != 0)
567 if (str2x(ms2, m2) != 0)
572 /*//---------------------------------------------------------------------------
575 if (c >= '0' && c <= '9')
579 //-----------------------------------------------------------------------------
582 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
586 //-----------------------------------------------------------------------------
587 const char * LogDate(time_t t)
590 struct tm * tt = localtime(&t);
592 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
594 tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
595 tt->tm_mday < 10 ? "0" : "", tt->tm_mday,
596 tt->tm_hour < 10 ? "0" : "", tt->tm_hour,
597 tt->tm_min < 10 ? "0" : "", tt->tm_min,
598 tt->tm_sec < 10 ? "0" : "", tt->tm_sec);
602 //-----------------------------------------------------------------------------
603 uint32_t CalcMask(uint32_t msk)
605 if (msk >= 32) return 0xFFffFFff;
606 if (msk == 0) return 0;
607 return htonl(0xFFffFFff << (32 - msk));
609 //---------------------------------------------------------------------------
610 void TouchFile(const string & fileName)
612 FILE * f = fopen(fileName.c_str(), "w");
616 //---------------------------------------------------------------------------
618 void EncodeStr(char * str, unsigned long serial, int useHDD)
620 int len = strlen(str);
624 char serial_c[sizeof(serial)];
625 memcpy(serial_c, &serial, sizeof(serial));
627 for (i = 0; i < len; i++)
633 str[i] = str[i]^serial_c[j%sizeof(serial)];
638 for (i = 0; i < 2*len; i++)
642 c1 = (str[i/2] >> 4);
648 c2 = (str[i/2] & 0x0f);
656 //---------------------------------------------------------------------------
657 void DecodeStr(char * str, unsigned long serial, int useHDD)
659 int len = strlen(str);
663 char serial_c[sizeof(serial)];
664 memcpy(serial_c, &serial, sizeof(serial));
666 for (i = 0; i < len; i += 2)
669 c2 = (str[i+1] - 50)<<4;
672 for (i = 0; i < len/2; i++)
675 strdc[i] = strdc[i]^49;
678 strdc[i] = strdc[i]^serial_c[j%sizeof(serial)];
685 //---------------------------------------------------------------------------
687 void SwapBytes(uint16_t & value)
689 value = (value >> 8) |
692 //---------------------------------------------------------------------------
693 void SwapBytes(uint32_t & value)
695 value = (value >> 24) |
696 ((value << 8) & 0x00FF0000L)|
697 ((value >> 8) & 0x0000FF00L)|
700 //---------------------------------------------------------------------------
701 void SwapBytes(uint64_t & value)
703 value = (value >> 56) |
704 ((value << 40) & 0x00FF000000000000LL) |
705 ((value << 24) & 0x0000FF0000000000LL) |
706 ((value << 8) & 0x000000FF00000000LL) |
707 ((value >> 8) & 0x00000000FF000000LL) |
708 ((value >> 24) & 0x0000000000FF0000LL) |
709 ((value >> 40) & 0x000000000000FF00LL) |
712 //---------------------------------------------------------------------------
713 void SwapBytes(int16_t & value)
715 uint16_t temp = value;
719 //---------------------------------------------------------------------------
720 void SwapBytes(int32_t & value)
722 uint32_t temp = value;
726 //---------------------------------------------------------------------------
727 void SwapBytes(int64_t & value)
729 uint64_t temp = value;
733 //---------------------------------------------------------------------------
734 int str2x(const std::string & str, int & x)
736 x = strtol(str.c_str(), NULL, 10);
743 //---------------------------------------------------------------------------
744 int str2x(const std::string & str, unsigned & x)
746 x = strtoul(str.c_str(), NULL, 10);
753 //---------------------------------------------------------------------------
754 int str2x(const std::string & str, long & x)
756 x = strtol(str.c_str(), NULL, 10);
763 //---------------------------------------------------------------------------
764 int str2x(const std::string & str, unsigned long & x)
766 x = strtoul(str.c_str(), NULL, 10);
774 //---------------------------------------------------------------------------
775 int str2x(const std::string & str, long long & x)
777 x = strtoll(str.c_str(), NULL, 10);
784 //---------------------------------------------------------------------------
785 int str2x(const std::string & str, unsigned long long & x)
787 x = strtoull(str.c_str(), NULL, 10);
795 //---------------------------------------------------------------------------
796 const std::string & x2str(unsigned x, std::string & s)
798 return unsigned2str(x, s);
800 //---------------------------------------------------------------------------
801 const std::string & x2str(unsigned long x, std::string & s)
803 return unsigned2str(x, s);
805 //---------------------------------------------------------------------------
806 const std::string & x2str(unsigned long long x, std::string & s)
808 return unsigned2str(x, s);
810 //---------------------------------------------------------------------------
811 std::string & TrimL(std::string & val)
813 size_t pos = val.find_first_not_of(" \t");
814 if (pos == std::string::npos)
816 val.erase(val.begin(), val.end());
824 //---------------------------------------------------------------------------
825 std::string & TrimR(std::string & val)
827 size_t pos = val.find_last_not_of(" \t");
828 if (pos != std::string::npos)
834 //---------------------------------------------------------------------------
835 std::string & Trim(std::string & val)
837 return TrimR(TrimL(val));
839 //---------------------------------------------------------------------------
841 static int is_leap(unsigned y)
844 return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
847 //---------------------------------------------------------------------------
849 time_t stg_timegm(struct tm * brokenTime)
852 static const unsigned ndays[2][12] ={
853 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
854 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
856 for (int i = 70; i < brokenTime->tm_year; ++i)
857 res += is_leap(i) ? 366 : 365;
858 for (int i = 0; i < brokenTime->tm_mon; ++i)
859 res += ndays[is_leap(brokenTime->tm_year)][i];
860 res += brokenTime->tm_mday - 1;
862 res += brokenTime->tm_hour;
864 res += brokenTime->tm_min;
866 res += brokenTime->tm_sec;
870 return timegm(brokenTime);
877 ret = mktime(brokenTime);
884 #endif // HAVE_TIMEGM
887 //---------------------------------------------------------------------------
888 std::string IconvString(const std::string & source,
889 const std::string & from,
890 const std::string & to)
893 return std::string();
895 size_t inBytesLeft = source.length() + 1;
896 size_t outBytesLeft = source.length() * 2 + 1;
898 char * inBuf = new char[inBytesLeft];
899 char * outBuf = new char[outBytesLeft];
901 strncpy(inBuf, source.c_str(), source.length());
903 inBuf[source.length()] = 0;
905 #if defined(FREE_BSD) || defined(FREE_BSD5) || defined(WIN32)
906 const char * srcPos = inBuf;
908 char * srcPos = inBuf;
910 char * dstPos = outBuf;
912 iconv_t handle = iconv_open(to.c_str(),
915 if (handle == iconv_t(-1))
919 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
925 printfd(__FILE__, "IconvString(): iconv_open error\n");
932 size_t res = iconv(handle,
933 &srcPos, &inBytesLeft,
934 &dstPos, &outBytesLeft);
936 if (res == size_t(-1))
938 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
948 std::string dst(outBuf);
958 int ParseYesNo(const std::string & str, bool * val)
960 if (0 == strncasecmp(str.c_str(), "yes", 3))
966 if (0 == strncasecmp(str.c_str(), "no", 2))
975 int ParseInt(const std::string & str, int * val)
977 if (str2x<int>(str, *val))
982 int ParseUnsigned(const string & str, unsigned * val)
984 if (str2x<unsigned>(str, *val))
989 int ParseIntInRange(const string & str, int min, int max, int * val)
991 if (ParseInt(str, val) != 0)
994 if (*val < min || *val > max)
1000 int ParseUnsignedInRange(const string & str, unsigned min,
1001 unsigned max, unsigned * val)
1003 if (ParseUnsigned(str, val) != 0)
1006 if (*val < min || *val > max)
1012 bool WaitPackets(int sd)
1020 tv.tv_usec = 500000;
1022 int res = select(sd + 1, &rfds, NULL, NULL, &tv);
1023 if (res == -1) // Error
1026 printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
1030 if (res == 0) // Timeout