#include <ctype.h>
#include <netdb.h>
#include <pwd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
Go to the source code of this file.
Defines | |
#define | PGINVALID_SOCKET (-1) |
#define | IS_DIR_SEP(ch) ((ch) == '/') |
#define | is_absolute_path(filename) |
#define | EXE "" |
#define | DEVNULL "/dev/null" |
#define | SYSTEMQUOTE "" |
#define | TIMEZONE_GLOBAL timezone |
#define | TZNAME_GLOBAL tzname |
#define | closesocket close |
#define | pgoff_t off_t |
#define | fseeko(a, b, c) fseek(a, b, c) |
#define | ftello(a) ftell(a) |
#define | qsort(a, b, c, d) pg_qsort(a,b,c,d) |
Typedefs | |
typedef int | pgsocket |
typedef int(* | qsort_arg_comparator )(const void *a, const void *b, void *arg) |
typedef void(* | pqsigfunc )(int signo) |
Functions | |
bool | pg_set_noblock (pgsocket sock) |
bool | pg_set_block (pgsocket sock) |
bool | has_drive_prefix (const char *filename) |
char * | first_dir_separator (const char *filename) |
char * | last_dir_separator (const char *filename) |
char * | first_path_var_separator (const char *pathlist) |
void | join_path_components (char *ret_path, const char *head, const char *tail) |
void | canonicalize_path (char *path) |
void | make_native_path (char *path) |
bool | path_contains_parent_reference (const char *path) |
bool | path_is_relative_and_below_cwd (const char *path) |
bool | path_is_prefix_of_path (const char *path1, const char *path2) |
const char * | get_progname (const char *argv0) |
void | get_share_path (const char *my_exec_path, char *ret_path) |
void | get_etc_path (const char *my_exec_path, char *ret_path) |
void | get_include_path (const char *my_exec_path, char *ret_path) |
void | get_pkginclude_path (const char *my_exec_path, char *ret_path) |
void | get_includeserver_path (const char *my_exec_path, char *ret_path) |
void | get_lib_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 | 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_man_path (const char *my_exec_path, char *ret_path) |
bool | get_home_path (char *ret_path) |
void | get_parent_directory (char *path) |
char ** | pgfnames (const char *path) |
void | pgfnames_cleanup (char **filenames) |
void | set_pglocale_pgservice (const char *argv0, const char *app) |
int | find_my_exec (const char *argv0, char *retpath) |
int | find_other_exec (const char *argv0, const char *target, const char *versionstr, char *retpath) |
void | pg_usleep (long microsec) |
int | pg_strcasecmp (const char *s1, const char *s2) |
int | pg_strncasecmp (const char *s1, const char *s2, size_t n) |
unsigned char | pg_toupper (unsigned char ch) |
unsigned char | pg_tolower (unsigned char ch) |
unsigned char | pg_ascii_toupper (unsigned char ch) |
unsigned char | pg_ascii_tolower (unsigned char ch) |
char * | simple_prompt (const char *prompt, int maxlen, bool echo) |
int | pclose_check (FILE *stream) |
bool | rmtree (const char *path, bool rmtopdir) |
char * | crypt (const char *key, const char *setting) |
double | pg_erand48 (unsigned short xseed[3]) |
long | pg_lrand48 (void) |
void | pg_srand48 (long seed) |
int | fls (int mask) |
int | getopt (int nargc, char *const *nargv, const char *ostr) |
int | getpeereid (int sock, uid_t *uid, gid_t *gid) |
int | isinf (double x) |
double | rint (double x) |
int | inet_aton (const char *cp, struct in_addr *addr) |
size_t | strlcat (char *dst, const char *src, size_t siz) |
size_t | strlcpy (char *dst, const char *src, size_t siz) |
long | random (void) |
void | unsetenv (const char *name) |
void | srandom (unsigned int seed) |
char * | pqStrerror (int errnum, char *strerrbuf, size_t buflen) |
int | pqGetpwuid (uid_t uid, struct passwd *resultbuf, char *buffer, size_t buflen, struct passwd **result) |
int | pqGethostbyname (const char *name, struct hostent *resultbuf, char *buffer, size_t buflen, struct hostent **result, int *herrno) |
void | pg_qsort (void *base, size_t nel, size_t elsize, int(*cmp)(const void *, const void *)) |
int | pg_qsort_strcmp (const void *a, const void *b) |
void | qsort_arg (void *base, size_t nel, size_t elsize, qsort_arg_comparator cmp, void *arg) |
int | pg_get_encoding_from_locale (const char *ctype, bool write_message) |
char * | inet_net_ntop (int af, const void *src, int bits, char *dst, size_t size) |
int | pg_check_dir (const char *dir) |
int | pg_mkdir_p (char *path, int omode) |
pqsigfunc | pqsignal (int signo, pqsigfunc func) |
char * | escape_single_quotes_ascii (const char *src) |
char * | wait_result_to_str (int exit_status) |
#define closesocket close |
Definition at line 352 of file port.h.
Referenced by CheckRADIUSAuth(), ident_inet(), internal_cancel(), ParallelBackupEnd(), ParallelBackupStart(), pgstat_init(), pqDropConnection(), SetupWorker(), ShutdownWorkersHard(), StreamClose(), and StreamServerPort().
#define DEVNULL "/dev/null" |
Definition at line 114 of file port.h.
Referenced by do_init(), get_set_pwd(), load_plpgsql(), make_postgres(), make_template0(), regression_main(), saveHistory(), setup_auth(), setup_collation(), setup_conversion(), setup_depend(), setup_description(), setup_dictionary(), setup_privileges(), setup_schema(), setup_sysviews(), start_postmaster(), SysLoggerMain(), test_config_settings(), and vacuum_db().
#define EXE "" |
Definition at line 108 of file port.h.
Referenced by find_other_exec(), and get_progname().
#define is_absolute_path | ( | filename | ) |
( \ IS_DIR_SEP((filename)[0]) \ )
Definition at line 75 of file port.h.
Referenced by BeginCopyTo(), connectOptions2(), convert_and_check_filename(), create_xlog_symlink(), CreateTableSpace(), do_connect(), exec_command(), find_in_dynamic_libpath(), find_my_exec(), get_extension_script_directory(), get_prompt(), make_absolute_path(), PasswordFromFile(), path_is_relative_and_below_cwd(), process_file(), setup_bin_paths(), and tokenize_inc_file().
#define IS_DIR_SEP | ( | ch | ) | ((ch) == '/') |
Definition at line 73 of file port.h.
Referenced by dir_strcmp(), first_dir_separator(), join_path_components(), last_dir_separator(), make_relative_path(), path_is_prefix_of_path(), path_is_relative_and_below_cwd(), trim_directory(), and trim_trailing_separator().
#define PGINVALID_SOCKET (-1) |
Definition at line 24 of file port.h.
Referenced by ClosePostmasterPorts(), initMasks(), pgstat_drop_database(), pgstat_init(), pgstat_initstats(), pgstat_ping(), pgstat_report_analyze(), pgstat_report_autovac(), pgstat_report_deadlock(), pgstat_report_recovery_conflict(), pgstat_report_tempfile(), pgstat_report_vacuum(), pgstat_reset_counters(), pgstat_reset_shared_counters(), pgstat_reset_single_counter(), pgstat_send(), pgstat_send_tabstat(), pgstat_start(), pgstat_vacuum_stat(), PostmasterMain(), ServerLoop(), StreamServerPort(), WaitLatch(), and WaitLatchOrSocket().
Definition at line 445 of file port.h.
Referenced by _ltree_picksplit(), aclitemsort(), aclmembers(), acquire_sample_rows(), add_guc_variable(), AddEnumLabel(), associate(), build_guc_variables(), BuildEventTriggerCache(), buildIndexArray(), choose_bitmap_and(), compileTheLexeme(), compute_array_stats(), compute_range_stats(), compute_scalar_stats(), compute_tsvector_stats(), dsynonym_init(), eliminate_duplicate_dependencies(), entry_dealloc(), EnumValuesCreate(), fill_in_constant_lengths(), find_inheritance_children(), findObjectByCatalogId(), g_int_picksplit(), g_intbig_picksplit(), gbt_num_picksplit(), generate_trgm(), generate_wildcard_trgm(), get_docrep(), ghstore_picksplit(), ginGetBAEntry(), gist_box_picksplit(), gseg_picksplit(), gtrgm_picksplit(), gtsquery_picksplit(), gtsvector_picksplit(), hstoreUniquePairs(), load_enum_cache_data(), ltree_picksplit(), ltsGetFreeBlock(), mcelem_array_contained_selec(), mXactCacheGetBySet(), mXactCachePut(), NISortAffixes(), NISortDictionary(), packGraph(), PageIndexMultiDelete(), PageRepairFragmentation(), perform_base_backup(), pg_qsort(), ProcArrayApplyRecoveryInfo(), putVariable(), QTNSort(), range_gist_double_sorting_split(), read_dictionary(), readstoplist(), rebuild_database_list(), run_named_permutations(), selectColorTrigrams(), sort_pool(), sort_snapshot(), sortDataAndIndexObjectsBySize(), sortDumpableObjectsByTypeName(), sortDumpableObjectsByTypeOid(), spg_kd_picksplit(), spg_quad_picksplit(), spg_text_picksplit(), spgPageIndexMultiDelete(), tbm_begin_iterate(), TidListCreate(), uniqueint(), uniquePos(), uniqueWORD(), and writezone().
#define SYSTEMQUOTE "" |
Definition at line 145 of file port.h.
Referenced by adjust_data_dir(), do_init(), do_shell(), ecpg_start_test(), editFile(), exec_prog(), get_control_data(), isolation_start_test(), psql_command(), psql_start_test(), regression_main(), results_differ(), runPgDump(), start_postmaster(), stop_postmaster(), and test_config_settings().
#define TIMEZONE_GLOBAL timezone |
Definition at line 259 of file port.h.
Referenced by abstime2tm(), and timestamp2tm().
#define TZNAME_GLOBAL tzname |
Definition at line 260 of file port.h.
Referenced by abstime2tm(), and timestamp2tm().
typedef int(* qsort_arg_comparator)(const void *a, const void *b, void *arg) |
void canonicalize_path | ( | char * | path | ) |
Definition at line 216 of file path.c.
References skip_drive, trim_directory(), and trim_trailing_separator().
Referenced by adjust_data_dir(), check_canonical_path(), convert_and_check_filename(), create_script_for_old_cluster_deletion(), create_xlog_symlink(), CreateTableSpace(), do_copy(), exec_command(), find_in_dynamic_libpath(), find_my_exec(), find_other_exec(), load_libraries(), main(), make_absolute_path(), make_relative_path(), perform_fsync(), process_file(), resolve_symlinks(), set_pglocale_pgservice(), setup(), setup_bin_paths(), setup_pgdata(), SplitDirectoriesString(), and tokenize_inc_file().
{ char *p, *to_p; char *spath; bool was_sep = false; int pending_strips; #ifdef WIN32 /* * The Windows command processor will accept suitably quoted paths with * forward slashes, but barfs badly with mixed forward and back slashes. */ for (p = path; *p; p++) { if (*p == '\\') *p = '/'; } /* * In Win32, if you do: prog.exe "a b" "\c\d\" the system will pass \c\d" * as argv[2], so trim off trailing quote. */ if (p > path && *(p - 1) == '"') *(p - 1) = '/'; #endif /* * Removing the trailing slash on a path means we never get ugly double * trailing slashes. Also, Win32 can't stat() a directory with a trailing * slash. Don't remove a leading slash, though. */ trim_trailing_separator(path); /* * Remove duplicate adjacent separators */ p = path; #ifdef WIN32 /* Don't remove leading double-slash on Win32 */ if (*p) p++; #endif to_p = p; for (; *p; p++, to_p++) { /* Handle many adjacent slashes, like "/a///b" */ while (*p == '/' && was_sep) p++; if (to_p != p) *to_p = *p; was_sep = (*p == '/'); } *to_p = '\0'; /* * Remove any trailing uses of "." and process ".." ourselves * * Note that "/../.." should reduce to just "/", while "../.." has to be * kept as-is. In the latter case we put back mistakenly trimmed ".." * components below. Also note that we want a Windows drive spec to be * visible to trim_directory(), but it's not part of the logic that's * looking at the name components; hence distinction between path and * spath. */ spath = skip_drive(path); pending_strips = 0; for (;;) { int len = strlen(spath); if (len >= 2 && strcmp(spath + len - 2, "/.") == 0) trim_directory(path); else if (strcmp(spath, ".") == 0) { /* Want to leave "." alone, but "./.." has to become ".." */ if (pending_strips > 0) *spath = '\0'; break; } else if ((len >= 3 && strcmp(spath + len - 3, "/..") == 0) || strcmp(spath, "..") == 0) { trim_directory(path); pending_strips++; } else if (pending_strips > 0 && *spath != '\0') { /* trim a regular directory name canceled by ".." */ trim_directory(path); pending_strips--; /* foo/.. should become ".", not empty */ if (*spath == '\0') strcpy(spath, "."); } else break; } if (pending_strips > 0) { /* * We could only get here if path is now totally empty (other than a * possible drive specifier on Windows). We have to put back one or * more ".."'s that we took off. */ while (--pending_strips > 0) strcat(path, "../"); strcat(path, ".."); } }
char* crypt | ( | const char * | key, | |
const char * | setting | |||
) |
Referenced by chkpass_eq(), chkpass_in(), and chkpass_ne().
char* escape_single_quotes_ascii | ( | const char * | src | ) |
Definition at line 33 of file quotes.c.
References i, malloc, and SQL_STR_DOUBLE.
Referenced by escape_quotes().
int find_my_exec | ( | const char * | argv0, | |
char * | retpath | |||
) |
Definition at line 119 of file exec.c.
References _, canonicalize_path(), first_dir_separator(), first_path_var_separator(), is_absolute_path, join_path_components(), log_error, MAXPGPATH, Min, NULL, resolve_symlinks(), strerror(), StrNCpy, and validate_exec().
Referenced by AuxiliaryProcessMain(), find_other_exec(), find_other_exec_or_die(), getInstallationPaths(), main(), PostgresMain(), process_psqlrc(), set_pglocale_pgservice(), setup(), and setup_bin_paths().
{ char cwd[MAXPGPATH], test_path[MAXPGPATH]; char *path; if (!getcwd(cwd, MAXPGPATH)) { log_error(_("could not identify current directory: %s"), strerror(errno)); return -1; } /* * If argv0 contains a separator, then PATH wasn't used. */ if (first_dir_separator(argv0) != NULL) { if (is_absolute_path(argv0)) StrNCpy(retpath, argv0, MAXPGPATH); else join_path_components(retpath, cwd, argv0); canonicalize_path(retpath); if (validate_exec(retpath) == 0) return resolve_symlinks(retpath); log_error(_("invalid binary \"%s\""), retpath); return -1; } #ifdef WIN32 /* Win32 checks the current directory first for names without slashes */ join_path_components(retpath, cwd, argv0); if (validate_exec(retpath) == 0) return resolve_symlinks(retpath); #endif /* * Since no explicit path was supplied, the user must have been relying on * PATH. We'll search the same PATH. */ if ((path = getenv("PATH")) && *path) { char *startp = NULL, *endp = NULL; do { if (!startp) startp = path; else startp = endp + 1; endp = first_path_var_separator(startp); if (!endp) endp = startp + strlen(startp); /* point to end */ StrNCpy(test_path, startp, Min(endp - startp + 1, MAXPGPATH)); if (is_absolute_path(test_path)) join_path_components(retpath, test_path, argv0); else { join_path_components(retpath, cwd, test_path); join_path_components(retpath, retpath, argv0); } canonicalize_path(retpath); switch (validate_exec(retpath)) { case 0: /* found ok */ return resolve_symlinks(retpath); case -1: /* wasn't even a candidate, keep looking */ break; case -2: /* found but disqualified */ log_error(_("could not read binary \"%s\""), retpath); break; } } while (*endp); } log_error(_("could not find a \"%s\" to execute"), argv0); return -1; }
int find_other_exec | ( | const char * | argv0, | |
const char * | target, | |||
const char * | versionstr, | |||
char * | retpath | |||
) |
Definition at line 307 of file exec.c.
References canonicalize_path(), EXE, find_my_exec(), last_dir_separator(), MAXPGPATH, pipe_read_line(), snprintf(), and validate_exec().
Referenced by find_other_exec_or_die(), getInstallationPaths(), main(), and setup_bin_paths().
{ char cmd[MAXPGPATH]; char line[100]; if (find_my_exec(argv0, retpath) < 0) return -1; /* Trim off program name and keep just directory */ *last_dir_separator(retpath) = '\0'; canonicalize_path(retpath); /* Now append the other program's name */ snprintf(retpath + strlen(retpath), MAXPGPATH - strlen(retpath), "/%s%s", target, EXE); if (validate_exec(retpath) != 0) return -1; snprintf(cmd, sizeof(cmd), "\"%s\" -V", retpath); if (!pipe_read_line(cmd, line, sizeof(line))) return -1; if (strcmp(line, versionstr) != 0) return -2; return 0; }
char* first_dir_separator | ( | const char * | filename | ) |
Definition at line 95 of file path.c.
References IS_DIR_SEP, and skip_drive.
Referenced by check_restricted_library_name(), check_valid_extension_name(), check_valid_version_name(), expand_dynamic_library_name(), find_in_dynamic_libpath(), find_my_exec(), load_libraries(), and substitute_libpath_macro().
{ const char *p; for (p = skip_drive(filename); *p; p++) if (IS_DIR_SEP(*p)) return (char *) p; return NULL; }
char* first_path_var_separator | ( | const char * | pathlist | ) |
Definition at line 112 of file path.c.
References IS_PATH_VAR_SEP.
Referenced by find_in_dynamic_libpath(), and find_my_exec().
{ const char *p; /* skip_drive is not needed */ for (p = pathlist; *p; p++) if (IS_PATH_VAR_SEP(*p)) return (char *) p; return NULL; }
int fls | ( | int | mask | ) |
Definition at line 55 of file fls.c.
Referenced by interval_transform().
{ int bit; if (mask == 0) return (0); for (bit = 1; mask != 1; bit++) mask = (unsigned int) mask >> 1; return (bit); }
void get_doc_path | ( | const char * | my_exec_path, | |
char * | ret_path | |||
) |
Definition at line 630 of file path.c.
References make_relative_path().
Referenced by show_docdir().
{ make_relative_path(ret_path, DOCDIR, PGBINDIR, my_exec_path); }
void get_etc_path | ( | const char * | my_exec_path, | |
char * | ret_path | |||
) |
Definition at line 567 of file path.c.
References make_relative_path().
Referenced by process_psqlrc(), set_pglocale_pgservice(), and show_sysconfdir().
{ make_relative_path(ret_path, SYSCONFDIR, PGBINDIR, my_exec_path); }
bool get_home_path | ( | char * | ret_path | ) |
Definition at line 661 of file path.c.
References MAXPGPATH, pqGetpwuid(), snprintf(), and strlcpy().
Referenced by expand_tilde(), initializeInput(), and process_psqlrc().
{ #ifndef WIN32 char pwdbuf[BUFSIZ]; struct passwd pwdstr; struct passwd *pwd = NULL; if (pqGetpwuid(geteuid(), &pwdstr, pwdbuf, sizeof(pwdbuf), &pwd) != 0) return false; strlcpy(ret_path, pwd->pw_dir, MAXPGPATH); return true; #else char *tmppath; /* * Note: We use getenv here because the more modern * SHGetSpecialFolderPath() will force us to link with shell32.lib which * eats valuable desktop heap. */ tmppath = getenv("APPDATA"); if (!tmppath) return false; snprintf(ret_path, MAXPGPATH, "%s/postgresql", tmppath); return true; #endif }
void get_html_path | ( | const char * | my_exec_path, | |
char * | ret_path | |||
) |
Definition at line 639 of file path.c.
References make_relative_path().
Referenced by show_htmldir().
{ make_relative_path(ret_path, HTMLDIR, PGBINDIR, my_exec_path); }
void get_include_path | ( | const char * | my_exec_path, | |
char * | ret_path | |||
) |
Definition at line 576 of file path.c.
References make_relative_path().
Referenced by main(), and show_includedir().
{ make_relative_path(ret_path, INCLUDEDIR, PGBINDIR, my_exec_path); }
void get_includeserver_path | ( | const char * | my_exec_path, | |
char * | ret_path | |||
) |
Definition at line 594 of file path.c.
References make_relative_path().
Referenced by show_includedir_server().
{ make_relative_path(ret_path, INCLUDEDIRSERVER, PGBINDIR, my_exec_path); }
void get_lib_path | ( | const char * | my_exec_path, | |
char * | ret_path | |||
) |
Definition at line 603 of file path.c.
References make_relative_path().
Referenced by show_libdir().
{ make_relative_path(ret_path, LIBDIR, PGBINDIR, my_exec_path); }
void get_locale_path | ( | const char * | my_exec_path, | |
char * | ret_path | |||
) |
Definition at line 621 of file path.c.
References make_relative_path().
Referenced by pg_bindtextdomain(), set_pglocale_pgservice(), and show_localedir().
{ make_relative_path(ret_path, LOCALEDIR, PGBINDIR, my_exec_path); }
void get_man_path | ( | const char * | my_exec_path, | |
char * | ret_path | |||
) |
Definition at line 648 of file path.c.
References make_relative_path().
Referenced by show_mandir().
{ make_relative_path(ret_path, MANDIR, PGBINDIR, my_exec_path); }
void get_parent_directory | ( | char * | path | ) |
Definition at line 705 of file path.c.
References trim_directory().
Referenced by destroy_tablespace_directories(), main(), process_file(), TablespaceCreateDbspace(), and tokenize_inc_file().
{ trim_directory(path); }
void get_pkginclude_path | ( | const char * | my_exec_path, | |
char * | ret_path | |||
) |
Definition at line 585 of file path.c.
References make_relative_path().
Referenced by main(), and show_pkgincludedir().
{ make_relative_path(ret_path, PKGINCLUDEDIR, PGBINDIR, my_exec_path); }
void get_pkglib_path | ( | const char * | my_exec_path, | |
char * | ret_path | |||
) |
Definition at line 612 of file path.c.
References make_relative_path().
Referenced by getInstallationPaths(), PostgresMain(), show_pgxs(), and show_pkglibdir().
{ make_relative_path(ret_path, PKGLIBDIR, PGBINDIR, my_exec_path); }
const char* get_progname | ( | const char * | argv0 | ) |
Definition at line 415 of file path.c.
References EXE, last_dir_separator(), NULL, pg_strcasecmp(), progname, and skip_drive.
Referenced by get_opts(), handle_help_version_opts(), main(), parseCommandLine(), and regression_main().
{ const char *nodir_name; char *progname; nodir_name = last_dir_separator(argv0); if (nodir_name) nodir_name++; else nodir_name = skip_drive(argv0); /* * Make a copy in case argv[0] is modified by ps_status. Leaks memory, but * called only once. */ progname = strdup(nodir_name); if (progname == NULL) { fprintf(stderr, "%s: out of memory\n", nodir_name); abort(); /* This could exit the postmaster */ } #if defined(__CYGWIN__) || defined(WIN32) /* strip ".exe" suffix, regardless of case */ if (strlen(progname) > sizeof(EXE) - 1 && pg_strcasecmp(progname + strlen(progname) - (sizeof(EXE) - 1), EXE) == 0) progname[strlen(progname) - (sizeof(EXE) - 1)] = '\0'; #endif return progname; }
void get_share_path | ( | const char * | my_exec_path, | |
char * | ret_path | |||
) |
Definition at line 558 of file path.c.
References make_relative_path().
Referenced by get_extension_control_directory(), get_extension_control_filename(), get_extension_script_directory(), get_tsearch_config_filename(), ParseTzFile(), pg_TZDIR(), setup_bin_paths(), and show_sharedir().
{ make_relative_path(ret_path, PGSHAREDIR, PGBINDIR, my_exec_path); }
int getopt | ( | int | nargc, | |
char *const * | nargv, | |||
const char * | ostr | |||
) |
Definition at line 77 of file getopt.c.
References optarg, opterr, optind, and optopt.
Referenced by AuxiliaryProcessMain(), get_opts(), main(), PostmasterMain(), and process_postgres_switches().
{ static char *place = EMSG; /* option letter processing */ char *oli; /* option letter list index */ if (!*place) { /* update scanning pointer */ if (optind >= nargc || *(place = nargv[optind]) != '-') { place = EMSG; return -1; } if (place[1] && *++place == '-' && place[1] == '\0') { /* found "--" */ ++optind; place = EMSG; return -1; } } /* option letter okay? */ if ((optopt = (int) *place++) == (int) ':' || !(oli = strchr(ostr, optopt))) { /* * if the user didn't specify '-' as an option, assume it means -1. */ if (optopt == (int) '-') { place = EMSG; return -1; } if (!*place) ++optind; if (opterr && *ostr != ':') (void) fprintf(stderr, "illegal option -- %c\n", optopt); return BADCH; } if (*++oli != ':') { /* don't need argument */ optarg = NULL; if (!*place) ++optind; } else { /* need an argument */ if (*place) /* no white space */ optarg = place; else if (nargc <= ++optind) { /* no arg */ place = EMSG; if (*ostr == ':') return BADARG; if (opterr) (void) fprintf(stderr, "option requires an argument -- %c\n", optopt); return BADCH; } else /* white space */ optarg = nargv[optind]; place = EMSG; ++optind; } return optopt; /* dump back option letter */ }
Definition at line 35 of file getpeereid.c.
Referenced by PQconnectPoll().
{ #if defined(SO_PEERCRED) /* Linux: use getsockopt(SO_PEERCRED) */ struct ucred peercred; ACCEPT_TYPE_ARG3 so_len = sizeof(peercred); if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &peercred, &so_len) != 0 || so_len != sizeof(peercred)) return -1; *uid = peercred.uid; *gid = peercred.gid; return 0; #elif defined(LOCAL_PEERCRED) /* Debian with FreeBSD kernel: use getsockopt(LOCAL_PEERCRED) */ struct xucred peercred; ACCEPT_TYPE_ARG3 so_len = sizeof(peercred); if (getsockopt(sock, 0, LOCAL_PEERCRED, &peercred, &so_len) != 0 || so_len != sizeof(peercred) || peercred.cr_version != XUCRED_VERSION) return -1; *uid = peercred.cr_uid; *gid = peercred.cr_gid; return 0; #elif defined(HAVE_GETPEERUCRED) /* Solaris: use getpeerucred() */ ucred_t *ucred; ucred = NULL; /* must be initialized to NULL */ if (getpeerucred(sock, &ucred) == -1) return -1; *uid = ucred_geteuid(ucred); *gid = ucred_getegid(ucred); ucred_free(ucred); if (*uid == (uid_t) (-1) || *gid == (gid_t) (-1)) return -1; return 0; #else /* No implementation available on this platform */ errno = ENOSYS; return -1; #endif }
bool has_drive_prefix | ( | const char * | filename | ) |
Definition at line 83 of file path.c.
References skip_drive.
Referenced by process_file().
{ return skip_drive(path) != path; }
int inet_aton | ( | const char * | cp, | |
struct in_addr * | addr | |||
) |
Definition at line 54 of file inet_aton.c.
References val.
Referenced by getaddrinfo().
{ unsigned int val; int base, n; char c; u_int parts[4]; u_int *pp = parts; for (;;) { /* * Collect number up to ``.''. Values are specified as for C: 0x=hex, * 0=octal, other=decimal. */ val = 0; base = 10; if (*cp == '0') { if (*++cp == 'x' || *cp == 'X') base = 16, cp++; else base = 8; } while ((c = *cp) != '\0') { if (isdigit((unsigned char) c)) { val = (val * base) + (c - '0'); cp++; continue; } if (base == 16 && isxdigit((unsigned char) c)) { val = (val << 4) + (c + 10 - (islower((unsigned char) c) ? 'a' : 'A')); cp++; continue; } break; } if (*cp == '.') { /* * Internet format: a.b.c.d a.b.c (with c treated as 16-bits) * a.b (with b treated as 24 bits) */ if (pp >= parts + 3 || val > 0xff) return 0; *pp++ = val, cp++; } else break; } /* * Check for trailing junk. */ while (*cp) if (!isspace((unsigned char) *cp++)) return 0; /* * Concoct the address according to the number of parts specified. */ n = pp - parts + 1; switch (n) { case 1: /* a -- 32 bits */ break; case 2: /* a.b -- 8.24 bits */ if (val > 0xffffff) return 0; val |= parts[0] << 24; break; case 3: /* a.b.c -- 8.8.16 bits */ if (val > 0xffff) return 0; val |= (parts[0] << 24) | (parts[1] << 16); break; case 4: /* a.b.c.d -- 8.8.8.8 bits */ if (val > 0xff) return 0; val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); break; } if (addr) addr->s_addr = htonl(val); return 1; }
char* inet_net_ntop | ( | int | af, | |
const void * | src, | |||
int | bits, | |||
char * | dst, | |||
size_t | size | |||
) |
Definition at line 78 of file inet_net_ntop.c.
References inet_net_ntop_ipv4(), inet_net_ntop_ipv6(), NULL, PGSQL_AF_INET, and PGSQL_AF_INET6.
Referenced by connectFailureMessage(), getnameinfo(), inet_abbrev(), network_host(), network_out(), and network_show().
{ /* * We need to cover both the address family constants used by the PG inet * type (PGSQL_AF_INET and PGSQL_AF_INET6) and those used by the system * libraries (AF_INET and AF_INET6). We can safely assume PGSQL_AF_INET * == AF_INET, but the INET6 constants are very likely to be different. If * AF_INET6 isn't defined, silently ignore it. */ switch (af) { case PGSQL_AF_INET: return (inet_net_ntop_ipv4(src, bits, dst, size)); case PGSQL_AF_INET6: #if defined(AF_INET6) && AF_INET6 != PGSQL_AF_INET6 case AF_INET6: #endif return (inet_net_ntop_ipv6(src, bits, dst, size)); default: errno = EAFNOSUPPORT; return (NULL); } }
int isinf | ( | double | x | ) |
Referenced by dacos(), dasin(), datan(), datan2(), dcbrt(), dcos(), degrees(), dexp(), dlog1(), dlog10(), dpow(), dsin(), dsqrt(), dtof(), float48div(), float48mi(), float48mul(), float48pl(), float4_accum(), float4_dist(), float4div(), float4in(), float4mi(), float4mul(), float4pl(), float84div(), float84mi(), float84mul(), float84pl(), float8_accum(), float8_corr(), float8_covar_pop(), float8_covar_samp(), float8_dist(), float8_regr_accum(), float8_regr_intercept(), float8_regr_r2(), float8_regr_slope(), float8_regr_sxx(), float8_regr_sxy(), float8_regr_syy(), float8_stddev_pop(), float8_stddev_samp(), float8_var_pop(), float8_var_samp(), float8div(), float8in(), float8mi(), float8mul(), float8pl(), gbt_float8_dist(), is_infinite(), main(), pg_hypot(), radians(), sprintf_double_value(), sprintf_float_value(), and width_bucket_float8().
void join_path_components | ( | char * | ret_path, | |
const char * | head, | |||
const char * | tail | |||
) |
Definition at line 180 of file path.c.
References IS_DIR_SEP, MAXPGPATH, skip_drive, snprintf(), and strlcpy().
Referenced by find_my_exec(), make_relative_path(), process_file(), resolve_symlinks(), and tokenize_inc_file().
{ if (ret_path != head) strlcpy(ret_path, head, MAXPGPATH); /* * Remove any leading "." in the tail component. * * Note: we used to try to remove ".." as well, but that's tricky to get * right; now we just leave it to be done by canonicalize_path() later. */ while (tail[0] == '.' && IS_DIR_SEP(tail[1])) tail += 2; if (*tail) { /* only separate with slash if head wasn't empty */ snprintf(ret_path + strlen(ret_path), MAXPGPATH - strlen(ret_path), "%s%s", (*(skip_drive(head)) != '\0') ? "/" : "", tail); } }
char* last_dir_separator | ( | const char * | filename | ) |
Definition at line 130 of file path.c.
References IS_DIR_SEP, and skip_drive.
Referenced by ECPGconnect(), find_other_exec(), get_progname(), main(), resolve_symlinks(), setup(), and setup_bin_paths().
{ const char *p, *ret = NULL; for (p = skip_drive(filename); *p; p++) if (IS_DIR_SEP(*p)) ret = p; return (char *) ret; }
void make_native_path | ( | char * | path | ) |
Definition at line 158 of file path.c.
Referenced by pgarch_archiveXlog(), and RestoreArchivedFile().
{ #ifdef WIN32 char *p; for (p = filename; *p; p++) if (*p == '/') *p = '\\'; #endif }
bool path_contains_parent_reference | ( | const char * | path | ) |
Definition at line 338 of file path.c.
References NULL, and skip_drive.
Referenced by convert_and_check_filename(), and path_is_relative_and_below_cwd().
{ int path_len; path = skip_drive(path); /* C: shouldn't affect our conclusion */ path_len = strlen(path); /* * ".." could be the whole path; otherwise, if it's present it must be at * the beginning, in the middle, or at the end. */ if (strcmp(path, "..") == 0 || strncmp(path, "../", 3) == 0 || strstr(path, "/../") != NULL || (path_len >= 3 && strcmp(path + path_len - 3, "/..") == 0)) return true; return false; }
bool path_is_prefix_of_path | ( | const char * | path1, | |
const char * | path2 | |||
) |
Definition at line 400 of file path.c.
References IS_DIR_SEP.
Referenced by convert_and_check_filename(), and create_script_for_old_cluster_deletion().
{ int path1_len = strlen(path1); if (strncmp(path1, path2, path1_len) == 0 && (IS_DIR_SEP(path2[path1_len]) || path2[path1_len] == '\0')) return true; return false; }
bool path_is_relative_and_below_cwd | ( | const char * | path | ) |
Definition at line 367 of file path.c.
References is_absolute_path, IS_DIR_SEP, and path_contains_parent_reference().
Referenced by convert_and_check_filename().
{ if (is_absolute_path(path)) return false; /* don't allow anything above the cwd */ else if (path_contains_parent_reference(path)) return false; #ifdef WIN32 /* * On Win32, a drive letter _not_ followed by a slash, e.g. 'E:abc', is * relative to the cwd on that drive, or the drive's root directory if * that drive has no cwd. Because the path itself cannot tell us which is * the case, we have to assume the worst, i.e. that it is not below the * cwd. We could use GetFullPathName() to find the full path but that * could change if the current directory for the drive changes underneath * us, so we just disallow it. */ else if (isalpha((unsigned char) path[0]) && path[1] == ':' && !IS_DIR_SEP(path[2])) return false; #endif else return true; }
int pclose_check | ( | FILE * | stream | ) |
Definition at line 510 of file exec.c.
References _, free, log_error, pfree(), strerror(), and wait_result_to_str().
Referenced by pipe_read_line().
{ int exitstatus; char *reason; exitstatus = pclose(stream); if (exitstatus == 0) return 0; /* all is well */ if (exitstatus == -1) { /* pclose() itself failed, and hopefully set errno */ log_error(_("pclose failed: %s"), strerror(errno)); } else { reason = wait_result_to_str(exitstatus); log_error("%s", reason); #ifdef FRONTEND free(reason); #else pfree(reason); #endif } return exitstatus; }
unsigned char pg_ascii_tolower | ( | unsigned char | ch | ) |
Definition at line 146 of file pgstrcasecmp.c.
Referenced by asc_initcap(), asc_tolower(), pg_wc_tolower(), and SB_lower_char().
{ if (ch >= 'A' && ch <= 'Z') ch += 'a' - 'A'; return ch; }
unsigned char pg_ascii_toupper | ( | unsigned char | ch | ) |
Definition at line 135 of file pgstrcasecmp.c.
Referenced by asc_initcap(), asc_toupper(), filter_list_to_array(), and pg_wc_toupper().
{ if (ch >= 'a' && ch <= 'z') ch += 'A' - 'a'; return ch; }
int pg_check_dir | ( | const char * | dir | ) |
Definition at line 29 of file pgcheckdir.c.
References closedir(), dirent::d_name, NULL, opendir(), and readdir().
Referenced by create_data_directory(), create_xlog_symlink(), and verify_dir_is_empty_or_create().
{ int result = 1; DIR *chkdir; struct dirent *file; bool dot_found = false; errno = 0; chkdir = opendir(dir); if (chkdir == NULL) return (errno == ENOENT) ? 0 : -1; while ((file = readdir(chkdir)) != NULL) { if (strcmp(".", file->d_name) == 0 || strcmp("..", file->d_name) == 0) { /* skip this and parent directory */ continue; } #ifndef WIN32 /* file starts with "." */ else if (file->d_name[0] == '.') { dot_found = true; } else if (strcmp("lost+found", file->d_name) == 0) { result = 3; /* not empty, mount point */ break; } #endif else { result = 4; /* not empty */ break; } } #ifdef WIN32 /* * This fix is in mingw cvs (runtime/mingwex/dirent.c rev 1.4), but not in * released version */ if (GetLastError() == ERROR_NO_MORE_FILES) errno = 0; #endif closedir(chkdir); if (errno != 0) result = -1; /* some kind of I/O error? */ /* We report on dot-files if we _only_ find dot files */ if (result == 1 && dot_found) result = 2; return result; }
double pg_erand48 | ( | unsigned short | xseed[3] | ) |
Definition at line 79 of file erand48.c.
References _dorand48().
Referenced by doCustom(), geqo_rand(), and getrand().
{ _dorand48(xseed); return ldexp((double) xseed[0], -48) + ldexp((double) xseed[1], -32) + ldexp((double) xseed[2], -16); }
int pg_get_encoding_from_locale | ( | const char * | ctype, | |
bool | write_message | |||
) |
Definition at line 376 of file chklocale.c.
Referenced by check_encoding_locale_matches(), check_locale_encoding(), connectOptions2(), GetPlatformEncoding(), PGLC_localeconv(), PQsetClientEncoding(), setup_collation(), and setup_locale_encoding().
{
return PG_SQL_ASCII;
}
long pg_lrand48 | ( | void | ) |
Definition at line 88 of file erand48.c.
References _dorand48(), and _rand48_seed.
Referenced by random().
{ _dorand48(_rand48_seed); return ((long) _rand48_seed[2] << 15) + ((long) _rand48_seed[1] >> 1); }
int pg_mkdir_p | ( | char * | path, | |
int | omode | |||
) |
Definition at line 57 of file pgmkdirp.c.
References mkdir, NULL, S_IRWXG, and S_IRWXO.
Referenced by create_xlog_symlink(), mkdatadir(), and verify_dir_is_empty_or_create().
{ struct stat sb; mode_t numask, oumask; int last, retval; char *p; retval = 0; p = path; #ifdef WIN32 /* skip network and drive specifiers for win32 */ if (strlen(p) >= 2) { if (p[0] == '/' && p[1] == '/') { /* network drive */ p = strstr(p + 2, "/"); if (p == NULL) { errno = EINVAL; return -1; } } else if (p[1] == ':' && ((p[0] >= 'a' && p[0] <= 'z') || (p[0] >= 'A' && p[0] <= 'Z'))) { /* local drive */ p += 2; } } #endif /* * POSIX 1003.2: For each dir operand that does not name an existing * directory, effects equivalent to those caused by the following command * shall occcur: * * mkdir -p -m $(umask -S),u+wx $(dirname dir) && mkdir [-m mode] dir * * We change the user's umask and then restore it, instead of doing * chmod's. Note we assume umask() can't change errno. */ oumask = umask(0); numask = oumask & ~(S_IWUSR | S_IXUSR); (void) umask(numask); if (p[0] == '/') /* Skip leading '/'. */ ++p; for (last = 0; !last; ++p) { if (p[0] == '\0') last = 1; else if (p[0] != '/') continue; *p = '\0'; if (!last && p[1] == '\0') last = 1; if (last) (void) umask(oumask); /* check for pre-existing directory */ if (stat(path, &sb) == 0) { if (!S_ISDIR(sb.st_mode)) { if (last) errno = EEXIST; else errno = ENOTDIR; retval = -1; break; } } else if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { retval = -1; break; } if (!last) *p = '/'; } /* ensure we restored umask */ (void) umask(oumask); return retval; }
void pg_qsort | ( | void * | base, | |
size_t | nel, | |||
size_t | elsize, | |||
int(*)(const void *, const void *) | cmp | |||
) |
Definition at line 103 of file qsort.c.
References cmp(), med3(), Min, qsort, swap, SWAPINIT, and vecswap.
Referenced by DropRelFileNodesAllBuffers().
{ char *pa, *pb, *pc, *pd, *pl, *pm, *pn; int d, r, swaptype, presorted; loop:SWAPINIT(a, es); if (n < 7) { for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es) for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0; pl -= es) swap(pl, pl - es); return; } presorted = 1; for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es) { if (cmp(pm - es, pm) > 0) { presorted = 0; break; } } if (presorted) return; pm = (char *) a + (n / 2) * es; if (n > 7) { pl = (char *) a; pn = (char *) a + (n - 1) * es; if (n > 40) { d = (n / 8) * es; pl = med3(pl, pl + d, pl + 2 * d, cmp); pm = med3(pm - d, pm, pm + d, cmp); pn = med3(pn - 2 * d, pn - d, pn, cmp); } pm = med3(pl, pm, pn, cmp); } swap(a, pm); pa = pb = (char *) a + es; pc = pd = (char *) a + (n - 1) * es; for (;;) { while (pb <= pc && (r = cmp(pb, a)) <= 0) { if (r == 0) { swap(pa, pb); pa += es; } pb += es; } while (pb <= pc && (r = cmp(pc, a)) >= 0) { if (r == 0) { swap(pc, pd); pd -= es; } pc -= es; } if (pb > pc) break; swap(pb, pc); pb += es; pc -= es; } pn = (char *) a + n * es; r = Min(pa - (char *) a, pb - pa); vecswap(a, pb - r, r); r = Min(pd - pc, pn - pd - es); vecswap(pb, pn - r, r); if ((r = pb - pa) > es) qsort(a, r / es, es, cmp); if ((r = pd - pc) > es) { /* Iterate rather than recurse to save stack space */ a = pn - r; n = r / es; goto loop; } /* qsort(pn - r, r / es, es, cmp);*/ }
int pg_qsort_strcmp | ( | const void * | a, | |
const void * | b | |||
) |
Definition at line 201 of file qsort.c.
Referenced by BuildEventTriggerCache(), filter_event_trigger(), readstoplist(), and searchstoplist().
{ return strcmp(*(char *const *) a, *(char *const *) b); }
Definition at line 35 of file noblock.c.
Referenced by pq_set_nonblocking().
{ #if !defined(WIN32) int flags; flags = fcntl(sock, F_GETFL); if (flags < 0 || fcntl(sock, F_SETFL, (long) (flags & ~O_NONBLOCK))) return false; return true; #else unsigned long ioctlsocket_ret = 0; /* Returns non-0 on failure, while fcntl() returns -1 on failure */ return (ioctlsocket(sock, FIONBIO, &ioctlsocket_ret) == 0); #endif }
Definition at line 21 of file noblock.c.
Referenced by pgstat_init(), pq_set_nonblocking(), PQconnectPoll(), and report_fork_failure_to_client().
{ #if !defined(WIN32) return (fcntl(sock, F_SETFL, O_NONBLOCK) != -1); #else unsigned long ioctlsocket_ret = 1; /* Returns non-0 on failure, while fcntl() returns -1 on failure */ return (ioctlsocket(sock, FIONBIO, &ioctlsocket_ret) == 0); #endif }
void pg_srand48 | ( | long | seed | ) |
Definition at line 95 of file erand48.c.
References _rand48_add, _rand48_mult, and _rand48_seed.
Referenced by srandom().
{ _rand48_seed[0] = RAND48_SEED_0; _rand48_seed[1] = (unsigned short) seed; _rand48_seed[2] = (unsigned short) (seed >> 16); _rand48_mult[0] = RAND48_MULT_0; _rand48_mult[1] = RAND48_MULT_1; _rand48_mult[2] = RAND48_MULT_2; _rand48_add = RAND48_ADD; }
int pg_strcasecmp | ( | const char * | s1, | |
const char * | s2 | |||
) |
Definition at line 36 of file pgstrcasecmp.c.
References IS_HIGHBIT_SET.
Referenced by AlterTSDictionary(), array_out(), ATExecSetStorage(), build_startup_packet(), check_datestyle(), check_ddl_tag(), check_ident_usermap(), check_locale_and_encoding(), check_log_destination(), check_usermap(), compat_find_digest(), compute_attributes_with_style(), config_enum_lookup_by_name(), convert_any_priv_string(), convert_priv_string(), defGetBoolean(), defGetTypeLength(), DefineAggregate(), DefineCollation(), DefineOperator(), DefineRange(), DefineTSConfiguration(), DefineTSDictionary(), DefineTSParser(), DefineTSTemplate(), DefineType(), dintdict_init(), dispell_init(), do_pset(), doCustom(), dsimple_init(), dsnowball_init(), dsynonym_init(), dumpFunc(), dxsyn_init(), echo_hidden_hook(), exec_command(), fillRelOptions(), find_matching_ts_config(), findTTStatus(), get_progname(), helpSQL(), hostname_match(), interpretOidsOption(), locate_stem_module(), main(), makeAlterConfigCommand(), on_error_rollback_hook(), parse_hstore(), parse_slash_copy(), parseArchiveFormat(), parseNameAndArgTypes(), ParseVariableBool(), pg_bind_textdomain_codeset(), pg_fe_sendauth(), pg_find_encoding(), pg_get_functiondef(), pgp_get_cipher_code(), pgp_get_digest_code(), PGTYPEStimestamp_defmt_scan(), plperl_trigger_handler(), PLy_exec_trigger(), pqSetenvPoll(), process_commands(), prsd_headline(), px_find_digest(), px_gen_salt(), px_resolve_alias(), ReadArrayStr(), splitTzLine(), SyncRepGetStandbyPriority(), thesaurus_init(), transformRelOptions(), unaccent_init(), validate_exec(), and xmlpi().
{ for (;;) { unsigned char ch1 = (unsigned char) *s1++; unsigned char ch2 = (unsigned char) *s2++; if (ch1 != ch2) { if (ch1 >= 'A' && ch1 <= 'Z') ch1 += 'a' - 'A'; else if (IS_HIGHBIT_SET(ch1) && isupper(ch1)) ch1 = tolower(ch1); if (ch2 >= 'A' && ch2 <= 'Z') ch2 += 'a' - 'A'; else if (IS_HIGHBIT_SET(ch2) && isupper(ch2)) ch2 = tolower(ch2); if (ch1 != ch2) return (int) ch1 - (int) ch2; } if (ch1 == 0) break; } return 0; }
int pg_strncasecmp | ( | const char * | s1, | |
const char * | s2, | |||
size_t | n | |||
) |
Definition at line 69 of file pgstrcasecmp.c.
References IS_HIGHBIT_SET.
Referenced by check_datestyle(), check_ddl_tag(), check_special_value(), check_timezone(), command_no_begin(), do_pset(), float4in(), float8in(), helpSQL(), is_select_command(), MainLoop(), map_sql_identifier_to_xml_name(), numeric_in(), parse_bool_with_len(), parseRelOptions(), ParseTzFile(), ParseVariableBool(), range_parse(), scan_directory_ci(), set_var_from_str(), SpecialTags(), and transformRelOptions().
{ while (n-- > 0) { unsigned char ch1 = (unsigned char) *s1++; unsigned char ch2 = (unsigned char) *s2++; if (ch1 != ch2) { if (ch1 >= 'A' && ch1 <= 'Z') ch1 += 'a' - 'A'; else if (IS_HIGHBIT_SET(ch1) && isupper(ch1)) ch1 = tolower(ch1); if (ch2 >= 'A' && ch2 <= 'Z') ch2 += 'a' - 'A'; else if (IS_HIGHBIT_SET(ch2) && isupper(ch2)) ch2 = tolower(ch2); if (ch1 != ch2) return (int) ch1 - (int) ch2; } if (ch1 == 0) break; } return 0; }
unsigned char pg_tolower | ( | unsigned char | ch | ) |
Definition at line 122 of file pgstrcasecmp.c.
References IS_HIGHBIT_SET.
Referenced by dir_strcmp(), ParseDateTime(), PGTYPESdate_defmt_asc(), PQfnumber(), processSQLNamePattern(), SB_lower_char(), seq_search(), str_initcap(), str_tolower(), and validateTzEntry().
{ if (ch >= 'A' && ch <= 'Z') ch += 'a' - 'A'; else if (IS_HIGHBIT_SET(ch) && isupper(ch)) ch = tolower(ch); return ch; }
unsigned char pg_toupper | ( | unsigned char | ch | ) |
Definition at line 105 of file pgstrcasecmp.c.
References IS_HIGHBIT_SET.
Referenced by cash_words(), pg_timezone_abbrevs(), pg_tzset(), seq_search(), str_initcap(), and str_toupper().
{ if (ch >= 'a' && ch <= 'z') ch += 'A' - 'a'; else if (IS_HIGHBIT_SET(ch) && islower(ch)) ch = toupper(ch); return ch; }
void pg_usleep | ( | long | microsec | ) |
Definition at line 52 of file signal.c.
References FALSE, NULL, pgwin32_dispatch_queued_signals(), pgwin32_signal_event, and select.
Referenced by auth_delay_checks(), AutoVacLauncherMain(), AutoVacWorkerMain(), backend_read_statsfile(), BackendInitialize(), BackgroundWriterMain(), CheckpointerMain(), CheckpointWriteDelay(), CountOtherDBBackends(), CreateCheckPoint(), CustomizableNextWALFileReady(), do_pg_stop_backup(), do_restart(), do_start_bgworker(), do_stop(), do_watch(), FileRead(), FileWrite(), ForgetDatabaseFsyncRequests(), ForgetRelationFsyncRequests(), GetMultiXactIdMembers(), InitPostgres(), lazy_truncate_heap(), main(), pg_sleep(), pgarch_ArchiverCopyLoop(), pgwin32_recv(), recoveryPausesHere(), register_unlink(), regression_main(), RequestCheckpoint(), ResolveRecoveryConflictWithDatabase(), ResolveRecoveryConflictWithVirtualXIDs(), RestoreWALFileForRecovery(), s_lock(), ServerLoop(), ShutdownWalRcv(), StartupXLOG(), StreamConnection(), test_postmaster_connection(), vacuum_delay_point(), WaitExceedsMaxStandbyDelay(), WaitForWALToBecomeAvailable(), WalWriterMain(), and XLogFlush().
{ if (WaitForSingleObject(pgwin32_signal_event, (microsec < 500 ? 1 : (microsec + 500) / 1000)) == WAIT_OBJECT_0) { pgwin32_dispatch_queued_signals(); errno = EINTR; return; } }
char** pgfnames | ( | const char * | path | ) |
Definition at line 363 of file dirmod.c.
References _, closedir(), dirent::d_name, elog, NULL, opendir(), palloc(), pstrdup(), readdir(), repalloc(), strerror(), and WARNING.
Referenced by convert_sourcefiles_in(), rmtree(), and scan_available_timezones().
{ DIR *dir; struct dirent *file; char **filenames; int numnames = 0; int fnsize = 200; /* enough for many small dbs */ dir = opendir(path); if (dir == NULL) { #ifndef FRONTEND elog(WARNING, "could not open directory \"%s\": %m", path); #else fprintf(stderr, _("could not open directory \"%s\": %s\n"), path, strerror(errno)); #endif return NULL; } filenames = (char **) palloc(fnsize * sizeof(char *)); errno = 0; while ((file = readdir(dir)) != NULL) { if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0) { if (numnames + 1 >= fnsize) { fnsize *= 2; filenames = (char **) repalloc(filenames, fnsize * sizeof(char *)); } filenames[numnames++] = pstrdup(file->d_name); } errno = 0; } #ifdef WIN32 /* * This fix is in mingw cvs (runtime/mingwex/dirent.c rev 1.4), but not in * released version */ if (GetLastError() == ERROR_NO_MORE_FILES) errno = 0; #endif if (errno) { #ifndef FRONTEND elog(WARNING, "could not read directory \"%s\": %m", path); #else fprintf(stderr, _("could not read directory \"%s\": %s\n"), path, strerror(errno)); #endif } filenames[numnames] = NULL; closedir(dir); return filenames; }
void pgfnames_cleanup | ( | char ** | filenames | ) |
Definition at line 433 of file dirmod.c.
References pfree().
Referenced by convert_sourcefiles_in(), rmtree(), and scan_available_timezones().
int pqGethostbyname | ( | const char * | name, | |
struct hostent * | resultbuf, | |||
char * | buffer, | |||
size_t | buflen, | |||
struct hostent ** | result, | |||
int * | herrno | |||
) |
Definition at line 122 of file thread.c.
References NULL.
Referenced by getaddrinfo().
{ #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(HAVE_GETHOSTBYNAME_R) /* * broken (well early POSIX draft) gethostbyname_r() which returns 'struct * hostent *' */ *result = gethostbyname_r(name, resultbuf, buffer, buflen, herrno); return (*result == NULL) ? -1 : 0; #else /* no gethostbyname_r(), just use gethostbyname() */ *result = gethostbyname(name); if (*result != NULL) *herrno = h_errno; if (*result != NULL) return 0; else return -1; #endif }
int pqGetpwuid | ( | uid_t | uid, | |
struct passwd * | resultbuf, | |||
char * | buffer, | |||
size_t | buflen, | |||
struct passwd ** | result | |||
) |
Definition at line 89 of file thread.c.
References NULL.
Referenced by get_home_path(), pg_fe_getauthname(), PQconnectPoll(), and pqGetHomeDirectory().
{ #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(HAVE_GETPWUID_R) #ifdef GETPWUID_R_5ARG /* POSIX version */ getpwuid_r(uid, resultbuf, buffer, buflen, result); #else /* * Early POSIX draft of getpwuid_r() returns 'struct passwd *'. * getpwuid_r(uid, resultbuf, buffer, buflen) */ *result = getpwuid_r(uid, resultbuf, buffer, buflen); #endif #else /* no getpwuid_r() available, just use getpwuid() */ *result = getpwuid(uid); #endif return (*result == NULL) ? -1 : 0; }
Definition at line 167 of file signal.c.
References pg_signal_array, SIGALRM, and SIGCHLD.
Referenced by AutoVacLauncherMain(), AutoVacWorkerMain(), BackendInitialize(), BackgroundWriterMain(), bootstrap_signals(), CheckpointerMain(), ClosePager(), do_copy(), do_start_bgworker(), InitializeTimeouts(), main(), PageOutput(), PgArchiverMain(), PgstatCollectorMain(), plperl_init_interp(), PostgresMain(), PostmasterMain(), PQprint(), setalarm(), setQFout(), setup_cancel_handler(), setup_signals(), sigquit_handler(), StartupProcessMain(), SysLoggerMain(), trapsig(), WalReceiverMain(), WalSndSignals(), and WalWriterMain().
{ pqsigfunc prevfunc; if (signum >= PG_SIGNAL_COUNT || signum < 0) return SIG_ERR; prevfunc = pg_signal_array[signum]; pg_signal_array[signum] = handler; return prevfunc; }
char* pqStrerror | ( | int | errnum, | |
char * | strerrbuf, | |||
size_t | buflen | |||
) |
Definition at line 61 of file thread.c.
References strerror(), and strlcpy().
Referenced by lo_export(), lo_import_internal(), pg_local_sendauth(), and PQconnectPoll().
{ #if defined(FRONTEND) && defined(ENABLE_THREAD_SAFETY) && defined(HAVE_STRERROR_R) /* reentrant strerror_r is available */ #ifdef STRERROR_R_INT /* SUSv3 version */ if (strerror_r(errnum, strerrbuf, buflen) == 0) return strerrbuf; else return "Unknown error"; #else /* GNU libc */ return strerror_r(errnum, strerrbuf, buflen); #endif #else /* no strerror_r() available, just use strerror */ strlcpy(strerrbuf, strerror(errnum), buflen); return strerrbuf; #endif }
void qsort_arg | ( | void * | base, | |
size_t | nel, | |||
size_t | elsize, | |||
qsort_arg_comparator | cmp, | |||
void * | arg | |||
) |
Definition at line 103 of file qsort_arg.c.
References cmp(), med3(), Min, qsort_arg(), swap, SWAPINIT, and vecswap.
Referenced by _bt_sort_array_elements(), compute_range_stats(), compute_scalar_stats(), gbt_var_picksplit(), ginExtractEntries(), mcelem_array_selec(), qsort_arg(), range_gist_double_sorting_split(), range_gist_single_sorting_split(), SortAndUniqItems(), spg_range_quad_picksplit(), tsvectorrecv(), and uniqueentry().
{ char *pa, *pb, *pc, *pd, *pl, *pm, *pn; int d, r, swaptype, presorted; loop:SWAPINIT(a, es); if (n < 7) { for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es) for (pl = pm; pl > (char *) a && cmp(pl - es, pl, arg) > 0; pl -= es) swap(pl, pl - es); return; } presorted = 1; for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es) { if (cmp(pm - es, pm, arg) > 0) { presorted = 0; break; } } if (presorted) return; pm = (char *) a + (n / 2) * es; if (n > 7) { pl = (char *) a; pn = (char *) a + (n - 1) * es; if (n > 40) { d = (n / 8) * es; pl = med3(pl, pl + d, pl + 2 * d, cmp, arg); pm = med3(pm - d, pm, pm + d, cmp, arg); pn = med3(pn - 2 * d, pn - d, pn, cmp, arg); } pm = med3(pl, pm, pn, cmp, arg); } swap(a, pm); pa = pb = (char *) a + es; pc = pd = (char *) a + (n - 1) * es; for (;;) { while (pb <= pc && (r = cmp(pb, a, arg)) <= 0) { if (r == 0) { swap(pa, pb); pa += es; } pb += es; } while (pb <= pc && (r = cmp(pc, a, arg)) >= 0) { if (r == 0) { swap(pc, pd); pd -= es; } pc -= es; } if (pb > pc) break; swap(pb, pc); pb += es; pc -= es; } pn = (char *) a + n * es; r = Min(pa - (char *) a, pb - pa); vecswap(a, pb - r, r); r = Min(pd - pc, pn - pd - es); vecswap(pb, pn - r, r); if ((r = pb - pa) > es) qsort_arg(a, r / es, es, cmp, arg); if ((r = pd - pc) > es) { /* Iterate rather than recurse to save stack space */ a = pn - r; n = r / es; goto loop; } /* qsort_arg(pn - r, r / es, es, cmp, arg);*/ }
long random | ( | void | ) |
Definition at line 22 of file random.c.
References pg_lrand48().
Referenced by _bt_findinsertloc(), anl_random_fract(), CheckRADIUSAuth(), chkpass_in(), drandom(), get_normal_pair(), gistchoose(), main(), PostmasterRandom(), prepare_buf(), s_lock(), SetTempTablespaces(), spgdoinsert(), and try_unix_std().
{ return pg_lrand48(); }
double rint | ( | double | x | ) |
Definition at line 16 of file rint.c.
Referenced by acquire_inherited_sample_rows(), AdjustFractSeconds(), AdjustIntervalForTypmod(), AdjustTimeForTypmod(), AdjustTimestampForTypmod(), btcostestimate(), calculatePagesPerBuffer(), cash_div_flt4(), cash_div_flt8(), cash_div_int2(), cash_div_int4(), cash_div_int8(), check_effective_io_concurrency(), clamp_row_est(), DecodeInterval(), DecodeNumberField(), dround(), dtoi2(), dtoi4(), dtoi8(), estimate_rel_size(), final_cost_hashjoin(), float4_to_char(), float8_to_char(), ftoi2(), ftoi4(), ftoi8(), genericcostestimate(), gincostestimate(), initial_cost_mergejoin(), initial_cost_nestloop(), interval_div(), interval_mul(), make_append(), make_modifytable(), ParseFractionalSecond(), set_append_rel_size(), and timestamp2tm().
{
return (x >= 0.0) ? floor(x + 0.5) : ceil(x - 0.5);
}
Definition at line 456 of file dirmod.c.
References _, elog, filename, lstat, MAXPGPATH, NULL, pgfnames(), pgfnames_cleanup(), rmtree(), snprintf(), strerror(), unlink(), and WARNING.
Referenced by convert_sourcefiles_in(), copy_subdir_files(), create_tablespace_directories(), dbase_redo(), exit_nicely(), movedb(), movedb_failure_callback(), regression_main(), remove_dbtablespaces(), and rmtree().
{ bool result = true; char pathbuf[MAXPGPATH]; char **filenames; char **filename; struct stat statbuf; /* * we copy all the names out of the directory before we start modifying * it. */ filenames = pgfnames(path); if (filenames == NULL) return false; /* now we have the names we can start removing things */ for (filename = filenames; *filename; filename++) { snprintf(pathbuf, MAXPGPATH, "%s/%s", path, *filename); /* * It's ok if the file is not there anymore; we were just about to * delete it anyway. * * This is not an academic possibility. One scenario where this * happens is when bgwriter has a pending unlink request for a file in * a database that's being dropped. In dropdb(), we call * ForgetDatabaseFsyncRequests() to flush out any such pending unlink * requests, but because that's asynchronous, it's not guaranteed that * the bgwriter receives the message in time. */ if (lstat(pathbuf, &statbuf) != 0) { if (errno != ENOENT) { #ifndef FRONTEND elog(WARNING, "could not stat file or directory \"%s\": %m", pathbuf); #else fprintf(stderr, _("could not stat file or directory \"%s\": %s\n"), pathbuf, strerror(errno)); #endif result = false; } continue; } if (S_ISDIR(statbuf.st_mode)) { /* call ourselves recursively for a directory */ if (!rmtree(pathbuf, true)) { /* we already reported the error */ result = false; } } else { if (unlink(pathbuf) != 0) { if (errno != ENOENT) { #ifndef FRONTEND elog(WARNING, "could not remove file or directory \"%s\": %m", pathbuf); #else fprintf(stderr, _("could not remove file or directory \"%s\": %s\n"), pathbuf, strerror(errno)); #endif result = false; } } } } if (rmtopdir) { if (rmdir(path) != 0) { #ifndef FRONTEND elog(WARNING, "could not remove file or directory \"%s\": %m", path); #else fprintf(stderr, _("could not remove file or directory \"%s\": %s\n"), path, strerror(errno)); #endif result = false; } } pgfnames_cleanup(filenames); return result; }
void set_pglocale_pgservice | ( | const char * | argv0, | |
const char * | app | |||
) |
Definition at line 550 of file exec.c.
References canonicalize_path(), find_my_exec(), get_etc_path(), get_locale_path(), MAXPGPATH, my_exec_path, NULL, PG_TEXTDOMAIN, putenv, and snprintf().
Referenced by main(), and regression_main().
{ char path[MAXPGPATH]; char my_exec_path[MAXPGPATH]; char env_path[MAXPGPATH + sizeof("PGSYSCONFDIR=")]; /* longer than * PGLOCALEDIR */ /* don't set LC_ALL in the backend */ if (strcmp(app, PG_TEXTDOMAIN("postgres")) != 0) setlocale(LC_ALL, ""); 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); putenv(strdup(env_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); putenv(strdup(env_path)); } }
char * simple_prompt | ( | const char * | prompt, | |
int | maxlen, | |||
bool | echo | |||
) |
Definition at line 38 of file sprompt.c.
References _, buf, free, malloc, and NULL.
Referenced by _connectDB(), ConnectDatabase(), connectDatabase(), doConnect(), exec_command(), get_set_pwd(), GetConnection(), main(), prompt_for_password(), sql_conn(), vacuumlo(), and yesno_prompt().
{ int length; char *destination; FILE *termin, *termout; #ifdef HAVE_TERMIOS_H struct termios t_orig, t; #else #ifdef WIN32 HANDLE t = NULL; LPDWORD t_orig = NULL; #endif #endif destination = (char *) malloc(maxlen + 1); if (!destination) return NULL; #ifdef WIN32 /* * A Windows console has an "input code page" and an "output code page"; * these usually match each other, but they rarely match the "Windows ANSI * code page" defined at system boot and expected of "char *" arguments to * Windows API functions. The Microsoft CRT write() implementation * automatically converts text between these code pages when writing to a * console. To identify such file descriptors, it calls GetConsoleMode() * on the underlying HANDLE, which in turn requires GENERIC_READ access on * the HANDLE. Opening termout in mode "w+" allows that detection to * succeed. Otherwise, write() would not recognize the descriptor as a * console, and non-ASCII characters would display incorrectly. * * XXX fgets() still receives text in the console's input code page. This * makes non-ASCII credentials unportable. */ termin = fopen("CONIN$", "r"); termout = fopen("CONOUT$", "w+"); #else /* * Do not try to collapse these into one "w+" mode file. Doesn't work on * some platforms (eg, HPUX 10.20). */ termin = fopen("/dev/tty", "r"); termout = fopen("/dev/tty", "w"); #endif if (!termin || !termout #ifdef WIN32 /* * Direct console I/O does not work from the MSYS 1.0.10 console. Writes * reach nowhere user-visible; reads block indefinitely. XXX This affects * most Windows terminal environments, including rxvt, mintty, Cygwin * xterm, Cygwin sshd, and PowerShell ISE. Switch to a more-generic test. */ || (getenv("OSTYPE") && strcmp(getenv("OSTYPE"), "msys") == 0) #endif ) { if (termin) fclose(termin); if (termout) fclose(termout); termin = stdin; termout = stderr; } #ifdef HAVE_TERMIOS_H if (!echo) { tcgetattr(fileno(termin), &t); t_orig = t; t.c_lflag &= ~ECHO; tcsetattr(fileno(termin), TCSAFLUSH, &t); } #else #ifdef WIN32 if (!echo) { /* get a new handle to turn echo off */ t_orig = (LPDWORD) malloc(sizeof(DWORD)); t = GetStdHandle(STD_INPUT_HANDLE); /* save the old configuration first */ GetConsoleMode(t, t_orig); /* set to the new mode */ SetConsoleMode(t, ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT); } #endif #endif if (prompt) { fputs(_(prompt), termout); fflush(termout); } if (fgets(destination, maxlen + 1, termin) == NULL) destination[0] = '\0'; length = strlen(destination); if (length > 0 && destination[length - 1] != '\n') { /* eat rest of the line */ char buf[128]; int buflen; do { if (fgets(buf, sizeof(buf), termin) == NULL) break; buflen = strlen(buf); } while (buflen > 0 && buf[buflen - 1] != '\n'); } if (length > 0 && destination[length - 1] == '\n') /* remove trailing newline */ destination[length - 1] = '\0'; #ifdef HAVE_TERMIOS_H if (!echo) { tcsetattr(fileno(termin), TCSAFLUSH, &t_orig); fputs("\n", termout); fflush(termout); } #else #ifdef WIN32 if (!echo) { /* reset to the original console mode */ SetConsoleMode(t, *t_orig); fputs("\n", termout); fflush(termout); free(t_orig); } #endif #endif if (termin != stdin) { fclose(termin); fclose(termout); } return destination; }
void srandom | ( | unsigned int | seed | ) |
Definition at line 22 of file srandom.c.
References pg_srand48().
Referenced by BackendRun(), main(), PostmasterRandom(), and setseed().
{ pg_srand48((long int) seed); }
size_t strlcat | ( | char * | dst, | |
const char * | src, | |||
size_t | siz | |||
) |
Definition at line 33 of file strlcat.c.
Referenced by CreateLockFile(), get_prompt(), show_pgxs(), and validate_exec().
{ char *d = dst; const char *s = src; size_t n = siz; size_t dlen; /* Find the end of dst and adjust bytes left but don't go past end */ while (n-- != 0 && *d != '\0') d++; dlen = d - dst; n = siz - dlen; if (n == 0) return (dlen + strlen(s)); while (*s != '\0') { if (n != 1) { *d++ = *s; n--; } s++; } *d = '\0'; return (dlen + (s - src)); /* count does not include NUL */ }
size_t strlcpy | ( | char * | dst, | |
const char * | src, | |||
size_t | siz | |||
) |
Definition at line 45 of file strlcpy.c.
Referenced by AuxiliaryProcessMain(), chkpass_in(), ChooseIndexNameAddition(), connectFailureMessage(), create_rel_filename_map(), create_script_for_old_cluster_deletion(), createNewConnection(), descriptor_variable(), exec_prog(), expand_tilde(), fetch_fp_info(), find_in_dynamic_libpath(), find_other_exec_or_die(), from_char_parse_int_len(), from_char_seq_search(), get_control_data(), get_home_path(), get_prompt(), get_rel_infos(), getPgPassFilename(), hash_create(), InitPostgres(), internal_cancel(), join_path_components(), logfile_getname(), main(), make_oper_cache_key(), make_relative_path(), old_8_3_rebuild_tsvector_tables(), ParseLongOption(), parseServiceInfo(), pg_getnameinfo_all(), pg_open_tzfile(), pg_TZDIR(), pgarch_archiveXlog(), pgstat_bestart(), PQcancel(), pqGetHomeDirectory(), PQrequestCancel(), pqStrerror(), process_file(), process_postgres_switches(), RegisterBackgroundWorker(), replace_string(), RequestXLogStreaming(), scan_available_timezones(), scan_directory_ci(), set_ps_display(), setup_bin_paths(), test_postmaster_connection(), timestamptz_to_str(), and WalReceiverMain().
{ char *d = dst; const char *s = src; size_t n = siz; /* Copy as many bytes as will fit */ if (n != 0) { while (--n != 0) { if ((*d++ = *s++) == '\0') break; } } /* Not enough room in dst, add NUL and traverse rest of src */ if (n == 0) { if (siz != 0) *d = '\0'; /* NUL-terminate dst */ while (*s++) ; } return (s - src - 1); /* count does not include NUL */ }
void unsetenv | ( | const char * | name | ) |
Definition at line 20 of file unsetenv.c.
References malloc, NULL, and putenv.
{ char *envstr; if (getenv(name) == NULL) return; /* no work */ /* * The technique embodied here works if libc follows the Single Unix Spec * and actually uses the storage passed to putenv() to hold the environ * entry. When we clobber the entry in the second step we are ensuring * that we zap the actual environ member. However, there are some libc * implementations (notably recent BSDs) that do not obey SUS but copy the * presented string. This method fails on such platforms. Hopefully all * such platforms have unsetenv() and thus won't be using this hack. See: * http://www.greenend.org.uk/rjk/2008/putenv.html * * Note that repeatedly setting and unsetting a var using this code will * leak memory. */ envstr = (char *) malloc(strlen(name) + 2); if (!envstr) /* not much we can do if no memory */ return; /* Override the existing setting by forcibly defining the var */ sprintf(envstr, "%s=", name); putenv(envstr); /* Now we can clobber the variable definition this way: */ strcpy(envstr, "="); /* * This last putenv cleans up if we have multiple zero-length names as a * result of unsetting multiple things. */ putenv(envstr); }
char* wait_result_to_str | ( | int | exit_status | ) |
Definition at line 34 of file wait_error.c.
References _, pstrdup(), snprintf(), WEXITSTATUS, WIFEXITED, WIFSIGNALED, and WTERMSIG.
Referenced by ClosePipeToProgram(), do_copy(), and pclose_check().
{ char str[512]; if (WIFEXITED(exitstatus)) { /* * Give more specific error message for some common exit codes that * have a special meaning in shells. */ switch (WEXITSTATUS(exitstatus)) { case 126: snprintf(str, sizeof(str), _("command not executable")); break; case 127: snprintf(str, sizeof(str), _("command not found")); break; default: snprintf(str, sizeof(str), _("child process exited with exit code %d"), WEXITSTATUS(exitstatus)); } } else if (WIFSIGNALED(exitstatus)) #if defined(WIN32) snprintf(str, sizeof(str), _("child process was terminated by exception 0x%X"), WTERMSIG(exitstatus)); #elif defined(HAVE_DECL_SYS_SIGLIST) && HAVE_DECL_SYS_SIGLIST { char str2[256]; snprintf(str2, sizeof(str2), "%d: %s", WTERMSIG(exitstatus), WTERMSIG(exitstatus) < NSIG ? sys_siglist[WTERMSIG(exitstatus)] : "(unknown)"); snprintf(str, sizeof(str), _("child process was terminated by signal %s"), str2); } #else snprintf(str, sizeof(str), _("child process was terminated by signal %d"), WTERMSIG(exitstatus)); #endif else snprintf(str, sizeof(str), _("child process exited with unrecognized status %d"), exitstatus); return pstrdup(str); }