46#include <openssl/bn.h>
47#include <openssl/conf.h>
48#include <openssl/dh.h>
49#ifndef OPENSSL_NO_ECDH
50#include <openssl/ec.h>
52#include <openssl/x509v3.h>
68static int verify_cb(
int ok, X509_STORE_CTX *ctx);
71 const unsigned char **out,
72 unsigned char *outlen,
73 const unsigned char *in,
76static bool initialize_dh(SSL_CTX *context,
bool isServerStart);
78static const char *
SSLerrmessageExt(
unsigned long ecode,
const char *replacement);
107 int ssl_ver_min = -1;
108 int ssl_ver_max = -1;
120 context = SSL_CTX_new(SSLv23_method());
124 (
errmsg(
"could not create SSL context: %s",
133 SSL_CTX_set_mode(context, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
138 (*openssl_tls_init_hook) (context, isServerStart);
146 if (SSL_CTX_use_certificate_chain_file(context,
ssl_cert_file) != 1)
149 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
150 errmsg(
"could not load server certificate file \"%s\": %s",
163 if (SSL_CTX_use_PrivateKey_file(context,
165 SSL_FILETYPE_PEM) != 1)
169 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
170 errmsg(
"private key file \"%s\" cannot be reloaded because it requires a passphrase",
174 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
175 errmsg(
"could not load private key file \"%s\": %s",
180 if (SSL_CTX_check_private_key(context) != 1)
183 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
184 errmsg(
"check of private key failed: %s",
193 if (ssl_ver_min == -1)
197 (
errmsg(
"\"%s\" setting \"%s\" not supported by this build",
198 "ssl_min_protocol_version",
204 if (!SSL_CTX_set_min_proto_version(context, ssl_ver_min))
207 (
errmsg(
"could not set minimum SSL protocol version")));
216 if (ssl_ver_max == -1)
220 (
errmsg(
"\"%s\" setting \"%s\" not supported by this build",
221 "ssl_max_protocol_version",
227 if (!SSL_CTX_set_max_proto_version(context, ssl_ver_max))
230 (
errmsg(
"could not set maximum SSL protocol version")));
243 if (ssl_ver_min > ssl_ver_max)
246 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
247 errmsg(
"could not set SSL protocol version range"),
248 errdetail(
"\"%s\" cannot be higher than \"%s\"",
249 "ssl_min_protocol_version",
250 "ssl_max_protocol_version")));
264#ifdef HAVE_SSL_CTX_SET_NUM_TICKETS
265 SSL_CTX_set_num_tickets(context, 0);
267 SSL_CTX_set_options(context, SSL_OP_NO_TICKET);
270 SSL_CTX_set_session_cache_mode(context, SSL_SESS_CACHE_OFF);
273 SSL_CTX_set_options(context, SSL_OP_NO_COMPRESSION);
283#ifdef SSL_OP_NO_RENEGOTIATION
284 SSL_CTX_set_options(context, SSL_OP_NO_RENEGOTIATION);
286#ifdef SSL_OP_NO_CLIENT_RENEGOTIATION
287 SSL_CTX_set_options(context, SSL_OP_NO_CLIENT_RENEGOTIATION);
300 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
301 errmsg(
"could not set the TLSv1.2 cipher list (no valid ciphers available)")));
315 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
316 errmsg(
"could not set the TLSv1.3 cipher suites (no valid ciphers available)")));
323 SSL_CTX_set_options(context, SSL_OP_CIPHER_SERVER_PREFERENCE);
330 STACK_OF(X509_NAME) * root_cert_list;
332 if (SSL_CTX_load_verify_locations(context,
ssl_ca_file, NULL) != 1 ||
333 (root_cert_list = SSL_load_client_CA_file(
ssl_ca_file)) == NULL)
336 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
337 errmsg(
"could not load root certificate file \"%s\": %s",
349 SSL_CTX_set_client_CA_list(context, root_cert_list);
356 SSL_CTX_set_verify(context,
358 SSL_VERIFY_CLIENT_ONCE),
369 X509_STORE *cvstore = SSL_CTX_get_cert_store(context);
374 if (X509_STORE_load_locations(cvstore,
379 X509_STORE_set_flags(cvstore,
380 X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);
385 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
386 errmsg(
"could not load SSL certificate revocation list file \"%s\": %s",
393 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
394 errmsg(
"could not load SSL certificate revocation list directory \"%s\": %s",
401 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
402 errmsg(
"could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s",
422 ssl_loaded_verify_locations =
true;
424 ssl_loaded_verify_locations =
false;
431 SSL_CTX_free(context);
441 ssl_loaded_verify_locations =
false;
451 bool give_proto_hint;
460 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
461 errmsg(
"could not initialize SSL connection: SSL context not set up")));
474 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
475 errmsg(
"could not initialize SSL connection: %s",
482 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
483 errmsg(
"could not set SSL socket: %s",
489 SSL_set_ex_data(
port->ssl, 0, &err_context);
491 port->ssl_in_use =
true;
505 r = SSL_accept(
port->ssl);
508 err = SSL_get_error(
port->ssl, r);
518 ecode = ERR_get_error();
521 case SSL_ERROR_WANT_READ:
522 case SSL_ERROR_WANT_WRITE:
531 if (
err == SSL_ERROR_WANT_READ)
537 WAIT_EVENT_SSL_OPEN_SERVER);
539 case SSL_ERROR_SYSCALL:
540 if (r < 0 && errno != 0)
543 errmsg(
"could not accept SSL connection: %m")));
546 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
547 errmsg(
"could not accept SSL connection: EOF detected")));
550 switch (ERR_GET_REASON(ecode))
565 case SSL_R_NO_PROTOCOLS_AVAILABLE:
566 case SSL_R_UNSUPPORTED_PROTOCOL:
567 case SSL_R_BAD_PROTOCOL_VERSION_NUMBER:
568 case SSL_R_UNKNOWN_PROTOCOL:
569 case SSL_R_UNKNOWN_SSL_VERSION:
570 case SSL_R_UNSUPPORTED_SSL_VERSION:
571 case SSL_R_WRONG_SSL_VERSION:
572 case SSL_R_WRONG_VERSION_NUMBER:
573 case SSL_R_TLSV1_ALERT_PROTOCOL_VERSION:
574#ifdef SSL_R_VERSION_TOO_HIGH
575 case SSL_R_VERSION_TOO_HIGH:
577#ifdef SSL_R_VERSION_TOO_LOW
578 case SSL_R_VERSION_TOO_LOW:
580 give_proto_hint =
true;
583 give_proto_hint =
false;
587 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
588 errmsg(
"could not accept SSL connection: %s",
592 errhint(
"This may indicate that the client does not support any SSL protocol version between %s and %s.",
595 MIN_OPENSSL_TLS_VERSION,
598 MAX_OPENSSL_TLS_VERSION) : 0));
602 case SSL_ERROR_ZERO_RETURN:
604 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
605 errmsg(
"could not accept SSL connection: EOF detected")));
609 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
610 errmsg(
"unrecognized SSL error code: %d",
618 port->alpn_used =
false;
620 const unsigned char *selected;
623 SSL_get0_alpn_selected(
port->ssl, &selected, &
len);
626 if (selected != NULL)
631 port->alpn_used =
true;
637 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
638 errmsg(
"received SSL connection request with unexpected ALPN protocol")));
644 port->peer = SSL_get_peer_certificate(
port->ssl);
647 port->peer_cn = NULL;
648 port->peer_dn = NULL;
649 port->peer_cert_valid =
false;
650 if (
port->peer != NULL)
653 X509_NAME *x509name = X509_get_subject_name(
port->peer);
656 BUF_MEM *bio_buf = NULL;
658 len = X509_NAME_get_text_by_NID(x509name, NID_commonName, NULL, 0);
664 r = X509_NAME_get_text_by_NID(x509name, NID_commonName, peer_cn,
678 if (
len != strlen(peer_cn))
681 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
682 errmsg(
"SSL certificate's common name contains embedded null")));
687 port->peer_cn = peer_cn;
690 bio = BIO_new(BIO_s_mem());
693 if (
port->peer_cn != NULL)
696 port->peer_cn = NULL;
708 if (X509_NAME_print_ex(bio, x509name, 0, XN_FLAG_RFC2253) == -1 ||
709 BIO_get_mem_ptr(bio, &bio_buf) <= 0)
712 if (
port->peer_cn != NULL)
715 port->peer_cn = NULL;
720 memcpy(peer_dn, bio_buf->data, bio_buf->length);
721 len = bio_buf->length;
724 if (
len != strlen(peer_dn))
727 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
728 errmsg(
"SSL certificate's distinguished name contains embedded null")));
730 if (
port->peer_cn != NULL)
733 port->peer_cn = NULL;
738 port->peer_dn = peer_dn;
740 port->peer_cert_valid =
true;
751 SSL_shutdown(
port->ssl);
754 port->ssl_in_use =
false;
759 X509_free(
port->peer);
766 port->peer_cn = NULL;
772 port->peer_dn = NULL;
785 n = SSL_read(
port->ssl, ptr,
len);
786 err = SSL_get_error(
port->ssl, n);
787 ecode = (
err != SSL_ERROR_NONE || n < 0) ? ERR_get_error() : 0;
793 case SSL_ERROR_WANT_READ:
798 case SSL_ERROR_WANT_WRITE:
803 case SSL_ERROR_SYSCALL:
805 if (n != -1 || errno == 0)
813 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
818 case SSL_ERROR_ZERO_RETURN:
824 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
825 errmsg(
"unrecognized SSL error code: %d",
844 n = SSL_write(
port->ssl, ptr,
len);
845 err = SSL_get_error(
port->ssl, n);
846 ecode = (
err != SSL_ERROR_NONE || n < 0) ? ERR_get_error() : 0;
852 case SSL_ERROR_WANT_READ:
857 case SSL_ERROR_WANT_WRITE:
862 case SSL_ERROR_SYSCALL:
870 if (n != -1 || errno == 0)
878 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
883 case SSL_ERROR_ZERO_RETURN:
894 (
errcode(ERRCODE_PROTOCOL_VIOLATION),
895 errmsg(
"unrecognized SSL error code: %d",
932 BIO_clear_retry_flags(h);
933 port->last_read_was_eof = res == 0;
939 BIO_set_retry_read(h);
953 BIO_clear_retry_flags(h);
959 BIO_set_retry_write(h);
982 res =
port->last_read_was_eof;
1003 my_bio_index = BIO_get_new_index();
1004 if (my_bio_index == -1)
1006 my_bio_index |= BIO_TYPE_SOURCE_SINK;
1026 BIO_METHOD *bio_method;
1029 if (bio_method == NULL)
1032 bio = BIO_new(bio_method);
1036 BIO_set_data(bio,
port);
1037 BIO_set_init(bio, 1);
1039 SSL_set_bio(
port->ssl, bio, bio);
1062 errmsg(
"could not open DH parameters file \"%s\": %m",
1067 dh = PEM_read_DHparams(fp, NULL, NULL, NULL);
1073 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
1074 errmsg(
"could not load DH parameters file: %s",
1080 if (DH_check(dh, &codes) == 0)
1083 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
1084 errmsg(
"invalid DH parameters: %s",
1089 if (codes & DH_CHECK_P_NOT_PRIME)
1092 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
1093 errmsg(
"invalid DH parameters: p is not prime")));
1097 if ((codes & DH_NOT_SUITABLE_GENERATOR) &&
1098 (codes & DH_CHECK_P_NOT_SAFE_PRIME))
1101 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
1102 errmsg(
"invalid DH parameters: neither suitable generator or safe prime")));
1123 bio = BIO_new_mem_buf(buffer,
len);
1126 dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
1143 const char *prompt =
"Enter PEM pass phrase:";
1179 size_t namelen = strlen(
name);
1180 char *truncated =
name;
1197 truncated[0] = truncated[1] = truncated[2] =
'.';
1221 const char *errstring;
1234 depth = X509_STORE_CTX_get_error_depth(ctx);
1235 errcode = X509_STORE_CTX_get_error(ctx);
1236 errstring = X509_verify_cert_error_string(
errcode);
1242 ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
1243 cb_err = (
struct CallbackErr *) SSL_get_ex_data(ssl, 0);
1247 _(
"Client certificate verification failed at depth %d: %s."),
1250 cert = X509_STORE_CTX_get_current_cert(ctx);
1278 sn = X509_get_serialNumber(cert);
1279 b = ASN1_INTEGER_to_BN(sn, NULL);
1280 serialno = BN_bn2dec(
b);
1284 _(
"Failed certificate data (unverified): subject \"%s\", serial number %s, issuer \"%s\"."),
1285 sub_prepared, serialno ? serialno :
_(
"unknown"),
1289 OPENSSL_free(serialno);
1290 pfree(iss_prepared);
1291 pfree(sub_prepared);
1309 desc = SSL_state_string_long(ssl);
1313 case SSL_CB_HANDSHAKE_START:
1317 case SSL_CB_HANDSHAKE_DONE:
1321 case SSL_CB_ACCEPT_LOOP:
1325 case SSL_CB_ACCEPT_EXIT:
1329 case SSL_CB_CONNECT_LOOP:
1333 case SSL_CB_CONNECT_EXIT:
1337 case SSL_CB_READ_ALERT:
1341 case SSL_CB_WRITE_ALERT:
1357 const unsigned char **out,
1358 unsigned char *outlen,
1359 const unsigned char *in,
1370 Assert(userdata != NULL);
1375 retval = SSL_select_next_proto((
unsigned char **) out, outlen,
1378 if (*out == NULL || *outlen >
sizeof(
alpn_protos) || *outlen <= 0)
1379 return SSL_TLSEXT_ERR_NOACK;
1381 if (retval == OPENSSL_NPN_NEGOTIATED)
1382 return SSL_TLSEXT_ERR_OK;
1389 return SSL_TLSEXT_ERR_ALERT_FATAL;
1412 SSL_CTX_set_options(context, SSL_OP_SINGLE_DH_USE);
1421 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
1422 errmsg(
"DH: could not load DH parameters")));
1426 if (SSL_CTX_set_tmp_dh(context, dh) != 1)
1429 (
errcode(ERRCODE_CONFIG_FILE_ERROR),
1430 errmsg(
"DH: could not set DH parameters: %s",
1448#ifndef OPENSSL_NO_ECDH
1449 if (SSL_CTX_set1_groups_list(context,
SSLECDHCurve) != 1)
1459 errcode(ERRCODE_CONFIG_FILE_ERROR),
1460 errmsg(
"could not set group names specified in ssl_groups: %s",
1462 _(
"No valid groups found"))),
1463 errhint(
"Ensure that each group name is spelled correctly and supported by the installed version of OpenSSL."));
1505 const char *errreason;
1506 static char errbuf[36];
1509 return _(
"no SSL error reported");
1510 errreason = ERR_reason_error_string(ecode);
1511 if (errreason != NULL)
1521#ifdef ERR_SYSTEM_ERROR
1522 if (ERR_SYSTEM_ERROR(ecode))
1523 return strerror(ERR_GET_REASON(ecode));
1527 snprintf(errbuf,
sizeof(errbuf),
_(
"SSL error code %lu"), ecode);
1538 SSL_get_cipher_bits(
port->ssl, &bits);
1549 return SSL_get_version(
port->ssl);
1558 return SSL_get_cipher(
port->ssl);
1586 ASN1_INTEGER *serial;
1590 serial = X509_get_serialNumber(
port->peer);
1591 b = ASN1_INTEGER_to_BN(serial, NULL);
1607 const EVP_MD *algo_type = NULL;
1608 unsigned char hash[EVP_MAX_MD_SIZE];
1609 unsigned int hash_size;
1613 server_cert = SSL_get_certificate(
port->ssl);
1614 if (server_cert == NULL)
1622#if HAVE_X509_GET_SIGNATURE_INFO
1623 if (!X509_get_signature_info(server_cert, &algo_nid, NULL, NULL, NULL))
1625 if (!OBJ_find_sigid_algs(X509_get_signature_nid(server_cert),
1628 elog(
ERROR,
"could not determine server certificate signature algorithm");
1640 algo_type = EVP_sha256();
1643 algo_type = EVP_get_digestbynid(algo_nid);
1644 if (algo_type == NULL)
1645 elog(
ERROR,
"could not find digest for NID %s",
1646 OBJ_nid2sn(algo_nid));
1651 if (!X509_digest(server_cert, algo_type,
hash, &hash_size))
1652 elog(
ERROR,
"could not generate server certificate hash");
1654 cert_hash =
palloc(hash_size);
1655 memcpy(cert_hash,
hash, hash_size);
1668 BIO *membuf = BIO_new(BIO_s_mem());
1671 count = X509_NAME_entry_count(
name);
1674 const char *field_name;
1683 (
errcode(ERRCODE_OUT_OF_MEMORY),
1684 errmsg(
"could not create BIO")));
1686 (void) BIO_set_close(membuf, BIO_CLOSE);
1687 for (
i = 0;
i < count;
i++)
1689 e = X509_NAME_get_entry(
name,
i);
1690 nid = OBJ_obj2nid(X509_NAME_ENTRY_get_object(
e));
1691 if (nid == NID_undef)
1693 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1694 errmsg(
"could not get NID for ASN1_OBJECT object")));
1695 v = X509_NAME_ENTRY_get_data(
e);
1696 field_name = OBJ_nid2sn(nid);
1697 if (field_name == NULL)
1698 field_name = OBJ_nid2ln(nid);
1699 if (field_name == NULL)
1701 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1702 errmsg(
"could not convert NID %d to an ASN1_OBJECT structure", nid)));
1703 BIO_printf(membuf,
"/%s=", field_name);
1704 ASN1_STRING_print_ex(membuf, v,
1705 ((ASN1_STRFLGS_RFC2253 & ~ASN1_STRFLGS_ESC_MSB)
1706 | ASN1_STRFLGS_UTF8_CONVERT));
1711 BIO_write(membuf, &nullterm, 1);
1712 size = BIO_get_mem_data(membuf, &sp);
1718 if (BIO_free(membuf) != 1)
1719 elog(
ERROR,
"could not free OpenSSL BIO structure");
1746 return TLS1_VERSION;
1748#ifdef TLS1_1_VERSION
1749 return TLS1_1_VERSION;
1754#ifdef TLS1_2_VERSION
1755 return TLS1_2_VERSION;
1760#ifdef TLS1_3_VERSION
1761 return TLS1_3_VERSION;
1790 return "(unrecognized)";
bool check_ssl_key_file_permissions(const char *ssl_key_file, bool isServerStart)
int run_ssl_passphrase_command(const char *prompt, bool is_server_start, char *buf, int size)
const char * be_tls_get_version(Port *port)
static const char * ssl_protocol_version_to_string(int v)
static void info_cb(const SSL *ssl, int type, int args)
static const char * SSLerrmessage(unsigned long ecode)
ssize_t be_tls_write(Port *port, const void *ptr, size_t len, int *waitfor)
void be_tls_destroy(void)
int be_tls_init(bool isServerStart)
static long port_bio_ctrl(BIO *h, int cmd, long num, void *ptr)
openssl_tls_init_hook_typ openssl_tls_init_hook
int be_tls_get_cipher_bits(Port *port)
int be_tls_open_server(Port *port)
char * be_tls_get_certificate_hash(Port *port, size_t *len)
static int alpn_cb(SSL *ssl, const unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *userdata)
const char * be_tls_get_cipher(Port *port)
static const char * SSLerrmessageExt(unsigned long ecode, const char *replacement)
static DH * load_dh_buffer(const char *buffer, size_t len)
static int dummy_ssl_passwd_cb(char *buf, int size, int rwflag, void *userdata)
static void default_openssl_tls_init(SSL_CTX *context, bool isServerStart)
static int ssl_set_port_bio(Port *port)
void be_tls_get_peer_serial(Port *port, char *ptr, size_t len)
static int ssl_protocol_version_to_openssl(int v)
static bool initialize_dh(SSL_CTX *context, bool isServerStart)
void be_tls_close(Port *port)
void be_tls_get_peer_issuer_name(Port *port, char *ptr, size_t len)
ssize_t be_tls_read(Port *port, void *ptr, size_t len, int *waitfor)
static char * X509_NAME_to_cstring(X509_NAME *name)
static BIO_METHOD * port_bio_method(void)
static int ssl_external_passwd_cb(char *buf, int size, int rwflag, void *userdata)
static char * prepare_cert_name(char *name)
static SSL_CTX * SSL_context
static bool ssl_is_server_start
static int verify_cb(int ok, X509_STORE_CTX *ctx)
static BIO_METHOD * port_bio_method_ptr
static bool initialize_ecdh(SSL_CTX *context, bool isServerStart)
static int port_bio_read(BIO *h, char *buf, int size)
static int port_bio_write(BIO *h, const char *buf, int size)
static bool dummy_ssl_passwd_cb_called
static DH * load_dh_file(char *filename, bool isServerStart)
static const unsigned char alpn_protos[]
void be_tls_get_peer_subject_name(Port *port, char *ptr, size_t len)
char * ssl_dh_params_file
int ssl_min_protocol_version
ssize_t secure_raw_read(Port *port, void *ptr, size_t len)
bool SSLPreferServerCiphers
int ssl_max_protocol_version
char * ssl_passphrase_command
bool ssl_passphrase_command_supports_reload
ssize_t secure_raw_write(Port *port, const void *ptr, size_t len)
int errcode_for_socket_access(void)
int errmsg_internal(const char *fmt,...)
int errdetail_internal(const char *fmt,...)
int errcode_for_file_access(void)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
void err(int eval, const char *fmt,...)
FILE * AllocateFile(const char *name, const char *mode)
const char * GetConfigOption(const char *name, bool missing_ok, bool restrict_privileged)
Assert(PointerIsAligned(start, uint64))
int WaitLatchOrSocket(Latch *latch, int wakeEvents, pgsocket sock, long timeout, uint32 wait_event_info)
char * pg_any_to_server(const char *s, int len, int encoding)
void * MemoryContextAlloc(MemoryContext context, Size size)
char * pstrdup(const char *in)
void pfree(void *pointer)
MemoryContext TopMemoryContext
size_t strlcpy(char *dst, const char *src, size_t siz)
#define PG_ALPN_PROTOCOL_VECTOR
static unsigned hash(unsigned *uv, int n)
char * pg_clean_ascii(const char *str, int alloc_flags)
void appendStringInfo(StringInfo str, const char *fmt,...)
void appendStringInfoChar(StringInfo str, char ch)
void initStringInfo(StringInfo str)
#define WL_SOCKET_READABLE
#define WL_EXIT_ON_PM_DEATH
#define WL_SOCKET_WRITEABLE