本文整理汇总了C++中canonicalize_path函数的典型用法代码示例。如果您正苦于以下问题:C++ canonicalize_path函数的具体用法?C++ canonicalize_path怎么用?C++ canonicalize_path使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了canonicalize_path函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: test_canonicalize_path
static Boolean test_canonicalize_path(int verbose)
{
static struct stringtest {
char *str1;
char *str2;
} tests[] = {
{ "/foo/a/bz.to/bar.dvi", "/foo/a/bz.to/bar.dvi" },
{ "/foo/../bar.dvi", "/bar.dvi" },
{ "/foo/../bar.dvi", "/bar.dvi" },
{ "/foo/./roo/./bar.dvi", "/foo/roo/bar.dvi" },
{ "/foo/./roo/../bar.dvi", "/foo/bar.dvi" },
};
size_t i;
Boolean result = True;
for (i = 0; i < (sizeof tests / sizeof tests[0]); i++) {
if (verbose) {
INFO((stderr, "canonicalize_path(%s) -> %s == %s?\n",
tests[i].str1,
canonicalize_path(tests[i].str1),
tests[i].str2));
}
if (!test_str_equality(verbose, canonicalize_path(tests[i].str1), tests[i].str2)) {
result = False;
}
}
return result;
}
示例2: make_relative_path
/*
* make_relative_path - make a path relative to the actual binary location
*
* This function exists to support relocation of installation trees.
*
* ret_path is the output area (must be of size MAXPGPATH)
* target_path is the compiled-in path to the directory we want to find
* bin_path is the compiled-in path to the directory of executables
* my_exec_path is the actual location of my executable
*
* If target_path matches bin_path up to the last directory component of
* bin_path, then we build the result as my_exec_path (less the executable
* name and last directory) joined to the non-matching part of target_path.
* Otherwise, we return target_path as-is.
*
* For example:
* target_path = '/usr/local/share/postgresql'
* bin_path = '/usr/local/bin'
* my_exec_path = '/opt/pgsql/bin/postmaster'
* Given these inputs we would return '/opt/pgsql/share/postgresql'
*/
static void
make_relative_path(char *ret_path, const char *target_path,
const char *bin_path, const char *my_exec_path)
{
const char *bin_end;
int prefix_len;
bin_end = last_dir_separator(bin_path);
if (!bin_end)
goto no_match;
prefix_len = bin_end - bin_path + 1;
if (strncmp(target_path, bin_path, prefix_len) != 0)
goto no_match;
StrNCpy(ret_path, my_exec_path, MAXPGPATH);
trim_directory(ret_path); /* remove my executable name */
trim_directory(ret_path); /* remove last directory component (/bin) */
join_path_components(ret_path, ret_path, target_path + prefix_len);
canonicalize_path(ret_path);
return;
no_match:
StrNCpy(ret_path, target_path, MAXPGPATH);
canonicalize_path(ret_path);
}
示例3: to_canonic_path
int
to_canonic_path(const char path[], char buf[], size_t buf_len)
{
if(!is_path_absolute(path))
{
char cwd[PATH_MAX];
char full_path[PATH_MAX];
if(getcwd(cwd, sizeof(cwd)) == NULL)
{
/* getcwd() failed, we can't use relative path, so fail. */
LOG_SERROR_MSG(errno, "Can't get CWD");
return 1;
}
snprintf(full_path, sizeof(full_path), "%s/%s", cwd, path);
canonicalize_path(full_path, buf, buf_len);
}
else
{
canonicalize_path(path, buf, buf_len);
}
chosp(buf);
return 0;
}
示例4: load_config
/*
* load_config()
*
* Set default options and overwrite with values from provided configuration
* file.
*
* Returns true if a configuration file could be parsed, otherwise false.
*
* Any configuration options changed in this function must also be changed in
* reload_config()
*/
bool
load_config(const char *config_file, t_configuration_options *options, char *argv0)
{
struct stat config;
/* Sanity checks */
/*
* If a configuration file was provided, check it exists, otherwise
* emit an error and terminate
*/
if (config_file[0])
{
strncpy(config_file_path, config_file, MAXPGPATH);
canonicalize_path(config_file_path);
if (stat(config_file_path, &config) != 0)
{
log_err(_("provided configuration file '%s' not found: %s\n"),
config_file,
strerror(errno)
);
exit(ERR_BAD_CONFIG);
}
config_file_provided = true;
}
/*
* If no configuration file was provided, attempt to find a default file
*/
if (config_file_provided == false)
{
char my_exec_path[MAXPGPATH];
char etc_path[MAXPGPATH];
/* First check if one is in the default sysconfdir */
if (find_my_exec(argv0, my_exec_path) < 0)
{
fprintf(stderr, _("%s: could not find own program executable\n"), argv0);
exit(EXIT_FAILURE);
}
get_etc_path(my_exec_path, etc_path);
snprintf(config_file_path, MAXPGPATH, "%s/repmgr.conf", etc_path);
log_debug(_("Looking for configuration file in %s\n"), etc_path);
if (stat(config_file_path, &config) != 0)
{
/* Not found - default to ./repmgr.conf */
strncpy(config_file_path, DEFAULT_CONFIG_FILE, MAXPGPATH);
canonicalize_path(config_file_path);
log_debug(_("Looking for configuration file in %s\n"), config_file_path);
}
}
return parse_config(options);
}
示例5: grub_resolve_relative_path
/* Return a new heap-allocated string representing to absolute path
to the file referred to by PATH. If PATH is an absolute path, then
the returned path is a copy of PATH. If PATH is a relative path, then
BASE is with PATH used to construct the absolute path. */
char *
grub_resolve_relative_path (const char *base, const char *path)
{
char *abspath;
char *canonpath;
char *p;
grub_size_t l;
/* If PATH is an absolute path, then just use it as is. */
if (path[0] == '/' || path[0] == '(')
return canonicalize_path (path);
abspath = grub_malloc (grub_strlen (base) + grub_strlen (path) + 3);
if (! abspath)
return 0;
/* Concatenate BASE and PATH. */
p = grub_stpcpy (abspath, base);
l = grub_strlen (abspath);
if (l == 0 || abspath[l-1] != '/')
{
*p = '/';
p++;
*p = 0;
}
grub_stpcpy (p, path);
canonpath = canonicalize_path (abspath);
if (! canonpath)
return abspath;
grub_free (abspath);
return canonpath;
}
示例6: tablespace_list_append
/*
* Split argument into old_dir and new_dir and append to tablespace mapping
* list.
*
* Adapted from pg_basebackup.c
*/
static void
tablespace_list_append(t_configuration_options *options, const char *arg)
{
TablespaceListCell *cell;
char *dst;
char *dst_ptr;
const char *arg_ptr;
cell = (TablespaceListCell *) pg_malloc0(sizeof(TablespaceListCell));
if (cell == NULL)
{
log_err(_("unable to allocate memory; terminating\n"));
exit(ERR_BAD_CONFIG);
}
dst_ptr = dst = cell->old_dir;
for (arg_ptr = arg; *arg_ptr; arg_ptr++)
{
if (dst_ptr - dst >= MAXPGPATH)
{
log_err(_("directory name too long\n"));
exit(ERR_BAD_CONFIG);
}
if (*arg_ptr == '\\' && *(arg_ptr + 1) == '=')
; /* skip backslash escaping = */
else if (*arg_ptr == '=' && (arg_ptr == arg || *(arg_ptr - 1) != '\\'))
{
if (*cell->new_dir)
{
log_err(_("multiple \"=\" signs in tablespace mapping\n"));
exit(ERR_BAD_CONFIG);
}
else
{
dst = dst_ptr = cell->new_dir;
}
}
else
*dst_ptr++ = *arg_ptr;
}
if (!*cell->old_dir || !*cell->new_dir)
{
log_err(_("invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"\n"),
arg);
exit(ERR_BAD_CONFIG);
}
canonicalize_path(cell->old_dir);
canonicalize_path(cell->new_dir);
if (options->tablespace_mapping.tail)
options->tablespace_mapping.tail->next = cell;
else
options->tablespace_mapping.head = cell;
options->tablespace_mapping.tail = cell;
}
示例7: set_pglocale_pgservice
/*
* set_pglocale_pgservice
*
* Set application-specific locale and service directory
*
* This function takes the value of argv[0] rather than a full path.
*
* (You may be wondering why this is in exec.c. It requires this module's
* services and doesn't introduce any new dependencies, so this seems as
* good as anyplace.)
*/
void
set_pglocale_pgservice(const char *argv0, const char *app)
{
char path[MAXPGPATH];
char my_exec_path[MAXPGPATH];
char env_path[MAXPGPATH + sizeof("PGSYSCONFDIR=")]; /* longer than
* PGLOCALEDIR */
char *dup_path;
/* don't set LC_ALL in the backend */
if (strcmp(app, PG_TEXTDOMAIN("postgres")) != 0)
{
setlocale(LC_ALL, "");
/*
* One could make a case for reproducing here PostmasterMain()'s test
* for whether the process is multithreaded. Unlike the postmaster,
* no frontend program calls sigprocmask() or otherwise provides for
* mutual exclusion between signal handlers. While frontends using
* fork(), if multithreaded, are formally exposed to undefined
* behavior, we have not witnessed a concrete bug. Therefore,
* complaining about multithreading here may be mere pedantry.
*/
}
if (find_my_exec(argv0, my_exec_path) < 0)
return;
#ifdef ENABLE_NLS
get_locale_path(my_exec_path, path);
bindtextdomain(app, path);
textdomain(app);
if (getenv("PGLOCALEDIR") == NULL)
{
/* set for libpq to use */
snprintf(env_path, sizeof(env_path), "PGLOCALEDIR=%s", path);
canonicalize_path(env_path + 12);
dup_path = strdup(env_path);
if (dup_path)
putenv(dup_path);
}
#endif
if (getenv("PGSYSCONFDIR") == NULL)
{
get_etc_path(my_exec_path, path);
/* set for libpq to use */
snprintf(env_path, sizeof(env_path), "PGSYSCONFDIR=%s", path);
canonicalize_path(env_path + 13);
dup_path = strdup(env_path);
if (dup_path)
putenv(dup_path);
}
}
示例8: treat_many_dots_right
static void
treat_many_dots_right(void)
{
char buf[PATH_MAX];
canonicalize_path("...", buf, sizeof(buf));
#ifndef _WIN32
assert_string_equal(".../", buf);
#else
assert_string_equal("./", buf);
#endif
canonicalize_path(".../", buf, sizeof(buf));
#ifndef _WIN32
assert_string_equal(".../", buf);
#else
assert_string_equal("./", buf);
#endif
canonicalize_path("...abc", buf, sizeof(buf));
assert_string_equal("...abc/", buf);
canonicalize_path(".abc", buf, sizeof(buf));
assert_string_equal(".abc/", buf);
canonicalize_path("abc...", buf, sizeof(buf));
assert_string_equal("abc.../", buf);
canonicalize_path("abc.", buf, sizeof(buf));
assert_string_equal("abc./", buf);
canonicalize_path(ABS_PREFIX "/a/.../.", buf, sizeof(buf));
#ifndef _WIN32
assert_string_equal(ABS_PREFIX "/a/.../", buf);
#else
assert_string_equal(ABS_PREFIX "/a/", buf);
#endif
canonicalize_path(ABS_PREFIX "/windows/.../", buf, sizeof(buf));
#ifndef _WIN32
assert_string_equal(ABS_PREFIX "/windows/.../", buf);
#else
assert_string_equal(ABS_PREFIX "/windows/", buf);
#endif
canonicalize_path(ABS_PREFIX "/windows/...abc", buf, sizeof(buf));
assert_string_equal(ABS_PREFIX "/windows/...abc/", buf);
canonicalize_path(ABS_PREFIX "/windows/..................", buf, sizeof(buf));
#ifndef _WIN32
assert_string_equal(ABS_PREFIX "/windows/................../", buf);
#else
assert_string_equal(ABS_PREFIX "/windows/", buf);
#endif
}
示例9: excess_slashes
static void
excess_slashes(void)
{
char buf[PATH_MAX];
canonicalize_path(ABS_PREFIX "//", buf, sizeof(buf));
assert_string_equal(ABS_PREFIX "/", buf);
canonicalize_path(ABS_PREFIX "/////////////", buf, sizeof(buf));
assert_string_equal(ABS_PREFIX "/", buf);
}
示例10: not_root_updir
static void
not_root_updir(void)
{
char buf[PATH_MAX];
canonicalize_path("../", buf, sizeof(buf));
assert_string_equal("../", buf);
canonicalize_path("../../", buf, sizeof(buf));
assert_string_equal("../../", buf);
}
示例11: paths_are_equal
int
paths_are_equal(const char s[], const char t[])
{
/* Some additional space is allocated for adding slashes. */
char s_can[strlen(s) + 8];
char t_can[strlen(t) + 8];
canonicalize_path(s, s_can, sizeof(s_can));
canonicalize_path(t, t_can, sizeof(t_can));
return stroscmp(s_can, t_can) == 0;
}
示例12: make_rel_path
const char *
make_rel_path(const char path[], const char base[])
{
static char buf[PATH_MAX];
const char *p = path, *b = base;
int i;
int nslashes;
#ifdef _WIN32
if(path[1] == ':' && base[1] == ':' && path[0] != base[0])
{
canonicalize_path(path, buf, sizeof(buf));
return buf;
}
#endif
while(p[0] != '\0' && p[1] != '\0' && b[0] != '\0' && b[1] != '\0')
{
const char *op = p, *ob = b;
if((p = strchr(p + 1, '/')) == NULL)
p = path + strlen(path);
if((b = strchr(b + 1, '/')) == NULL)
b = base + strlen(base);
if(p - path != b - base || strnoscmp(path, base, p - path) != 0)
{
p = op;
b = ob;
break;
}
}
canonicalize_path(b, buf, sizeof(buf));
chosp(buf);
nslashes = 0;
for(i = 0; buf[i] != '\0'; i++)
if(buf[i] == '/')
nslashes++;
buf[0] = '\0';
while(nslashes-- > 0)
strcat(buf, "../");
if(*p == '/')
p++;
canonicalize_path(p, buf + strlen(buf), sizeof(buf) - strlen(buf));
chosp(buf);
if(buf[0] == '\0')
strcpy(buf, ".");
return buf;
}
示例13: make_relative_path
/*
* make_relative_path - make a path relative to the actual binary location
*
* This function exists to support relocation of installation trees.
*
* ret_path is the output area (must be of size MAXPGPATH)
* target_path is the compiled-in path to the directory we want to find
* bin_path is the compiled-in path to the directory of executables
* my_exec_path is the actual location of my executable
*
* We determine the common prefix of target_path and bin_path, then compare
* the remainder of bin_path to the last directory component(s) of
* my_exec_path. If they match, build the result as the part of my_exec_path
* preceding the match, joined to the remainder of target_path. If no match,
* return target_path as-is.
*
* For example:
* target_path = '/usr/local/share/postgresql'
* bin_path = '/usr/local/bin'
* my_exec_path = '/opt/pgsql/bin/postmaster'
* Given these inputs, the common prefix is '/usr/local/', the tail of
* bin_path is 'bin' which does match the last directory component of
* my_exec_path, so we would return '/opt/pgsql/share/postgresql'
*/
static void
make_relative_path(char *ret_path, const char *target_path,
const char *bin_path, const char *my_exec_path)
{
int prefix_len;
int tail_start;
int tail_len;
int i;
/*
* Determine the common prefix --- note we require it to end on a
* directory separator, consider eg '/usr/lib' and '/usr/libexec'.
*/
prefix_len = 0;
for (i = 0; target_path[i] && bin_path[i]; i++)
{
if (IS_DIR_SEP(target_path[i]) && IS_DIR_SEP(bin_path[i]))
prefix_len = i + 1;
else if (target_path[i] != bin_path[i])
break;
}
if (prefix_len == 0)
goto no_match; /* no common prefix? */
tail_len = strlen(bin_path) - prefix_len;
/*
* Set up my_exec_path without the actual executable name, and
* canonicalize to simplify comparison to bin_path.
*/
strlcpy(ret_path, my_exec_path, MAXPGPATH);
trim_directory(ret_path); /* remove my executable name */
canonicalize_path(ret_path);
/*
* Tail match?
*/
tail_start = (int) strlen(ret_path) - tail_len;
if (tail_start > 0 &&
IS_DIR_SEP(ret_path[tail_start - 1]) &&
dir_strcmp(ret_path + tail_start, bin_path + prefix_len) == 0)
{
ret_path[tail_start] = '\0';
trim_trailing_separator(ret_path);
join_path_components(ret_path, ret_path, target_path + prefix_len);
canonicalize_path(ret_path);
return;
}
no_match:
strlcpy(ret_path, target_path, MAXPGPATH);
canonicalize_path(ret_path);
}
示例14: remove_dots
static void
remove_dots(void)
{
char buf[PATH_MAX];
canonicalize_path("./", buf, sizeof(buf));
assert_string_equal("./", buf);
canonicalize_path(ABS_PREFIX "/a/./", buf, sizeof(buf));
assert_string_equal(ABS_PREFIX "/a/", buf);
canonicalize_path("././././././", buf, sizeof(buf));
assert_string_equal("./", buf);
}
示例15: test_canonicalize_path
static int test_canonicalize_path(const char *path, const char *expected)
{
char epath[PATH_MAX];
EXPECT_ZERO(zsnprintf(epath, PATH_MAX, "%s", path));
if (!expected) {
EXPECT_NONZERO(canonicalize_path(epath));
}
else {
EXPECT_ZERO(canonicalize_path(epath));
EXPECT_ZERO(strcmp(epath, expected));
}
return 0;
}