You've already forked pgbackrest
mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2025-07-05 00:28:52 +02:00
This should make it a little clearer what the variable (VR) macros are doing since the declaration/definition cannot both be set to extern (but functions can). Splitting the variable macros out also allows them to be changed in the future with little churn, while changing the function macro creates a large amount of churn.
79 lines
2.7 KiB
C
79 lines
2.7 KiB
C
/***********************************************************************************************************************************
|
|
Common Functions and Definitions for Repo Commands
|
|
***********************************************************************************************************************************/
|
|
#include "build.auto.h"
|
|
|
|
#include "command/repo/common.h"
|
|
#include "common/debug.h"
|
|
#include "config/config.h"
|
|
#include "storage/helper.h"
|
|
|
|
/**********************************************************************************************************************************/
|
|
FN_EXTERN String *
|
|
repoPathIsValid(const String *path)
|
|
{
|
|
FUNCTION_LOG_BEGIN(logLevelDebug);
|
|
FUNCTION_LOG_PARAM(STRING, path);
|
|
FUNCTION_LOG_END();
|
|
|
|
ASSERT(path != NULL);
|
|
|
|
String *result = NULL;
|
|
|
|
MEM_CONTEXT_TEMP_BEGIN()
|
|
{
|
|
// Make sure there are no occurrences of //
|
|
if (strstr(strZ(path), "//") != NULL)
|
|
THROW_FMT(ParamInvalidError, "path '%s' cannot contain //", strZ(path));
|
|
|
|
// Make sure the path does not end with a slash
|
|
if (strEndsWith(path, FSLASH_STR))
|
|
path = strPath(path);
|
|
|
|
// Validate absolute paths
|
|
if (strBeginsWith(path, FSLASH_STR))
|
|
{
|
|
// Get the repo path using repo storage in case it is remotely configured
|
|
const String *const repoPath = storagePathP(storageRepo(), NULL);
|
|
|
|
// If the path is exactly equal to the repo path then the relative path is empty
|
|
if (strEq(path, repoPath))
|
|
{
|
|
MEM_CONTEXT_PRIOR_BEGIN()
|
|
{
|
|
result = strNew();
|
|
}
|
|
MEM_CONTEXT_PRIOR_END();
|
|
}
|
|
// Else check that the file path begins with the repo path
|
|
else
|
|
{
|
|
if (!strEq(repoPath, FSLASH_STR) && !strBeginsWith(path, strNewFmt("%s/", strZ(repoPath))))
|
|
{
|
|
THROW_FMT(
|
|
ParamInvalidError, "absolute path '%s' is not in base path '%s'", strZ(path),
|
|
strZ(cfgOptionDisplay(cfgOptRepoPath)));
|
|
}
|
|
|
|
MEM_CONTEXT_PRIOR_BEGIN()
|
|
{
|
|
// Get the relative part of the path/file
|
|
result = strSub(path, strEq(repoPath, FSLASH_STR) ? 1 : strSize(repoPath) + 1);
|
|
}
|
|
MEM_CONTEXT_PRIOR_END();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MEM_CONTEXT_PRIOR_BEGIN()
|
|
{
|
|
result = strDup(path);
|
|
}
|
|
MEM_CONTEXT_PRIOR_END();
|
|
}
|
|
}
|
|
MEM_CONTEXT_TEMP_END();
|
|
|
|
FUNCTION_LOG_RETURN(STRING, result);
|
|
}
|