NSH library: Costmetic change
This commit is contained in:
parent
a88338b41a
commit
691bd07f2e
@ -62,30 +62,6 @@
|
|||||||
|
|
||||||
#ifdef CONFIG_NSH_BUILTIN_APPS
|
#ifdef CONFIG_NSH_BUILTIN_APPS
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Pre-processor Definitions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Types
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Function Prototypes
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Data
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Data
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
@ -96,9 +96,8 @@
|
|||||||
* Private Types
|
* Private Types
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
typedef void (*codec_callback_t)(FAR char *src_buff, int src_buff_len,
|
typedef void (*codec_callback_t)(FAR char *src, int srclen, FAR char *dest,
|
||||||
FAR char *dst_buff, FAR int *dst_buff_len,
|
FAR int *destlen, int mode);
|
||||||
int mode);
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Functions
|
* Private Functions
|
||||||
@ -109,10 +108,10 @@ typedef void (*codec_callback_t)(FAR char *src_buff, int src_buff_len,
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_CODECS_URLCODE) && !defined(CONFIG_NSH_DISABLE_URLENCODE)
|
#if defined(CONFIG_CODECS_URLCODE) && !defined(CONFIG_NSH_DISABLE_URLENCODE)
|
||||||
static void urlencode_cb(FAR char *src_buff, int src_buff_len,
|
static void urlencode_cb(FAR char *src, int srclen, FAR char *dest,
|
||||||
FAR char *dst_buff, FAR int *dst_buff_len, int mode)
|
FAR int *destlen, int mode)
|
||||||
{
|
{
|
||||||
urlencode(src_buff,src_buff_len,dst_buff,dst_buff_len);
|
urlencode(src, srclen, dest, destlen);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -121,10 +120,10 @@ static void urlencode_cb(FAR char *src_buff, int src_buff_len,
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_CODECS_URLCODE) && !defined(CONFIG_NSH_DISABLE_URLDECODE)
|
#if defined(CONFIG_CODECS_URLCODE) && !defined(CONFIG_NSH_DISABLE_URLDECODE)
|
||||||
static void urldecode_cb(FAR char *src_buff, int src_buff_len, FAR char *dst_buff,
|
static void urldecode_cb(FAR char *src, int srclen, FAR char *dest,
|
||||||
FAR int *dst_buff_len, int mode)
|
FAR int *destlen, int mode)
|
||||||
{
|
{
|
||||||
urldecode(src_buff,src_buff_len,dst_buff,dst_buff_len);
|
urldecode(src,srclen,dest,destlen);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -133,20 +132,18 @@ static void urldecode_cb(FAR char *src_buff, int src_buff_len, FAR char *dst_buf
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_CODECS_BASE64) && !defined(CONFIG_NSH_DISABLE_BASE64ENC)
|
#if defined(CONFIG_CODECS_BASE64) && !defined(CONFIG_NSH_DISABLE_BASE64ENC)
|
||||||
static void b64enc_cb(FAR char *src_buff, int src_buff_len, FAR char *dst_buff,
|
static void b64enc_cb(FAR char *src, int srclen, FAR char *dest,
|
||||||
FAR int *dst_buff_len, int mode)
|
FAR int *destlen, int mode)
|
||||||
{
|
{
|
||||||
if (mode == 0)
|
if (mode == 0)
|
||||||
{
|
{
|
||||||
//dst_buff =
|
base64_encode((unsigned char *)src, srclen,
|
||||||
base64_encode((unsigned char *)src_buff, src_buff_len,
|
(unsigned char *)dest, (size_t *)destlen);
|
||||||
(unsigned char *)dst_buff, (size_t *)dst_buff_len);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//dst_buff =
|
base64w_encode((unsigned char *)src, srclen,
|
||||||
base64w_encode((unsigned char *)src_buff, src_buff_len,
|
(unsigned char *)dest, (size_t *)destlen);
|
||||||
(unsigned char *)dst_buff, (size_t *)dst_buff_len);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -156,20 +153,18 @@ static void b64enc_cb(FAR char *src_buff, int src_buff_len, FAR char *dst_buff,
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_CODECS_BASE64) && !defined(CONFIG_NSH_DISABLE_BASE64DEC)
|
#if defined(CONFIG_CODECS_BASE64) && !defined(CONFIG_NSH_DISABLE_BASE64DEC)
|
||||||
static void b64dec_cb(FAR char *src_buff, int src_buff_len, FAR char *dst_buff,
|
static void b64dec_cb(FAR char *src, int srclen, FAR char *dest,
|
||||||
FAR int *dst_buff_len, int mode)
|
FAR int *destlen, int mode)
|
||||||
{
|
{
|
||||||
if (mode == 0)
|
if (mode == 0)
|
||||||
{
|
{
|
||||||
//dst_buff =
|
base64_decode((unsigned char *)src, srclen,
|
||||||
base64_decode((unsigned char *)src_buff, src_buff_len,
|
(unsigned char *)dest, (size_t *)destlen);
|
||||||
(unsigned char *)dst_buff, (size_t *)dst_buff_len);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//dst_buff =
|
base64w_decode((unsigned char *)src, srclen,
|
||||||
base64w_decode((unsigned char *)src_buff, src_buff_len,
|
(unsigned char *)dest,(size_t *)destlen);
|
||||||
(unsigned char *)dst_buff,(size_t *)dst_buff_len);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -179,10 +174,10 @@ static void b64dec_cb(FAR char *src_buff, int src_buff_len, FAR char *dst_buff,
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_CODECS_HASH_MD5) && !defined(CONFIG_NSH_DISABLE_MD5)
|
#if defined(CONFIG_CODECS_HASH_MD5) && !defined(CONFIG_NSH_DISABLE_MD5)
|
||||||
static void md5_cb(FAR char *src_buff, int src_buff_len, FAR char *dst_buff,
|
static void md5_cb(FAR char *src, int srclen, FAR char *dest,
|
||||||
FAR int *dst_buff_len, int mode)
|
FAR int *destlen, int mode)
|
||||||
{
|
{
|
||||||
MD5Update((MD5_CTX *)dst_buff, (unsigned char *)src_buff, src_buff_len);
|
MD5Update((MD5_CTX *)dest, (unsigned char *)src, srclen);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -190,22 +185,27 @@ static void md5_cb(FAR char *src_buff, int src_buff_len, FAR char *dst_buff,
|
|||||||
* Name: calc_codec_buffsize
|
* Name: calc_codec_buffsize
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int calc_codec_buffsize(int src_buffsize, uint8_t mode)
|
static int calc_codec_buffsize(int srclen, uint8_t mode)
|
||||||
{
|
{
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case CODEC_MODE_URLENCODE:
|
case CODEC_MODE_URLENCODE:
|
||||||
return src_buffsize*3+1;
|
return srclen * 3 + 1;
|
||||||
|
|
||||||
case CODEC_MODE_URLDECODE:
|
case CODEC_MODE_URLDECODE:
|
||||||
return src_buffsize+1;
|
return srclen + 1;
|
||||||
|
|
||||||
case CODEC_MODE_BASE64ENC:
|
case CODEC_MODE_BASE64ENC:
|
||||||
return ((src_buffsize + 2)/ 3 * 4)+1;
|
return ((srclen + 2) / 3 * 4) + 1;
|
||||||
|
|
||||||
case CODEC_MODE_BASE64DEC:
|
case CODEC_MODE_BASE64DEC:
|
||||||
return (src_buffsize / 4 * 3 + 2)+1;
|
return (srclen / 4 * 3 + 2) + 1;
|
||||||
|
|
||||||
case CODEC_MODE_HASH_MD5:
|
case CODEC_MODE_HASH_MD5:
|
||||||
return 32 + 1;
|
return 32 + 1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return src_buffsize+1;
|
return srclen + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,26 +217,26 @@ static int cmd_codecs_proc(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv,
|
|||||||
uint8_t mode, codec_callback_t func)
|
uint8_t mode, codec_callback_t func)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_CODECS_HASH_MD5) && !defined(CONFIG_NSH_DISABLE_MD5)
|
#if defined(CONFIG_CODECS_HASH_MD5) && !defined(CONFIG_NSH_DISABLE_MD5)
|
||||||
static const unsigned char hex_chars[] = "0123456789abcdef";
|
static const unsigned char hexchars[] = "0123456789abcdef";
|
||||||
MD5_CTX ctx;
|
MD5_CTX ctx;
|
||||||
unsigned char mac[16];
|
unsigned char mac[16];
|
||||||
char *pSrc;
|
FAR char *src;
|
||||||
char *pDest;
|
FAR char *dest;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
char *localfile = NULL;
|
FAR char *localfile = NULL;
|
||||||
char *src_buffer = NULL;
|
FAR char *srcbuf = NULL;
|
||||||
char *buffer = NULL;
|
FAR char *destbuf = NULL;
|
||||||
char *fullpath = NULL;
|
FAR char *fullpath = NULL;
|
||||||
const char *fmt;
|
FAR const char *fmt;
|
||||||
char *s_data;
|
FAR char *sdata;
|
||||||
bool badarg = false;
|
bool badarg = false;
|
||||||
bool is_file = false;
|
bool isfile = false;
|
||||||
bool is_websafe=false;
|
bool iswebsafe = false;
|
||||||
int option;
|
int option;
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
int buff_len = 0;
|
int buflen = 0;
|
||||||
int src_buff_len = 0;
|
int srclen = 0;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
|
|
||||||
@ -247,12 +247,12 @@ static int cmd_codecs_proc(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv,
|
|||||||
switch (option)
|
switch (option)
|
||||||
{
|
{
|
||||||
case 'f':
|
case 'f':
|
||||||
is_file = true;
|
isfile = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef CONFIG_CODECS_BASE64
|
#ifdef CONFIG_CODECS_BASE64
|
||||||
case 'w':
|
case 'w':
|
||||||
is_websafe = true;
|
iswebsafe = true;
|
||||||
|
|
||||||
if (!(mode == CODEC_MODE_BASE64ENC || mode == CODEC_MODE_BASE64DEC))
|
if (!(mode == CODEC_MODE_BASE64ENC || mode == CODEC_MODE_BASE64DEC))
|
||||||
{
|
{
|
||||||
@ -284,7 +284,7 @@ static int cmd_codecs_proc(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv,
|
|||||||
|
|
||||||
if (optind == argc-1)
|
if (optind == argc-1)
|
||||||
{
|
{
|
||||||
s_data = argv[optind];
|
sdata = argv[optind];
|
||||||
}
|
}
|
||||||
else if (optind >= argc)
|
else if (optind >= argc)
|
||||||
{
|
{
|
||||||
@ -304,11 +304,11 @@ static int cmd_codecs_proc(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (is_file)
|
if (isfile)
|
||||||
{
|
{
|
||||||
/* Get the local file name */
|
/* Get the local file name */
|
||||||
|
|
||||||
localfile = s_data;
|
localfile = sdata;
|
||||||
|
|
||||||
/* Get the full path to the local file */
|
/* Get the full path to the local file */
|
||||||
|
|
||||||
@ -324,24 +324,24 @@ static int cmd_codecs_proc(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
src_buffer = malloc(CONFIG_NSH_CODECS_BUFSIZE+2);
|
srcbuf = malloc(CONFIG_NSH_CODECS_BUFSIZE+2);
|
||||||
#if defined(CONFIG_CODECS_BASE64) && !defined(CONFIG_NSH_DISABLE_BASE64ENC)
|
#if defined(CONFIG_CODECS_BASE64) && !defined(CONFIG_NSH_DISABLE_BASE64ENC)
|
||||||
if (mode == CODEC_MODE_BASE64ENC)
|
if (mode == CODEC_MODE_BASE64ENC)
|
||||||
{
|
{
|
||||||
src_buff_len = CONFIG_NSH_CODECS_BUFSIZE / 3 * 3;
|
srclen = CONFIG_NSH_CODECS_BUFSIZE / 3 * 3;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
src_buff_len = CONFIG_NSH_CODECS_BUFSIZE;
|
srclen = CONFIG_NSH_CODECS_BUFSIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
buff_len = calc_codec_buffsize(src_buff_len+2, mode);
|
buflen = calc_codec_buffsize(srclen+2, mode);
|
||||||
buffer = malloc(buff_len);
|
destbuf = malloc(buflen);
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
memset(src_buffer, 0, src_buff_len+2);
|
memset(srcbuf, 0, srclen+2);
|
||||||
ret=read(fd, src_buffer, src_buff_len);
|
ret=read(fd, srcbuf, srclen);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "read", NSH_ERRNO);
|
nsh_output(vtbl, g_fmtcmdfailed, argv[0], "read", NSH_ERRNO);
|
||||||
@ -356,49 +356,49 @@ static int cmd_codecs_proc(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv,
|
|||||||
#if defined(CONFIG_CODECS_URLCODE) && !defined(CONFIG_NSH_DISABLE_URLDECODE)
|
#if defined(CONFIG_CODECS_URLCODE) && !defined(CONFIG_NSH_DISABLE_URLDECODE)
|
||||||
if (mode == CODEC_MODE_URLDECODE)
|
if (mode == CODEC_MODE_URLDECODE)
|
||||||
{
|
{
|
||||||
if (src_buffer[src_buff_len-1]=='%')
|
if (srcbuf[srclen-1]=='%')
|
||||||
{
|
{
|
||||||
ret += read(fd,&src_buffer[src_buff_len],2);
|
ret += read(fd,&srcbuf[srclen],2);
|
||||||
}
|
}
|
||||||
else if (src_buffer[src_buff_len-2]=='%')
|
else if (srcbuf[srclen-2]=='%')
|
||||||
{
|
{
|
||||||
ret += read(fd,&src_buffer[src_buff_len],1);
|
ret += read(fd,&srcbuf[srclen],1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
memset(buffer, 0, buff_len);
|
memset(destbuf, 0, buflen);
|
||||||
if (func)
|
if (func)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_CODECS_HASH_MD5) && !defined(CONFIG_NSH_DISABLE_MD5)
|
#if defined(CONFIG_CODECS_HASH_MD5) && !defined(CONFIG_NSH_DISABLE_MD5)
|
||||||
if (mode == CODEC_MODE_HASH_MD5)
|
if (mode == CODEC_MODE_HASH_MD5)
|
||||||
{
|
{
|
||||||
func(src_buffer, ret, (char *)&ctx, &buff_len,0);
|
func(srcbuf, ret, (char *)&ctx, &buflen,0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
func(src_buffer, ret, buffer, &buff_len,(is_websafe)?1:0);
|
func(srcbuf, ret, destbuf, &buflen,(iswebsafe)?1:0);
|
||||||
nsh_output(vtbl, "%s", buffer);
|
nsh_output(vtbl, "%s", destbuf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buff_len = calc_codec_buffsize(src_buff_len+2, mode);
|
buflen = calc_codec_buffsize(srclen+2, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_CODECS_HASH_MD5) && !defined(CONFIG_NSH_DISABLE_MD5)
|
#if defined(CONFIG_CODECS_HASH_MD5) && !defined(CONFIG_NSH_DISABLE_MD5)
|
||||||
if (mode == CODEC_MODE_HASH_MD5)
|
if (mode == CODEC_MODE_HASH_MD5)
|
||||||
{
|
{
|
||||||
MD5Final(mac, &ctx);
|
MD5Final(mac, &ctx);
|
||||||
pSrc = (char *)&mac;
|
src = (FAR char *)&mac;
|
||||||
pDest = buffer;
|
dest = destbuf;
|
||||||
for (i = 0; i < 16; i++, pSrc++)
|
for (i = 0; i < 16; i++, src++)
|
||||||
{
|
{
|
||||||
*pDest++ = hex_chars[(*pSrc) >> 4];
|
*dest++ = hexchars[(*src) >> 4];
|
||||||
*pDest++ = hex_chars[(*pSrc) & 0x0f];
|
*dest++ = hexchars[(*src) & 0x0f];
|
||||||
}
|
}
|
||||||
|
|
||||||
*pDest='\0';
|
*dest = '\0';
|
||||||
nsh_output(vtbl, "%s\n", buffer);
|
nsh_output(vtbl, "%s\n", destbuf);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
ret = OK;
|
ret = OK;
|
||||||
@ -406,44 +406,44 @@ static int cmd_codecs_proc(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
src_buffer = s_data;
|
srcbuf = sdata;
|
||||||
src_buff_len = strlen(s_data);
|
srclen = strlen(sdata);
|
||||||
buff_len = calc_codec_buffsize(src_buff_len, mode);
|
buflen = calc_codec_buffsize(srclen, mode);
|
||||||
buffer = malloc(buff_len);
|
destbuf = malloc(buflen);
|
||||||
buffer[0]=0;
|
destbuf[0]=0;
|
||||||
if (!buffer)
|
if (!destbuf)
|
||||||
{
|
{
|
||||||
fmt = g_fmtcmdoutofmemory;
|
fmt = g_fmtcmdoutofmemory;
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(buffer, 0, buff_len);
|
memset(destbuf, 0, buflen);
|
||||||
if (func)
|
if (func)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_CODECS_HASH_MD5) && !defined(CONFIG_NSH_DISABLE_MD5)
|
#if defined(CONFIG_CODECS_HASH_MD5) && !defined(CONFIG_NSH_DISABLE_MD5)
|
||||||
if (mode == CODEC_MODE_HASH_MD5)
|
if (mode == CODEC_MODE_HASH_MD5)
|
||||||
{
|
{
|
||||||
func(src_buffer, src_buff_len, (char *)&ctx, &buff_len, 0);
|
func(srcbuf, srclen, (char *)&ctx, &buflen, 0);
|
||||||
MD5Final(mac, &ctx);
|
MD5Final(mac, &ctx);
|
||||||
pSrc = (char *)&mac;
|
src = (char *)&mac;
|
||||||
pDest = buffer;
|
dest = destbuf;
|
||||||
for (i = 0; i < 16; i++, pSrc++)
|
for (i = 0; i < 16; i++, src++)
|
||||||
{
|
{
|
||||||
*pDest++ = hex_chars[(*pSrc) >> 4];
|
*dest++ = hexchars[(*src) >> 4];
|
||||||
*pDest++ = hex_chars[(*pSrc) & 0x0f];
|
*dest++ = hexchars[(*src) & 0x0f];
|
||||||
}
|
}
|
||||||
|
|
||||||
*pDest='\0';
|
*dest = '\0';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
func(src_buffer, src_buff_len, buffer, &buff_len,(is_websafe)?1:0);
|
func(srcbuf, srclen, destbuf, &buflen,(iswebsafe)?1:0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nsh_output(vtbl, "%s\n",buffer);
|
nsh_output(vtbl, "%s\n",destbuf);
|
||||||
src_buffer = NULL;
|
srcbuf = NULL;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -458,14 +458,14 @@ exit:
|
|||||||
free(fullpath);
|
free(fullpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src_buffer)
|
if (srcbuf)
|
||||||
{
|
{
|
||||||
free(src_buffer);
|
free(srcbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buffer)
|
if (destbuf)
|
||||||
{
|
{
|
||||||
free(buffer);
|
free(destbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user