1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2025-07-05 00:28:52 +02:00
Files
pgbackrest/src/command/repo/common.c
David Steele f018912908 Split VR_EXTERN/FN_EXTERN macros from FV_EXTERN.
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.
2023-01-02 15:24:51 +07:00

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);
}