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-2016, 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 44 struct sockaddr_storage 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(1,0) 111 #define PG_PROTOCOL_LATEST PG_PROTOCOL(3,0) 112 113 typedef uint32 ProtocolVersion; /* FE/BE protocol version number */ 114 115 typedef ProtocolVersion MsgType; 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 124 typedef uint32 PacketLen; 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 /* SASL authentication. Not supported before 176 * libpq version 10. */ 177 178 typedef uint32 AuthRequest; 179 180 181 /* 182 * A client can also send a cancel-current-operation request to the postmaster. 183 * This is uglier than sending it directly to the client's backend, but it 184 * avoids depending on out-of-band communication facilities. 185 * 186 * The cancel request code must not match any protocol version number 187 * we're ever likely to use. This random choice should do. 188 */ 189 #define CANCEL_REQUEST_CODE PG_PROTOCOL(1234,5678) 190 191 typedef struct CancelRequestPacket 192 { 193 /* Note that each field is stored in network byte order! */ 194 MsgType cancelRequestCode; /* code to identify a cancel request */ 195 uint32 backendPID; /* PID of client's backend */ 196 uint32 cancelAuthCode; /* secret key to authorize cancel */ 197 } CancelRequestPacket; 198 199 200 /* 201 * A client can also start by sending a SSL negotiation request, to get a 202 * secure channel. 203 */ 204 #define NEGOTIATE_SSL_CODE PG_PROTOCOL(1234,5679) 205 206 #endif /* PQCOMM_H */ 207