PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
pqcomm.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * pqcomm.h
4  * Definitions common to frontends and backends.
5  *
6  * NOTE: for historical reasons, this does not correspond to pqcomm.c.
7  * pqcomm.c's routines are declared in libpq.h.
8  *
9  * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
10  * Portions Copyright (c) 1994, Regents of the University of California
11  *
12  * src/include/libpq/pqcomm.h
13  *
14  *-------------------------------------------------------------------------
15  */
16 #ifndef PQCOMM_H
17 #define PQCOMM_H
18 
19 #include <sys/socket.h>
20 #include <netdb.h>
21 #ifdef HAVE_SYS_UN_H
22 #include <sys/un.h>
23 #endif
24 #include <netinet/in.h>
25 
26 #ifdef HAVE_STRUCT_SOCKADDR_STORAGE
27 
28 #ifndef HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY
29 #ifdef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY
30 #define ss_family __ss_family
31 #else
32 #error struct sockaddr_storage does not provide an ss_family member
33 #endif
34 #endif
35 
36 #ifdef HAVE_STRUCT_SOCKADDR_STORAGE___SS_LEN
37 #define ss_len __ss_len
38 #define HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN 1
39 #endif
40 #else /* !HAVE_STRUCT_SOCKADDR_STORAGE */
41 
42 /* Define a struct sockaddr_storage if we don't have one. */
43 
45 {
46  union
47  {
48  struct sockaddr sa; /* get the system-dependent fields */
49  int64 ss_align; /* ensures struct is properly aligned */
50  char ss_pad[128]; /* ensures struct has desired size */
51  } ss_stuff;
52 };
53 
54 #define ss_family ss_stuff.sa.sa_family
55 /* It should have an ss_len field if sockaddr has sa_len. */
56 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
57 #define ss_len ss_stuff.sa.sa_len
58 #define HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN 1
59 #endif
60 #endif /* HAVE_STRUCT_SOCKADDR_STORAGE */
61 
62 typedef struct
63 {
64  struct sockaddr_storage addr;
65  ACCEPT_TYPE_ARG3 salen;
66 } SockAddr;
67 
68 /* Configure the UNIX socket location for the well known port. */
69 
70 #define UNIXSOCK_PATH(path, port, sockdir) \
71  snprintf(path, sizeof(path), "%s/.s.PGSQL.%d", \
72  ((sockdir) && *(sockdir) != '\0') ? (sockdir) : \
73  DEFAULT_PGSOCKET_DIR, \
74  (port))
75 
76 /*
77  * The maximum workable length of a socket path is what will fit into
78  * struct sockaddr_un. This is usually only 100 or so bytes :-(.
79  *
80  * For consistency, always pass a MAXPGPATH-sized buffer to UNIXSOCK_PATH(),
81  * then complain if the resulting string is >= UNIXSOCK_PATH_BUFLEN bytes.
82  * (Because the standard API for getaddrinfo doesn't allow it to complain in
83  * a useful way when the socket pathname is too long, we have to test for
84  * this explicitly, instead of just letting the subroutine return an error.)
85  */
86 #define UNIXSOCK_PATH_BUFLEN sizeof(((struct sockaddr_un *) NULL)->sun_path)
87 
88 
89 /*
90  * These manipulate the frontend/backend protocol version number.
91  *
92  * The major number should be incremented for incompatible changes. The minor
93  * number should be incremented for compatible changes (eg. additional
94  * functionality).
95  *
96  * If a backend supports version m.n of the protocol it must actually support
97  * versions m.[0..n]. Backend support for version m-1 can be dropped after a
98  * `reasonable' length of time.
99  *
100  * A frontend isn't required to support anything other than the current
101  * version.
102  */
103 
104 #define PG_PROTOCOL_MAJOR(v) ((v) >> 16)
105 #define PG_PROTOCOL_MINOR(v) ((v) & 0x0000ffff)
106 #define PG_PROTOCOL(m,n) (((m) << 16) | (n))
107 
108 /* The earliest and latest frontend/backend protocol version supported. */
109 
110 #define PG_PROTOCOL_EARLIEST PG_PROTOCOL(2,0)
111 #define PG_PROTOCOL_LATEST PG_PROTOCOL(3,0)
112 
113 typedef uint32 ProtocolVersion; /* FE/BE protocol version number */
114 
116 
117 
118 /*
119  * Packet lengths are 4 bytes in network byte order.
120  *
121  * The initial length is omitted from the packet layouts appearing below.
122  */
123 
125 
126 
127 /*
128  * Old-style startup packet layout with fixed-width fields. This is used in
129  * protocol 1.0 and 2.0, but not in later versions. Note that the fields
130  * in this layout are '\0' terminated only if there is room.
131  */
132 
133 #define SM_DATABASE 64
134 #define SM_USER 32
135 /* We append database name if db_user_namespace true. */
136 #define SM_DATABASE_USER (SM_DATABASE+SM_USER+1) /* +1 for @ */
137 #define SM_OPTIONS 64
138 #define SM_UNUSED 64
139 #define SM_TTY 64
140 
141 typedef struct StartupPacket
142 {
143  ProtocolVersion protoVersion; /* Protocol version */
144  char database[SM_DATABASE]; /* Database name */
145  /* Db_user_namespace appends dbname */
146  char user[SM_USER]; /* User name */
147  char options[SM_OPTIONS]; /* Optional additional args */
148  char unused[SM_UNUSED]; /* Unused */
149  char tty[SM_TTY]; /* Tty for debug output */
150 } StartupPacket;
151 
152 extern bool Db_user_namespace;
153 
154 /*
155  * In protocol 3.0 and later, the startup packet length is not fixed, but
156  * we set an arbitrary limit on it anyway. This is just to prevent simple
157  * denial-of-service attacks via sending enough data to run the server
158  * out of memory.
159  */
160 #define MAX_STARTUP_PACKET_LENGTH 10000
161 
162 
163 /* These are the authentication request codes sent by the backend. */
164 
165 #define AUTH_REQ_OK 0 /* User is authenticated */
166 #define AUTH_REQ_KRB4 1 /* Kerberos V4. Not supported any more. */
167 #define AUTH_REQ_KRB5 2 /* Kerberos V5. Not supported any more. */
168 #define AUTH_REQ_PASSWORD 3 /* Password */
169 #define AUTH_REQ_CRYPT 4 /* crypt password. Not supported any more. */
170 #define AUTH_REQ_MD5 5 /* md5 password */
171 #define AUTH_REQ_SCM_CREDS 6 /* transfer SCM credentials */
172 #define AUTH_REQ_GSS 7 /* GSSAPI without wrap() */
173 #define AUTH_REQ_GSS_CONT 8 /* Continue GSS exchanges */
174 #define AUTH_REQ_SSPI 9 /* SSPI negotiate without wrap() */
175 #define AUTH_REQ_SASL 10 /* Begin SASL authentication */
176 #define AUTH_REQ_SASL_CONT 11 /* Continue SASL authentication */
177 #define AUTH_REQ_SASL_FIN 12 /* Final SASL message */
178 
180 
181 
182 /*
183  * A client can also send a cancel-current-operation request to the postmaster.
184  * This is uglier than sending it directly to the client's backend, but it
185  * avoids depending on out-of-band communication facilities.
186  *
187  * The cancel request code must not match any protocol version number
188  * we're ever likely to use. This random choice should do.
189  */
190 #define CANCEL_REQUEST_CODE PG_PROTOCOL(1234,5678)
191 
192 typedef struct CancelRequestPacket
193 {
194  /* Note that each field is stored in network byte order! */
195  MsgType cancelRequestCode; /* code to identify a cancel request */
196  uint32 backendPID; /* PID of client's backend */
197  uint32 cancelAuthCode; /* secret key to authorize cancel */
199 
200 
201 /*
202  * A client can also start by sending a SSL negotiation request, to get a
203  * secure channel.
204  */
205 #define NEGOTIATE_SSL_CODE PG_PROTOCOL(1234,5679)
206 
207 #endif /* PQCOMM_H */
#define SM_UNUSED
Definition: pqcomm.h:138
char ss_pad[128]
Definition: pqcomm.h:50
char tty[SM_TTY]
Definition: pqcomm.h:149
uint32 cancelAuthCode
Definition: pqcomm.h:197
struct StartupPacket StartupPacket
#define SM_USER
Definition: pqcomm.h:134
uint32 AuthRequest
Definition: pqcomm.h:179
char unused[SM_UNUSED]
Definition: pqcomm.h:148
uint32 backendPID
Definition: pqcomm.h:196
#define SM_TTY
Definition: pqcomm.h:139
unsigned int uint32
Definition: c.h:268
ACCEPT_TYPE_ARG3 salen
Definition: pqcomm.h:65
bool Db_user_namespace
Definition: postmaster.c:240
uint32 ProtocolVersion
Definition: pqcomm.h:113
char database[SM_DATABASE]
Definition: pqcomm.h:144
struct CancelRequestPacket CancelRequestPacket
union sockaddr_storage::@89 ss_stuff
MsgType cancelRequestCode
Definition: pqcomm.h:195
int64 ss_align
Definition: pqcomm.h:49
char user[SM_USER]
Definition: pqcomm.h:146
ProtocolVersion MsgType
Definition: pqcomm.h:115
ProtocolVersion protoVersion
Definition: pqcomm.h:143
uint32 PacketLen
Definition: pqcomm.h:124
#define SM_OPTIONS
Definition: pqcomm.h:137
#define SM_DATABASE
Definition: pqcomm.h:133