/*------------------------------------------------------------------------- * * wait_error.c * Convert a wait/waitpid(2) result code to a human-readable string * * * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION * src/common/wait_error.c * *------------------------------------------------------------------------- */ #ifndef FRONTEND #include "postgres.h" #else #include "postgres_fe.h" #endif #include #include #include #include /* * Return a human-readable string explaining the reason a child process * terminated. The argument is a return code returned by wait(2) or * waitpid(2). The result is a translated, palloc'd or malloc'd string. */ char * wait_result_to_str(int exitstatus) { 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)); #else snprintf(str, sizeof(str), _("child process was terminated by signal %d: %s"), WTERMSIG(exitstatus), pg_strsignal(WTERMSIG(exitstatus))); #endif } else snprintf(str, sizeof(str), _("child process exited with unrecognized status %d"), exitstatus); return pstrdup(str); }