PostgreSQL Source Code git master
Loading...
Searching...
No Matches
fe-misc.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * FILE
4 * fe-misc.c
5 *
6 * DESCRIPTION
7 * miscellaneous useful functions
8 *
9 * The communication routines here are analogous to the ones in
10 * backend/libpq/pqcomm.c and backend/libpq/pqformat.c, but operate
11 * in the considerably different environment of the frontend libpq.
12 * In particular, we work with a bare nonblock-mode socket, rather than
13 * a stdio stream, so that we can avoid unwanted blocking of the application.
14 *
15 * XXX: MOVE DEBUG PRINTOUT TO HIGHER LEVEL. As is, block and restart
16 * will cause repeat printouts.
17 *
18 * We must speak the same transmitted data representations as the backend
19 * routines.
20 *
21 *
22 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
23 * Portions Copyright (c) 1994, Regents of the University of California
24 *
25 * IDENTIFICATION
26 * src/interfaces/libpq/fe-misc.c
27 *
28 *-------------------------------------------------------------------------
29 */
30
31#include "postgres_fe.h"
32
33#include <signal.h>
34#include <time.h>
35
36#ifdef WIN32
37#include "win32.h"
38#else
39#include <unistd.h>
40#include <sys/select.h>
41#include <sys/time.h>
42#endif
43
44#ifdef HAVE_POLL_H
45#include <poll.h>
46#endif
47
48#include "libpq-fe.h"
49#include "libpq-int.h"
50#include "mb/pg_wchar.h"
51#include "pg_config_paths.h"
52#include "port/pg_bswap.h"
53
54static int pqPutMsgBytes(const void *buf, size_t len, PGconn *conn);
55static int pqSendSome(PGconn *conn, int len);
56static int pqSocketCheck(PGconn *conn, int forRead, int forWrite,
58
59/*
60 * PQlibVersion: return the libpq version number
61 */
62int
64{
65 return PG_VERSION_NUM;
66}
67
68
69/*
70 * pqGetc: read 1 character from the connection
71 *
72 * All these routines return 0 on success, EOF on error.
73 * Note that for the Get routines, EOF only means there is not enough
74 * data in the buffer, not that there is necessarily a hard error.
75 */
76int
77pqGetc(char *result, PGconn *conn)
78{
79 if (conn->inCursor >= conn->inEnd)
80 return EOF;
81
82 *result = conn->inBuffer[conn->inCursor++];
83
84 return 0;
85}
86
87
88/*
89 * pqPutc: write 1 char to the current message
90 */
91int
93{
94 if (pqPutMsgBytes(&c, 1, conn))
95 return EOF;
96
97 return 0;
98}
99
100
101/*
102 * pqGets[_append]:
103 * read a null-terminated string from the connection,
104 * and store it in an expansible PQExpBuffer.
105 * If we run out of memory, all of the string is still read,
106 * but the excess characters are silently discarded.
107 */
108static int
110{
111 /* Copy conn data to locals for faster search loop */
112 char *inBuffer = conn->inBuffer;
113 int inCursor = conn->inCursor;
114 int inEnd = conn->inEnd;
115 int slen;
116
117 while (inCursor < inEnd && inBuffer[inCursor])
118 inCursor++;
119
120 if (inCursor >= inEnd)
121 return EOF;
122
123 slen = inCursor - conn->inCursor;
124
125 if (resetbuffer)
127
129
130 conn->inCursor = ++inCursor;
131
132 return 0;
133}
134
135int
137{
138 return pqGets_internal(buf, conn, true);
139}
140
141int
143{
144 return pqGets_internal(buf, conn, false);
145}
146
147
148/*
149 * pqPuts: write a null-terminated string to the current message
150 */
151int
152pqPuts(const char *s, PGconn *conn)
153{
154 if (pqPutMsgBytes(s, strlen(s) + 1, conn))
155 return EOF;
156
157 return 0;
158}
159
160/*
161 * pqGetnchar:
162 * read exactly len bytes in buffer s, no null termination
163 */
164int
165pqGetnchar(void *s, size_t len, PGconn *conn)
166{
167 if (len > (size_t) (conn->inEnd - conn->inCursor))
168 return EOF;
169
171 /* no terminating null */
172
173 conn->inCursor += len;
174
175 return 0;
176}
177
178/*
179 * pqSkipnchar:
180 * skip over len bytes in input buffer.
181 *
182 * Note: this is primarily useful for its debug output, which should
183 * be exactly the same as for pqGetnchar. We assume the data in question
184 * will actually be used, but just isn't getting copied anywhere as yet.
185 */
186int
188{
189 if (len > (size_t) (conn->inEnd - conn->inCursor))
190 return EOF;
191
192 conn->inCursor += len;
193
194 return 0;
195}
196
197/*
198 * pqPutnchar:
199 * write exactly len bytes to the current message
200 */
201int
202pqPutnchar(const void *s, size_t len, PGconn *conn)
203{
204 if (pqPutMsgBytes(s, len, conn))
205 return EOF;
206
207 return 0;
208}
209
210/*
211 * pqGetInt
212 * read a 2 or 4 byte integer and convert from network byte order
213 * to local byte order
214 */
215int
216pqGetInt(int *result, size_t bytes, PGconn *conn)
217{
218 uint16 tmp2;
219 uint32 tmp4;
220
221 switch (bytes)
222 {
223 case 2:
224 if (conn->inCursor + 2 > conn->inEnd)
225 return EOF;
227 conn->inCursor += 2;
228 *result = (int) pg_ntoh16(tmp2);
229 break;
230 case 4:
231 if (conn->inCursor + 4 > conn->inEnd)
232 return EOF;
234 conn->inCursor += 4;
235 *result = (int) pg_ntoh32(tmp4);
236 break;
237 default:
239 "integer of size %zu not supported by pqGetInt",
240 bytes);
241 return EOF;
242 }
243
244 return 0;
245}
246
247/*
248 * pqPutInt
249 * write an integer of 2 or 4 bytes, converting from host byte order
250 * to network byte order.
251 */
252int
253pqPutInt(int value, size_t bytes, PGconn *conn)
254{
255 uint16 tmp2;
256 uint32 tmp4;
257
258 switch (bytes)
259 {
260 case 2:
262 if (pqPutMsgBytes((const char *) &tmp2, 2, conn))
263 return EOF;
264 break;
265 case 4:
267 if (pqPutMsgBytes((const char *) &tmp4, 4, conn))
268 return EOF;
269 break;
270 default:
272 "integer of size %zu not supported by pqPutInt",
273 bytes);
274 return EOF;
275 }
276
277 return 0;
278}
279
280/*
281 * Make sure conn's output buffer can hold bytes_needed bytes (caller must
282 * include already-stored data into the value!)
283 *
284 * Returns 0 on success, EOF if failed to enlarge buffer
285 */
286int
288{
289 int newsize = conn->outBufSize;
290 char *newbuf;
291
292 /* Quick exit if we have enough space */
293 if (bytes_needed <= (size_t) newsize)
294 return 0;
295
296 /*
297 * If we need to enlarge the buffer, we first try to double it in size; if
298 * that doesn't work, enlarge in multiples of 8K. This avoids thrashing
299 * the malloc pool by repeated small enlargements.
300 *
301 * Note: tests for newsize > 0 are to catch integer overflow.
302 */
303 do
304 {
305 newsize *= 2;
306 } while (newsize > 0 && bytes_needed > (size_t) newsize);
307
308 if (newsize > 0 && bytes_needed <= (size_t) newsize)
309 {
311 if (newbuf)
312 {
313 /* realloc succeeded */
316 return 0;
317 }
318 }
319
321 do
322 {
323 newsize += 8192;
324 } while (newsize > 0 && bytes_needed > (size_t) newsize);
325
326 if (newsize > 0 && bytes_needed <= (size_t) newsize)
327 {
329 if (newbuf)
330 {
331 /* realloc succeeded */
334 return 0;
335 }
336 }
337
338 /* realloc failed. Probably out of memory */
340 "cannot allocate memory for output buffer\n");
341 return EOF;
342}
343
344/*
345 * Make sure conn's input buffer can hold bytes_needed bytes (caller must
346 * include already-stored data into the value!)
347 *
348 * Returns 0 on success, EOF if failed to enlarge buffer
349 */
350int
352{
353 int newsize = conn->inBufSize;
354 char *newbuf;
355
356 /* Quick exit if we have enough space */
357 if (bytes_needed <= (size_t) newsize)
358 return 0;
359
360 /*
361 * Before concluding that we need to enlarge the buffer, left-justify
362 * whatever is in it and recheck. The caller's value of bytes_needed
363 * includes any data to the left of inStart, but we can delete that in
364 * preference to enlarging the buffer. It's slightly ugly to have this
365 * function do this, but it's better than making callers worry about it.
366 */
368
369 if (conn->inStart < conn->inEnd)
370 {
371 if (conn->inStart > 0)
372 {
374 conn->inEnd - conn->inStart);
375 conn->inEnd -= conn->inStart;
377 conn->inStart = 0;
378 }
379 }
380 else
381 {
382 /* buffer is logically empty, reset it */
383 conn->inStart = conn->inCursor = conn->inEnd = 0;
384 }
385
386 /* Recheck whether we have enough space */
387 if (bytes_needed <= (size_t) newsize)
388 return 0;
389
390 /*
391 * If we need to enlarge the buffer, we first try to double it in size; if
392 * that doesn't work, enlarge in multiples of 8K. This avoids thrashing
393 * the malloc pool by repeated small enlargements.
394 *
395 * Note: tests for newsize > 0 are to catch integer overflow.
396 */
397 do
398 {
399 newsize *= 2;
400 } while (newsize > 0 && bytes_needed > (size_t) newsize);
401
402 if (newsize > 0 && bytes_needed <= (size_t) newsize)
403 {
405 if (newbuf)
406 {
407 /* realloc succeeded */
410 return 0;
411 }
412 }
413
415 do
416 {
417 newsize += 8192;
418 } while (newsize > 0 && bytes_needed > (size_t) newsize);
419
420 if (newsize > 0 && bytes_needed <= (size_t) newsize)
421 {
423 if (newbuf)
424 {
425 /* realloc succeeded */
428 return 0;
429 }
430 }
431
432 /* realloc failed. Probably out of memory */
434 "cannot allocate memory for input buffer\n");
435 return EOF;
436}
437
438/*
439 * pqParseDone: after a server-to-client message has successfully
440 * been parsed, advance conn->inStart to account for it.
441 */
442void
444{
445 /* trace server-to-client message */
446 if (conn->Pfdebug)
448
449 /* Mark message as done */
451}
452
453/*
454 * pqPutMsgStart: begin construction of a message to the server
455 *
456 * msg_type is the message type byte, or 0 for a message without type byte
457 * (only startup messages have no type byte)
458 *
459 * Returns 0 on success, EOF on error
460 *
461 * The idea here is that we construct the message in conn->outBuffer,
462 * beginning just past any data already in outBuffer (ie, at
463 * outBuffer+outCount). We enlarge the buffer as needed to hold the message.
464 * When the message is complete, we fill in the length word (if needed) and
465 * then advance outCount past the message, making it eligible to send.
466 *
467 * The state variable conn->outMsgStart points to the incomplete message's
468 * length word: it is either outCount or outCount+1 depending on whether
469 * there is a type byte. The state variable conn->outMsgEnd is the end of
470 * the data collected so far.
471 */
472int
474{
475 int lenPos;
476 int endPos;
477
478 /* allow room for message type byte */
479 if (msg_type)
480 endPos = conn->outCount + 1;
481 else
483
484 /* do we want a length word? */
485 lenPos = endPos;
486 /* allow room for message length */
487 endPos += 4;
488
489 /* make sure there is room for message header */
491 return EOF;
492 /* okay, save the message type byte if any */
493 if (msg_type)
495 /* set up the message pointers */
498 /* length word, if needed, will be filled in by pqPutMsgEnd */
499
500 return 0;
501}
502
503/*
504 * pqPutMsgBytes: add bytes to a partially-constructed message
505 *
506 * Returns 0 on success, EOF on error
507 */
508static int
509pqPutMsgBytes(const void *buf, size_t len, PGconn *conn)
510{
511 /* make sure there is room for it */
513 return EOF;
514 /* okay, save the data */
516 conn->outMsgEnd += len;
517 /* no Pfdebug call here, caller should do it */
518 return 0;
519}
520
521/*
522 * pqPutMsgEnd: finish constructing a message and possibly send it
523 *
524 * Returns 0 on success, EOF on error
525 *
526 * We don't actually send anything here unless we've accumulated at least
527 * 8K worth of data (the typical size of a pipe buffer on Unix systems).
528 * This avoids sending small partial packets. The caller must use pqFlush
529 * when it's important to flush all the data out to the server.
530 */
531int
533{
534 /* Fill in length word if needed */
535 if (conn->outMsgStart >= 0)
536 {
538
541 }
542
543 /* trace client-to-server message */
544 if (conn->Pfdebug)
545 {
548 else
551 }
552
553 /* Make message eligible to send */
555
556 /* If appropriate, try to push out some data */
557 if (conn->outCount >= 8192)
558 {
559 int toSend = conn->outCount;
560
561 /*
562 * On Unix-pipe connections, it seems profitable to prefer sending
563 * pipe-buffer-sized packets not randomly-sized ones, so retain the
564 * last partial-8K chunk in our buffer for now. On TCP connections,
565 * the advantage of that is far less clear. Moreover, it flat out
566 * isn't safe when using SSL or GSSAPI, because those code paths have
567 * API stipulations that if they fail to send all the data that was
568 * offered in the previous write attempt, we mustn't offer less data
569 * in this write attempt. The previous write attempt might've been
570 * pqFlush attempting to send everything in the buffer, so we mustn't
571 * offer less now. (Presently, we won't try to use SSL or GSSAPI on
572 * Unix connections, so those checks are just Asserts. They'll have
573 * to become part of the regular if-test if we ever change that.)
574 */
575 if (conn->raddr.addr.ss_family == AF_UNIX)
576 {
577#ifdef USE_SSL
579#endif
580#ifdef ENABLE_GSS
581 Assert(!conn->gssenc);
582#endif
583 toSend -= toSend % 8192;
584 }
585
586 if (pqSendSome(conn, toSend) < 0)
587 return EOF;
588 /* in nonblock mode, don't complain if unable to send it all */
589 }
590
591 return 0;
592}
593
594/* ----------
595 * pqReadData: read more data, if any is available
596 * Possible return values:
597 * 1: successfully loaded at least one more byte
598 * 0: no data is presently available, but no error detected
599 * -1: error detected (including EOF = connection closure);
600 * conn->errorMessage set
601 * NOTE: callers must not assume that pointers or indexes into conn->inBuffer
602 * remain valid across this call!
603 * ----------
604 */
605int
607{
608 int someread = 0;
609 int nread;
610
611 if (conn->sock == PGINVALID_SOCKET)
612 {
613 libpq_append_conn_error(conn, "connection not open");
614 return -1;
615 }
616
617 /* Left-justify any data in the buffer to make room */
618 if (conn->inStart < conn->inEnd)
619 {
620 if (conn->inStart > 0)
621 {
623 conn->inEnd - conn->inStart);
624 conn->inEnd -= conn->inStart;
626 conn->inStart = 0;
627 }
628 }
629 else
630 {
631 /* buffer is logically empty, reset it */
632 conn->inStart = conn->inCursor = conn->inEnd = 0;
633 }
634
635 /*
636 * If the buffer is fairly full, enlarge it. We need to be able to enlarge
637 * the buffer in case a single message exceeds the initial buffer size. We
638 * enlarge before filling the buffer entirely so as to avoid asking the
639 * kernel for a partial packet. The magic constant here should be large
640 * enough for a TCP packet or Unix pipe bufferload. 8K is the usual pipe
641 * buffer size, so...
642 */
643 if (conn->inBufSize - conn->inEnd < 8192)
644 {
645 if (pqCheckInBufferSpace(conn->inEnd + (size_t) 8192, conn))
646 {
647 /*
648 * We don't insist that the enlarge worked, but we need some room
649 */
650 if (conn->inBufSize - conn->inEnd < 100)
651 return -1; /* errorMessage already set */
652 }
653 }
654
655 /* OK, try to read some data */
656retry3:
659 if (nread < 0)
660 {
661 switch (SOCK_ERRNO)
662 {
663 case EINTR:
664 goto retry3;
665
666 /* Some systems return EAGAIN/EWOULDBLOCK for no data */
667#ifdef EAGAIN
668 case EAGAIN:
669 return someread;
670#endif
671#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
672 case EWOULDBLOCK:
673 return someread;
674#endif
675
676 /* We might get ECONNRESET etc here if connection failed */
678 goto definitelyFailed;
679
680 default:
681 /* pqsecure_read set the error message for us */
682 return -1;
683 }
684 }
685 if (nread > 0)
686 {
687 conn->inEnd += nread;
688
689 /*
690 * Hack to deal with the fact that some kernels will only give us back
691 * 1 packet per recv() call, even if we asked for more and there is
692 * more available. If it looks like we are reading a long message,
693 * loop back to recv() again immediately, until we run out of data or
694 * buffer space. Without this, the block-and-restart behavior of
695 * libpq's higher levels leads to O(N^2) performance on long messages.
696 *
697 * Since we left-justified the data above, conn->inEnd gives the
698 * amount of data already read in the current message. We consider
699 * the message "long" once we have acquired 32k ...
700 */
701 if (conn->inEnd > 32768 &&
702 (conn->inBufSize - conn->inEnd) >= 8192)
703 {
704 someread = 1;
705 goto retry3;
706 }
707 return 1;
708 }
709
710 if (someread)
711 return 1; /* got a zero read after successful tries */
712
713 /*
714 * A return value of 0 could mean just that no data is now available, or
715 * it could mean EOF --- that is, the server has closed the connection.
716 * Since we have the socket in nonblock mode, the only way to tell the
717 * difference is to see if select() is saying that the file is ready.
718 * Grumble. Fortunately, we don't expect this path to be taken much,
719 * since in normal practice we should not be trying to read data unless
720 * the file selected for reading already.
721 *
722 * In SSL mode it's even worse: SSL_read() could say WANT_READ and then
723 * data could arrive before we make the pqReadReady() test, but the second
724 * SSL_read() could still say WANT_READ because the data received was not
725 * a complete SSL record. So we must play dumb and assume there is more
726 * data, relying on the SSL layer to detect true EOF.
727 */
728
729#ifdef USE_SSL
730 if (conn->ssl_in_use)
731 return 0;
732#endif
733
734 switch (pqReadReady(conn))
735 {
736 case 0:
737 /* definitely no data available */
738 return 0;
739 case 1:
740 /* ready for read */
741 break;
742 default:
743 /* we override pqReadReady's message with something more useful */
744 goto definitelyEOF;
745 }
746
747 /*
748 * Still not sure that it's EOF, because some data could have just
749 * arrived.
750 */
751retry4:
754 if (nread < 0)
755 {
756 switch (SOCK_ERRNO)
757 {
758 case EINTR:
759 goto retry4;
760
761 /* Some systems return EAGAIN/EWOULDBLOCK for no data */
762#ifdef EAGAIN
763 case EAGAIN:
764 return 0;
765#endif
766#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
767 case EWOULDBLOCK:
768 return 0;
769#endif
770
771 /* We might get ECONNRESET etc here if connection failed */
773 goto definitelyFailed;
774
775 default:
776 /* pqsecure_read set the error message for us */
777 return -1;
778 }
779 }
780 if (nread > 0)
781 {
782 conn->inEnd += nread;
783 return 1;
784 }
785
786 /*
787 * OK, we are getting a zero read even though select() says ready. This
788 * means the connection has been closed. Cope.
789 */
791 libpq_append_conn_error(conn, "server closed the connection unexpectedly\n"
792 "\tThis probably means the server terminated abnormally\n"
793 "\tbefore or while processing the request.");
794
795 /* Come here if lower-level code already set a suitable errorMessage */
797 /* Do *not* drop any already-read data; caller still wants it */
798 pqDropConnection(conn, false);
799 conn->status = CONNECTION_BAD; /* No more connection to backend */
800 return -1;
801}
802
803/*
804 * pqSendSome: send data waiting in the output buffer.
805 *
806 * len is how much to try to send (typically equal to outCount, but may
807 * be less).
808 *
809 * Return 0 on success, -1 on failure and 1 when not all data could be sent
810 * because the socket would block and the connection is non-blocking.
811 *
812 * Note that this is also responsible for consuming data from the socket
813 * (putting it in conn->inBuffer) in any situation where we can't send
814 * all the specified data immediately.
815 *
816 * If a socket-level write failure occurs, conn->write_failed is set and the
817 * error message is saved in conn->write_err_msg, but we clear the output
818 * buffer and return zero anyway; this is because callers should soldier on
819 * until we have read what we can from the server and checked for an error
820 * message. write_err_msg should be reported only when we are unable to
821 * obtain a server error first. Much of that behavior is implemented at
822 * lower levels, but this function deals with some edge cases.
823 */
824static int
826{
827 char *ptr = conn->outBuffer;
828 int remaining = conn->outCount;
829 int result = 0;
830
831 /*
832 * If we already had a write failure, we will never again try to send data
833 * on that connection. Even if the kernel would let us, we've probably
834 * lost message boundary sync with the server. conn->write_failed
835 * therefore persists until the connection is reset, and we just discard
836 * all data presented to be written. However, as long as we still have a
837 * valid socket, we should continue to absorb data from the backend, so
838 * that we can collect any final error messages.
839 */
840 if (conn->write_failed)
841 {
842 /* conn->write_err_msg should be set up already */
843 conn->outCount = 0;
844 /* Absorb input data if any, and detect socket closure */
845 if (conn->sock != PGINVALID_SOCKET)
846 {
847 if (pqReadData(conn) < 0)
848 return -1;
849 }
850 return 0;
851 }
852
853 if (conn->sock == PGINVALID_SOCKET)
854 {
855 conn->write_failed = true;
856 /* Store error message in conn->write_err_msg, if possible */
857 /* (strdup failure is OK, we'll cope later) */
858 conn->write_err_msg = strdup(libpq_gettext("connection not open\n"));
859 /* Discard queued data; no chance it'll ever be sent */
860 conn->outCount = 0;
861 return 0;
862 }
863
864 /* while there's still data to send */
865 while (len > 0)
866 {
867 int sent;
868
869#ifndef WIN32
870 sent = pqsecure_write(conn, ptr, len);
871#else
872
873 /*
874 * Windows can fail on large sends, per KB article Q201213. The
875 * failure-point appears to be different in different versions of
876 * Windows, but 64k should always be safe.
877 */
878 sent = pqsecure_write(conn, ptr, Min(len, 65536));
879#endif
880
881 if (sent < 0)
882 {
883 /* Anything except EAGAIN/EWOULDBLOCK/EINTR is trouble */
884 switch (SOCK_ERRNO)
885 {
886#ifdef EAGAIN
887 case EAGAIN:
888 break;
889#endif
890#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
891 case EWOULDBLOCK:
892 break;
893#endif
894 case EINTR:
895 continue;
896
897 default:
898 /* Discard queued data; no chance it'll ever be sent */
899 conn->outCount = 0;
900
901 /* Absorb input data if any, and detect socket closure */
902 if (conn->sock != PGINVALID_SOCKET)
903 {
904 if (pqReadData(conn) < 0)
905 return -1;
906 }
907
908 /*
909 * Lower-level code should already have filled
910 * conn->write_err_msg (and set conn->write_failed) or
911 * conn->errorMessage. In the former case, we pretend
912 * there's no problem; the write_failed condition will be
913 * dealt with later. Otherwise, report the error now.
914 */
915 if (conn->write_failed)
916 return 0;
917 else
918 return -1;
919 }
920 }
921 else
922 {
923 ptr += sent;
924 len -= sent;
925 remaining -= sent;
926 }
927
928 if (len > 0)
929 {
930 /*
931 * We didn't send it all, wait till we can send more.
932 *
933 * There are scenarios in which we can't send data because the
934 * communications channel is full, but we cannot expect the server
935 * to clear the channel eventually because it's blocked trying to
936 * send data to us. (This can happen when we are sending a large
937 * amount of COPY data, and the server has generated lots of
938 * NOTICE responses.) To avoid a deadlock situation, we must be
939 * prepared to accept and buffer incoming data before we try
940 * again. Furthermore, it is possible that such incoming data
941 * might not arrive until after we've gone to sleep. Therefore,
942 * we wait for either read ready or write ready.
943 *
944 * In non-blocking mode, we don't wait here directly, but return 1
945 * to indicate that data is still pending. The caller should wait
946 * for both read and write ready conditions, and call
947 * PQconsumeInput() on read ready, but just in case it doesn't, we
948 * call pqReadData() ourselves before returning. That's not
949 * enough if the data has not arrived yet, but it's the best we
950 * can do, and works pretty well in practice. (The documentation
951 * used to say that you only need to wait for write-ready, so
952 * there are still plenty of applications like that out there.)
953 *
954 * Note that errors here don't result in write_failed becoming
955 * set.
956 */
957 if (pqReadData(conn) < 0)
958 {
959 result = -1; /* error message already set up */
960 break;
961 }
962
964 {
965 result = 1;
966 break;
967 }
968
969 if (pqWait(true, true, conn))
970 {
971 result = -1;
972 break;
973 }
974 }
975 }
976
977 /* shift the remaining contents of the buffer */
978 if (remaining > 0)
981
982 return result;
983}
984
985
986/*
987 * pqFlush: send any data waiting in the output buffer
988 *
989 * Return 0 on success, -1 on failure and 1 when not all data could be sent
990 * because the socket would block and the connection is non-blocking.
991 * (See pqSendSome comments about how failure should be handled.)
992 */
993int
995{
996 if (conn->outCount > 0)
997 {
998 if (conn->Pfdebug)
1000
1001 return pqSendSome(conn, conn->outCount);
1002 }
1003
1004 return 0;
1005}
1006
1007
1008/*
1009 * pqWait: wait until we can read or write the connection socket
1010 *
1011 * JAB: If SSL enabled and used and forRead, buffered bytes short-circuit the
1012 * call to select().
1013 *
1014 * We also stop waiting and return if the kernel flags an exception condition
1015 * on the socket. The actual error condition will be detected and reported
1016 * when the caller tries to read or write the socket.
1017 */
1018int
1020{
1021 return pqWaitTimed(forRead, forWrite, conn, -1);
1022}
1023
1024/*
1025 * pqWaitTimed: wait, but not past end_time.
1026 *
1027 * Returns -1 on failure, 0 if the socket is readable/writable, 1 if it timed out.
1028 *
1029 * The timeout is specified by end_time, which is the int64 number of
1030 * microseconds since the Unix epoch (that is, time_t times 1 million).
1031 * Timeout is infinite if end_time is -1. Timeout is immediate (no blocking)
1032 * if end_time is 0 (or indeed, any time before now).
1033 */
1034int
1036{
1037 int result;
1038
1040
1041 if (result < 0)
1042 return -1; /* errorMessage is already set */
1043
1044 if (result == 0)
1045 {
1046 libpq_append_conn_error(conn, "timeout expired");
1047 return 1;
1048 }
1049
1050 return 0;
1051}
1052
1053/*
1054 * pqReadReady: is select() saying the file is ready to read?
1055 * Returns -1 on failure, 0 if not ready, 1 if ready.
1056 */
1057int
1059{
1060 return pqSocketCheck(conn, 1, 0, 0);
1061}
1062
1063/*
1064 * pqWriteReady: is select() saying the file is ready to write?
1065 * Returns -1 on failure, 0 if not ready, 1 if ready.
1066 */
1067int
1069{
1070 return pqSocketCheck(conn, 0, 1, 0);
1071}
1072
1073/*
1074 * Checks a socket, using poll or select, for data to be read, written,
1075 * or both. Returns >0 if one or more conditions are met, 0 if it timed
1076 * out, -1 if an error occurred.
1077 *
1078 * If an altsock is set for asynchronous authentication, that will be used in
1079 * preference to the "server" socket. Otherwise, if SSL is in use, the SSL
1080 * buffer is checked prior to checking the socket for read data directly.
1081 */
1082static int
1084{
1085 int result;
1086 pgsocket sock;
1087
1088 if (!conn)
1089 return -1;
1090
1092 sock = conn->altsock;
1093 else
1094 {
1095 sock = conn->sock;
1096 if (sock == PGINVALID_SOCKET)
1097 {
1098 libpq_append_conn_error(conn, "invalid socket");
1099 return -1;
1100 }
1101
1102#ifdef USE_SSL
1103 /* Check for SSL library buffering read bytes */
1105 {
1106 /* short-circuit the select */
1107 return 1;
1108 }
1109#endif
1110 }
1111
1112 /* We will retry as long as we get EINTR */
1113 do
1114 result = PQsocketPoll(sock, forRead, forWrite, end_time);
1115 while (result < 0 && SOCK_ERRNO == EINTR);
1116
1117 if (result < 0)
1118 {
1120
1121 libpq_append_conn_error(conn, "%s() failed: %s", "select",
1122 SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf)));
1123 }
1124
1125 return result;
1126}
1127
1128
1129/*
1130 * Check a file descriptor for read and/or write data, possibly waiting.
1131 * If neither forRead nor forWrite are set, immediately return a timeout
1132 * condition (without waiting). Return >0 if condition is met, 0
1133 * if a timeout occurred, -1 if an error or interrupt occurred.
1134 *
1135 * The timeout is specified by end_time, which is the int64 number of
1136 * microseconds since the Unix epoch (that is, time_t times 1 million).
1137 * Timeout is infinite if end_time is -1. Timeout is immediate (no blocking)
1138 * if end_time is 0 (or indeed, any time before now).
1139 */
1140int
1142{
1143 /* We use poll(2) if available, otherwise select(2) */
1144#ifdef HAVE_POLL
1145 struct pollfd input_fd;
1146 int timeout_ms;
1147
1148 if (!forRead && !forWrite)
1149 return 0;
1150
1151 input_fd.fd = sock;
1152 input_fd.events = POLLERR;
1153 input_fd.revents = 0;
1154
1155 if (forRead)
1156 input_fd.events |= POLLIN;
1157 if (forWrite)
1158 input_fd.events |= POLLOUT;
1159
1160 /* Compute appropriate timeout interval */
1161 if (end_time == -1)
1162 timeout_ms = -1;
1163 else if (end_time == 0)
1164 timeout_ms = 0;
1165 else
1166 {
1168
1169 if (end_time > now)
1170 timeout_ms = (end_time - now) / 1000;
1171 else
1172 timeout_ms = 0;
1173 }
1174
1175 return poll(&input_fd, 1, timeout_ms);
1176#else /* !HAVE_POLL */
1177
1181 struct timeval timeout;
1182 struct timeval *ptr_timeout;
1183
1184 if (!forRead && !forWrite)
1185 return 0;
1186
1190 if (forRead)
1191 FD_SET(sock, &input_mask);
1192
1193 if (forWrite)
1194 FD_SET(sock, &output_mask);
1195 FD_SET(sock, &except_mask);
1196
1197 /* Compute appropriate timeout interval */
1198 if (end_time == -1)
1199 ptr_timeout = NULL;
1200 else if (end_time == 0)
1201 {
1202 timeout.tv_sec = 0;
1203 timeout.tv_usec = 0;
1205 }
1206 else
1207 {
1209
1210 if (end_time > now)
1211 {
1212 timeout.tv_sec = (end_time - now) / 1000000;
1213 timeout.tv_usec = (end_time - now) % 1000000;
1214 }
1215 else
1216 {
1217 timeout.tv_sec = 0;
1218 timeout.tv_usec = 0;
1219 }
1221 }
1222
1223 return select(sock + 1, &input_mask, &output_mask,
1225#endif /* HAVE_POLL */
1226}
1227
1228/*
1229 * PQgetCurrentTimeUSec: get current time with microsecond precision
1230 *
1231 * This provides a platform-independent way of producing a reference
1232 * value for PQsocketPoll's timeout parameter.
1233 */
1236{
1237 struct timeval tval;
1238
1240 return (pg_usec_time_t) tval.tv_sec * 1000000 + tval.tv_usec;
1241}
1242
1243
1244/*
1245 * A couple of "miscellaneous" multibyte related functions. They used
1246 * to be in fe-print.c but that file is doomed.
1247 */
1248
1249/*
1250 * Like pg_encoding_mblen(). Use this in callers that want the
1251 * dynamically-linked libpq's stance on encodings, even if that means
1252 * different behavior in different startups of the executable.
1253 */
1254int
1255PQmblen(const char *s, int encoding)
1256{
1257 return pg_encoding_mblen(encoding, s);
1258}
1259
1260/*
1261 * Like pg_encoding_mblen_bounded(). Use this in callers that want the
1262 * dynamically-linked libpq's stance on encodings, even if that means
1263 * different behavior in different startups of the executable.
1264 */
1265int
1266PQmblenBounded(const char *s, int encoding)
1267{
1268 return strnlen(s, pg_encoding_mblen(encoding, s));
1269}
1270
1271/*
1272 * Returns the display length of the character beginning at s, using the
1273 * specified encoding.
1274 */
1275int
1276PQdsplen(const char *s, int encoding)
1277{
1278 return pg_encoding_dsplen(encoding, s);
1279}
1280
1281/*
1282 * Get encoding id from environment variable PGCLIENTENCODING.
1283 */
1284int
1286{
1287 char *str;
1288 int encoding = PG_SQL_ASCII;
1289
1290 str = getenv("PGCLIENTENCODING");
1291 if (str && *str != '\0')
1292 {
1294 if (encoding < 0)
1296 }
1297 return encoding;
1298}
1299
1300
1301#ifdef ENABLE_NLS
1302
1303static void
1304libpq_binddomain(void)
1305{
1306 /*
1307 * At least on Windows, there are gettext implementations that fail if
1308 * multiple threads call bindtextdomain() concurrently. Use a mutex and
1309 * flag variable to ensure that we call it just once per process. It is
1310 * not known that similar bugs exist on non-Windows platforms, but we
1311 * might as well do it the same way everywhere.
1312 */
1313 static volatile bool already_bound = false;
1315
1316 if (!already_bound)
1317 {
1318 /* bindtextdomain() does not preserve errno */
1319#ifdef WIN32
1320 int save_errno = GetLastError();
1321#else
1322 int save_errno = errno;
1323#endif
1324
1326
1327 if (!already_bound)
1328 {
1329 const char *ldir;
1330
1331 /*
1332 * No relocatable lookup here because the calling executable could
1333 * be anywhere
1334 */
1335 ldir = getenv("PGLOCALEDIR");
1336 if (!ldir)
1337 ldir = LOCALEDIR;
1339 already_bound = true;
1340 }
1341
1343
1344#ifdef WIN32
1346#else
1347 errno = save_errno;
1348#endif
1349 }
1350}
1351
1352char *
1353libpq_gettext(const char *msgid)
1354{
1356 return dgettext(PG_TEXTDOMAIN("libpq"), msgid);
1357}
1358
1359char *
1360libpq_ngettext(const char *msgid, const char *msgid_plural, unsigned long n)
1361{
1363 return dngettext(PG_TEXTDOMAIN("libpq"), msgid, msgid_plural, n);
1364}
1365
1366#endif /* ENABLE_NLS */
1367
1368
1369/*
1370 * Append a formatted string to the given buffer, after translating it. A
1371 * newline is automatically appended; the format should not end with a
1372 * newline.
1373 */
1374void
1375libpq_append_error(PQExpBuffer errorMessage, const char *fmt,...)
1376{
1377 int save_errno = errno;
1378 bool done;
1379 va_list args;
1380
1381 Assert(fmt[strlen(fmt) - 1] != '\n');
1382
1383 if (PQExpBufferBroken(errorMessage))
1384 return; /* already failed */
1385
1386 /* Loop in case we have to retry after enlarging the buffer. */
1387 do
1388 {
1389 errno = save_errno;
1390 va_start(args, fmt);
1391 done = appendPQExpBufferVA(errorMessage, libpq_gettext(fmt), args);
1392 va_end(args);
1393 } while (!done);
1394
1395 appendPQExpBufferChar(errorMessage, '\n');
1396}
1397
1398/*
1399 * Append a formatted string to the error message buffer of the given
1400 * connection, after translating it. A newline is automatically appended; the
1401 * format should not end with a newline.
1402 */
1403void
1405{
1406 int save_errno = errno;
1407 bool done;
1408 va_list args;
1409
1410 Assert(fmt[strlen(fmt) - 1] != '\n');
1411
1413 return; /* already failed */
1414
1415 /* Loop in case we have to retry after enlarging the buffer. */
1416 do
1417 {
1418 errno = save_errno;
1419 va_start(args, fmt);
1421 va_end(args);
1422 } while (!done);
1423
1425}
1426
1427/*
1428 * For 19beta only, some protocol errors will have additional information
1429 * appended to help with the "grease" campaign.
1430 */
1431void
1433{
1434 /* translator: %s is a URL */
1436 "\tThis indicates a bug in either the server being contacted\n"
1437 "\tor a proxy handling the connection. Please consider\n"
1438 "\treporting this to the maintainers of that software.\n"
1439 "\tFor more information, including instructions on how to\n"
1440 "\twork around this issue for now, visit\n"
1441 "\t\t%s",
1442 "https://www.postgresql.org/docs/devel/libpq-connect.html#LIBPQ-CONNECT-MAX-PROTOCOL-VERSION");
1443}
Datum now(PG_FUNCTION_ARGS)
Definition timestamp.c:1609
#define Min(x, y)
Definition c.h:1019
#define Assert(condition)
Definition c.h:885
#define PG_TEXTDOMAIN(domain)
Definition c.h:1231
#define dngettext(d, s, p, n)
Definition c.h:1199
uint16_t uint16
Definition c.h:557
uint32_t uint32
Definition c.h:558
#define dgettext(d, x)
Definition c.h:1197
void pqDropConnection(PGconn *conn, bool flushInput)
Definition fe-connect.c:533
void pqInternalNotice(const PGNoticeHooks *hooks, const char *fmt,...)
Definition fe-exec.c:944
int pqPutc(char c, PGconn *conn)
Definition fe-misc.c:92
int pqReadData(PGconn *conn)
Definition fe-misc.c:606
int pqPutInt(int value, size_t bytes, PGconn *conn)
Definition fe-misc.c:253
int pqCheckOutBufferSpace(size_t bytes_needed, PGconn *conn)
Definition fe-misc.c:287
int pqFlush(PGconn *conn)
Definition fe-misc.c:994
void pqParseDone(PGconn *conn, int newInStart)
Definition fe-misc.c:443
int pqReadReady(PGconn *conn)
Definition fe-misc.c:1058
static int pqSocketCheck(PGconn *conn, int forRead, int forWrite, pg_usec_time_t end_time)
Definition fe-misc.c:1083
int PQenv2encoding(void)
Definition fe-misc.c:1285
int pqPutMsgStart(char msg_type, PGconn *conn)
Definition fe-misc.c:473
int pqSkipnchar(size_t len, PGconn *conn)
Definition fe-misc.c:187
int PQsocketPoll(int sock, int forRead, int forWrite, pg_usec_time_t end_time)
Definition fe-misc.c:1141
int pqGetc(char *result, PGconn *conn)
Definition fe-misc.c:77
int PQlibVersion(void)
Definition fe-misc.c:63
int pqGetInt(int *result, size_t bytes, PGconn *conn)
Definition fe-misc.c:216
int PQmblen(const char *s, int encoding)
Definition fe-misc.c:1255
int pqWait(int forRead, int forWrite, PGconn *conn)
Definition fe-misc.c:1019
void libpq_append_grease_info(PGconn *conn)
Definition fe-misc.c:1432
int pqGets(PQExpBuffer buf, PGconn *conn)
Definition fe-misc.c:136
int pqPutnchar(const void *s, size_t len, PGconn *conn)
Definition fe-misc.c:202
int PQdsplen(const char *s, int encoding)
Definition fe-misc.c:1276
int pqCheckInBufferSpace(size_t bytes_needed, PGconn *conn)
Definition fe-misc.c:351
static int pqPutMsgBytes(const void *buf, size_t len, PGconn *conn)
Definition fe-misc.c:509
static int pqSendSome(PGconn *conn, int len)
Definition fe-misc.c:825
pg_usec_time_t PQgetCurrentTimeUSec(void)
Definition fe-misc.c:1235
static int pqGets_internal(PQExpBuffer buf, PGconn *conn, bool resetbuffer)
Definition fe-misc.c:109
int pqPuts(const char *s, PGconn *conn)
Definition fe-misc.c:152
void libpq_append_error(PQExpBuffer errorMessage, const char *fmt,...)
Definition fe-misc.c:1375
int pqGetnchar(void *s, size_t len, PGconn *conn)
Definition fe-misc.c:165
int PQmblenBounded(const char *s, int encoding)
Definition fe-misc.c:1266
void libpq_append_conn_error(PGconn *conn, const char *fmt,...)
Definition fe-misc.c:1404
int pqWaitTimed(int forRead, int forWrite, PGconn *conn, pg_usec_time_t end_time)
Definition fe-misc.c:1035
int pqGets_append(PQExpBuffer buf, PGconn *conn)
Definition fe-misc.c:142
int pqWriteReady(PGconn *conn)
Definition fe-misc.c:1068
int pqPutMsgEnd(PGconn *conn)
Definition fe-misc.c:532
bool pgtls_read_pending(PGconn *conn)
ssize_t pqsecure_write(PGconn *conn, const void *ptr, size_t len)
Definition fe-secure.c:267
ssize_t pqsecure_read(PGconn *conn, void *ptr, size_t len)
Definition fe-secure.c:167
void pqTraceOutputMessage(PGconn *conn, const char *message, bool toServer)
Definition fe-trace.c:624
void pqTraceOutputNoTypeByteMessage(PGconn *conn, const char *message)
Definition fe-trace.c:841
const char * str
int remaining
Definition informix.c:692
static struct @174 value
static char * encoding
Definition initdb.c:139
@ CONNECTION_BAD
Definition libpq-fe.h:85
int64_t pg_usec_time_t
Definition libpq-fe.h:238
#define SOCK_STRERROR
Definition libpq-int.h:973
#define libpq_ngettext(s, p, n)
Definition libpq-int.h:951
#define pqIsnonblocking(conn)
Definition libpq-int.h:939
#define SOCK_ERRNO
#define libpq_gettext(x)
Definition oauth-utils.h:86
#define pg_ntoh32(x)
Definition pg_bswap.h:125
#define pg_hton32(x)
Definition pg_bswap.h:121
#define pg_hton16(x)
Definition pg_bswap.h:120
#define pg_ntoh16(x)
Definition pg_bswap.h:124
const void size_t len
static char buf[DEFAULT_XLOG_SEG_SIZE]
@ PG_SQL_ASCII
Definition pg_wchar.h:226
#define pg_char_to_encoding
Definition pg_wchar.h:629
static int64 end_time
Definition pgbench.c:176
#define PG_STRERROR_R_BUFLEN
Definition port.h:278
#define ALL_CONNECTION_FAILURE_ERRNOS
Definition port.h:122
int pgsocket
Definition port.h:29
#define PGINVALID_SOCKET
Definition port.h:31
void resetPQExpBuffer(PQExpBuffer str)
void appendBinaryPQExpBuffer(PQExpBuffer str, const char *data, size_t datalen)
bool appendPQExpBufferVA(PQExpBuffer str, const char *fmt, va_list args)
void appendPQExpBufferChar(PQExpBuffer str, char ch)
void appendPQExpBufferStr(PQExpBuffer str, const char *data)
#define PQExpBufferBroken(str)
Definition pqexpbuffer.h:59
char * c
static int fb(int x)
int pthread_mutex_unlock(pthread_mutex_t *mp)
int pthread_mutex_lock(pthread_mutex_t *mp)
#define PTHREAD_MUTEX_INITIALIZER
#define realloc(a, b)
PGconn * conn
Definition streamutil.c:52
struct sockaddr_storage addr
Definition pqcomm.h:32
char * write_err_msg
Definition libpq-int.h:513
pgsocket sock
Definition libpq-int.h:499
char * inBuffer
Definition libpq-int.h:576
bool write_failed
Definition libpq-int.h:512
int inCursor
Definition libpq-int.h:579
int inEnd
Definition libpq-int.h:580
int inBufSize
Definition libpq-int.h:577
int inStart
Definition libpq-int.h:578
PQExpBufferData errorMessage
Definition libpq-int.h:683
pgsocket altsock
Definition libpq-int.h:530
int outBufSize
Definition libpq-int.h:584
PGNoticeHooks noticeHooks
Definition libpq-int.h:454
FILE * Pfdebug
Definition libpq-int.h:450
int outMsgStart
Definition libpq-int.h:588
SockAddr raddr
Definition libpq-int.h:502
int outCount
Definition libpq-int.h:585
int outMsgEnd
Definition libpq-int.h:590
bool ssl_in_use
Definition libpq-int.h:620
char * outBuffer
Definition libpq-int.h:583
ConnStatusType status
Definition libpq-int.h:462
int pg_encoding_dsplen(int encoding, const char *mbstr)
Definition wchar.c:2198
int pg_encoding_mblen(int encoding, const char *mbstr)
Definition wchar.c:2157
#define EINTR
Definition win32_port.h:361
#define EWOULDBLOCK
Definition win32_port.h:367
#define EAGAIN
Definition win32_port.h:359
#define select(n, r, w, e, timeout)
Definition win32_port.h:500
int gettimeofday(struct timeval *tp, void *tzp)