fis-gtm/sr_port/prepare_unique_name.c

116 lines
3.5 KiB
C

/****************************************************************
* *
* Copyright 2003, 2013 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#include "mdef.h"
#include "gtm_string.h"
#include "gtm_time.h"
#include "iosp.h"
#include "gtm_file_stat.h"
#include "gtm_rename.h"
#include "gtmmsg.h"
#define MAX_CHARS_APPEND 10
#if defined(UNIX)
# define DIR_FILE_SEPARATOR '/'
#elif defined(VMS)
# define DIR_FILE_SEPARATOR ']'
#endif
/* Given org_fn this will create rename_fn
* a) If prefix is not null, rename_fn = prefix + org_fn
* b) If suffix is not null, rename_fn = org_fn + suffix
* c) If prefix and suffix are both null, then
* rename_fn = org_fn + timestamp
* If rename_fn exists, add numbers to make it non-existance file
*/
uint4 prepare_unique_name(char *org_fn, int org_fn_len, char *prefix, char *suffix,
char *rename_fn, int *rename_fn_len, jnl_tm_t now, uint4 *ustatus)
{
mstr filestr;
char *filename_begin, append_char[MAX_CHARS_APPEND] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
int prefix_len, suffix_len, cnt, length;
struct tm *tm_struct;
int file_stat;
uint4 status1;
error_def(ERR_FILENAMETOOLONG);
*ustatus = SS_NORMAL;
if (0 != prefix[0])
{
prefix_len = STRLEN(prefix);
assert('\0' == org_fn[org_fn_len]);
filename_begin = strrchr(org_fn, DIR_FILE_SEPARATOR);
length = 0;
if (NULL != filename_begin)
{
length = (int4)(filename_begin - org_fn + 1);
assert(length < org_fn_len);
memcpy(rename_fn, org_fn, length);
org_fn_len -= length;
org_fn += length;
}
memcpy(rename_fn + length, prefix, prefix_len);
memcpy(rename_fn + length + prefix_len, org_fn, org_fn_len);
*rename_fn_len = length + prefix_len + org_fn_len;
}
if (0 != suffix[0])
{
suffix_len = STRLEN(suffix);
memcpy(rename_fn, org_fn, org_fn_len);
memcpy(rename_fn + org_fn_len, suffix, suffix_len);
*rename_fn_len = org_fn_len + suffix_len;
}
if (0 != prefix[0] || 0 != suffix[0])
{
rename_fn[*rename_fn_len] = 0; /* Ensure it to be NULL terminated */
return SS_NORMAL;
}
memcpy(rename_fn, org_fn, org_fn_len);
filestr.addr = rename_fn;
filestr.len = org_fn_len;
rename_fn[filestr.len] = 0;
assert(filestr.len + 1 < MAX_FN_LEN);
if (SS_NORMAL != (status1 = append_time_stamp(rename_fn, &filestr.len, now)))
return status1;
if (FILE_PRESENT == (file_stat = gtm_file_stat(&filestr, NULL, NULL, FALSE, ustatus))) /* One already exists */
{ /* new name refers to an existing file - stuff numbers on the end until its unique */
rename_fn[filestr.len] = '_';
filestr.len += 2; /* 2 is for "_" + "append_char[]" */
for ( ; filestr.len < MAX_FN_LEN; filestr.len++)
{
rename_fn[filestr.len] = '\0';
filestr.len = filestr.len;
for (cnt = 0; cnt < MAX_CHARS_APPEND; cnt++)
{
rename_fn[filestr.len - 1] = append_char[cnt];
if (FILE_NOT_FOUND == gtm_file_stat(&filestr, NULL, NULL, FALSE, ustatus))
break;
}
if (cnt < MAX_CHARS_APPEND) /* found one non existance file */
break;
}
*ustatus = SS_NORMAL;
if (MAX_FN_LEN <= filestr.len)
return ERR_FILENAMETOOLONG; /* no parameter for this message */
} else if (FILE_STAT_ERROR == file_stat)
{
status1 = *ustatus;
*ustatus = SS_NORMAL;
return status1;
}
*rename_fn_len = filestr.len;
return SS_NORMAL;
}