/**************************************************************** * * * Copyright 2001, 2012 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 #include #include "gtm_unistd.h" #include "gtm_string.h" #include "gtm_limits.h" #include "gdsroot.h" #include "gdsbt.h" error_def(ERR_FILENAMETOOLONG); /* gets the full path name for a given file name. Prepends the CWD, even if the file does not exist */ boolean_t get_full_path(char *orig_fn, unsigned int orig_len, char *full_fn, unsigned int *full_len, int max_len, uint4 *status) { char *cptr, *c1; char cwdbuf[GTM_PATH_MAX]; int cwd_len; int i, length; char *getcwd_res; if ('/' == *orig_fn) { /* The original path is already complete */ if (max_len < orig_len) { *status = ERR_FILENAMETOOLONG; return FALSE; } length = orig_len; memcpy(full_fn, orig_fn, length); } else { if (NULL == GETCWD(cwdbuf, SIZEOF(cwdbuf), getcwd_res)) { *status = errno; return FALSE; } cwd_len = STRLEN(cwdbuf); cptr = orig_fn; if (('.' == *cptr) && ('.' == *(cptr + 1))) { for (i = 1; ; ++i) { cptr += 2; if (('.' != *(cptr + 1)) || ('.' != *(cptr + 2))) break; ++cptr; } for (c1 = &cwdbuf[cwd_len - 1]; i > 0; --i) while ('/' != *c1) --c1; if ((length = (int)((c1 - cwdbuf) + orig_len - (cptr - orig_fn))) + 1 > max_len) /* Warning - assignment */ { *status = ERR_FILENAMETOOLONG; return FALSE; } memcpy(full_fn, cwdbuf, c1 - cwdbuf); memcpy(full_fn + (c1 - cwdbuf), cptr, orig_len - (cptr - orig_fn)); } else { if ('.' == *cptr && '/' == (*(cptr + 1))) cptr += 2; if ((length = (int)(cwd_len + 1 + orig_len - (cptr - orig_fn))) + 1 > max_len) /* Warning - assignment */ { *status = ERR_FILENAMETOOLONG; return FALSE; } strcpy(full_fn, cwdbuf); full_fn[cwd_len] = '/'; memcpy(full_fn + cwd_len + 1, cptr, orig_len - (cptr - orig_fn)); } } *full_len = length; full_fn[length] = '\0'; return TRUE; }