28#define _WIN32_IE 0x0500
40#include "pg_config_paths.h"
44#define IS_PATH_VAR_SEP(ch) ((ch) == ':')
46#define IS_PATH_VAR_SEP(ch) ((ch) == ';')
50static void debackslash_path(
char *path,
int encoding);
77 else if (isalpha((
unsigned char) path[0]) && path[1] ==
':')
85#define skip_drive(path) (path)
132 for (p = pathlist; *p; p++)
164debackslash_path(
char *path,
int encoding)
177 for (p = path; *p; p +=
pg_sjis_mblen((
const unsigned char *) p))
185 for (p = path; *p; p++)
206 if (*s >= 0xa1 && *s <= 0xdf)
267 GetShortPathName(path, path,
MAXPGPATH - 1);
287 const char *head,
const char *tail)
289 if (ret_path != head)
351 bool was_sep =
false;
368 p = path + strlen(path);
369 if (p > path && *(p - 1) ==
'"')
390 for (; *p; p++, to_p++)
393 while (*p ==
'/' && was_sep)
397 was_sep = (*p ==
'/');
421 parsed = unparse = (spath + 1);
426 parsed = unparse = spath;
429 while (*unparse !=
'\0')
435 unparse_next = unparse;
436 while (*unparse_next && *unparse_next !=
'/')
438 if (*unparse_next !=
'\0')
439 *unparse_next++ =
'\0';
442 if (strcmp(unparse,
".") == 0)
445 unparse = unparse_next;
449 if (strcmp(unparse,
"..") == 0)
450 is_double_dot =
true;
455 is_double_dot =
false;
477 if (--pathdepth == 0)
509 if (--pathdepth == 0)
555 unparse = unparse_next;
587 if (path[0] ==
'.' &&
589 (path[2] ==
'\0' || path[2] ==
'/'))
622 else if (isalpha((
unsigned char) path[0]) && path[1] ==
':' &&
639 int path1_len = strlen(path1);
641 if (strncmp(path1, path2, path1_len) == 0 &&
642 (
IS_DIR_SEP(path2[path1_len]) || path2[path1_len] ==
'\0'))
654 const char *nodir_name;
670 fprintf(stderr,
"%s: out of memory\n", nodir_name);
674#if defined(__CYGWIN__) || defined(WIN32)
702 return (
int) *
s1 - (int) *
s2;
760 tail_len = strlen(
bin_path) - prefix_len;
773 tail_start = (int) strlen(ret_path) - tail_len;
774 if (tail_start > 0 &&
778 ret_path[tail_start] =
'\0';
828 (
errcode(ERRCODE_OUT_OF_MEMORY),
829 errmsg(
"out of memory")));
831 fprintf(stderr,
_(
"out of memory\n"));
836 if (getcwd(
buf, buflen))
838 else if (errno == ERANGE)
846 int save_errno = errno;
851 elog(
ERROR,
"could not get current working directory: %m");
853 fprintf(stderr,
_(
"could not get current working directory: %m\n"));
859 new =
malloc(strlen(
buf) + strlen(path) + 2);
865 (
errcode(ERRCODE_OUT_OF_MEMORY),
866 errmsg(
"out of memory")));
868 fprintf(stderr,
_(
"out of memory\n"));
882 (
errcode(ERRCODE_OUT_OF_MEMORY),
883 errmsg(
"out of memory")));
885 fprintf(stderr,
_(
"out of memory\n"));
1014 home = getenv(
"HOME");
1015 if (home && home[0])
1022 struct passwd pwbuf;
1027 rc = getpwuid_r(geteuid(), &pwbuf,
buf,
sizeof buf, &pw);
1043 tmppath = getenv(
"APPDATA");
1091 if (path[0] ==
'\0')
1095 for (p = path + strlen(path) - 1;
IS_DIR_SEP(*p) && p > path; p--)
1101 for (; p > path &&
IS_DIR_SEP(*(p - 1)); p--)
1122 p = path + strlen(path);
1141 size_t len = strlen(subdir);
1145 memmove(path, subdir,
len);
#define unconstify(underlying_type, expr)
#define IS_HIGHBIT_SET(ch)
#define fprintf(file, fmt, msg)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
char my_exec_path[MAXPGPATH]
Assert(PointerIsAligned(start, uint64))
static char bin_path[MAXPGPATH]
void cleanup_path(char *path)
void get_share_path(const char *my_exec_path, char *ret_path)
void get_pkglib_path(const char *my_exec_path, char *ret_path)
void get_locale_path(const char *my_exec_path, char *ret_path)
void join_path_components(char *ret_path, const char *head, const char *tail)
#define IS_PATH_VAR_SEP(ch)
void get_man_path(const char *my_exec_path, char *ret_path)
bool get_home_path(char *ret_path)
void get_include_path(const char *my_exec_path, char *ret_path)
static char * append_subdir_to_path(char *path, char *subdir)
bool path_is_prefix_of_path(const char *path1, const char *path2)
char * last_dir_separator(const char *filename)
bool path_is_relative_and_below_cwd(const char *path)
void get_lib_path(const char *my_exec_path, char *ret_path)
char * first_path_var_separator(const char *pathlist)
void canonicalize_path(char *path)
void get_parent_directory(char *path)
static void trim_trailing_separator(char *path)
static char * trim_directory(char *path)
static void make_relative_path(char *ret_path, const char *target_path, const char *bin_path, const char *my_exec_path)
void get_etc_path(const char *my_exec_path, char *ret_path)
void canonicalize_path_enc(char *path, int encoding)
static int dir_strcmp(const char *s1, const char *s2)
bool path_contains_parent_reference(const char *path)
void make_native_path(char *filename)
char * make_absolute_path(const char *path)
const char * get_progname(const char *argv0)
char * first_dir_separator(const char *filename)
void get_doc_path(const char *my_exec_path, char *ret_path)
void get_html_path(const char *my_exec_path, char *ret_path)
void get_pkginclude_path(const char *my_exec_path, char *ret_path)
bool has_drive_prefix(const char *path)
void get_includeserver_path(const char *my_exec_path, char *ret_path)
@ RELATIVE_WITH_PARENT_REF
#define is_absolute_path(filename)
int pg_strcasecmp(const char *s1, const char *s2)
unsigned char pg_tolower(unsigned char ch)
size_t strlcpy(char *dst, const char *src, size_t siz)
static int pg_sjis_mblen(const unsigned char *s)