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