fastdfs/common/fdfs_global.c

147 lines
3.3 KiB
C

/**
* Copyright (C) 2008 Happy Fish / YuQing
*
* FastDFS may be copied only under the terms of the GNU General
* Public License V3, which may be found in the FastDFS source kit.
* Please visit the FastDFS Home Page http://www.fastken.com/ for more detail.
**/
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <errno.h>
#include "fastcommon/logger.h"
#include "fdfs_global.h"
Version g_fdfs_version = {6, 10, 0};
bool g_use_connection_pool = false;
ConnectionPool g_connection_pool;
int g_connection_pool_max_idle_time = 3600;
/*
data filename format:
HH/HH/filename: HH for 2 uppercase hex chars
*/
int fdfs_check_data_filename(const char *filename, const int len)
{
if (len < 6)
{
logError("file: "__FILE__", line: %d, " \
"the length=%d of filename \"%s\" is too short", \
__LINE__, len, filename);
return EINVAL;
}
if (!IS_UPPER_HEX(*filename) || !IS_UPPER_HEX(*(filename+1)) || \
*(filename+2) != '/' || \
!IS_UPPER_HEX(*(filename+3)) || !IS_UPPER_HEX(*(filename+4)) || \
*(filename+5) != '/')
{
logError("file: "__FILE__", line: %d, " \
"the format of filename \"%s\" is invalid", \
__LINE__, filename);
return EINVAL;
}
if (strchr(filename + 6, '/') != NULL)
{
logError("file: "__FILE__", line: %d, " \
"the format of filename \"%s\" is invalid", \
__LINE__, filename);
return EINVAL;
}
return 0;
}
int fdfs_gen_slave_filename(const char *master_filename, \
const char *prefix_name, const char *ext_name, \
char *filename, int *filename_len)
{
char true_ext_name[FDFS_FILE_EXT_NAME_MAX_LEN + 2];
char *pDot;
int master_file_len;
master_file_len = strlen(master_filename);
if (master_file_len < 28 + FDFS_FILE_EXT_NAME_MAX_LEN)
{
logError("file: "__FILE__", line: %d, " \
"master filename \"%s\" is invalid", \
__LINE__, master_filename);
return EINVAL;
}
pDot = strchr(master_filename + (master_file_len - \
(FDFS_FILE_EXT_NAME_MAX_LEN + 1)), '.');
if (ext_name != NULL)
{
if (*ext_name == '\0')
{
*true_ext_name = '\0';
}
else if (*ext_name == '.')
{
snprintf(true_ext_name, sizeof(true_ext_name), \
"%s", ext_name);
}
else
{
snprintf(true_ext_name, sizeof(true_ext_name), \
".%s", ext_name);
}
}
else
{
if (pDot == NULL)
{
*true_ext_name = '\0';
}
else
{
strcpy(true_ext_name, pDot);
}
}
if (*true_ext_name == '\0' && strcmp(prefix_name, "-m") == 0)
{
logError("file: "__FILE__", line: %d, " \
"prefix_name \"%s\" is invalid", \
__LINE__, prefix_name);
return EINVAL;
}
/* when prefix_name is empty, the extension name of master file and
slave file can not be same
*/
if ((*prefix_name == '\0') && ((pDot == NULL && *true_ext_name == '\0')
|| (pDot != NULL && strcmp(pDot, true_ext_name) == 0)))
{
logError("file: "__FILE__", line: %d, " \
"empty prefix_name is not allowed", __LINE__);
return EINVAL;
}
if (pDot == NULL)
{
*filename_len = sprintf(filename, "%s%s%s", master_filename, \
prefix_name, true_ext_name);
}
else
{
*filename_len = pDot - master_filename;
memcpy(filename, master_filename, *filename_len);
*filename_len += sprintf(filename + *filename_len, "%s%s", \
prefix_name, true_ext_name);
}
return 0;
}