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>
59 #include "stg/common.h"
61 #ifndef INET_ADDRSTRLEN
62 # define INET_ADDRSTRLEN 16
67 //---------------------------------------------------------------------------
68 unsigned char koi2win[] = {
69 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
70 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
71 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
72 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
73 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
74 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
75 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
76 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
77 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
78 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
79 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
80 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
81 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
82 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
83 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
84 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
85 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
86 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
87 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
88 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
89 0xA0, 0xA1, 0xA2, 0xB8, 0xBA, 0xA5, 0xB3, 0xBF,
90 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB4, 0xAE, 0xAF,
91 0xB0, 0xB1, 0xB2, 0xA8, 0xAA, 0xB5, 0xB2, 0xAF,
92 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xA5, 0xBE, 0xBF,
93 0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
94 0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
95 0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
96 0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
97 0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
98 0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
99 0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
100 0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA};
103 unsigned char win2koi[] = {
104 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
105 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
106 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
107 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
108 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
109 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
110 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
111 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
112 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
113 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
114 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
115 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
116 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
117 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
118 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
119 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
120 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
121 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
122 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
123 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
124 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xBD, 0xA6, 0xA7,
125 0xB3, 0xA9, 0xB4, 0xAB, 0xAC, 0xAD, 0xAE, 0xB7,
126 0xB0, 0xB1, 0xB6, 0xA6, 0xAD, 0xB5, 0xB6, 0xB7,
127 0xA3, 0xB9, 0xA4, 0xBB, 0xBC, 0xBD, 0xBE, 0xA7,
128 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
129 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
130 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
131 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
132 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
133 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
134 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
135 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1};
139 //-----------------------------------------------------------------------------
140 const char * inet_ntop(int af, const void * src, char * dst, unsigned long length)
142 struct sockaddr_in addr;
143 addr.sin_family = af;
145 memcpy(&addr.sin_addr.s_addr, src, sizeof(addr.sin_addr.s_addr));
146 if (WSAAddressToStringA(reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr), 0, dst, &length))
152 //-----------------------------------------------------------------------------
153 int inet_pton(int af, const char * src, void * dst)
155 // Fuck you Microsoft!
156 // Why the hell not to use const char *?
157 size_t slen = strlen(src);
158 char * buf = new char[slen + 1];
159 strncpy(buf, src, slen + 1);
161 struct sockaddr_in addr;
162 addr.sin_family = af;
164 addr.sin_addr.s_addr = 0;
165 int length = sizeof(addr);
166 if (WSAStringToAddressA(buf, af, 0, reinterpret_cast<struct sockaddr *>(&addr), &length))
171 memcpy(dst, &addr, sizeof(addr));
176 //-----------------------------------------------------------------------------
177 int strtodouble2(const char * s, double &a)
188 //-----------------------------------------------------------------------------
190 int printfd(const char * __file__, const char * fmt, ...)
192 int printfd(const char *, const char *, ...)
198 time_t t = time(NULL);
202 vsnprintf(buff, sizeof(buff), fmt, vl);
205 printf("%18s > %s > ", __file__, LogDate(t)+11);
211 //-----------------------------------------------------------------------------
212 int strprintf(std::string * str, const char * fmt, ...)
218 int n = vsnprintf(buff, sizeof(buff), fmt, vl);
225 //-----------------------------------------------------------------------------
226 const char *IntToKMG(int64_t a, int stat)
228 static const double K = 1024;
229 static const double M = 1024 * 1024;
230 static const double G = 1024 * 1024 * 1024;
238 sprintf(str, "%Ld", a);
240 sprintf(str, "%lld", a);
244 sprintf(str, "%.2f kb", value / K);
247 sprintf(str, "%.2f Mb", value / M);
252 sprintf(str, "%.2f Gb", value / G);
257 sprintf(str, "%.2f Gb", value / G);
262 sprintf(str, "%.2f Mb", value / M);
267 sprintf(str, "%.2f Mb", value / M);
271 sprintf(str, "%.2f kb", value / K);
276 //---------------------------------------------------------------------------
277 void KOIToWin(const char * s1, char * s2, int l)
279 for (int j = 0; j < l; j++)
281 unsigned char t = s1[j];
288 //---------------------------------------------------------------------------
289 void WinToKOI(const char * s1, char * s2, int l)
291 for (int j = 0; j < l; j++)
293 unsigned char t = s1[j];
300 //---------------------------------------------------------------------------
301 void KOIToWin(const std::string & s1, std::string * s2)
303 s2->erase(s2->begin(), s2->end());
304 s2->reserve(s1.length());
305 for (int j = 0; j < (int)s1.length(); j++)
307 unsigned char t = s1[j];
308 s2->push_back(koi2win[t]);
311 //---------------------------------------------------------------------------
312 void WinToKOI(const std::string & s1, std::string * s2)
314 s2->erase(s2->begin(), s2->end());
315 s2->reserve(s1.length());
316 for (int j = 0; j < (int)s1.length(); j++)
318 unsigned char t = s1[j];
319 s2->push_back(win2koi[t]);
322 //---------------------------------------------------------------------------
323 void Encode12str(std::string & dst, const std::string & src)
325 dst.erase(dst.begin(), dst.end());
326 for (size_t i = 0; i < src.length(); i++)
328 dst.push_back('a' + (src[i] & 0x0f));
329 dst.push_back('a' + ((src[i] & 0xf0) >> 4));
332 //---------------------------------------------------------------------------
333 void Decode21str(std::string & dst, const std::string & src)
335 dst.erase(dst.begin(), dst.end());
336 for (size_t i = 0; i < src.length() / 2; i++)
338 char c1 = src[i * 2];
339 char c2 = src[i * 2 + 1];
344 dst.push_back(static_cast<char>(c1 + (c2 << 4)));
347 //---------------------------------------------------------------------------
348 void Encode12(char * dst, const char * src, size_t srcLen)
350 for (size_t i = 0; i <= srcLen; i++)
352 char c1 = src[i] & 0x0f;
353 char c2 = (src[i] & 0xf0) >> 4;
363 //---------------------------------------------------------------------------
364 void Decode21(char * dst, const char * src)
366 for (size_t i = 0; ; i++)
371 char c1 = src[i * 2];
372 char c2 = src[i * 2 + 1];
377 dst[i] = static_cast<char>(c1 + (c2 << 4));
379 dst[strlen(src) / 2] = 0;
381 //---------------------------------------------------------------------------
382 int ParseIPString(const char * str, uint32_t * ips, int maxIP)
385 *Function Name:ParseIPString
388 ÓÔÒÏËÁ ÄÌÑ ÒÁÚÂÏÒÁ É ÍÁÓÓÉ× ËÕÄÁ ÚÁÎÏÓÉÔØ ÐÏÌÕÞÅÎÎÙÅ ÁÄÒÅÓÁ
391 îÁ ×ÈÏÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÁ ×ÉÄÁ "ip1,ip2,ip3" ÉÌÉ "*"
392 ÷ ÐÅÒ×ÏÍ ÓÌÕÞÁÅ × ÍÁÓÓÉ× ÚÁÎÏÓÑÔÓÑ ÒÁÚÏÂÒÁÎÎÙÅ ÁÄÒÅÓÁ.
393 åÓÌÉ ÉÈ ÍÅÎØÛÅ MAX_IP?, ÔÏ ÐÏÓÌÅÄÎÉÊ ÁÄÒÅÓ ÂÕÄÅÔ 255.255.255.255
394 åÓÌÉ ÓÔÒÏËÁ * , ÔÏ ÐÅÒ×ÁÙÊ ÁÄÒÅÓ ÂÕÄÅÔ 0.0.0.0, Ô.Å. ÌÀÂÏÊ
396 *Returns: 0 ÅÓÌÉ ×ÓÅ ïë
403 strncpy(p, str, 254);
406 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
408 if (str[0] == '*' && strlen(str) == 1)
414 for (int i = 0; i < maxIP; i++)
416 char * p1 = strtok(pp, ",\n ");
419 if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
430 if (inet_pton(AF_INET, p1, &in) != 1)
432 //printf("INADDR_NONE\n");
438 /*if (ips[n] == INADDR_NONE)
450 //-----------------------------------------------------------------------------
451 int DaysInCurrentMonth()
453 time_t t = time(NULL);
455 struct tm * lt = localtime(&t);
457 return DaysInMonth(lt->tm_year, lt->tm_mon);
459 //-----------------------------------------------------------------------------
460 int DaysInMonth(unsigned year, unsigned mon)
462 assert(mon < 12 && "Month number should be 0 - 11");
465 case 0: return 31; //jan
467 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
470 case 2: return 31; //mar
471 case 3: return 30; //apr
472 case 4: return 31; //may
473 case 5: return 30; //june
474 case 6: return 31; //jule
475 case 7: return 31; //aug
476 case 8: return 30; //sep
477 case 9: return 31; //oct
478 case 10: return 30; //nov
479 case 11: return 31; //dec
481 return -1; // We will never reach here
483 //-----------------------------------------------------------------------------
487 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
492 return a + (8 - a % 8);
494 //-----------------------------------------------------------------------------
495 /*char * inet_ntostr(unsigned long ip)
497 struct in_addr addr = {ip};
498 return inet_ntoa(addr);
500 //-----------------------------------------------------------------------------
501 std::string inet_ntostring(uint32_t ip)
503 char buf[INET_ADDRSTRLEN + 1];
504 return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
506 //-----------------------------------------------------------------------------
507 uint32_t inet_strington(const std::string & value)
511 if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
516 //-----------------------------------------------------------------------------
517 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
519 char hs1[10], ms1[10], hs2[10], ms2[10];
524 strncpy(ss, str, 48);
526 p1 = strtok(ss, "-");
532 p2 = strtok(NULL, "-");
538 p1 = strtok(s1, ":");
544 p2 = strtok(NULL, ":");
550 p1 = strtok(s2, ":");
556 p2 = strtok(NULL, ":");
562 if (str2x(hs1, h1) != 0)
565 if (str2x(ms1, m1) != 0)
568 if (str2x(hs2, h2) != 0)
571 if (str2x(ms2, m2) != 0)
576 /*//---------------------------------------------------------------------------
579 if (c >= '0' && c <= '9')
583 //-----------------------------------------------------------------------------
586 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
590 //-----------------------------------------------------------------------------
591 const char * LogDate(time_t t)
594 struct tm * tt = localtime(&t);
596 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
598 tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
599 tt->tm_mday < 10 ? "0" : "", tt->tm_mday,
600 tt->tm_hour < 10 ? "0" : "", tt->tm_hour,
601 tt->tm_min < 10 ? "0" : "", tt->tm_min,
602 tt->tm_sec < 10 ? "0" : "", tt->tm_sec);
606 //-----------------------------------------------------------------------------
607 uint32_t CalcMask(uint32_t msk)
609 if (msk >= 32) return 0xFFffFFff;
610 if (msk == 0) return 0;
611 return htonl(0xFFffFFff << (32 - msk));
613 //---------------------------------------------------------------------------
614 void TouchFile(const std::string & fileName)
616 FILE * f = fopen(fileName.c_str(), "w");
620 //---------------------------------------------------------------------------
622 void EncodeStr(char * str, unsigned long serial, int useHDD)
624 int len = strlen(str);
628 char serial_c[sizeof(serial)];
629 memcpy(serial_c, &serial, sizeof(serial));
631 for (i = 0; i < len; i++)
637 str[i] = str[i]^serial_c[j%sizeof(serial)];
642 for (i = 0; i < 2*len; i++)
646 c1 = (str[i/2] >> 4);
652 c2 = (str[i/2] & 0x0f);
660 //---------------------------------------------------------------------------
661 void DecodeStr(char * str, unsigned long serial, int useHDD)
663 size_t len = strlen(str);
665 char serial_c[sizeof(serial)];
666 memcpy(serial_c, &serial, sizeof(serial));
668 for (size_t i = 0; i < len; i += 2)
670 char c1 = (str[i] - 50);
671 char c2 = (str[i+1] - 50)<<4;
674 for (size_t i = 0; i < len/2; i++)
677 strdc[i] = strdc[i]^49;
680 strdc[i] = strdc[i]^serial_c[j%sizeof(serial)];
687 //---------------------------------------------------------------------------
689 void SwapBytes(uint16_t & value)
691 value = static_cast<uint16_t>((value >> 8) |
694 //---------------------------------------------------------------------------
695 void SwapBytes(uint32_t & value)
697 value = static_cast<uint32_t>((value >> 24) |
698 ((value << 8) & 0x00FF0000L) |
699 ((value >> 8) & 0x0000FF00L) |
702 //---------------------------------------------------------------------------
703 void SwapBytes(uint64_t & value)
705 value = static_cast<uint64_t>((value >> 56) |
706 ((value << 40) & 0x00FF000000000000LL) |
707 ((value << 24) & 0x0000FF0000000000LL) |
708 ((value << 8) & 0x000000FF00000000LL) |
709 ((value >> 8) & 0x00000000FF000000LL) |
710 ((value >> 24) & 0x0000000000FF0000LL) |
711 ((value >> 40) & 0x000000000000FF00LL) |
714 //---------------------------------------------------------------------------
715 void SwapBytes(int16_t & value)
717 uint16_t temp = value;
721 //---------------------------------------------------------------------------
722 void SwapBytes(int32_t & value)
724 uint32_t temp = value;
728 //---------------------------------------------------------------------------
729 void SwapBytes(int64_t & value)
731 uint64_t temp = value;
735 //---------------------------------------------------------------------------
736 int str2x(const std::string & str, int32_t & x)
738 x = static_cast<int32_t>(strtol(str.c_str(), NULL, 10));
745 //---------------------------------------------------------------------------
746 int str2x(const std::string & str, uint32_t & x)
748 x = static_cast<uint32_t>(strtoul(str.c_str(), NULL, 10));
756 //---------------------------------------------------------------------------
757 int str2x(const std::string & str, int64_t & x)
759 x = strtoll(str.c_str(), NULL, 10);
766 //---------------------------------------------------------------------------
767 int str2x(const std::string & str, uint64_t & x)
769 x = strtoull(str.c_str(), NULL, 10);
777 //---------------------------------------------------------------------------
778 const std::string & x2str(uint32_t x, std::string & s)
780 return unsigned2str(x, s);
782 //---------------------------------------------------------------------------
783 const std::string & x2str(uint64_t x, std::string & s)
785 return unsigned2str(x, s);
787 //---------------------------------------------------------------------------
788 const std::string & x2str(double x, std::string & s)
791 snprintf(buf, sizeof(buf), "%f", x);
795 //---------------------------------------------------------------------------
796 std::string & TrimL(std::string & val)
798 size_t pos = val.find_first_not_of(" \t");
799 if (pos == std::string::npos)
801 val.erase(val.begin(), val.end());
809 //---------------------------------------------------------------------------
810 std::string & TrimR(std::string & val)
812 size_t pos = val.find_last_not_of(" \t");
813 if (pos != std::string::npos)
819 //---------------------------------------------------------------------------
820 std::string & Trim(std::string & val)
822 return TrimR(TrimL(val));
824 //---------------------------------------------------------------------------
825 std::string ToLower(std::string value)
827 std::transform(value.begin(), value.end(), value.begin(), ::tolower);
830 //---------------------------------------------------------------------------
831 std::string ToUpper(std::string value)
833 std::transform(value.begin(), value.end(), value.begin(), ::toupper);
836 //---------------------------------------------------------------------------
838 static int is_leap(unsigned y)
841 return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
844 //---------------------------------------------------------------------------
846 time_t stg_timegm(struct tm * brokenTime)
849 static const unsigned ndays[2][12] ={
850 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
851 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
853 for (int i = 70; i < brokenTime->tm_year; ++i)
854 res += is_leap(i) ? 366 : 365;
855 for (int i = 0; i < brokenTime->tm_mon; ++i)
856 res += ndays[is_leap(brokenTime->tm_year)][i];
857 res += brokenTime->tm_mday - 1;
859 res += brokenTime->tm_hour;
861 res += brokenTime->tm_min;
863 res += brokenTime->tm_sec;
867 return timegm(brokenTime);
874 ret = mktime(brokenTime);
881 #endif // HAVE_TIMEGM
884 //---------------------------------------------------------------------------
885 std::string IconvString(const std::string & source,
886 const std::string & from,
887 const std::string & to)
890 return std::string();
892 size_t inBytesLeft = source.length() + 1;
893 size_t outBytesLeft = source.length() * 2 + 1;
895 char * inBuf = new char[inBytesLeft];
896 char * outBuf = new char[outBytesLeft];
898 strncpy(inBuf, source.c_str(), source.length());
900 inBuf[source.length()] = 0;
902 #if defined(CONST_ICONV)
903 const char * srcPos = inBuf;
905 char * srcPos = inBuf;
907 char * dstPos = outBuf;
909 iconv_t handle = iconv_open(to.c_str(),
912 if (handle == iconv_t(-1))
916 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
922 printfd(__FILE__, "IconvString(): iconv_open error\n");
929 size_t res = iconv(handle,
930 &srcPos, &inBytesLeft,
931 &dstPos, &outBytesLeft);
933 if (res == size_t(-1))
935 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
945 std::string dst(outBuf);
955 int ParseYesNo(const std::string & str, bool * val)
957 if (0 == strncasecmp(str.c_str(), "yes", 3))
963 if (0 == strncasecmp(str.c_str(), "no", 2))
972 int ParseInt(const std::string & str, int * val)
974 if (str2x<int>(str, *val))
979 int ParseUnsigned(const std::string & str, unsigned * val)
981 if (str2x<unsigned>(str, *val))
986 int ParseIntInRange(const std::string & str, int min, int max, int * val)
988 if (ParseInt(str, val) != 0)
991 if (*val < min || *val > max)
997 int ParseUnsignedInRange(const std::string & str, unsigned min,
998 unsigned max, unsigned * val)
1000 if (ParseUnsigned(str, val) != 0)
1003 if (*val < min || *val > max)
1009 bool WaitPackets(int sd)
1017 tv.tv_usec = 500000;
1019 int res = select(sd + 1, &rfds, NULL, NULL, &tv);
1020 if (res == -1) // Error
1023 printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
1027 if (res == 0) // Timeout
1033 bool ReadAll(int sd, void * dest, size_t size)
1036 char * ptr = static_cast<char *>(dest);
1039 if (!WaitPackets(sd))
1041 ssize_t res = read(sd, ptr + done, size - done);
1051 bool WriteAll(int sd, const void * source, size_t size)
1054 const char * ptr = static_cast<const char *>(source);
1057 ssize_t res = write(sd, ptr + done, size - done);
1065 std::string ToPrintable(const std::string & src)
1069 for (size_t i = 0; i < src.size(); ++i)
1070 if (std::isprint(src[i]))
1073 dest += "\\" + x2str(src[i]);