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)
277 for (int j = 0; j < l; j++)
279 unsigned char t = s1[j];
286 //---------------------------------------------------------------------------
287 void WinToKOI(const char * s1, char * s2, int l)
289 for (int j = 0; j < l; j++)
291 unsigned char t = s1[j];
298 //---------------------------------------------------------------------------
299 void KOIToWin(const std::string & s1, std::string * s2)
301 s2->erase(s2->begin(), s2->end());
302 s2->reserve(s1.length());
303 for (int j = 0; j < (int)s1.length(); j++)
305 unsigned char t = s1[j];
306 s2->push_back(koi2win[t]);
309 //---------------------------------------------------------------------------
310 void WinToKOI(const std::string & s1, std::string * s2)
312 s2->erase(s2->begin(), s2->end());
313 s2->reserve(s1.length());
314 for (int j = 0; j < (int)s1.length(); j++)
316 unsigned char t = s1[j];
317 s2->push_back(win2koi[t]);
320 //---------------------------------------------------------------------------
321 void Encode12str(std::string & dst, const std::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(static_cast<char>(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] = static_cast<char>(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 ÅÓÌÉ ×ÓÅ ïë
401 strncpy(p, str, 254);
404 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
406 if (str[0] == '*' && strlen(str) == 1)
412 for (int i = 0; i < maxIP; i++)
414 char * p1 = strtok(pp, ",\n ");
417 if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
428 if (inet_pton(AF_INET, p1, &in) != 1)
430 //printf("INADDR_NONE\n");
436 /*if (ips[n] == INADDR_NONE)
448 //-----------------------------------------------------------------------------
449 int DaysInCurrentMonth()
451 time_t t = time(NULL);
453 struct tm * lt = localtime(&t);
455 return DaysInMonth(lt->tm_year, lt->tm_mon);
457 //-----------------------------------------------------------------------------
458 int DaysInMonth(unsigned year, unsigned mon)
460 assert(mon < 12 && "Month number should be 0 - 11");
463 case 0: return 31; //jan
465 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
468 case 2: return 31; //mar
469 case 3: return 30; //apr
470 case 4: return 31; //may
471 case 5: return 30; //june
472 case 6: return 31; //jule
473 case 7: return 31; //aug
474 case 8: return 30; //sep
475 case 9: return 31; //oct
476 case 10: return 30; //nov
477 case 11: return 31; //dec
479 return -1; // We will never reach here
481 //-----------------------------------------------------------------------------
485 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
490 return a + (8 - a % 8);
492 //-----------------------------------------------------------------------------
493 /*char * inet_ntostr(unsigned long ip)
495 struct in_addr addr = {ip};
496 return inet_ntoa(addr);
498 //-----------------------------------------------------------------------------
499 std::string inet_ntostring(uint32_t ip)
501 char buf[INET_ADDRSTRLEN + 1];
502 return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
504 //-----------------------------------------------------------------------------
505 uint32_t inet_strington(const std::string & value)
509 if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
514 //-----------------------------------------------------------------------------
515 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
517 char hs1[10], ms1[10], hs2[10], ms2[10];
522 strncpy(ss, str, 48);
524 p1 = strtok(ss, "-");
530 p2 = strtok(NULL, "-");
536 p1 = strtok(s1, ":");
542 p2 = strtok(NULL, ":");
548 p1 = strtok(s2, ":");
554 p2 = strtok(NULL, ":");
560 if (str2x(hs1, h1) != 0)
563 if (str2x(ms1, m1) != 0)
566 if (str2x(hs2, h2) != 0)
569 if (str2x(ms2, m2) != 0)
574 /*//---------------------------------------------------------------------------
577 if (c >= '0' && c <= '9')
581 //-----------------------------------------------------------------------------
584 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
588 //-----------------------------------------------------------------------------
589 const char * LogDate(time_t t)
592 struct tm * tt = localtime(&t);
594 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
596 tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
597 tt->tm_mday < 10 ? "0" : "", tt->tm_mday,
598 tt->tm_hour < 10 ? "0" : "", tt->tm_hour,
599 tt->tm_min < 10 ? "0" : "", tt->tm_min,
600 tt->tm_sec < 10 ? "0" : "", tt->tm_sec);
604 //-----------------------------------------------------------------------------
605 uint32_t CalcMask(uint32_t msk)
607 if (msk >= 32) return 0xFFffFFff;
608 if (msk == 0) return 0;
609 return htonl(0xFFffFFff << (32 - msk));
611 //---------------------------------------------------------------------------
612 void TouchFile(const std::string & fileName)
614 FILE * f = fopen(fileName.c_str(), "w");
618 //---------------------------------------------------------------------------
620 void EncodeStr(char * str, unsigned long serial, int useHDD)
622 int len = strlen(str);
626 char serial_c[sizeof(serial)];
627 memcpy(serial_c, &serial, sizeof(serial));
629 for (i = 0; i < len; i++)
635 str[i] = str[i]^serial_c[j%sizeof(serial)];
640 for (i = 0; i < 2*len; i++)
644 c1 = (str[i/2] >> 4);
650 c2 = (str[i/2] & 0x0f);
658 //---------------------------------------------------------------------------
659 void DecodeStr(char * str, unsigned long serial, int useHDD)
661 size_t len = strlen(str);
663 char serial_c[sizeof(serial)];
664 memcpy(serial_c, &serial, sizeof(serial));
666 for (size_t i = 0; i < len; i += 2)
668 char c1 = (str[i] - 50);
669 char c2 = (str[i+1] - 50)<<4;
672 for (size_t 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 = static_cast<uint16_t>((value >> 8) |
692 //---------------------------------------------------------------------------
693 void SwapBytes(uint32_t & value)
695 value = static_cast<uint32_t>((value >> 24) |
696 ((value << 8) & 0x00FF0000L) |
697 ((value >> 8) & 0x0000FF00L) |
700 //---------------------------------------------------------------------------
701 void SwapBytes(uint64_t & value)
703 value = static_cast<uint64_t>((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, int32_t & x)
736 x = static_cast<int32_t>(strtol(str.c_str(), NULL, 10));
743 //---------------------------------------------------------------------------
744 int str2x(const std::string & str, uint32_t & x)
746 x = static_cast<uint32_t>(strtoul(str.c_str(), NULL, 10));
754 //---------------------------------------------------------------------------
755 int str2x(const std::string & str, int64_t & x)
757 x = strtoll(str.c_str(), NULL, 10);
764 //---------------------------------------------------------------------------
765 int str2x(const std::string & str, uint64_t & x)
767 x = strtoull(str.c_str(), NULL, 10);
775 //---------------------------------------------------------------------------
776 const std::string & x2str(uint32_t x, std::string & s)
778 return unsigned2str(x, s);
780 //---------------------------------------------------------------------------
781 const std::string & x2str(uint64_t x, std::string & s)
783 return unsigned2str(x, s);
785 //---------------------------------------------------------------------------
786 const std::string & x2str(double x, std::string & s)
789 snprintf(buf, sizeof(buf), "%f", x);
793 //---------------------------------------------------------------------------
794 std::string & TrimL(std::string & val)
796 size_t pos = val.find_first_not_of(" \t");
797 if (pos == std::string::npos)
799 val.erase(val.begin(), val.end());
807 //---------------------------------------------------------------------------
808 std::string & TrimR(std::string & val)
810 size_t pos = val.find_last_not_of(" \t");
811 if (pos != std::string::npos)
817 //---------------------------------------------------------------------------
818 std::string & Trim(std::string & val)
820 return TrimR(TrimL(val));
822 //---------------------------------------------------------------------------
823 std::string ToLower(std::string value)
825 std::transform(value.begin(), value.end(), value.begin(), ::tolower);
828 //---------------------------------------------------------------------------
829 std::string ToUpper(std::string value)
831 std::transform(value.begin(), value.end(), value.begin(), ::toupper);
834 //---------------------------------------------------------------------------
836 static int is_leap(unsigned y)
839 return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
842 //---------------------------------------------------------------------------
844 time_t stg_timegm(struct tm * brokenTime)
847 static const unsigned ndays[2][12] ={
848 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
849 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
851 for (int i = 70; i < brokenTime->tm_year; ++i)
852 res += is_leap(i) ? 366 : 365;
853 for (int i = 0; i < brokenTime->tm_mon; ++i)
854 res += ndays[is_leap(brokenTime->tm_year)][i];
855 res += brokenTime->tm_mday - 1;
857 res += brokenTime->tm_hour;
859 res += brokenTime->tm_min;
861 res += brokenTime->tm_sec;
865 return timegm(brokenTime);
872 ret = mktime(brokenTime);
879 #endif // HAVE_TIMEGM
882 //---------------------------------------------------------------------------
883 std::string IconvString(const std::string & source,
884 const std::string & from,
885 const std::string & to)
888 return std::string();
890 size_t inBytesLeft = source.length() + 1;
891 size_t outBytesLeft = source.length() * 2 + 1;
893 char * inBuf = new char[inBytesLeft];
894 char * outBuf = new char[outBytesLeft];
896 strncpy(inBuf, source.c_str(), source.length());
898 inBuf[source.length()] = 0;
900 #if defined(FREE_BSD) || defined(FREE_BSD5) || defined(WIN32)
901 const char * srcPos = inBuf;
903 char * srcPos = inBuf;
905 char * dstPos = outBuf;
907 iconv_t handle = iconv_open(to.c_str(),
910 if (handle == iconv_t(-1))
914 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
920 printfd(__FILE__, "IconvString(): iconv_open error\n");
927 size_t res = iconv(handle,
928 &srcPos, &inBytesLeft,
929 &dstPos, &outBytesLeft);
931 if (res == size_t(-1))
933 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
943 std::string dst(outBuf);
953 int ParseYesNo(const std::string & str, bool * val)
955 if (0 == strncasecmp(str.c_str(), "yes", 3))
961 if (0 == strncasecmp(str.c_str(), "no", 2))
970 int ParseInt(const std::string & str, int * val)
972 if (str2x<int>(str, *val))
977 int ParseUnsigned(const std::string & str, unsigned * val)
979 if (str2x<unsigned>(str, *val))
984 int ParseIntInRange(const std::string & str, int min, int max, int * val)
986 if (ParseInt(str, val) != 0)
989 if (*val < min || *val > max)
995 int ParseUnsignedInRange(const std::string & str, unsigned min,
996 unsigned max, unsigned * val)
998 if (ParseUnsigned(str, val) != 0)
1001 if (*val < min || *val > max)
1007 bool WaitPackets(int sd)
1015 tv.tv_usec = 500000;
1017 int res = select(sd + 1, &rfds, NULL, NULL, &tv);
1018 if (res == -1) // Error
1021 printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
1025 if (res == 0) // Timeout
1031 bool ReadAll(int sd, void * dest, size_t size)
1034 char * ptr = static_cast<char *>(dest);
1037 if (!WaitPackets(sd))
1039 ssize_t res = read(sd, ptr + done, size - done);
1049 bool WriteAll(int sd, const void * source, size_t size)
1052 const char * ptr = static_cast<const char *>(source);
1055 ssize_t res = write(sd, ptr + done, size - done);
1063 std::string ToPrintable(const std::string & src)
1067 for (size_t i = 0; i < src.size(); ++i)
1068 if (std::isprint(src[i]))
1071 dest += "\\" + x2str(src[i]);