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>
38 #include <sys/select.h>
43 #include <sys/socket.h>
44 #include <netinet/in.h>
45 #include <arpa/inet.h>
46 #include <sys/select.h>
60 #include "stg/common.h"
62 #ifndef INET_ADDRSTRLEN
63 # define INET_ADDRSTRLEN 16
68 //---------------------------------------------------------------------------
69 unsigned char koi2win[] = {
70 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
71 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
72 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
73 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
74 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
75 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
76 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
77 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
78 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
79 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
80 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
81 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
82 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
83 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
84 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
85 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
86 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
87 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
88 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
89 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
90 0xA0, 0xA1, 0xA2, 0xB8, 0xBA, 0xA5, 0xB3, 0xBF,
91 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB4, 0xAE, 0xAF,
92 0xB0, 0xB1, 0xB2, 0xA8, 0xAA, 0xB5, 0xB2, 0xAF,
93 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xA5, 0xBE, 0xBF,
94 0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
95 0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
96 0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
97 0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
98 0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
99 0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
100 0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
101 0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA};
104 unsigned char win2koi[] = {
105 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
106 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
107 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
108 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
109 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
110 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
111 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
112 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
113 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
114 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
115 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
116 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
117 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
118 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
119 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
120 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
121 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
122 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
123 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
124 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
125 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xBD, 0xA6, 0xA7,
126 0xB3, 0xA9, 0xB4, 0xAB, 0xAC, 0xAD, 0xAE, 0xB7,
127 0xB0, 0xB1, 0xB6, 0xA6, 0xAD, 0xB5, 0xB6, 0xB7,
128 0xA3, 0xB9, 0xA4, 0xBB, 0xBC, 0xBD, 0xBE, 0xA7,
129 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
130 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
131 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
132 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
133 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
134 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
135 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
136 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1};
140 //-----------------------------------------------------------------------------
141 const char * inet_ntop(int af, const void * src, char * dst, unsigned long length)
143 struct sockaddr_in addr;
144 addr.sin_family = af;
146 memcpy(&addr.sin_addr.s_addr, src, sizeof(addr.sin_addr.s_addr));
147 if (WSAAddressToStringA(reinterpret_cast<struct sockaddr *>(&addr), sizeof(addr), 0, dst, &length))
153 //-----------------------------------------------------------------------------
154 int inet_pton(int af, const char * src, void * dst)
156 // Fuck you Microsoft!
157 // Why the hell not to use const char *?
158 size_t slen = strlen(src);
159 char * buf = new char[slen + 1];
160 strncpy(buf, src, slen + 1);
162 struct sockaddr_in addr;
163 addr.sin_family = af;
165 addr.sin_addr.s_addr = 0;
166 int length = sizeof(addr);
167 if (WSAStringToAddressA(buf, af, 0, reinterpret_cast<struct sockaddr *>(&addr), &length))
172 memcpy(dst, &addr, sizeof(addr));
177 //-----------------------------------------------------------------------------
178 int strtodouble2(const char * s, double &a)
189 //-----------------------------------------------------------------------------
191 int printfd(const char * __file__, const char * fmt, ...)
193 int printfd(const char *, const char *, ...)
199 time_t t = time(NULL);
203 vsnprintf(buff, sizeof(buff), fmt, vl);
206 printf("%18s > %s > ", __file__, LogDate(t)+11);
212 //-----------------------------------------------------------------------------
213 int strprintf(std::string * str, const char * fmt, ...)
219 int n = vsnprintf(buff, sizeof(buff), fmt, vl);
226 //-----------------------------------------------------------------------------
227 const char *IntToKMG(int64_t a, int stat)
229 static const double K = 1024;
230 static const double M = 1024 * 1024;
231 static const double G = 1024 * 1024 * 1024;
239 sprintf(str, "%Ld", a);
241 sprintf(str, "%lld", a);
245 sprintf(str, "%.2f kb", value / K);
248 sprintf(str, "%.2f Mb", value / M);
253 sprintf(str, "%.2f Gb", value / G);
258 sprintf(str, "%.2f Gb", value / G);
263 sprintf(str, "%.2f Mb", value / M);
268 sprintf(str, "%.2f Mb", value / M);
272 sprintf(str, "%.2f kb", value / K);
277 //---------------------------------------------------------------------------
278 void KOIToWin(const char * s1, char * s2, int l)
280 for (int j = 0; j < l; j++)
282 unsigned char t = s1[j];
289 //---------------------------------------------------------------------------
290 void WinToKOI(const char * s1, char * s2, int l)
292 for (int j = 0; j < l; j++)
294 unsigned char t = s1[j];
301 //---------------------------------------------------------------------------
302 void KOIToWin(const std::string & s1, std::string * s2)
304 s2->erase(s2->begin(), s2->end());
305 s2->reserve(s1.length());
306 for (int j = 0; j < (int)s1.length(); j++)
308 unsigned char t = s1[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());
316 s2->reserve(s1.length());
317 for (int j = 0; j < (int)s1.length(); j++)
319 unsigned char t = s1[j];
320 s2->push_back(win2koi[t]);
323 //---------------------------------------------------------------------------
324 void Encode12str(std::string & dst, const std::string & src)
326 dst.erase(dst.begin(), dst.end());
327 for (size_t i = 0; i < src.length(); i++)
329 dst.push_back('a' + (src[i] & 0x0f));
330 dst.push_back('a' + ((src[i] & 0xf0) >> 4));
333 //---------------------------------------------------------------------------
334 void Decode21str(std::string & dst, const std::string & src)
336 dst.erase(dst.begin(), dst.end());
337 for (size_t i = 0; i < src.length() / 2; i++)
339 char c1 = src[i * 2];
340 char c2 = src[i * 2 + 1];
345 dst.push_back(static_cast<char>(c1 + (c2 << 4)));
348 //---------------------------------------------------------------------------
349 void Encode12(char * dst, const char * src, size_t srcLen)
351 for (size_t i = 0; i <= srcLen; i++)
353 char c1 = src[i] & 0x0f;
354 char c2 = (src[i] & 0xf0) >> 4;
364 //---------------------------------------------------------------------------
365 void Decode21(char * dst, const char * src)
367 for (size_t i = 0; ; i++)
372 char c1 = src[i * 2];
373 char c2 = src[i * 2 + 1];
378 dst[i] = static_cast<char>(c1 + (c2 << 4));
380 dst[strlen(src) / 2] = 0;
382 //---------------------------------------------------------------------------
383 int ParseIPString(const char * str, uint32_t * ips, int maxIP)
386 *Function Name:ParseIPString
389 ÓÔÒÏËÁ ÄÌÑ ÒÁÚÂÏÒÁ É ÍÁÓÓÉ× ËÕÄÁ ÚÁÎÏÓÉÔØ ÐÏÌÕÞÅÎÎÙÅ ÁÄÒÅÓÁ
392 îÁ ×ÈÏÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÁ ×ÉÄÁ "ip1,ip2,ip3" ÉÌÉ "*"
393 ÷ ÐÅÒ×ÏÍ ÓÌÕÞÁÅ × ÍÁÓÓÉ× ÚÁÎÏÓÑÔÓÑ ÒÁÚÏÂÒÁÎÎÙÅ ÁÄÒÅÓÁ.
394 åÓÌÉ ÉÈ ÍÅÎØÛÅ MAX_IP?, ÔÏ ÐÏÓÌÅÄÎÉÊ ÁÄÒÅÓ ÂÕÄÅÔ 255.255.255.255
395 åÓÌÉ ÓÔÒÏËÁ * , ÔÏ ÐÅÒ×ÁÙÊ ÁÄÒÅÓ ÂÕÄÅÔ 0.0.0.0, Ô.Å. ÌÀÂÏÊ
397 *Returns: 0 ÅÓÌÉ ×ÓÅ ïë
404 strncpy(p, str, 254);
407 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
409 if (str[0] == '*' && strlen(str) == 1)
415 for (int i = 0; i < maxIP; i++)
417 char * p1 = strtok(pp, ",\n ");
420 if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
431 if (inet_pton(AF_INET, p1, &in) != 1)
433 //printf("INADDR_NONE\n");
439 /*if (ips[n] == INADDR_NONE)
451 //-----------------------------------------------------------------------------
452 int DaysInCurrentMonth()
454 time_t t = time(NULL);
456 struct tm * lt = localtime(&t);
458 return DaysInMonth(lt->tm_year, lt->tm_mon);
460 //-----------------------------------------------------------------------------
461 int DaysInMonth(unsigned year, unsigned mon)
463 assert(mon < 12 && "Month number should be 0 - 11");
466 case 0: return 31; //jan
468 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
471 case 2: return 31; //mar
472 case 3: return 30; //apr
473 case 4: return 31; //may
474 case 5: return 30; //june
475 case 6: return 31; //jule
476 case 7: return 31; //aug
477 case 8: return 30; //sep
478 case 9: return 31; //oct
479 case 10: return 30; //nov
480 case 11: return 31; //dec
482 return -1; // We will never reach here
484 //-----------------------------------------------------------------------------
488 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
493 return a + (8 - a % 8);
495 //-----------------------------------------------------------------------------
496 /*char * inet_ntostr(unsigned long ip)
498 struct in_addr addr = {ip};
499 return inet_ntoa(addr);
501 //-----------------------------------------------------------------------------
502 std::string inet_ntostring(uint32_t ip)
504 char buf[INET_ADDRSTRLEN + 1];
505 return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
507 //-----------------------------------------------------------------------------
508 uint32_t inet_strington(const std::string & value)
512 if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
517 //-----------------------------------------------------------------------------
518 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
520 char hs1[10], ms1[10], hs2[10], ms2[10];
525 strncpy(ss, str, 48);
527 p1 = strtok(ss, "-");
533 p2 = strtok(NULL, "-");
539 p1 = strtok(s1, ":");
545 p2 = strtok(NULL, ":");
551 p1 = strtok(s2, ":");
557 p2 = strtok(NULL, ":");
563 if (str2x(hs1, h1) != 0)
566 if (str2x(ms1, m1) != 0)
569 if (str2x(hs2, h2) != 0)
572 if (str2x(ms2, m2) != 0)
577 /*//---------------------------------------------------------------------------
580 if (c >= '0' && c <= '9')
584 //-----------------------------------------------------------------------------
587 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
591 //-----------------------------------------------------------------------------
592 const char * LogDate(time_t t)
595 struct tm * tt = localtime(&t);
597 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
599 tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
600 tt->tm_mday < 10 ? "0" : "", tt->tm_mday,
601 tt->tm_hour < 10 ? "0" : "", tt->tm_hour,
602 tt->tm_min < 10 ? "0" : "", tt->tm_min,
603 tt->tm_sec < 10 ? "0" : "", tt->tm_sec);
607 //-----------------------------------------------------------------------------
608 uint32_t CalcMask(uint32_t msk)
610 if (msk >= 32) return 0xFFffFFff;
611 if (msk == 0) return 0;
612 return htonl(0xFFffFFff << (32 - msk));
614 //---------------------------------------------------------------------------
615 void TouchFile(const std::string & fileName)
617 FILE * f = fopen(fileName.c_str(), "w");
621 //---------------------------------------------------------------------------
623 void EncodeStr(char * str, unsigned long serial, int useHDD)
625 int len = strlen(str);
629 char serial_c[sizeof(serial)];
630 memcpy(serial_c, &serial, sizeof(serial));
632 for (i = 0; i < len; i++)
638 str[i] = str[i]^serial_c[j%sizeof(serial)];
643 for (i = 0; i < 2*len; i++)
647 c1 = (str[i/2] >> 4);
653 c2 = (str[i/2] & 0x0f);
661 //---------------------------------------------------------------------------
662 void DecodeStr(char * str, unsigned long serial, int useHDD)
664 size_t len = strlen(str);
666 char serial_c[sizeof(serial)];
667 memcpy(serial_c, &serial, sizeof(serial));
669 for (size_t i = 0; i < len; i += 2)
671 char c1 = (str[i] - 50);
672 char c2 = (str[i+1] - 50)<<4;
675 for (size_t i = 0; i < len/2; i++)
678 strdc[i] = strdc[i]^49;
681 strdc[i] = strdc[i]^serial_c[j%sizeof(serial)];
688 //---------------------------------------------------------------------------
690 void SwapBytes(uint16_t & value)
692 value = static_cast<uint16_t>((value >> 8) |
695 //---------------------------------------------------------------------------
696 void SwapBytes(uint32_t & value)
698 value = static_cast<uint32_t>((value >> 24) |
699 ((value << 8) & 0x00FF0000L) |
700 ((value >> 8) & 0x0000FF00L) |
703 //---------------------------------------------------------------------------
704 void SwapBytes(uint64_t & value)
706 value = static_cast<uint64_t>((value >> 56) |
707 ((value << 40) & 0x00FF000000000000LL) |
708 ((value << 24) & 0x0000FF0000000000LL) |
709 ((value << 8) & 0x000000FF00000000LL) |
710 ((value >> 8) & 0x00000000FF000000LL) |
711 ((value >> 24) & 0x0000000000FF0000LL) |
712 ((value >> 40) & 0x000000000000FF00LL) |
715 //---------------------------------------------------------------------------
716 void SwapBytes(int16_t & value)
718 uint16_t temp = value;
722 //---------------------------------------------------------------------------
723 void SwapBytes(int32_t & value)
725 uint32_t temp = value;
729 //---------------------------------------------------------------------------
730 void SwapBytes(int64_t & value)
732 uint64_t temp = value;
736 //---------------------------------------------------------------------------
737 std::string formatTime(time_t ts)
740 struct tm brokenTime;
742 brokenTime.tm_wday = 0;
743 brokenTime.tm_yday = 0;
744 brokenTime.tm_isdst = 0;
746 gmtime_r(&ts, &brokenTime);
748 strftime(buf, 32, "%Y-%m-%d %H:%M:%S", &brokenTime);
752 //---------------------------------------------------------------------------
753 time_t readTime(const std::string & ts)
755 if (ts == "0000-00-00 00:00:00")
758 struct tm brokenTime;
760 brokenTime.tm_wday = 0;
761 brokenTime.tm_yday = 0;
762 brokenTime.tm_isdst = 0;
764 stg_strptime(ts.c_str(), "%Y-%m-%d %H:%M:%S", &brokenTime);
766 return stg_timegm(&brokenTime);
768 //---------------------------------------------------------------------------
769 int str2x(const std::string & str, int32_t & x)
771 x = static_cast<int32_t>(strtol(str.c_str(), NULL, 10));
778 //---------------------------------------------------------------------------
779 int str2x(const std::string & str, uint32_t & x)
781 x = static_cast<uint32_t>(strtoul(str.c_str(), NULL, 10));
788 //---------------------------------------------------------------------------
789 int str2x(const std::string & str, double & x)
791 return strtodouble2(str.c_str(), x);
794 //---------------------------------------------------------------------------
795 int str2x(const std::string & str, int64_t & x)
797 x = strtoll(str.c_str(), NULL, 10);
804 //---------------------------------------------------------------------------
805 int str2x(const std::string & str, uint64_t & x)
807 x = strtoull(str.c_str(), NULL, 10);
815 //---------------------------------------------------------------------------
816 const std::string & x2str(uint32_t x, std::string & s)
818 return unsigned2str(x, s);
820 //---------------------------------------------------------------------------
821 const std::string & x2str(uint64_t x, std::string & s)
823 return unsigned2str(x, s);
825 //---------------------------------------------------------------------------
826 const std::string & x2str(double x, std::string & s)
829 snprintf(buf, sizeof(buf), "%f", x);
833 //---------------------------------------------------------------------------
834 std::string & TrimL(std::string & val)
836 size_t pos = val.find_first_not_of(" \t");
837 if (pos == std::string::npos)
839 val.erase(val.begin(), val.end());
847 //---------------------------------------------------------------------------
848 std::string & TrimR(std::string & val)
850 size_t pos = val.find_last_not_of(" \t");
851 if (pos != std::string::npos)
857 //---------------------------------------------------------------------------
858 std::string & Trim(std::string & val)
860 return TrimR(TrimL(val));
862 //---------------------------------------------------------------------------
863 std::string ToLower(std::string value)
865 std::transform(value.begin(), value.end(), value.begin(), ::tolower);
868 //---------------------------------------------------------------------------
869 std::string ToUpper(std::string value)
871 std::transform(value.begin(), value.end(), value.begin(), ::toupper);
874 //---------------------------------------------------------------------------
876 static int is_leap(unsigned y)
879 return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0);
882 //---------------------------------------------------------------------------
884 time_t stg_timegm(struct tm * brokenTime)
887 static const unsigned ndays[2][12] ={
888 {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
889 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
891 for (int i = 70; i < brokenTime->tm_year; ++i)
892 res += is_leap(i) ? 366 : 365;
893 for (int i = 0; i < brokenTime->tm_mon; ++i)
894 res += ndays[is_leap(brokenTime->tm_year)][i];
895 res += brokenTime->tm_mday - 1;
897 res += brokenTime->tm_hour;
899 res += brokenTime->tm_min;
901 res += brokenTime->tm_sec;
905 return timegm(brokenTime);
912 ret = mktime(brokenTime);
919 #endif // HAVE_TIMEGM
922 //---------------------------------------------------------------------------
923 std::string IconvString(const std::string & source,
924 const std::string & from,
925 const std::string & to)
928 return std::string();
930 size_t inBytesLeft = source.length() + 1;
931 size_t outBytesLeft = source.length() * 2 + 1;
933 char * inBuf = new char[inBytesLeft];
934 char * outBuf = new char[outBytesLeft];
936 strncpy(inBuf, source.c_str(), source.length());
938 inBuf[source.length()] = 0;
940 #if defined(CONST_ICONV)
941 const char * srcPos = inBuf;
943 char * srcPos = inBuf;
945 char * dstPos = outBuf;
947 iconv_t handle = iconv_open(to.c_str(),
950 if (handle == iconv_t(-1))
954 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
960 printfd(__FILE__, "IconvString(): iconv_open error\n");
967 size_t res = iconv(handle,
968 &srcPos, &inBytesLeft,
969 &dstPos, &outBytesLeft);
971 if (res == size_t(-1))
973 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
983 std::string dst(outBuf);
993 int ParseYesNo(const std::string & str, bool * val)
995 if (0 == strncasecmp(str.c_str(), "yes", 3))
1001 if (0 == strncasecmp(str.c_str(), "no", 2))
1010 int ParseInt(const std::string & str, int * val)
1012 if (str2x<int>(str, *val))
1017 int ParseUnsigned(const std::string & str, unsigned * val)
1019 if (str2x<unsigned>(str, *val))
1024 int ParseIntInRange(const std::string & str, int min, int max, int * val)
1026 if (ParseInt(str, val) != 0)
1029 if (*val < min || *val > max)
1035 int ParseUnsignedInRange(const std::string & str, unsigned min,
1036 unsigned max, unsigned * val)
1038 if (ParseUnsigned(str, val) != 0)
1041 if (*val < min || *val > max)
1047 bool WaitPackets(int sd)
1055 tv.tv_usec = 500000;
1057 int res = select(sd + 1, &rfds, NULL, NULL, &tv);
1058 if (res == -1) // Error
1061 printfd(__FILE__, "Error on select: '%s'\n", strerror(errno));
1065 if (res == 0) // Timeout
1071 bool ReadAll(int sd, void * dest, size_t size)
1074 char * ptr = static_cast<char *>(dest);
1077 if (!WaitPackets(sd))
1079 ssize_t res = read(sd, ptr + done, size - done);
1089 bool WriteAll(int sd, const void * source, size_t size)
1092 const char * ptr = static_cast<const char *>(source);
1095 ssize_t res = write(sd, ptr + done, size - done);
1103 std::string ToPrintable(const std::string & src)
1107 for (size_t i = 0; i < src.size(); ++i)
1108 if (std::isprint(src[i]))
1111 dest += "\\" + x2str(src[i]);
1116 uid_t str2uid(const std::string& name)
1118 const passwd* res = getpwnam(name.c_str());
1124 gid_t str2gid(const std::string& name)
1126 const group* res = getgrnam(name.c_str());
1132 mode_t str2mode(const std::string& name)
1134 if (name.length() < 3 || name.length() > 4)
1137 if (name.length() == 4 && name[0] != '0')
1141 for (size_t i = 0; i < name.length(); ++i)
1143 if (name[i] > '7' || name[i] < '0')
1145 res = (res << 3) + (name[i] - '0');