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>
58 #include "stg/common.h"
60 #ifndef INET_ADDRSTRLEN
61 # define INET_ADDRSTRLEN 16
66 //---------------------------------------------------------------------------
67 unsigned char koi2win[] = {
68 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
69 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
70 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
71 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
72 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
73 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
74 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
75 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
76 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
77 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
78 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
79 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
80 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
81 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
82 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
83 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
84 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
85 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
86 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
87 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
88 0xA0, 0xA1, 0xA2, 0xB8, 0xBA, 0xA5, 0xB3, 0xBF,
89 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB4, 0xAE, 0xAF,
90 0xB0, 0xB1, 0xB2, 0xA8, 0xAA, 0xB5, 0xB2, 0xAF,
91 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xA5, 0xBE, 0xBF,
92 0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
93 0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
94 0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
95 0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
96 0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
97 0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
98 0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
99 0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA};
102 unsigned char win2koi[] = {
103 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
104 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
105 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
106 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
107 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
108 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
109 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
110 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
111 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
112 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
113 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
114 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
115 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
116 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
117 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
118 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
119 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
120 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
121 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
122 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
123 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xBD, 0xA6, 0xA7,
124 0xB3, 0xA9, 0xB4, 0xAB, 0xAC, 0xAD, 0xAE, 0xB7,
125 0xB0, 0xB1, 0xB6, 0xA6, 0xAD, 0xB5, 0xB6, 0xB7,
126 0xA3, 0xB9, 0xA4, 0xBB, 0xBC, 0xBD, 0xBE, 0xA7,
127 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
128 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
129 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
130 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
131 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
132 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
133 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
134 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1};
138 //-----------------------------------------------------------------------------
139 const char * inet_ntop(int af, const void * src, char * dst, unsigned long length)
141 struct sockaddr_in addr;
142 addr.sin_family = af;
144 memcpy(&addr.sin_addr.s_addr, src, sizeof(addr.sin_addr.s_addr));
145 if (WSAAddressToStringA(reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr), 0, dst, &length))
151 //-----------------------------------------------------------------------------
152 int inet_pton(int af, const char * src, void * dst)
154 // Fuck you Microsoft!
155 // Why the hell not to use const char *?
156 size_t slen = strlen(src);
157 char * buf = new char[slen + 1];
158 strncpy(buf, src, slen + 1);
160 struct sockaddr_in addr;
161 addr.sin_family = af;
163 addr.sin_addr.s_addr = 0;
164 int length = sizeof(addr);
165 if (WSAStringToAddressA(buf, af, 0, reinterpret_cast<struct sockaddr *>(&addr), &length))
170 memcpy(dst, &addr, sizeof(addr));
175 //-----------------------------------------------------------------------------
176 int strtodouble2(const char * s, double &a)
187 //-----------------------------------------------------------------------------
189 int printfd(const char * __file__, const char * fmt, ...)
191 int printfd(const char *, const char *, ...)
197 time_t t = time(NULL);
201 vsnprintf(buff, sizeof(buff), fmt, vl);
204 printf("%18s > %s > ", __file__, LogDate(t)+11);
210 //-----------------------------------------------------------------------------
211 int strprintf(std::string * str, const char * fmt, ...)
217 int n = vsnprintf(buff, sizeof(buff), fmt, vl);
224 //-----------------------------------------------------------------------------
225 const char *IntToKMG(int64_t a, int stat)
227 static const double K = 1024;
228 static const double M = 1024 * 1024;
229 static const double G = 1024 * 1024 * 1024;
237 sprintf(str, "%Ld", a);
239 sprintf(str, "%lld", a);
243 sprintf(str, "%.2f kb", value / K);
246 sprintf(str, "%.2f Mb", value / M);
251 sprintf(str, "%.2f Gb", value / G);
256 sprintf(str, "%.2f Gb", value / G);
261 sprintf(str, "%.2f Mb", value / M);
266 sprintf(str, "%.2f Mb", value / M);
270 sprintf(str, "%.2f kb", value / K);
275 //---------------------------------------------------------------------------
276 void KOIToWin(const char * s1, char * s2, int l)
278 for (int j = 0; j < l; j++)
280 unsigned char t = s1[j];
287 //---------------------------------------------------------------------------
288 void WinToKOI(const char * s1, char * s2, int l)
290 for (int j = 0; j < l; j++)
292 unsigned char t = s1[j];
299 //---------------------------------------------------------------------------
300 void KOIToWin(const std::string & s1, std::string * s2)
302 s2->erase(s2->begin(), s2->end());
303 s2->reserve(s1.length());
304 for (int j = 0; j < (int)s1.length(); j++)
306 unsigned char t = s1[j];
307 s2->push_back(koi2win[t]);
310 //---------------------------------------------------------------------------
311 void WinToKOI(const std::string & s1, std::string * s2)
313 s2->erase(s2->begin(), s2->end());
314 s2->reserve(s1.length());
315 for (int j = 0; j < (int)s1.length(); j++)
317 unsigned char t = s1[j];
318 s2->push_back(win2koi[t]);
321 //---------------------------------------------------------------------------
322 void Encode12str(std::string & dst, const std::string & src)
324 dst.erase(dst.begin(), dst.end());
325 for (size_t i = 0; i < src.length(); i++)
327 dst.push_back('a' + (src[i] & 0x0f));
328 dst.push_back('a' + ((src[i] & 0xf0) >> 4));
331 //---------------------------------------------------------------------------
332 void Decode21str(std::string & dst, const std::string & src)
334 dst.erase(dst.begin(), dst.end());
335 for (size_t i = 0; i < src.length() / 2; i++)
337 char c1 = src[i * 2];
338 char c2 = src[i * 2 + 1];
343 dst.push_back(static_cast<char>(c1 + (c2 << 4)));
346 //---------------------------------------------------------------------------
347 std::string Encode12str(const std::string & src)
350 Encode12str(res, src);
353 //---------------------------------------------------------------------------
354 std::string Decode21str(const std::string & src)
357 Decode21str(res, src);
360 //---------------------------------------------------------------------------
361 void Encode12(char * dst, const char * src, size_t srcLen)
363 for (size_t i = 0; i <= srcLen; i++)
365 char c1 = src[i] & 0x0f;
366 char c2 = (src[i] & 0xf0) >> 4;
376 //---------------------------------------------------------------------------
377 void Decode21(char * dst, const char * src)
379 for (size_t i = 0; ; i++)
384 char c1 = src[i * 2];
385 char c2 = src[i * 2 + 1];
390 dst[i] = static_cast<char>(c1 + (c2 << 4));
392 dst[strlen(src) / 2] = 0;
394 //---------------------------------------------------------------------------
395 int ParseIPString(const char * str, uint32_t * ips, int maxIP)
398 *Function Name:ParseIPString
401 ÓÔÒÏËÁ ÄÌÑ ÒÁÚÂÏÒÁ É ÍÁÓÓÉ× ËÕÄÁ ÚÁÎÏÓÉÔØ ÐÏÌÕÞÅÎÎÙÅ ÁÄÒÅÓÁ
404 îÁ ×ÈÏÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÁ ×ÉÄÁ "ip1,ip2,ip3" ÉÌÉ "*"
405 ÷ ÐÅÒ×ÏÍ ÓÌÕÞÁÅ × ÍÁÓÓÉ× ÚÁÎÏÓÑÔÓÑ ÒÁÚÏÂÒÁÎÎÙÅ ÁÄÒÅÓÁ.
406 åÓÌÉ ÉÈ ÍÅÎØÛÅ MAX_IP?, ÔÏ ÐÏÓÌÅÄÎÉÊ ÁÄÒÅÓ ÂÕÄÅÔ 255.255.255.255
407 åÓÌÉ ÓÔÒÏËÁ * , ÔÏ ÐÅÒ×ÁÙÊ ÁÄÒÅÓ ÂÕÄÅÔ 0.0.0.0, Ô.Å. ÌÀÂÏÊ
409 *Returns: 0 ÅÓÌÉ ×ÓÅ ïë
416 strncpy(p, str, 254);
419 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
421 if (str[0] == '*' && strlen(str) == 1)
427 for (int i = 0; i < maxIP; i++)
429 char * p1 = strtok(pp, ",\n ");
432 if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
443 if (inet_pton(AF_INET, p1, &in) != 1)
445 //printf("INADDR_NONE\n");
451 /*if (ips[n] == INADDR_NONE)
463 //-----------------------------------------------------------------------------
464 int DaysInCurrentMonth()
466 time_t t = time(NULL);
468 struct tm * lt = localtime(&t);
470 return DaysInMonth(lt->tm_year, lt->tm_mon);
472 //-----------------------------------------------------------------------------
473 int DaysInMonth(unsigned year, unsigned mon)
475 assert(mon < 12 && "Month number should be 0 - 11");
478 case 0: return 31; //jan
480 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
483 case 2: return 31; //mar
484 case 3: return 30; //apr
485 case 4: return 31; //may
486 case 5: return 30; //june
487 case 6: return 31; //jule
488 case 7: return 31; //aug
489 case 8: return 30; //sep
490 case 9: return 31; //oct
491 case 10: return 30; //nov
492 case 11: return 31; //dec
494 return -1; // We will never reach here
496 //-----------------------------------------------------------------------------
500 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
505 return a + (8 - a % 8);
507 //-----------------------------------------------------------------------------
508 /*char * inet_ntostr(unsigned long ip)
510 struct in_addr addr = {ip};
511 return inet_ntoa(addr);
513 //-----------------------------------------------------------------------------
514 std::string inet_ntostring(uint32_t ip)
516 char buf[INET_ADDRSTRLEN + 1];
517 return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
519 //-----------------------------------------------------------------------------
520 uint32_t inet_strington(const std::string & value)
524 if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
529 //-----------------------------------------------------------------------------
530 std::string TimeToString(time_t time)
532 struct tm brokenTime;
534 brokenTime.tm_wday = 0;
535 brokenTime.tm_yday = 0;
536 brokenTime.tm_isdst = 0;
538 gmtime_r(&time, &brokenTime);
541 strftime(buf, 32, "%Y-%m-%d %H:%M:%S", &brokenTime);
545 //-----------------------------------------------------------------------------
546 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
548 char hs1[10], ms1[10], hs2[10], ms2[10];
553 strncpy(ss, str, 48);
555 p1 = strtok(ss, "-");
561 p2 = strtok(NULL, "-");
567 p1 = strtok(s1, ":");
573 p2 = strtok(NULL, ":");
579 p1 = strtok(s2, ":");
585 p2 = strtok(NULL, ":");
591 if (str2x(hs1, h1) != 0)
594 if (str2x(ms1, m1) != 0)
597 if (str2x(hs2, h2) != 0)
600 if (str2x(ms2, m2) != 0)
605 /*//---------------------------------------------------------------------------
608 if (c >= '0' && c <= '9')
612 //-----------------------------------------------------------------------------
615 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
619 //-----------------------------------------------------------------------------
620 const char * LogDate(time_t t)
623 struct tm * tt = localtime(&t);
625 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
627 tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
628 tt->tm_mday < 10 ? "0" : "", tt->tm_mday,
629 tt->tm_hour < 10 ? "0" : "", tt->tm_hour,
630 tt->tm_min < 10 ? "0" : "", tt->tm_min,
631 tt->tm_sec < 10 ? "0" : "", tt->tm_sec);
635 //-----------------------------------------------------------------------------
636 uint32_t CalcMask(uint32_t msk)
638 if (msk >= 32) return 0xFFffFFff;
639 if (msk == 0) return 0;
640 return htonl(0xFFffFFff << (32 - msk));
642 //---------------------------------------------------------------------------
643 void TouchFile(const std::string & fileName)
645 FILE * f = fopen(fileName.c_str(), "w");
649 //---------------------------------------------------------------------------
651 void EncodeStr(char * str, unsigned long serial, int useHDD)
653 int len = strlen(str);
657 char serial_c[sizeof(serial)];
658 memcpy(serial_c, &serial, sizeof(serial));
660 for (i = 0; i < len; i++)
666 str[i] = str[i]^serial_c[j%sizeof(serial)];
671 for (i = 0; i < 2*len; i++)
675 c1 = (str[i/2] >> 4);
681 c2 = (str[i/2] & 0x0f);
689 //---------------------------------------------------------------------------
690 void DecodeStr(char * str, unsigned long serial, int useHDD)
692 size_t len = strlen(str);
694 char serial_c[sizeof(serial)];
695 memcpy(serial_c, &serial, sizeof(serial));
697 for (size_t i = 0; i < len; i += 2)
699 char c1 = (str[i] - 50);
700 char c2 = (str[i+1] - 50)<<4;
703 for (size_t i = 0; i < len/2; i++)
706 strdc[i] = strdc[i]^49;
709 strdc[i] = strdc[i]^serial_c[j%sizeof(serial)];
716 //---------------------------------------------------------------------------
718 void SwapBytes(uint16_t & value)
720 value = static_cast<uint16_t>((value >> 8) |
723 //---------------------------------------------------------------------------
724 void SwapBytes(uint32_t & value)
726 value = static_cast<uint32_t>((value >> 24) |
727 ((value << 8) & 0x00FF0000L) |
728 ((value >> 8) & 0x0000FF00L) |
731 //---------------------------------------------------------------------------
732 void SwapBytes(uint64_t & value)
734 value = static_cast<uint64_t>((value >> 56) |
735 ((value << 40) & 0x00FF000000000000LL) |
736 ((value << 24) & 0x0000FF0000000000LL) |
737 ((value << 8) & 0x000000FF00000000LL) |
738 ((value >> 8) & 0x00000000FF000000LL) |
739 ((value >> 24) & 0x0000000000FF0000LL) |
740 ((value >> 40) & 0x000000000000FF00LL) |
743 //---------------------------------------------------------------------------
744 void SwapBytes(int16_t & value)
746 uint16_t temp = value;
750 //---------------------------------------------------------------------------
751 void SwapBytes(int32_t & value)
753 uint32_t temp = value;
757 //---------------------------------------------------------------------------
758 void SwapBytes(int64_t & value)
760 uint64_t temp = value;
764 //---------------------------------------------------------------------------
765 int str2x(const std::string & str, int32_t & x)
767 x = static_cast<int32_t>(strtol(str.c_str(), NULL, 10));
774 //---------------------------------------------------------------------------
775 int str2x(const std::string & str, uint32_t & x)
777 x = static_cast<uint32_t>(strtoul(str.c_str(), NULL, 10));
785 //---------------------------------------------------------------------------
786 int str2x(const std::string & str, int64_t & x)
788 x = strtoll(str.c_str(), NULL, 10);
795 //---------------------------------------------------------------------------
796 int str2x(const std::string & str, uint64_t & x)
798 x = strtoull(str.c_str(), NULL, 10);
806 //---------------------------------------------------------------------------
807 const std::string & x2str(uint32_t x, std::string & s)
809 return unsigned2str(x, s);
811 //---------------------------------------------------------------------------
812 const std::string & x2str(uint64_t x, std::string & s)
814 return unsigned2str(x, s);
816 //---------------------------------------------------------------------------
817 const std::string & x2str(double x, std::string & s)
820 snprintf(buf, sizeof(buf), "%f", x);
824 //---------------------------------------------------------------------------
825 std::string & TrimL(std::string & val)
827 size_t pos = val.find_first_not_of(" \t");
828 if (pos == std::string::npos)
830 val.erase(val.begin(), val.end());
838 //---------------------------------------------------------------------------
839 std::string & TrimR(std::string & val)
841 size_t pos = val.find_last_not_of(" \t");
842 if (pos != std::string::npos)
848 //---------------------------------------------------------------------------
849 std::string & Trim(std::string & val)
851 return TrimR(TrimL(val));
853 //---------------------------------------------------------------------------
854 std::string Trim(const std::string & val)
856 std::string res(val);
857 return TrimR(TrimL(res));
859 //---------------------------------------------------------------------------
860 std::string ToLower(std::string value)
862 std::transform(value.begin(), value.end(), value.begin(), ::tolower);
865 //---------------------------------------------------------------------------
866 std::string ToUpper(std::string value)
868 std::transform(value.begin(), value.end(), value.begin(), ::toupper);
871 //---------------------------------------------------------------------------
873 static int is_leap(unsigned y)
876 return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
879 //---------------------------------------------------------------------------
881 time_t stg_timegm(struct tm * brokenTime)
884 static const unsigned ndays[2][12] ={
885 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
886 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
888 for (int i = 70; i < brokenTime->tm_year; ++i)
889 res += is_leap(i) ? 366 : 365;
890 for (int i = 0; i < brokenTime->tm_mon; ++i)
891 res += ndays[is_leap(brokenTime->tm_year)][i];
892 res += brokenTime->tm_mday - 1;
894 res += brokenTime->tm_hour;
896 res += brokenTime->tm_min;
898 res += brokenTime->tm_sec;
902 return timegm(brokenTime);
909 ret = mktime(brokenTime);
916 #endif // HAVE_TIMEGM
919 //---------------------------------------------------------------------------
920 std::string IconvString(const std::string & source,
921 const std::string & from,
922 const std::string & to)
925 return std::string();
927 size_t inBytesLeft = source.length() + 1;
928 size_t outBytesLeft = source.length() * 2 + 1;
930 char * inBuf = new char[inBytesLeft];
931 char * outBuf = new char[outBytesLeft];
933 strncpy(inBuf, source.c_str(), source.length());
935 inBuf[source.length()] = 0;
937 #if defined(FREE_BSD) || defined(FREE_BSD5) || defined(WIN32)
938 const char * srcPos = inBuf;
940 char * srcPos = inBuf;
942 char * dstPos = outBuf;
944 iconv_t handle = iconv_open(to.c_str(),
947 if (handle == iconv_t(-1))
951 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
957 printfd(__FILE__, "IconvString(): iconv_open error\n");
964 size_t res = iconv(handle,
965 &srcPos, &inBytesLeft,
966 &dstPos, &outBytesLeft);
968 if (res == size_t(-1))
970 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
980 std::string dst(outBuf);
990 int ParseYesNo(const std::string & str, bool * val)
992 if (0 == strncasecmp(str.c_str(), "yes", 3))
998 if (0 == strncasecmp(str.c_str(), "no", 2))
1007 int ParseInt(const std::string & str, int * val)
1009 if (str2x<int>(str, *val))
1014 int ParseUnsigned(const std::string & str, unsigned * val)
1016 if (str2x<unsigned>(str, *val))
1021 int ParseIntInRange(const std::string & str, int min, int max, int * val)
1023 if (ParseInt(str, val) != 0)
1026 if (*val < min || *val > max)
1032 int ParseUnsignedInRange(const std::string & str, unsigned min,
1033 unsigned max, unsigned * val)
1035 if (ParseUnsigned(str, val) != 0)
1038 if (*val < min || *val > max)
1044 bool WaitPackets(int sd)
1052 tv.tv_usec = 500000;
1054 int res = select(sd + 1, &rfds, NULL, NULL, &tv);
1055 if (res == -1) // Error
1058 printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
1062 if (res == 0) // Timeout
1068 bool ReadAll(int sd, void * dest, size_t size)
1071 char * ptr = static_cast<char *>(dest);
1074 if (!WaitPackets(sd))
1076 ssize_t res = read(sd, ptr + done, size - done);
1086 bool WriteAll(int sd, const void * source, size_t size)
1089 const char * ptr = static_cast<const char *>(source);
1092 ssize_t res = write(sd, ptr + done, size - done);
1100 std::string ToPrintable(const std::string & src)
1104 for (size_t i = 0; i < src.size(); ++i)
1105 if (std::isprint(src[i]))
1108 dest += "\\" + x2str(src[i]);