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 std::string Encode12str(const std::string & src)
353 Encode12str(res, src);
356 //---------------------------------------------------------------------------
357 std::string Decode21str(const std::string & src)
360 Decode21str(res, src);
363 //---------------------------------------------------------------------------
364 void Encode12(char * dst, const char * src, size_t srcLen)
366 for (size_t i = 0; i <= srcLen; i++)
368 char c1 = src[i] & 0x0f;
369 char c2 = (src[i] & 0xf0) >> 4;
379 //---------------------------------------------------------------------------
380 void Decode21(char * dst, const char * src)
382 for (size_t i = 0; ; i++)
387 char c1 = src[i * 2];
388 char c2 = src[i * 2 + 1];
393 dst[i] = static_cast<char>(c1 + (c2 << 4));
395 dst[strlen(src) / 2] = 0;
397 //---------------------------------------------------------------------------
398 int ParseIPString(const char * str, uint32_t * ips, int maxIP)
401 *Function Name:ParseIPString
404 ÓÔÒÏËÁ ÄÌÑ ÒÁÚÂÏÒÁ É ÍÁÓÓÉ× ËÕÄÁ ÚÁÎÏÓÉÔØ ÐÏÌÕÞÅÎÎÙÅ ÁÄÒÅÓÁ
407 îÁ ×ÈÏÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÁ ×ÉÄÁ "ip1,ip2,ip3" ÉÌÉ "*"
408 ÷ ÐÅÒ×ÏÍ ÓÌÕÞÁÅ × ÍÁÓÓÉ× ÚÁÎÏÓÑÔÓÑ ÒÁÚÏÂÒÁÎÎÙÅ ÁÄÒÅÓÁ.
409 åÓÌÉ ÉÈ ÍÅÎØÛÅ MAX_IP?, ÔÏ ÐÏÓÌÅÄÎÉÊ ÁÄÒÅÓ ÂÕÄÅÔ 255.255.255.255
410 åÓÌÉ ÓÔÒÏËÁ * , ÔÏ ÐÅÒ×ÁÙÊ ÁÄÒÅÓ ÂÕÄÅÔ 0.0.0.0, Ô.Å. ÌÀÂÏÊ
412 *Returns: 0 ÅÓÌÉ ×ÓÅ ïë
420 strncpy(p, str, 254);
423 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
425 if (str[0] == '*' && strlen(str) == 1)
431 for (int i = 0; i < maxIP; i++)
433 p1 = strtok(pp, ",\n ");
436 if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
447 if (inet_pton(AF_INET, p1, &in) != 1)
449 //printf("INADDR_NONE\n");
455 /*if (ips[n] == INADDR_NONE)
467 //-----------------------------------------------------------------------------
468 int DaysInCurrentMonth()
470 time_t t = time(NULL);
472 struct tm * lt = localtime(&t);
474 return DaysInMonth(lt->tm_year, lt->tm_mon);
476 //-----------------------------------------------------------------------------
477 int DaysInMonth(unsigned year, unsigned mon)
479 assert(mon < 12 && "Month number should be 0 - 11");
482 case 0: return 31; //jan
484 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
487 case 2: return 31; //mar
488 case 3: return 30; //apr
489 case 4: return 31; //may
490 case 5: return 30; //june
491 case 6: return 31; //jule
492 case 7: return 31; //aug
493 case 8: return 30; //sep
494 case 9: return 31; //oct
495 case 10: return 30; //nov
496 case 11: return 31; //dec
498 return -1; // We will never reach here
500 //-----------------------------------------------------------------------------
504 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
509 return a + (8 - a % 8);
511 //-----------------------------------------------------------------------------
512 /*char * inet_ntostr(unsigned long ip)
514 struct in_addr addr = {ip};
515 return inet_ntoa(addr);
517 //-----------------------------------------------------------------------------
518 std::string inet_ntostring(uint32_t ip)
520 char buf[INET_ADDRSTRLEN + 1];
521 return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
523 //-----------------------------------------------------------------------------
524 uint32_t inet_strington(const std::string & value)
528 if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
533 //-----------------------------------------------------------------------------
534 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
536 char hs1[10], ms1[10], hs2[10], ms2[10];
541 strncpy(ss, str, 48);
543 p1 = strtok(ss, "-");
549 p2 = strtok(NULL, "-");
555 p1 = strtok(s1, ":");
561 p2 = strtok(NULL, ":");
567 p1 = strtok(s2, ":");
573 p2 = strtok(NULL, ":");
579 if (str2x(hs1, h1) != 0)
582 if (str2x(ms1, m1) != 0)
585 if (str2x(hs2, h2) != 0)
588 if (str2x(ms2, m2) != 0)
593 /*//---------------------------------------------------------------------------
596 if (c >= '0' && c <= '9')
600 //-----------------------------------------------------------------------------
603 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
607 //-----------------------------------------------------------------------------
608 const char * LogDate(time_t t)
611 struct tm * tt = localtime(&t);
613 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
615 tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
616 tt->tm_mday < 10 ? "0" : "", tt->tm_mday,
617 tt->tm_hour < 10 ? "0" : "", tt->tm_hour,
618 tt->tm_min < 10 ? "0" : "", tt->tm_min,
619 tt->tm_sec < 10 ? "0" : "", tt->tm_sec);
623 //-----------------------------------------------------------------------------
624 uint32_t CalcMask(uint32_t msk)
626 if (msk >= 32) return 0xFFffFFff;
627 if (msk == 0) return 0;
628 return htonl(0xFFffFFff << (32 - msk));
630 //---------------------------------------------------------------------------
631 void TouchFile(const std::string & fileName)
633 FILE * f = fopen(fileName.c_str(), "w");
637 //---------------------------------------------------------------------------
639 void EncodeStr(char * str, unsigned long serial, int useHDD)
641 int len = strlen(str);
645 char serial_c[sizeof(serial)];
646 memcpy(serial_c, &serial, sizeof(serial));
648 for (i = 0; i < len; i++)
654 str[i] = str[i]^serial_c[j%sizeof(serial)];
659 for (i = 0; i < 2*len; i++)
663 c1 = (str[i/2] >> 4);
669 c2 = (str[i/2] & 0x0f);
677 //---------------------------------------------------------------------------
678 void DecodeStr(char * str, unsigned long serial, int useHDD)
680 int len = strlen(str);
684 char serial_c[sizeof(serial)];
685 memcpy(serial_c, &serial, sizeof(serial));
687 for (i = 0; i < len; i += 2)
690 c2 = (str[i+1] - 50)<<4;
693 for (i = 0; i < len/2; i++)
696 strdc[i] = strdc[i]^49;
699 strdc[i] = strdc[i]^serial_c[j%sizeof(serial)];
706 //---------------------------------------------------------------------------
708 void SwapBytes(uint16_t & value)
710 value = static_cast<uint16_t>((value >> 8) |
713 //---------------------------------------------------------------------------
714 void SwapBytes(uint32_t & value)
716 value = static_cast<uint32_t>((value >> 24) |
717 ((value << 8) & 0x00FF0000L) |
718 ((value >> 8) & 0x0000FF00L) |
721 //---------------------------------------------------------------------------
722 void SwapBytes(uint64_t & value)
724 value = static_cast<uint64_t>((value >> 56) |
725 ((value << 40) & 0x00FF000000000000LL) |
726 ((value << 24) & 0x0000FF0000000000LL) |
727 ((value << 8) & 0x000000FF00000000LL) |
728 ((value >> 8) & 0x00000000FF000000LL) |
729 ((value >> 24) & 0x0000000000FF0000LL) |
730 ((value >> 40) & 0x000000000000FF00LL) |
733 //---------------------------------------------------------------------------
734 void SwapBytes(int16_t & value)
736 uint16_t temp = value;
740 //---------------------------------------------------------------------------
741 void SwapBytes(int32_t & value)
743 uint32_t temp = value;
747 //---------------------------------------------------------------------------
748 void SwapBytes(int64_t & value)
750 uint64_t temp = value;
754 //---------------------------------------------------------------------------
755 int str2x(const std::string & str, int32_t & x)
757 x = static_cast<int32_t>(strtol(str.c_str(), NULL, 10));
764 //---------------------------------------------------------------------------
765 int str2x(const std::string & str, uint32_t & x)
767 x = static_cast<uint32_t>(strtoul(str.c_str(), NULL, 10));
775 //---------------------------------------------------------------------------
776 int str2x(const std::string & str, int64_t & x)
778 x = strtoll(str.c_str(), NULL, 10);
785 //---------------------------------------------------------------------------
786 int str2x(const std::string & str, uint64_t & x)
788 x = strtoull(str.c_str(), NULL, 10);
796 //---------------------------------------------------------------------------
797 const std::string & x2str(uint32_t x, std::string & s)
799 return unsigned2str(x, s);
801 //---------------------------------------------------------------------------
802 const std::string & x2str(uint64_t x, std::string & s)
804 return unsigned2str(x, s);
806 //---------------------------------------------------------------------------
807 const std::string & x2str(double x, std::string & s)
810 s = snprintf(buf, sizeof(buf), "%f", x);
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 //---------------------------------------------------------------------------
843 std::string ToLower(const std::string & value)
846 for (std::string::size_type pos = 0; pos < value.length(); ++pos)
847 res += tolower(value[pos]);
850 //---------------------------------------------------------------------------
851 std::string ToUpper(const std::string & value)
854 for (std::string::size_type pos = 0; pos < value.length(); ++pos)
855 res += toupper(value[pos]);
858 //---------------------------------------------------------------------------
860 static int is_leap(unsigned y)
863 return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
866 //---------------------------------------------------------------------------
868 time_t stg_timegm(struct tm * brokenTime)
871 static const unsigned ndays[2][12] ={
872 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
873 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
875 for (int i = 70; i < brokenTime->tm_year; ++i)
876 res += is_leap(i) ? 366 : 365;
877 for (int i = 0; i < brokenTime->tm_mon; ++i)
878 res += ndays[is_leap(brokenTime->tm_year)][i];
879 res += brokenTime->tm_mday - 1;
881 res += brokenTime->tm_hour;
883 res += brokenTime->tm_min;
885 res += brokenTime->tm_sec;
889 return timegm(brokenTime);
896 ret = mktime(brokenTime);
903 #endif // HAVE_TIMEGM
906 //---------------------------------------------------------------------------
907 std::string IconvString(const std::string & source,
908 const std::string & from,
909 const std::string & to)
912 return std::string();
914 size_t inBytesLeft = source.length() + 1;
915 size_t outBytesLeft = source.length() * 2 + 1;
917 char * inBuf = new char[inBytesLeft];
918 char * outBuf = new char[outBytesLeft];
920 strncpy(inBuf, source.c_str(), source.length());
922 inBuf[source.length()] = 0;
924 #if defined(FREE_BSD) || defined(FREE_BSD5) || defined(WIN32)
925 const char * srcPos = inBuf;
927 char * srcPos = inBuf;
929 char * dstPos = outBuf;
931 iconv_t handle = iconv_open(to.c_str(),
934 if (handle == iconv_t(-1))
938 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
944 printfd(__FILE__, "IconvString(): iconv_open error\n");
951 size_t res = iconv(handle,
952 &srcPos, &inBytesLeft,
953 &dstPos, &outBytesLeft);
955 if (res == size_t(-1))
957 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
967 std::string dst(outBuf);
977 int ParseYesNo(const std::string & str, bool * val)
979 if (0 == strncasecmp(str.c_str(), "yes", 3))
985 if (0 == strncasecmp(str.c_str(), "no", 2))
994 int ParseInt(const std::string & str, int * val)
996 if (str2x<int>(str, *val))
1001 int ParseUnsigned(const std::string & str, unsigned * val)
1003 if (str2x<unsigned>(str, *val))
1008 int ParseIntInRange(const std::string & str, int min, int max, int * val)
1010 if (ParseInt(str, val) != 0)
1013 if (*val < min || *val > max)
1019 int ParseUnsignedInRange(const std::string & str, unsigned min,
1020 unsigned max, unsigned * val)
1022 if (ParseUnsigned(str, val) != 0)
1025 if (*val < min || *val > max)
1031 bool WaitPackets(int sd)
1039 tv.tv_usec = 500000;
1041 int res = select(sd + 1, &rfds, NULL, NULL, &tv);
1042 if (res == -1) // Error
1045 printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
1049 if (res == 0) // Timeout