38 #ifdef ENABLE_THREAD_SAFETY
57 #define SIGPIPE_MASKED(conn) ((conn)->sigpipe_so || (conn)->sigpipe_flag)
59 #ifdef ENABLE_THREAD_SAFETY
68 #define DECLARE_SIGPIPE_INFO(spinfo) struct sigpipe_info spinfo
70 #define DISABLE_SIGPIPE(conn, spinfo, failaction) \
72 (spinfo).got_epipe = false; \
73 if (!SIGPIPE_MASKED(conn)) \
75 if (pq_block_sigpipe(&(spinfo).oldsigmask, \
76 &(spinfo).sigpipe_pending) < 0) \
81 #define REMEMBER_EPIPE(spinfo, cond) \
84 (spinfo).got_epipe = true; \
87 #define RESTORE_SIGPIPE(conn, spinfo) \
89 if (!SIGPIPE_MASKED(conn)) \
90 pq_reset_sigpipe(&(spinfo).oldsigmask, (spinfo).sigpipe_pending, \
91 (spinfo).got_epipe); \
95 #define DECLARE_SIGPIPE_INFO(spinfo) pqsigfunc spinfo = NULL
97 #define DISABLE_SIGPIPE(conn, spinfo, failaction) \
99 if (!SIGPIPE_MASKED(conn)) \
100 spinfo = pqsignal(SIGPIPE, SIG_IGN); \
103 #define REMEMBER_EPIPE(spinfo, cond)
105 #define RESTORE_SIGPIPE(conn, spinfo) \
107 if (!SIGPIPE_MASKED(conn)) \
108 pqsignal(SIGPIPE, spinfo); \
113 #define DECLARE_SIGPIPE_INFO(spinfo)
114 #define DISABLE_SIGPIPE(conn, spinfo, failaction)
115 #define REMEMBER_EPIPE(spinfo, cond)
116 #define RESTORE_SIGPIPE(conn, spinfo)
233 int result_errno = 0;
243 switch (result_errno)
248 #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
258 "\tThis probably means the server terminated abnormally\n"
259 "\tbefore or while processing the request.");
265 sebuf,
sizeof(sebuf)));
350 int result_errno = 0;
368 flags |= MSG_NOSIGNAL;
387 if (flags != 0 && result_errno == EINVAL)
396 switch (result_errno)
401 #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
420 "\tThis probably means the server terminated abnormally\n"
421 "\tbefore or while processing the request."));
423 strlcat(msgbuf,
"\n",
sizeof(msgbuf));
436 sebuf,
sizeof(sebuf)));
438 strlcat(msgbuf,
"\n",
sizeof(msgbuf));
478 static const char *
const result[] = {NULL};
527 #if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32)
534 pq_block_sigpipe(sigset_t *osigset,
bool *sigpipe_pending)
536 sigset_t sigpipe_sigset;
539 sigemptyset(&sigpipe_sigset);
540 sigaddset(&sigpipe_sigset,
SIGPIPE);
543 SOCK_ERRNO_SET(pthread_sigmask(SIG_BLOCK, &sigpipe_sigset, osigset));
548 if (sigismember(osigset,
SIGPIPE))
551 if (sigpending(&sigset) != 0)
554 if (sigismember(&sigset,
SIGPIPE))
555 *sigpipe_pending =
true;
557 *sigpipe_pending =
false;
560 *sigpipe_pending =
false;
584 pq_reset_sigpipe(sigset_t *osigset,
bool sigpipe_pending,
bool got_epipe)
591 if (got_epipe && !sigpipe_pending)
593 if (sigpending(&sigset) == 0 &&
596 sigset_t sigpipe_sigset;
598 sigemptyset(&sigpipe_sigset);
599 sigaddset(&sigpipe_sigset,
SIGPIPE);
601 sigwait(&sigpipe_sigset, &signo);
606 pthread_sigmask(SIG_SETMASK, osigset, NULL);
void libpq_append_conn_error(PGconn *conn, const char *fmt,...)
ssize_t pg_GSS_read(PGconn *conn, void *ptr, size_t len)
ssize_t pg_GSS_write(PGconn *conn, const void *ptr, size_t len)
PostgresPollingStatusType pgtls_open_client(PGconn *conn)
void pgtls_init_library(bool do_ssl, int do_crypto)
ssize_t pgtls_read(PGconn *conn, void *ptr, size_t len)
ssize_t pgtls_write(PGconn *conn, const void *ptr, size_t len)
int pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto)
void pgtls_close(PGconn *conn)
ssize_t pqsecure_write(PGconn *conn, const void *ptr, size_t len)
void PQinitSSL(int do_init)
PQsslKeyPassHook_OpenSSL_type PQgetSSLKeyPassHook_OpenSSL(void)
#define REMEMBER_EPIPE(spinfo, cond)
int PQdefaultSSLKeyPassHook_OpenSSL(char *buf, int size, PGconn *conn)
PostgresPollingStatusType pqsecure_open_client(PGconn *conn)
int PQgssEncInUse(PGconn *conn)
#define DISABLE_SIGPIPE(conn, spinfo, failaction)
void PQinitOpenSSL(int do_ssl, int do_crypto)
int PQsslInUse(PGconn *conn)
ssize_t pqsecure_read(PGconn *conn, void *ptr, size_t len)
ssize_t pqsecure_raw_read(PGconn *conn, void *ptr, size_t len)
ssize_t pqsecure_raw_write(PGconn *conn, const void *ptr, size_t len)
const char *const * PQsslAttributeNames(PGconn *conn)
void * PQgetssl(PGconn *conn)
void * PQsslStruct(PGconn *conn, const char *struct_name)
void * PQgetgssctx(PGconn *conn)
void pqsecure_close(PGconn *conn)
int pqsecure_initialize(PGconn *conn, bool do_ssl, bool do_crypto)
const char * PQsslAttribute(PGconn *conn, const char *attribute_name)
#define DECLARE_SIGPIPE_INFO(spinfo)
void PQsetSSLKeyPassHook_OpenSSL(PQsslKeyPassHook_OpenSSL_type hook)
#define RESTORE_SIGPIPE(conn, spinfo)
int(* PQsslKeyPassHook_OpenSSL_type)(char *buf, int size, PGconn *conn)
PostgresPollingStatusType
#define SOCK_ERRNO_SET(e)
static void do_init(void)
#define PG_STRERROR_R_BUFLEN
size_t strlcat(char *dst, const char *src, size_t siz)
#define recv(s, buf, len, flags)
#define send(s, buf, len, flags)