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/03 10:26:30 $
32 /*#include <sys/stat.h>
44 #include <sys/types.h>
48 #include <sysutils.hpp>
52 #include <netinet/in.h>
53 #include <arpa/inet.h>
54 #include <sys/socket.h>
57 #include <sys/socket.h>
58 #include <netinet/in.h>
59 #include <arpa/inet.h>
71 #ifndef INET_ADDRSTRLEN
72 # define INET_ADDRSTRLEN 16
77 //-----------------------------------------------------------------------------
78 int strtodouble2(const char * s, double &a)
89 //-----------------------------------------------------------------------------
91 int printfd(const char * __file__, const char * fmt, ...)
93 int printfd(const char *, const char *, ...)
99 time_t t = time(NULL);
103 vsnprintf(buff, sizeof(buff), fmt, vl);
106 printf("%18s > %s > ", __file__, LogDate(t)+11);
112 //-----------------------------------------------------------------------------
113 int strprintf(string * str, const char * fmt, ...)
119 int n = vsnprintf(buff, sizeof(buff), fmt, vl);
126 //-----------------------------------------------------------------------------
127 const char *IntToKMG(long long a, int stat)
129 static int64_t M = 1024*1024;
130 static int64_t G = 1024*1024*1024;
137 sprintf(str, "%Ld", a);
139 sprintf(str, "%lld", a);
143 sprintf(str, "%.2f kb", double(a)/1024.0);
146 sprintf(str, "%.2f Mb", double(a)/(1024.0*1024.0));
151 sprintf(str, "%.2f Gb", double(a)/double(G));
156 sprintf(str, "%.2f Gb", double(a)/double(G));
161 sprintf(str, "%.2f Mb", double(a)/double(M));
166 sprintf(str, "%.2f Mb", double(a)/double(M));
170 sprintf(str, "%.2f kb", double(a)/1024.0);
175 //---------------------------------------------------------------------------
176 unsigned char koi2win[] = {
177 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
178 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
179 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
180 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
181 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
182 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
183 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
184 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
185 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
186 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
187 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
188 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
189 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
190 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
191 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
192 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
193 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
194 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
195 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
196 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
197 0xA0, 0xA1, 0xA2, 0xB8, 0xBA, 0xA5, 0xB3, 0xBF,
198 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB4, 0xAE, 0xAF,
199 0xB0, 0xB1, 0xB2, 0xA8, 0xAA, 0xB5, 0xB2, 0xAF,
200 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xA5, 0xBE, 0xBF,
201 0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
202 0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
203 0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
204 0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
205 0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
206 0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
207 0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
208 0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA};
211 unsigned char win2koi[] = {
212 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
213 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
214 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
215 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
216 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
217 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
218 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
219 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
220 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
221 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
222 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
223 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
224 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
225 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
226 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
227 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
228 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
229 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
230 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
231 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
232 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xBD, 0xA6, 0xA7,
233 0xB3, 0xA9, 0xB4, 0xAB, 0xAC, 0xAD, 0xAE, 0xB7,
234 0xB0, 0xB1, 0xB6, 0xA6, 0xAD, 0xB5, 0xB6, 0xB7,
235 0xA3, 0xB9, 0xA4, 0xBB, 0xBC, 0xBD, 0xBE, 0xA7,
236 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
237 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
238 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
239 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
240 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
241 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
242 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
243 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1};
244 //---------------------------------------------------------------------------
245 void KOIToWin(const char * s1, char * s2, int l)
248 for (int j = 0; j < l; j++)
257 //---------------------------------------------------------------------------
258 void WinToKOI(const char * s1, char * s2, int l)
261 for (int j = 0; j < l; j++)
270 //---------------------------------------------------------------------------
271 void KOIToWin(const string & s1, string * s2)
273 s2->erase(s2->begin(), s2->end());
275 s2->reserve(s1.length());
276 for (int j = 0; j < (int)s1.length(); j++)
279 s2->push_back(koi2win[t]);
282 //---------------------------------------------------------------------------
283 void WinToKOI(const string & s1, string * s2)
285 s2->erase(s2->begin(), s2->end());
287 s2->reserve(s1.length());
288 for (int j = 0; j < (int)s1.length(); j++)
291 s2->push_back(win2koi[t]);
294 //---------------------------------------------------------------------------
295 void Encode12str(string & dst, const string & src)
297 dst.erase(dst.begin(), dst.end());
298 for (size_t i = 0; i < src.length(); i++)
300 dst.push_back('a' + (src[i] & 0x0f));
301 dst.push_back('a' + ((src[i] & 0xf0) >> 4));
304 //---------------------------------------------------------------------------
305 void Decode21str(std::string & dst, const std::string & src)
307 dst.erase(dst.begin(), dst.end());
308 for (size_t i = 0; i < src.length() / 2; i++)
310 char c1 = src[i * 2];
311 char c2 = src[i * 2 + 1];
316 dst.push_back(c1 + (c2 << 4));
319 //---------------------------------------------------------------------------
320 void Encode12(char * dst, const char * src, size_t srcLen)
322 for (size_t i = 0; i <= srcLen; i++)
327 dst[i * 2 + 1] = 'a';
330 char c1 = src[i] & 0x0f;
331 char c2 = (src[i] & 0xf0) >> 4;
341 //---------------------------------------------------------------------------
342 void Decode21(char * dst, const char * src)
344 for (size_t i = 0; ; i++)
349 char c1 = src[i * 2];
350 char c2 = src[i * 2 + 1];
355 dst[i] = c1 + (c2 << 4);
357 dst[strlen(src) / 2] = 0;
359 //---------------------------------------------------------------------------
360 int ParseIPString(const char * str, uint32_t * ips, int maxIP)
363 *Function Name:ParseIPString
366 ÓÔÒÏËÁ ÄÌÑ ÒÁÚÂÏÒÁ É ÍÁÓÓÉ× ËÕÄÁ ÚÁÎÏÓÉÔØ ÐÏÌÕÞÅÎÎÙÅ ÁÄÒÅÓÁ
369 îÁ ×ÈÏÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÁ ×ÉÄÁ "ip1,ip2,ip3" ÉÌÉ "*"
370 ÷ ÐÅÒ×ÏÍ ÓÌÕÞÁÅ × ÍÁÓÓÉ× ÚÁÎÏÓÑÔÓÑ ÒÁÚÏÂÒÁÎÎÙÅ ÁÄÒÅÓÁ.
371 åÓÌÉ ÉÈ ÍÅÎØÛÅ MAX_IP?, ÔÏ ÐÏÓÌÅÄÎÉÊ ÁÄÒÅÓ ÂÕÄÅÔ 255.255.255.255
372 åÓÌÉ ÓÔÒÏËÁ * , ÔÏ ÐÅÒ×ÁÙÊ ÁÄÒÅÓ ÂÕÄÅÔ 0.0.0.0, Ô.Å. ÌÀÂÏÊ
374 *Returns: 0 ÅÓÌÉ ×ÓÅ ïë
382 strncpy(p, str, 254);
385 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
387 if (str[0] == '*' && strlen(str) == 1)
393 for (int i = 0; i < maxIP; i++)
395 p1 = strtok(pp, ",\n ");
398 if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
409 if (!inet_aton(p1, &in))
411 //printf("INADDR_NONE\n");
417 /*if (ips[n] == INADDR_NONE)
429 //-----------------------------------------------------------------------------
430 int DaysInCurrentMonth()
432 time_t t = time(NULL);
434 struct tm * lt = localtime(&t);
436 return DaysInMonth(lt->tm_year, lt->tm_mon);
438 //-----------------------------------------------------------------------------
439 int DaysInMonth(unsigned year, unsigned mon)
441 assert(mon < 12 && "Month number should be 0 - 11");
444 case 0: return 31; //jan
446 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
449 case 2: return 31; //mar
450 case 3: return 30; //apr
451 case 4: return 31; //may
452 case 5: return 30; //june
453 case 6: return 31; //jule
454 case 7: return 31; //aug
455 case 8: return 30; //sep
456 case 9: return 31; //oct
457 case 10: return 30; //nov
458 case 11: return 31; //dec
460 return -1; // We will never reach here
462 //-----------------------------------------------------------------------------
466 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
471 return a + (8 - a % 8);
473 //-----------------------------------------------------------------------------
474 /*char * inet_ntostr(unsigned long ip)
476 struct in_addr addr = {ip};
477 return inet_ntoa(addr);
479 //-----------------------------------------------------------------------------
480 std::string inet_ntostring(uint32_t ip)
482 char buf[INET_ADDRSTRLEN + 1];
483 return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
485 //-----------------------------------------------------------------------------
486 uint32_t inet_strington(const std::string & value)
490 if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
495 //-----------------------------------------------------------------------------
496 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
498 char hs1[10], ms1[10], hs2[10], ms2[10];
503 strncpy(ss, str, 48);
505 p1 = strtok(ss, "-");
511 p2 = strtok(NULL, "-");
517 p1 = strtok(s1, ":");
523 p2 = strtok(NULL, ":");
529 p1 = strtok(s2, ":");
535 p2 = strtok(NULL, ":");
541 if (str2x(hs1, h1) != 0)
544 if (str2x(ms1, m1) != 0)
547 if (str2x(hs2, h2) != 0)
550 if (str2x(ms2, m2) != 0)
555 /*//---------------------------------------------------------------------------
558 if (c >= '0' && c <= '9')
562 //-----------------------------------------------------------------------------
565 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
569 //-----------------------------------------------------------------------------
570 const char * LogDate(time_t t)
573 struct tm * tt = localtime(&t);
575 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
577 tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
578 tt->tm_mday < 10 ? "0" : "", tt->tm_mday,
579 tt->tm_hour < 10 ? "0" : "", tt->tm_hour,
580 tt->tm_min < 10 ? "0" : "", tt->tm_min,
581 tt->tm_sec < 10 ? "0" : "", tt->tm_sec);
585 //-----------------------------------------------------------------------------
586 uint32_t CalcMask(uint32_t msk)
588 if (msk >= 32) return 0xFFffFFff;
589 if (msk == 0) return 0;
590 return htonl(0xFFffFFff << (32 - msk));
592 //---------------------------------------------------------------------------
593 void TouchFile(const string & fileName)
595 FILE * f = fopen(fileName.c_str(), "w");
599 //---------------------------------------------------------------------------
601 void EncodeStr(char * str, unsigned long serial, int useHDD)
603 int len = strlen(str);
607 char serial_c[sizeof(serial)];
608 memcpy(serial_c, &serial, sizeof(serial));
610 for (i = 0; i < len; i++)
616 str[i] = str[i]^serial_c[j%sizeof(serial)];
621 for (i = 0; i < 2*len; i++)
625 c1 = (str[i/2] >> 4);
631 c2 = (str[i/2] & 0x0f);
639 //---------------------------------------------------------------------------
640 void DecodeStr(char * str, unsigned long serial, int useHDD)
642 int len = strlen(str);
646 char serial_c[sizeof(serial)];
647 memcpy(serial_c, &serial, sizeof(serial));
649 for (i = 0; i < len; i += 2)
652 c2 = (str[i+1] - 50)<<4;
655 for (i = 0; i < len/2; i++)
658 strdc[i] = strdc[i]^49;
661 strdc[i] = strdc[i]^serial_c[j%sizeof(serial)];
668 //---------------------------------------------------------------------------
670 void SwapBytes(uint16_t & value)
672 value = (value >> 8) |
675 //---------------------------------------------------------------------------
676 void SwapBytes(uint32_t & value)
678 value = (value >> 24) |
679 ((value << 8) & 0x00FF0000L)|
680 ((value >> 8) & 0x0000FF00L)|
683 //---------------------------------------------------------------------------
684 void SwapBytes(uint64_t & value)
686 value = (value >> 56) |
687 ((value << 40) & 0x00FF000000000000LL) |
688 ((value << 24) & 0x0000FF0000000000LL) |
689 ((value << 8) & 0x000000FF00000000LL) |
690 ((value >> 8) & 0x00000000FF000000LL) |
691 ((value >> 24) & 0x0000000000FF0000LL) |
692 ((value >> 40) & 0x000000000000FF00LL) |
695 //---------------------------------------------------------------------------
696 void SwapBytes(int16_t & value)
698 uint16_t temp = value;
702 //---------------------------------------------------------------------------
703 void SwapBytes(int32_t & value)
705 uint32_t temp = value;
709 //---------------------------------------------------------------------------
710 void SwapBytes(int64_t & value)
712 uint64_t temp = value;
716 //---------------------------------------------------------------------------
717 int str2x(const std::string & str, int & x)
719 x = strtol(str.c_str(), NULL, 10);
726 //---------------------------------------------------------------------------
727 int str2x(const std::string & str, unsigned & x)
729 x = strtoul(str.c_str(), NULL, 10);
736 //---------------------------------------------------------------------------
737 int str2x(const std::string & str, long long & x)
739 x = strtoll(str.c_str(), NULL, 10);
746 //---------------------------------------------------------------------------
747 int str2x(const std::string & str, unsigned long long & x)
749 x = strtoull(str.c_str(), NULL, 10);
756 //---------------------------------------------------------------------------
757 const std::string & x2str(unsigned x, std::string & s)
759 return unsigned2str(x, s);
761 //---------------------------------------------------------------------------
762 const std::string & x2str(unsigned long long x, std::string & s)
764 return unsigned2str(x, s);
766 //---------------------------------------------------------------------------
767 std::string & TrimL(std::string & val)
769 size_t pos = val.find_first_not_of(" \t");
770 if (pos == std::string::npos)
772 val.erase(val.begin(), val.end());
780 //---------------------------------------------------------------------------
781 std::string & TrimR(std::string & val)
783 size_t pos = val.find_last_not_of(" \t");
784 if (pos != std::string::npos)
790 //---------------------------------------------------------------------------
791 std::string & Trim(std::string & val)
793 return TrimR(TrimL(val));
795 //---------------------------------------------------------------------------
796 time_t stg_timegm(struct tm * brokenTime)
799 return timegm(brokenTime);
806 ret = mktime(brokenTime);
815 //---------------------------------------------------------------------------
816 std::string IconvString(const std::string & source,
817 const std::string & from,
818 const std::string & to)
821 return std::string();
823 size_t inBytesLeft = source.length() + 1;
824 size_t outBytesLeft = source.length() * 2 + 1;
826 char * inBuf = new char[inBytesLeft];
827 char * outBuf = new char[outBytesLeft];
829 strncpy(inBuf, source.c_str(), source.length());
831 inBuf[source.length()] = 0;
833 #if defined(FREE_BSD) || defined(FREE_BSD5)
834 const char * srcPos = inBuf;
836 char * srcPos = inBuf;
838 char * dstPos = outBuf;
840 iconv_t handle = iconv_open(to.c_str(),
843 if (handle == iconv_t(-1))
847 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
853 printfd(__FILE__, "IconvString(): iconv_open error\n");
860 size_t res = iconv(handle,
861 &srcPos, &inBytesLeft,
862 &dstPos, &outBytesLeft);
864 if (res == size_t(-1))
866 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
876 std::string dst(outBuf);
885 //---------------------------------------------------------------------------