Header And Logo

PostgreSQL
| The world's most advanced open source database.

Functions

wait_error.c File Reference

#include "postgres.h"
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/wait.h>
Include dependency graph for wait_error.c:

Go to the source code of this file.

Functions

char * wait_result_to_str (int exitstatus)

Function Documentation

char* wait_result_to_str ( int  exitstatus  ) 

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