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 $
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>
58 #include <sys/types.h>
61 #include <sys/socket.h>
62 #include <netinet/in.h>
63 #include <arpa/inet.h>
75 #ifndef INET_ADDRSTRLEN
76 # define INET_ADDRSTRLEN 16
81 //-----------------------------------------------------------------------------
82 int strtodouble2(const char * s, double &a)
93 //-----------------------------------------------------------------------------
95 int printfd(const char * __file__, const char * fmt, ...)
97 int printfd(const char *, const char *, ...)
103 time_t t = time(NULL);
107 vsnprintf(buff, sizeof(buff), fmt, vl);
110 printf("%18s > %s > ", __file__, LogDate(t)+11);
116 //-----------------------------------------------------------------------------
117 int strprintf(string * str, const char * fmt, ...)
123 int n = vsnprintf(buff, sizeof(buff), fmt, vl);
130 //-----------------------------------------------------------------------------
131 const char *IntToKMG(long long a, int stat)
133 static int64_t M = 1024*1024;
134 static int64_t G = 1024*1024*1024;
141 sprintf(str, "%Ld", a);
143 sprintf(str, "%lld", a);
147 sprintf(str, "%.2f kb", double(a)/1024.0);
150 sprintf(str, "%.2f Mb", double(a)/(1024.0*1024.0));
155 sprintf(str, "%.2f Gb", double(a)/double(G));
160 sprintf(str, "%.2f Gb", double(a)/double(G));
165 sprintf(str, "%.2f Mb", double(a)/double(M));
170 sprintf(str, "%.2f Mb", double(a)/double(M));
174 sprintf(str, "%.2f kb", double(a)/1024.0);
179 //---------------------------------------------------------------------------
180 unsigned char koi2win[] = {
181 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
182 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
183 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
184 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
185 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
186 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
187 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
188 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
189 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
190 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
191 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
192 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
193 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
194 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
195 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
196 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
197 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
198 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
199 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
200 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
201 0xA0, 0xA1, 0xA2, 0xB8, 0xBA, 0xA5, 0xB3, 0xBF,
202 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xB4, 0xAE, 0xAF,
203 0xB0, 0xB1, 0xB2, 0xA8, 0xAA, 0xB5, 0xB2, 0xAF,
204 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xA5, 0xBE, 0xBF,
205 0xFE, 0xE0, 0xE1, 0xF6, 0xE4, 0xE5, 0xF4, 0xE3,
206 0xF5, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE,
207 0xEF, 0xFF, 0xF0, 0xF1, 0xF2, 0xF3, 0xE6, 0xE2,
208 0xFC, 0xFB, 0xE7, 0xF8, 0xFD, 0xF9, 0xF7, 0xFA,
209 0xDE, 0xC0, 0xC1, 0xD6, 0xC4, 0xC5, 0xD4, 0xC3,
210 0xD5, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE,
211 0xCF, 0xDF, 0xD0, 0xD1, 0xD2, 0xD3, 0xC6, 0xC2,
212 0xDC, 0xDB, 0xC7, 0xD8, 0xDD, 0xD9, 0xD7, 0xDA};
215 unsigned char win2koi[] = {
216 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
217 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
218 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
219 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
220 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
221 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
222 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
223 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
224 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
225 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
226 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
227 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
228 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
229 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
230 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
231 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
232 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
233 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
234 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
235 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
236 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xBD, 0xA6, 0xA7,
237 0xB3, 0xA9, 0xB4, 0xAB, 0xAC, 0xAD, 0xAE, 0xB7,
238 0xB0, 0xB1, 0xB6, 0xA6, 0xAD, 0xB5, 0xB6, 0xB7,
239 0xA3, 0xB9, 0xA4, 0xBB, 0xBC, 0xBD, 0xBE, 0xA7,
240 0xE1, 0xE2, 0xF7, 0xE7, 0xE4, 0xE5, 0xF6, 0xFA,
241 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0,
242 0xF2, 0xF3, 0xF4, 0xF5, 0xE6, 0xE8, 0xE3, 0xFE,
243 0xFB, 0xFD, 0xFF, 0xF9, 0xF8, 0xFC, 0xE0, 0xF1,
244 0xC1, 0xC2, 0xD7, 0xC7, 0xC4, 0xC5, 0xD6, 0xDA,
245 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0,
246 0xD2, 0xD3, 0xD4, 0xD5, 0xC6, 0xC8, 0xC3, 0xDE,
247 0xDB, 0xDD, 0xDF, 0xD9, 0xD8, 0xDC, 0xC0, 0xD1};
248 //---------------------------------------------------------------------------
249 void KOIToWin(const char * s1, char * s2, int l)
252 for (int j = 0; j < l; j++)
261 //---------------------------------------------------------------------------
262 void WinToKOI(const char * s1, char * s2, int l)
265 for (int j = 0; j < l; j++)
274 //---------------------------------------------------------------------------
275 void KOIToWin(const string & s1, string * s2)
277 s2->erase(s2->begin(), s2->end());
279 s2->reserve(s1.length());
280 for (int j = 0; j < (int)s1.length(); j++)
283 s2->push_back(koi2win[t]);
286 //---------------------------------------------------------------------------
287 void WinToKOI(const string & s1, string * s2)
289 s2->erase(s2->begin(), s2->end());
291 s2->reserve(s1.length());
292 for (int j = 0; j < (int)s1.length(); j++)
295 s2->push_back(win2koi[t]);
298 //---------------------------------------------------------------------------
299 void Encode12str(string & dst, const string & src)
301 dst.erase(dst.begin(), dst.end());
302 for (size_t i = 0; i < src.length(); i++)
304 dst.push_back('a' + (src[i] & 0x0f));
305 dst.push_back('a' + ((src[i] & 0xf0) >> 4));
308 //---------------------------------------------------------------------------
309 void Decode21str(std::string & dst, const std::string & src)
311 dst.erase(dst.begin(), dst.end());
312 for (size_t i = 0; i < src.length() / 2; i++)
314 char c1 = src[i * 2];
315 char c2 = src[i * 2 + 1];
320 dst.push_back(c1 + (c2 << 4));
323 //---------------------------------------------------------------------------
324 void Encode12(char * dst, const char * src, size_t srcLen)
326 for (size_t i = 0; i <= srcLen; i++)
331 dst[i * 2 + 1] = 'a';
334 char c1 = src[i] & 0x0f;
335 char c2 = (src[i] & 0xf0) >> 4;
345 //---------------------------------------------------------------------------
346 void Decode21(char * dst, const char * src)
348 for (size_t i = 0; ; i++)
353 char c1 = src[i * 2];
354 char c2 = src[i * 2 + 1];
359 dst[i] = c1 + (c2 << 4);
361 dst[strlen(src) / 2] = 0;
363 //---------------------------------------------------------------------------
364 int ParseIPString(const char * str, uint32_t * ips, int maxIP)
367 *Function Name:ParseIPString
370 ÓÔÒÏËÁ ÄÌÑ ÒÁÚÂÏÒÁ É ÍÁÓÓÉ× ËÕÄÁ ÚÁÎÏÓÉÔØ ÐÏÌÕÞÅÎÎÙÅ ÁÄÒÅÓÁ
373 îÁ ×ÈÏÄÅ ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÁ ×ÉÄÁ "ip1,ip2,ip3" ÉÌÉ "*"
374 ÷ ÐÅÒ×ÏÍ ÓÌÕÞÁÅ × ÍÁÓÓÉ× ÚÁÎÏÓÑÔÓÑ ÒÁÚÏÂÒÁÎÎÙÅ ÁÄÒÅÓÁ.
375 åÓÌÉ ÉÈ ÍÅÎØÛÅ MAX_IP?, ÔÏ ÐÏÓÌÅÄÎÉÊ ÁÄÒÅÓ ÂÕÄÅÔ 255.255.255.255
376 åÓÌÉ ÓÔÒÏËÁ * , ÔÏ ÐÅÒ×ÁÙÊ ÁÄÒÅÓ ÂÕÄÅÔ 0.0.0.0, Ô.Å. ÌÀÂÏÊ
378 *Returns: 0 ÅÓÌÉ ×ÓÅ ïë
386 strncpy(p, str, 254);
389 memset(ips, 0xFF, sizeof(unsigned long) * maxIP);
391 if (str[0] == '*' && strlen(str) == 1)
397 for (int i = 0; i < maxIP; i++)
399 p1 = strtok(pp, ",\n ");
402 if (p1 == NULL && n == 0)// ÕËÁÚÁÔÅÌØ ÎÕÌØ É ÐÒÏÞÉÔÁÎÏ ÁÄÒÅÓÏ× ÔÏÖÅ ÎÏÌØ
413 if (!inet_aton(p1, &in))
415 //printf("INADDR_NONE\n");
421 /*if (ips[n] == INADDR_NONE)
433 //-----------------------------------------------------------------------------
434 int DaysInCurrentMonth()
436 time_t t = time(NULL);
438 struct tm * lt = localtime(&t);
440 return DaysInMonth(lt->tm_year, lt->tm_mon);
442 //-----------------------------------------------------------------------------
443 int DaysInMonth(unsigned year, unsigned mon)
445 assert(mon < 12 && "Month number should be 0 - 11");
448 case 0: return 31; //jan
450 if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
453 case 2: return 31; //mar
454 case 3: return 30; //apr
455 case 4: return 31; //may
456 case 5: return 30; //june
457 case 6: return 31; //jule
458 case 7: return 31; //aug
459 case 8: return 30; //sep
460 case 9: return 31; //oct
461 case 10: return 30; //nov
462 case 11: return 31; //dec
464 return -1; // We will never reach here
466 //-----------------------------------------------------------------------------
470 æÕÎËÃÉÑ ×ÏÚ×ÒÁÝÁÅÔ ÎÁÉÍÅÎØÛÅÅ ÞÉÓÌÏ ËÒÁÔÎÏÅ 8-ÍÉ ÂÏÌØÛÅÅ ÉÌÉ ÒÁ×ÎÏÅ ÚÁÄÁÎÎÏÍÕ
475 return a + (8 - a % 8);
477 //-----------------------------------------------------------------------------
478 /*char * inet_ntostr(unsigned long ip)
480 struct in_addr addr = {ip};
481 return inet_ntoa(addr);
483 //-----------------------------------------------------------------------------
484 std::string inet_ntostring(uint32_t ip)
486 char buf[INET_ADDRSTRLEN + 1];
487 return inet_ntop(AF_INET, &ip, buf, INET_ADDRSTRLEN);
489 //-----------------------------------------------------------------------------
490 uint32_t inet_strington(const std::string & value)
494 if (inet_pton(AF_INET, value.c_str(), &result) <= 0)
499 //-----------------------------------------------------------------------------
500 int ParseTariffTimeStr(const char * str, int &h1, int &m1, int &h2, int &m2)
502 char hs1[10], ms1[10], hs2[10], ms2[10];
507 strncpy(ss, str, 48);
509 p1 = strtok(ss, "-");
515 p2 = strtok(NULL, "-");
521 p1 = strtok(s1, ":");
527 p2 = strtok(NULL, ":");
533 p1 = strtok(s2, ":");
539 p2 = strtok(NULL, ":");
545 if (str2x(hs1, h1) != 0)
548 if (str2x(ms1, m1) != 0)
551 if (str2x(hs2, h2) != 0)
554 if (str2x(ms2, m2) != 0)
559 /*//---------------------------------------------------------------------------
562 if (c >= '0' && c <= '9')
566 //-----------------------------------------------------------------------------
569 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
573 //-----------------------------------------------------------------------------
574 const char * LogDate(time_t t)
577 struct tm * tt = localtime(&t);
579 snprintf(s, 20, "%d-%s%d-%s%d %s%d:%s%d:%s%d",
581 tt->tm_mon + 1 < 10 ? "0" : "", tt->tm_mon + 1,
582 tt->tm_mday < 10 ? "0" : "", tt->tm_mday,
583 tt->tm_hour < 10 ? "0" : "", tt->tm_hour,
584 tt->tm_min < 10 ? "0" : "", tt->tm_min,
585 tt->tm_sec < 10 ? "0" : "", tt->tm_sec);
589 //-----------------------------------------------------------------------------
590 uint32_t CalcMask(uint32_t msk)
592 if (msk >= 32) return 0xFFffFFff;
593 if (msk == 0) return 0;
594 return htonl(0xFFffFFff << (32 - msk));
596 //---------------------------------------------------------------------------
597 void TouchFile(const string & fileName)
599 FILE * f = fopen(fileName.c_str(), "w");
603 //---------------------------------------------------------------------------
605 void EncodeStr(char * str, unsigned long serial, int useHDD)
607 int len = strlen(str);
611 char serial_c[sizeof(serial)];
612 memcpy(serial_c, &serial, sizeof(serial));
614 for (i = 0; i < len; i++)
620 str[i] = str[i]^serial_c[j%sizeof(serial)];
625 for (i = 0; i < 2*len; i++)
629 c1 = (str[i/2] >> 4);
635 c2 = (str[i/2] & 0x0f);
643 //---------------------------------------------------------------------------
644 void DecodeStr(char * str, unsigned long serial, int useHDD)
646 int len = strlen(str);
650 char serial_c[sizeof(serial)];
651 memcpy(serial_c, &serial, sizeof(serial));
653 for (i = 0; i < len; i += 2)
656 c2 = (str[i+1] - 50)<<4;
659 for (i = 0; i < len/2; i++)
662 strdc[i] = strdc[i]^49;
665 strdc[i] = strdc[i]^serial_c[j%sizeof(serial)];
672 //---------------------------------------------------------------------------
674 void SwapBytes(uint16_t & value)
676 value = (value >> 8) |
679 //---------------------------------------------------------------------------
680 void SwapBytes(uint32_t & value)
682 value = (value >> 24) |
683 ((value << 8) & 0x00FF0000L)|
684 ((value >> 8) & 0x0000FF00L)|
687 //---------------------------------------------------------------------------
688 void SwapBytes(uint64_t & value)
690 value = (value >> 56) |
691 ((value << 40) & 0x00FF000000000000LL) |
692 ((value << 24) & 0x0000FF0000000000LL) |
693 ((value << 8) & 0x000000FF00000000LL) |
694 ((value >> 8) & 0x00000000FF000000LL) |
695 ((value >> 24) & 0x0000000000FF0000LL) |
696 ((value >> 40) & 0x000000000000FF00LL) |
699 //---------------------------------------------------------------------------
700 void SwapBytes(int16_t & value)
702 uint16_t temp = value;
706 //---------------------------------------------------------------------------
707 void SwapBytes(int32_t & value)
709 uint32_t temp = value;
713 //---------------------------------------------------------------------------
714 void SwapBytes(int64_t & value)
716 uint64_t temp = value;
720 //---------------------------------------------------------------------------
721 int str2x(const std::string & str, int & x)
723 x = strtol(str.c_str(), NULL, 10);
730 //---------------------------------------------------------------------------
731 int str2x(const std::string & str, unsigned & x)
733 x = strtoul(str.c_str(), NULL, 10);
740 //---------------------------------------------------------------------------
741 int str2x(const std::string & str, long & x)
743 x = strtol(str.c_str(), NULL, 10);
750 //---------------------------------------------------------------------------
751 int str2x(const std::string & str, unsigned long & x)
753 x = strtoul(str.c_str(), NULL, 10);
760 //---------------------------------------------------------------------------
761 int str2x(const std::string & str, long long & x)
763 x = strtoll(str.c_str(), NULL, 10);
770 //---------------------------------------------------------------------------
771 int str2x(const std::string & str, unsigned long long & x)
773 x = strtoull(str.c_str(), NULL, 10);
780 //---------------------------------------------------------------------------
781 const std::string & x2str(unsigned x, std::string & s)
783 return unsigned2str(x, s);
785 //---------------------------------------------------------------------------
786 const std::string & x2str(unsigned long x, std::string & s)
788 return unsigned2str(x, s);
790 //---------------------------------------------------------------------------
791 const std::string & x2str(unsigned long long x, std::string & s)
793 return unsigned2str(x, s);
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 time_t stg_timegm(struct tm * brokenTime)
828 return timegm(brokenTime);
835 ret = mktime(brokenTime);
844 //---------------------------------------------------------------------------
845 std::string IconvString(const std::string & source,
846 const std::string & from,
847 const std::string & to)
850 return std::string();
852 size_t inBytesLeft = source.length() + 1;
853 size_t outBytesLeft = source.length() * 2 + 1;
855 char * inBuf = new char[inBytesLeft];
856 char * outBuf = new char[outBytesLeft];
858 strncpy(inBuf, source.c_str(), source.length());
860 inBuf[source.length()] = 0;
862 #if defined(FREE_BSD) || defined(FREE_BSD5)
863 const char * srcPos = inBuf;
865 char * srcPos = inBuf;
867 char * dstPos = outBuf;
869 iconv_t handle = iconv_open(to.c_str(),
872 if (handle == iconv_t(-1))
876 printfd(__FILE__, "IconvString(): iconv from %s to %s failed\n", from.c_str(), to.c_str());
882 printfd(__FILE__, "IconvString(): iconv_open error\n");
889 size_t res = iconv(handle,
890 &srcPos, &inBytesLeft,
891 &dstPos, &outBytesLeft);
893 if (res == size_t(-1))
895 printfd(__FILE__, "IconvString(): '%s'\n", strerror(errno));
905 std::string dst(outBuf);
914 //---------------------------------------------------------------------------