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/stat.h>
44 #include <sys/types.h>
48 #include <sysutils.hpp>
52 #include <netinet/in.h>
53 #include <arpa/inet.h>
54 #include <sys/socket.h>
58 #include <sys/types.h>
64 #include <sys/socket.h>
65 #include <netinet/in.h>
66 #include <arpa/inet.h>
67 #include <sys/select.h>
81 #ifndef INET_ADDRSTRLEN
82 # define INET_ADDRSTRLEN 16
88 //-----------------------------------------------------------------------------
89 const char * inet_ntop(int af, const void * src, char * dst, unsigned long length)
91 struct sockaddr_in addr;
94 memcpy(&addr.sin_addr.s_addr, src, sizeof(addr.sin_addr.s_addr));
95 if (WSAAddressToStringA(reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr), 0, dst, &length))
101 //-----------------------------------------------------------------------------
102 int inet_pton(int af, const char * src, void * dst)
104 // Fuck you Microsoft!
105 // Why the hell not to use const char *?
106 size_t slen = strlen(src);
107 char * buf = new char[slen + 1];
108 strncpy(buf, src, slen + 1);
110 struct sockaddr_in addr;
111 addr.sin_family = af;
113 addr.sin_addr.s_addr = 0;
114 int length = sizeof(addr);
115 if (WSAStringToAddressA(buf, af, 0, reinterpret_cast<struct sockaddr *>(&addr), &length))
120 memcpy(dst, &addr, sizeof(addr));
125 //-----------------------------------------------------------------------------
126 int strtodouble2(const char * s, double &a)
137 //-----------------------------------------------------------------------------
139 int printfd(const char * __file__, const char * fmt, ...)
141 int printfd(const char *, const char *, ...)
147 time_t t = time(NULL);
151 vsnprintf(buff, sizeof(buff), fmt, vl);
154 printf("%18s > %s > ", __file__, LogDate(t)+11);
160 //-----------------------------------------------------------------------------
161 int strprintf(string * str, const char * fmt, ...)
167 int n = vsnprintf(buff, sizeof(buff), fmt, vl);
174 //-----------------------------------------------------------------------------
175 const char *IntToKMG(long long a, int stat)
177 static int64_t M = 1024*1024;
178 static int64_t G = 1024*1024*1024;
185 sprintf(str, "%Ld", a);
187 sprintf(str, "%lld", a);
191 sprintf(str, "%.2f kb", double(a)/1024.0);
194 sprintf(str, "%.2f Mb", double(a)/(1024.0*1024.0));
199 sprintf(str, "%.2f Gb", double(a)/double(G));
204 sprintf(str, "%.2f Gb", double(a)/double(G));
209 sprintf(str, "%.2f Mb", double(a)/double(M));
214 sprintf(str, "%.2f Mb", double(a)/double(M));
218 sprintf(str, "%.2f kb", double(a)/1024.0);
223 //---------------------------------------------------------------------------
224 unsigned char koi2win[] = {
225 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
226 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
227 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
228 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
229 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
230 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
231 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
232 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
233 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
234 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
235 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
236 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
237 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
238 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
239 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
240 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
241 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
242 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
243 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
244 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
245 0xA0, 0xA1, 0xA2, 0xB8, 0xBA, 0xA5, 0xB3, 0xBF,
246 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB4, 0xAE, 0xAF,
247 0xB0, 0xB1, 0xB2, 0xA8, 0xAA, 0xB5, 0xB2, 0xAF,
248 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xA5, 0xBE, 0xBF,
249 0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
250 0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
251 0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
252 0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
253 0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
254 0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
255 0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
256 0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA};
259 unsigned char win2koi[] = {
260 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
261 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
262 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
263 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
264 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
265 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
266 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
267 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
268 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
269 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
270 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
271 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
272 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
273 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
274 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
275 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
276 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
277 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
278 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
279 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
280 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xBD, 0xA6, 0xA7,
281 0xB3, 0xA9, 0xB4, 0xAB, 0xAC, 0xAD, 0xAE, 0xB7,
282 0xB0, 0xB1, 0xB6, 0xA6, 0xAD, 0xB5, 0xB6, 0xB7,
283 0xA3, 0xB9, 0xA4, 0xBB, 0xBC, 0xBD, 0xBE, 0xA7,
284 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
285 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
286 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
287 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
288 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
289 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
290 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
291 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1};
292 //---------------------------------------------------------------------------
293 void KOIToWin(const char * s1, char * s2, int l)
296 for (int j = 0; j < l; j++)
305 //---------------------------------------------------------------------------
306 void WinToKOI(const char * s1, char * s2, int l)
309 for (int j = 0; j < l; j++)
318 //---------------------------------------------------------------------------
319 void KOIToWin(const string & s1, string * s2)
321 s2->erase(s2->begin(), s2->end());
323 s2->reserve(s1.length());
324 for (int j = 0; j < (int)s1.length(); j++)
327 s2->push_back(koi2win[t]);
330 //---------------------------------------------------------------------------
331 void WinToKOI(const string & s1, string * s2)
333 s2->erase(s2->begin(), s2->end());
335 s2->reserve(s1.length());
336 for (int j = 0; j < (int)s1.length(); j++)
339 s2->push_back(win2koi[t]);
342 //---------------------------------------------------------------------------
343 void Encode12str(string & dst, const string & src)
345 dst.erase(dst.begin(), dst.end());
346 for (size_t i = 0; i < src.length(); i++)
348 dst.push_back('a' + (src[i] & 0x0f));
349 dst.push_back('a' + ((src[i] & 0xf0) >> 4));
352 //---------------------------------------------------------------------------
353 void Decode21str(std::string & dst, const std::string & src)
355 dst.erase(dst.begin(), dst.end());
356 for (size_t i = 0; i < src.length() / 2; i++)
358 char c1 = src[i * 2];
359 char c2 = src[i * 2 + 1];
364 dst.push_back(c1 + (c2 << 4));
367 //---------------------------------------------------------------------------
368 void Encode12(char * dst, const char * src, size_t srcLen)
370 for (size_t i = 0; i <= srcLen; i++)
372 char c1 = src[i] & 0x0f;
373 char c2 = (src[i] & 0xf0) >> 4;
383 //---------------------------------------------------------------------------
384 void Decode21(char * dst, const char * src)
386 for (size_t i = 0; ; i++)
391 char c1 = src[i * 2];
392 char c2 = src[i * 2 + 1];
397 dst[i] = c1 + (c2 << 4);
399 dst[strlen(src) / 2] = 0;
401 //---------------------------------------------------------------------------
402 int ParseIPString(const char * str, uint32_t * ips, int maxIP)
405 *Function Name:ParseIPString
408 ÓÔÒÏËÁ ÄÌÑ ÒÁÚÂÏÒÁ É ÍÁÓÓÉ× ËÕÄÁ ÚÁÎÏÓÉÔØ ÐÏÌÕÞÅÎÎÙÅ ÁÄÒÅÓÁ
411 îÁ ×ÈÏÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÁ ×ÉÄÁ "ip1,ip2,ip3" ÉÌÉ "*"
412 ÷ ÐÅÒ×ÏÍ ÓÌÕÞÁÅ × ÍÁÓÓÉ× ÚÁÎÏÓÑÔÓÑ ÒÁÚÏÂÒÁÎÎÙÅ ÁÄÒÅÓÁ.
413 åÓÌÉ ÉÈ ÍÅÎØÛÅ MAX_IP?, ÔÏ ÐÏÓÌÅÄÎÉÊ ÁÄÒÅÓ ÂÕÄÅÔ 255.255.255.255
414 åÓÌÉ ÓÔÒÏËÁ * , ÔÏ ÐÅÒ×ÁÙÊ ÁÄÒÅÓ ÂÕÄÅÔ 0.0.0.0, Ô.Å. ÌÀÂÏÊ
416 *Returns: 0 ÅÓÌÉ ×ÓÅ ïë
424 strncpy(p, str, 254);
427 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
429 if (str[0] == '*' && strlen(str) == 1)
435 for (int i = 0; i < maxIP; i++)
437 p1 = strtok(pp, ",\n ");
440 if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
451 if (inet_pton(AF_INET, p1, &in) != 1)
453 //printf("INADDR_NONE\n");
459 /*if (ips[n] == INADDR_NONE)
471 //-----------------------------------------------------------------------------
472 int DaysInCurrentMonth()
474 time_t t = time(NULL);
476 struct tm * lt = localtime(&t);
478 return DaysInMonth(lt->tm_year, lt->tm_mon);
480 //-----------------------------------------------------------------------------
481 int DaysInMonth(unsigned year, unsigned mon)
483 assert(mon < 12 && "Month number should be 0 - 11");
486 case 0: return 31; //jan
488 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
491 case 2: return 31; //mar
492 case 3: return 30; //apr
493 case 4: return 31; //may
494 case 5: return 30; //june
495 case 6: return 31; //jule
496 case 7: return 31; //aug
497 case 8: return 30; //sep
498 case 9: return 31; //oct
499 case 10: return 30; //nov
500 case 11: return 31; //dec
502 return -1; // We will never reach here
504 //-----------------------------------------------------------------------------
508 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
513 return a + (8 - a % 8);
515 //-----------------------------------------------------------------------------
516 /*char * inet_ntostr(unsigned long ip)
518 struct in_addr addr = {ip};
519 return inet_ntoa(addr);
521 //-----------------------------------------------------------------------------
522 std::string inet_ntostring(uint32_t ip)
524 char buf[INET_ADDRSTRLEN + 1];
525 return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
527 //-----------------------------------------------------------------------------
528 uint32_t inet_strington(const std::string & value)
532 if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
537 //-----------------------------------------------------------------------------
538 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
540 char hs1[10], ms1[10], hs2[10], ms2[10];
545 strncpy(ss, str, 48);
547 p1 = strtok(ss, "-");
553 p2 = strtok(NULL, "-");
559 p1 = strtok(s1, ":");
565 p2 = strtok(NULL, ":");
571 p1 = strtok(s2, ":");
577 p2 = strtok(NULL, ":");
583 if (str2x(hs1, h1) != 0)
586 if (str2x(ms1, m1) != 0)
589 if (str2x(hs2, h2) != 0)
592 if (str2x(ms2, m2) != 0)
597 /*//---------------------------------------------------------------------------
600 if (c >= '0' && c <= '9')
604 //-----------------------------------------------------------------------------
607 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
611 //-----------------------------------------------------------------------------
612 const char * LogDate(time_t t)
615 struct tm * tt = localtime(&t);
617 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
619 tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
620 tt->tm_mday < 10 ? "0" : "", tt->tm_mday,
621 tt->tm_hour < 10 ? "0" : "", tt->tm_hour,
622 tt->tm_min < 10 ? "0" : "", tt->tm_min,
623 tt->tm_sec < 10 ? "0" : "", tt->tm_sec);
627 //-----------------------------------------------------------------------------
628 uint32_t CalcMask(uint32_t msk)
630 if (msk >= 32) return 0xFFffFFff;
631 if (msk == 0) return 0;
632 return htonl(0xFFffFFff << (32 - msk));
634 //---------------------------------------------------------------------------
635 void TouchFile(const string & fileName)
637 FILE * f = fopen(fileName.c_str(), "w");
641 //---------------------------------------------------------------------------
643 void EncodeStr(char * str, unsigned long serial, int useHDD)
645 int len = strlen(str);
649 char serial_c[sizeof(serial)];
650 memcpy(serial_c, &serial, sizeof(serial));
652 for (i = 0; i < len; i++)
658 str[i] = str[i]^serial_c[j%sizeof(serial)];
663 for (i = 0; i < 2*len; i++)
667 c1 = (str[i/2] >> 4);
673 c2 = (str[i/2] & 0x0f);
681 //---------------------------------------------------------------------------
682 void DecodeStr(char * str, unsigned long serial, int useHDD)
684 int len = strlen(str);
688 char serial_c[sizeof(serial)];
689 memcpy(serial_c, &serial, sizeof(serial));
691 for (i = 0; i < len; i += 2)
694 c2 = (str[i+1] - 50)<<4;
697 for (i = 0; i < len/2; i++)
700 strdc[i] = strdc[i]^49;
703 strdc[i] = strdc[i]^serial_c[j%sizeof(serial)];
710 //---------------------------------------------------------------------------
712 void SwapBytes(uint16_t & value)
714 value = (value >> 8) |
717 //---------------------------------------------------------------------------
718 void SwapBytes(uint32_t & value)
720 value = (value >> 24) |
721 ((value << 8) & 0x00FF0000L)|
722 ((value >> 8) & 0x0000FF00L)|
725 //---------------------------------------------------------------------------
726 void SwapBytes(uint64_t & value)
728 value = (value >> 56) |
729 ((value << 40) & 0x00FF000000000000LL) |
730 ((value << 24) & 0x0000FF0000000000LL) |
731 ((value << 8) & 0x000000FF00000000LL) |
732 ((value >> 8) & 0x00000000FF000000LL) |
733 ((value >> 24) & 0x0000000000FF0000LL) |
734 ((value >> 40) & 0x000000000000FF00LL) |
737 //---------------------------------------------------------------------------
738 void SwapBytes(int16_t & value)
740 uint16_t temp = value;
744 //---------------------------------------------------------------------------
745 void SwapBytes(int32_t & value)
747 uint32_t temp = value;
751 //---------------------------------------------------------------------------
752 void SwapBytes(int64_t & value)
754 uint64_t temp = value;
758 //---------------------------------------------------------------------------
759 int str2x(const std::string & str, int & x)
761 x = strtol(str.c_str(), NULL, 10);
768 //---------------------------------------------------------------------------
769 int str2x(const std::string & str, unsigned & x)
771 x = strtoul(str.c_str(), NULL, 10);
778 //---------------------------------------------------------------------------
779 int str2x(const std::string & str, long & x)
781 x = strtol(str.c_str(), NULL, 10);
788 //---------------------------------------------------------------------------
789 int str2x(const std::string & str, unsigned long & x)
791 x = strtoul(str.c_str(), NULL, 10);
799 //---------------------------------------------------------------------------
800 int str2x(const std::string & str, long long & x)
802 x = strtoll(str.c_str(), NULL, 10);
809 //---------------------------------------------------------------------------
810 int str2x(const std::string & str, unsigned long long & x)
812 x = strtoull(str.c_str(), NULL, 10);
820 //---------------------------------------------------------------------------
821 const std::string & x2str(unsigned x, std::string & s)
823 return unsigned2str(x, s);
825 //---------------------------------------------------------------------------
826 const std::string & x2str(unsigned long x, std::string & s)
828 return unsigned2str(x, s);
830 //---------------------------------------------------------------------------
831 const std::string & x2str(unsigned long long x, std::string & s)
833 return unsigned2str(x, s);
835 //---------------------------------------------------------------------------
836 std::string & TrimL(std::string & val)
838 size_t pos = val.find_first_not_of(" \t");
839 if (pos == std::string::npos)
841 val.erase(val.begin(), val.end());
849 //---------------------------------------------------------------------------
850 std::string & TrimR(std::string & val)
852 size_t pos = val.find_last_not_of(" \t");
853 if (pos != std::string::npos)
859 //---------------------------------------------------------------------------
860 std::string & Trim(std::string & val)
862 return TrimR(TrimL(val));
864 //---------------------------------------------------------------------------
866 static int is_leap(unsigned y)
869 return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
872 //---------------------------------------------------------------------------
874 time_t stg_timegm(struct tm * brokenTime)
877 static const unsigned ndays[2][12] ={
878 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
879 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
881 for (int i = 70; i < brokenTime->tm_year; ++i)
882 res += is_leap(i) ? 366 : 365;
883 for (int i = 0; i < brokenTime->tm_mon; ++i)
884 res += ndays[is_leap(brokenTime->tm_year)][i];
885 res += brokenTime->tm_mday - 1;
887 res += brokenTime->tm_hour;
889 res += brokenTime->tm_min;
891 res += brokenTime->tm_sec;
895 return timegm(brokenTime);
902 ret = mktime(brokenTime);
909 #endif // HAVE_TIMEGM
912 //---------------------------------------------------------------------------
913 std::string IconvString(const std::string & source,
914 const std::string & from,
915 const std::string & to)
918 return std::string();
920 size_t inBytesLeft = source.length() + 1;
921 size_t outBytesLeft = source.length() * 2 + 1;
923 char * inBuf = new char[inBytesLeft];
924 char * outBuf = new char[outBytesLeft];
926 strncpy(inBuf, source.c_str(), source.length());
928 inBuf[source.length()] = 0;
930 #if defined(FREE_BSD) || defined(FREE_BSD5) || defined(WIN32)
931 const char * srcPos = inBuf;
933 char * srcPos = inBuf;
935 char * dstPos = outBuf;
937 iconv_t handle = iconv_open(to.c_str(),
940 if (handle == iconv_t(-1))
944 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
950 printfd(__FILE__, "IconvString(): iconv_open error\n");
957 size_t res = iconv(handle,
958 &srcPos, &inBytesLeft,
959 &dstPos, &outBytesLeft);
961 if (res == size_t(-1))
963 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
973 std::string dst(outBuf);
983 int ParseYesNo(const std::string & str, bool * val)
985 if (0 == strncasecmp(str.c_str(), "yes", 3))
991 if (0 == strncasecmp(str.c_str(), "no", 2))
1000 int ParseInt(const std::string & str, int * val)
1002 if (str2x<int>(str, *val))
1007 int ParseUnsigned(const string & str, unsigned * val)
1009 if (str2x<unsigned>(str, *val))
1014 int ParseIntInRange(const string & str, int min, int max, int * val)
1016 if (ParseInt(str, val) != 0)
1019 if (*val < min || *val > max)
1025 int ParseUnsignedInRange(const string & str, unsigned min,
1026 unsigned max, unsigned * val)
1028 if (ParseUnsigned(str, val) != 0)
1031 if (*val < min || *val > max)
1037 bool WaitPackets(int sd)
1045 tv.tv_usec = 500000;
1047 int res = select(sd + 1, &rfds, NULL, NULL, &tv);
1048 if (res == -1) // Error
1051 printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
1055 if (res == 0) // Timeout