1 /*------------------------------------------------------------------------- 2 * 3 * libpq.h 4 * POSTGRES LIBPQ buffer structure definitions. 5 * 6 * 7 * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group 8 * Portions Copyright (c) 1994, Regents of the University of California 9 * 10 * src/include/libpq/libpq.h 11 * 12 *------------------------------------------------------------------------- 13 */ 14 #ifndef LIBPQ_H 15 #define LIBPQ_H 16 17 #include <netinet/in.h> 18 19 #include "lib/stringinfo.h" 20 #include "libpq/libpq-be.h" 21 #include "storage/latch.h" 22 23 24 /* 25 * Callers of pq_getmessage() must supply a maximum expected message size. 26 * By convention, if there's not any specific reason to use another value, 27 * use PQ_SMALL_MESSAGE_LIMIT for messages that shouldn't be too long, and 28 * PQ_LARGE_MESSAGE_LIMIT for messages that can be long. 29 */ 30 #define PQ_SMALL_MESSAGE_LIMIT 10000 31 #define PQ_LARGE_MESSAGE_LIMIT (MaxAllocSize - 1) 32 33 typedef struct 34 { 35 void (*comm_reset) (void); 36 int (*flush) (void); 37 int (*flush_if_writable) (void); 38 bool (*is_send_pending) (void); 39 int (*putmessage) (char msgtype, const char *s, size_t len); 40 void (*putmessage_noblock) (char msgtype, const char *s, size_t len); 41 } PQcommMethods; 42 43 extern const PGDLLIMPORT PQcommMethods *PqCommMethods; 44 45 #define pq_comm_reset() (PqCommMethods->comm_reset()) 46 #define pq_flush() (PqCommMethods->flush()) 47 #define pq_flush_if_writable() (PqCommMethods->flush_if_writable()) 48 #define pq_is_send_pending() (PqCommMethods->is_send_pending()) 49 #define pq_putmessage(msgtype, s, len) \ 50 (PqCommMethods->putmessage(msgtype, s, len)) 51 #define pq_putmessage_noblock(msgtype, s, len) \ 52 (PqCommMethods->putmessage_noblock(msgtype, s, len)) 53 54 /* 55 * External functions. 56 */ 57 58 /* 59 * prototypes for functions in pqcomm.c 60 */ 61 extern WaitEventSet *FeBeWaitSet; 62 63 #define FeBeWaitSetSocketPos 0 64 #define FeBeWaitSetLatchPos 1 65 66 extern int StreamServerPort(int family, const char *hostName, 67 unsigned short portNumber, const char *unixSocketDir, 68 pgsocket ListenSocket[], int MaxListen); 69 extern int StreamConnection(pgsocket server_fd, Port *port); 70 extern void StreamClose(pgsocket sock); 71 extern void TouchSocketFiles(void); 72 extern void RemoveSocketFiles(void); 73 extern void pq_init(void); 74 extern int pq_getbytes(char *s, size_t len); 75 extern void pq_startmsgread(void); 76 extern void pq_endmsgread(void); 77 extern bool pq_is_reading_msg(void); 78 extern int pq_getmessage(StringInfo s, int maxlen); 79 extern int pq_getbyte(void); 80 extern int pq_peekbyte(void); 81 extern int pq_getbyte_if_available(unsigned char *c); 82 extern bool pq_buffer_has_data(void); 83 extern int pq_putmessage_v2(char msgtype, const char *s, size_t len); 84 extern bool pq_check_connection(void); 85 86 /* 87 * prototypes for functions in be-secure.c 88 */ 89 extern char *ssl_library; 90 extern char *ssl_cert_file; 91 extern char *ssl_key_file; 92 extern char *ssl_ca_file; 93 extern char *ssl_crl_file; 94 extern char *ssl_crl_dir; 95 extern char *ssl_dh_params_file; 96 extern PGDLLIMPORT char *ssl_passphrase_command; 97 extern PGDLLIMPORT bool ssl_passphrase_command_supports_reload; 98 #ifdef USE_SSL 99 extern bool ssl_loaded_verify_locations; 100 #endif 101 102 extern int secure_initialize(bool isServerStart); 103 extern bool secure_loaded_verify_locations(void); 104 extern void secure_destroy(void); 105 extern int secure_open_server(Port *port); 106 extern void secure_close(Port *port); 107 extern ssize_t secure_read(Port *port, void *ptr, size_t len); 108 extern ssize_t secure_write(Port *port, void *ptr, size_t len); 109 extern ssize_t secure_raw_read(Port *port, void *ptr, size_t len); 110 extern ssize_t secure_raw_write(Port *port, const void *ptr, size_t len); 111 112 /* 113 * prototypes for functions in be-secure-gssapi.c 114 */ 115 #ifdef ENABLE_GSS 116 extern ssize_t secure_open_gssapi(Port *port); 117 #endif 118 119 /* GUCs */ 120 extern char *SSLCipherSuites; 121 extern char *SSLECDHCurve; 122 extern bool SSLPreferServerCiphers; 123 extern int ssl_min_protocol_version; 124 extern int ssl_max_protocol_version; 125 126 enum ssl_protocol_versions 127 { 128 PG_TLS_ANY = 0, 129 PG_TLS1_VERSION, 130 PG_TLS1_1_VERSION, 131 PG_TLS1_2_VERSION, 132 PG_TLS1_3_VERSION, 133 }; 134 135 /* 136 * prototypes for functions in be-secure-common.c 137 */ 138 extern int run_ssl_passphrase_command(const char *prompt, bool is_server_start, 139 char *buf, int size); 140 extern bool check_ssl_key_file_permissions(const char *ssl_key_file, 141 bool isServerStart); 142 143 #endif /* LIBPQ_H */ 144