260 lines
6.1 KiB
C++
260 lines
6.1 KiB
C++
|
|
#include <sys/time.h>
|
|||
|
|
#include <time.h>
|
|||
|
|
#include <string.h>
|
|||
|
|
#include <ctype.h>
|
|||
|
|
#include <sys/types.h>
|
|||
|
|
#include <sys/stat.h>
|
|||
|
|
#include <unistd.h>
|
|||
|
|
#include <stdio.h>
|
|||
|
|
#include <stdlib.h>
|
|||
|
|
#include <errno.h>
|
|||
|
|
|
|||
|
|
#include "tango_cache_tools.h"
|
|||
|
|
|
|||
|
|
static const char data_bin2ascii[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|||
|
|
|
|||
|
|
#define conv_bin2ascii(a) (data_bin2ascii[(a)&0x3f])
|
|||
|
|
|
|||
|
|
#define B64_EOLN 0xF0
|
|||
|
|
#define B64_CR 0xF1
|
|||
|
|
#define B64_EOF 0xF2
|
|||
|
|
#define B64_WS 0xE0
|
|||
|
|
#define B64_ERROR 0xFF
|
|||
|
|
#define B64_NOT_BASE64(a) (((a)|0x13) == 0xF3)
|
|||
|
|
#define B64_BASE64(a) !B64_NOT_BASE64(a)
|
|||
|
|
|
|||
|
|
static const unsigned char data_ascii2bin[128] = {
|
|||
|
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|||
|
|
0xFF, 0xE0, 0xF0, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF,
|
|||
|
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|||
|
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|||
|
|
0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|||
|
|
0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xF2, 0xFF, 0x3F,
|
|||
|
|
0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,
|
|||
|
|
0x3C, 0x3D, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
|
|||
|
|
0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
|
|||
|
|
0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,
|
|||
|
|
0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
|
|||
|
|
0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|||
|
|
0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,
|
|||
|
|
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
|
|||
|
|
0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,
|
|||
|
|
0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
//<2F>мDz<D0BC><C7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD>: conv_ascii2bin(x++); <20><>Ϊ<EFBFBD><CEAA>++<2B><><EFBFBD><EFBFBD>
|
|||
|
|
#define conv_ascii2bin(aa) (((aa) & 0x80)?(0xFF):data_ascii2bin[(aa)])
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>Base64_EncodeBlock
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD><EFBFBD>飺<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>BASE64<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>in<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
inl<EFBFBD><EFBFBD>in<EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>out<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*********************************************************************/
|
|||
|
|
int Base64_EncodeBlock(const unsigned char *in, int inl, unsigned char *out)
|
|||
|
|
{
|
|||
|
|
int i, ret = 0;
|
|||
|
|
unsigned long l;
|
|||
|
|
|
|||
|
|
for (i = inl; i > 0; i -= 3) {
|
|||
|
|
if (i >= 3) {
|
|||
|
|
l = (((unsigned long)in[0]) << 16L) |
|
|||
|
|
(((unsigned long)in[1]) << 8L) | in[2];
|
|||
|
|
*(out++) = conv_bin2ascii(l >> 18L);
|
|||
|
|
*(out++) = conv_bin2ascii(l >> 12L);
|
|||
|
|
*(out++) = conv_bin2ascii(l >> 6L);
|
|||
|
|
*(out++) = conv_bin2ascii(l);
|
|||
|
|
} else {
|
|||
|
|
l = ((unsigned long)in[0]) << 16L;
|
|||
|
|
if (i == 2)
|
|||
|
|
l |= ((unsigned long)in[1] << 8L);
|
|||
|
|
|
|||
|
|
*(out++) = conv_bin2ascii(l >> 18L);
|
|||
|
|
*(out++) = conv_bin2ascii(l >> 12L);
|
|||
|
|
*(out++) = (i == 1) ? '=' : conv_bin2ascii(l >> 6L);
|
|||
|
|
*(out++) = '=';
|
|||
|
|
}
|
|||
|
|
ret += 4;
|
|||
|
|
in += 3;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
*out = '\0';
|
|||
|
|
return (ret);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*********************************************************************
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>Base64_DecodeBlock
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD><EFBFBD>飺<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>BASE64<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><EFBFBD>BASE64<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>in<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
inl<EFBFBD><EFBFBD>in<EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>out<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD>뱣֤<EFBFBD><EFBFBD><EFBFBD>㹻<EFBFBD>Ŀռ䣬һ<EFBFBD><EFBFBD><EFBFBD>ﵽ@inl<EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><0<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>>=0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*********************************************************************/
|
|||
|
|
int Base64_DecodeBlock(const unsigned char *in, int inl, unsigned char *out, int outsize)
|
|||
|
|
{
|
|||
|
|
int i, ret = 0;
|
|||
|
|
unsigned char a, b, c, d;
|
|||
|
|
unsigned long l;
|
|||
|
|
|
|||
|
|
/* ignore not-base64-encoded charactor. */
|
|||
|
|
while ((conv_ascii2bin(*in) == B64_WS) && (inl > 0))
|
|||
|
|
{
|
|||
|
|
in++;
|
|||
|
|
inl--;
|
|||
|
|
}
|
|||
|
|
while ((inl > 3) && (B64_NOT_BASE64(conv_ascii2bin(in[inl - 1]))))
|
|||
|
|
inl--;
|
|||
|
|
|
|||
|
|
if (inl % 4 != 0)
|
|||
|
|
return -1;
|
|||
|
|
|
|||
|
|
if(outsize < (inl*3)/4)
|
|||
|
|
return -2;
|
|||
|
|
|
|||
|
|
for (i = 0; i < inl; i += 4)
|
|||
|
|
{
|
|||
|
|
a = conv_ascii2bin(*(in));
|
|||
|
|
b = conv_ascii2bin(*(in+1));
|
|||
|
|
c = conv_ascii2bin(*(in+2));
|
|||
|
|
d = conv_ascii2bin(*(in+3));
|
|||
|
|
if ((a & 0x80) || (b & 0x80) || (c & 0x80) || (d & 0x80))
|
|||
|
|
return (-1);
|
|||
|
|
l = ((((unsigned long)a) << 18L) | (((unsigned long)b) << 12L) |
|
|||
|
|
(((unsigned long)c) << 6L) | (((unsigned long)d)));
|
|||
|
|
*(out++) = (unsigned char)(l >> 16L) & 0xff;
|
|||
|
|
*(out++) = (unsigned char)(l >> 8L) & 0xff;
|
|||
|
|
*(out++) = (unsigned char)(l) & 0xff;
|
|||
|
|
ret += 3;
|
|||
|
|
in+=4;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for(i = inl; i > 0; i -= 4)
|
|||
|
|
{
|
|||
|
|
if(*(in-3) == '=')
|
|||
|
|
{
|
|||
|
|
in -= 4;
|
|||
|
|
ret -= 3;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
while(*(--in) == '=')
|
|||
|
|
ret -= 1;
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//<2F><>֪<EFBFBD><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int strcmp_one_word_mesa_equal_len(const char *s1_lowercase, const char *s1_uppercase, const char *s2, size_t len)
|
|||
|
|
{
|
|||
|
|
unsigned char *s1,*s12;
|
|||
|
|
|
|||
|
|
if (s2[len-1]-'a'>=0)
|
|||
|
|
{
|
|||
|
|
s1 = (unsigned char *)s1_lowercase;
|
|||
|
|
s12= (unsigned char *)s1_uppercase;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
s1 = (unsigned char *)s1_uppercase;
|
|||
|
|
s12= (unsigned char *)s1_lowercase;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
do {
|
|||
|
|
if (*s1 == *s2 || *s12 == *s2)
|
|||
|
|
{
|
|||
|
|
++s1;
|
|||
|
|
++s12;
|
|||
|
|
++s2;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
} while (--len);
|
|||
|
|
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int mkdir_according_path(const char * path)
|
|||
|
|
{
|
|||
|
|
char buffer[256];
|
|||
|
|
const char *ps=path, *pc;
|
|||
|
|
|
|||
|
|
if(*ps == '/')
|
|||
|
|
ps += 1;
|
|||
|
|
|
|||
|
|
while((pc = strchr(ps, '/')) != NULL)
|
|||
|
|
{
|
|||
|
|
while(*(pc+1) == '/')
|
|||
|
|
pc++;
|
|||
|
|
|
|||
|
|
memcpy(buffer, path, pc - path);
|
|||
|
|
buffer[pc-path] = '\0';
|
|||
|
|
|
|||
|
|
if(access(buffer, F_OK))
|
|||
|
|
{
|
|||
|
|
if(mkdir(buffer, 0777) && errno!=EEXIST)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ps = pc + 1;
|
|||
|
|
}
|
|||
|
|
if(access(path, F_OK))
|
|||
|
|
{
|
|||
|
|
if(mkdir(path, 0777))
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊʱ<CEAA><CAB1><EFBFBD><EFBFBD>
|
|||
|
|
time_t expires_hdr2timestamp(const char *expires_val, int len)
|
|||
|
|
{
|
|||
|
|
struct tm tm;
|
|||
|
|
time_t expire;
|
|||
|
|
|
|||
|
|
while(len > 0 && (*expires_val==' '||*expires_val=='\t'||*expires_val=='\r'||*expires_val=='\n'))
|
|||
|
|
{
|
|||
|
|
expires_val++;
|
|||
|
|
len--;
|
|||
|
|
}
|
|||
|
|
if(len == 0)
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(strptime(expires_val, "%a, %d %b %Y %T", &tm) == NULL)
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
expire = mktime(&tm);
|
|||
|
|
return expire;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ΪGMTʱ<54><CAB1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
|||
|
|
size_t expires_timestamp2hdr_str(time_t seconds, char *buffer, size_t size)
|
|||
|
|
{
|
|||
|
|
struct tm save;
|
|||
|
|
return strftime(buffer, size, "Expires: %a, %d %b %Y %T GMT", gmtime_r(&seconds, &save));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ΪGMTʱ<54><CAB1><EFBFBD><EFBFBD>
|
|||
|
|
time_t get_gmtime_timestamp(time_t seconds)
|
|||
|
|
{
|
|||
|
|
struct tm *tm, save;
|
|||
|
|
|
|||
|
|
tm = gmtime_r(&seconds, &save);
|
|||
|
|
return mktime(tm);
|
|||
|
|
}
|
|||
|
|
|