From c0bf0e81067d0958e9aa8f11302d52185f009ec7 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Tue, 24 Sep 2024 12:11:49 +0200 Subject: [PATCH 06/10] backend libpq void * argument for binary data Change some backend libpq functions to take void * for binary data instead of char *. This removes the need for numerous casts. getbytes/putbytes void * argument --- src/backend/libpq/pqcomm.c | 13 ++++++++----- src/backend/libpq/pqformat.c | 10 +++++----- src/backend/tcop/backend_startup.c | 2 +- src/backend/utils/adt/varbit.c | 4 ++-- src/include/libpq/libpq.h | 2 +- src/include/libpq/pqformat.h | 2 +- 6 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index 937a2b02a4f..af018b21f9d 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -144,7 +144,7 @@ static int socket_flush_if_writable(void); static bool socket_is_send_pending(void); static int socket_putmessage(char msgtype, const char *s, size_t len); static void socket_putmessage_noblock(char msgtype, const char *s, size_t len); -static inline int internal_putbytes(const char *s, size_t len); +static inline int internal_putbytes(const void *b, size_t len); static inline int internal_flush(void); static pg_noinline int internal_flush_buffer(const char *buf, size_t *start, size_t *end); @@ -1060,8 +1060,9 @@ pq_getbyte_if_available(unsigned char *c) * -------------------------------- */ int -pq_getbytes(char *s, size_t len) +pq_getbytes(void *b, size_t len) { + char *s = b; size_t amount; Assert(PqCommReadingMsg); @@ -1209,7 +1210,7 @@ pq_getmessage(StringInfo s, int maxlen) resetStringInfo(s); /* Read message length word */ - if (pq_getbytes((char *) &len, 4) == EOF) + if (pq_getbytes(&len, 4) == EOF) { ereport(COMMERROR, (errcode(ERRCODE_PROTOCOL_VIOLATION), @@ -1274,8 +1275,10 @@ pq_getmessage(StringInfo s, int maxlen) static inline int -internal_putbytes(const char *s, size_t len) +internal_putbytes(const void *b, size_t len) { + const char *s = b; + while (len > 0) { /* If buffer is full, then flush it out */ @@ -1499,7 +1502,7 @@ socket_putmessage(char msgtype, const char *s, size_t len) goto fail; n32 = pg_hton32((uint32) (len + 4)); - if (internal_putbytes((char *) &n32, 4)) + if (internal_putbytes(&n32, 4)) goto fail; if (internal_putbytes(s, len)) diff --git a/src/backend/libpq/pqformat.c b/src/backend/libpq/pqformat.c index 295297cb559..1cc126772f7 100644 --- a/src/backend/libpq/pqformat.c +++ b/src/backend/libpq/pqformat.c @@ -422,15 +422,15 @@ pq_getmsgint(StringInfo msg, int b) switch (b) { case 1: - pq_copymsgbytes(msg, (char *) &n8, 1); + pq_copymsgbytes(msg, &n8, 1); result = n8; break; case 2: - pq_copymsgbytes(msg, (char *) &n16, 2); + pq_copymsgbytes(msg, &n16, 2); result = pg_ntoh16(n16); break; case 4: - pq_copymsgbytes(msg, (char *) &n32, 4); + pq_copymsgbytes(msg, &n32, 4); result = pg_ntoh32(n32); break; default: @@ -454,7 +454,7 @@ pq_getmsgint64(StringInfo msg) { uint64 n64; - pq_copymsgbytes(msg, (char *) &n64, sizeof(n64)); + pq_copymsgbytes(msg, &n64, sizeof(n64)); return pg_ntoh64(n64); } @@ -525,7 +525,7 @@ pq_getmsgbytes(StringInfo msg, int datalen) * -------------------------------- */ void -pq_copymsgbytes(StringInfo msg, char *buf, int datalen) +pq_copymsgbytes(StringInfo msg, void *buf, int datalen) { if (datalen < 0 || datalen > (msg->len - msg->cursor)) ereport(ERROR, diff --git a/src/backend/tcop/backend_startup.c b/src/backend/tcop/backend_startup.c index 9ee738eb1e0..c70746fa562 100644 --- a/src/backend/tcop/backend_startup.c +++ b/src/backend/tcop/backend_startup.c @@ -480,7 +480,7 @@ ProcessStartupPacket(Port *port, bool ssl_done, bool gss_done) * sound inefficient, but it's not really, because of buffering in * pqcomm.c.) */ - if (pq_getbytes((char *) &len, 1) == EOF) + if (pq_getbytes(&len, 1) == EOF) { /* * If we get no data at all, don't clutter the log with a complaint; diff --git a/src/backend/utils/adt/varbit.c b/src/backend/utils/adt/varbit.c index 0071e026f01..205a67dafc5 100644 --- a/src/backend/utils/adt/varbit.c +++ b/src/backend/utils/adt/varbit.c @@ -361,7 +361,7 @@ bit_recv(PG_FUNCTION_ARGS) SET_VARSIZE(result, len); VARBITLEN(result) = bitlen; - pq_copymsgbytes(buf, (char *) VARBITS(result), VARBITBYTES(result)); + pq_copymsgbytes(buf, VARBITS(result), VARBITBYTES(result)); /* Make sure last byte is correctly zero-padded */ VARBIT_PAD(result); @@ -666,7 +666,7 @@ varbit_recv(PG_FUNCTION_ARGS) SET_VARSIZE(result, len); VARBITLEN(result) = bitlen; - pq_copymsgbytes(buf, (char *) VARBITS(result), VARBITBYTES(result)); + pq_copymsgbytes(buf, VARBITS(result), VARBITBYTES(result)); /* Make sure last byte is correctly zero-padded */ VARBIT_PAD(result); diff --git a/src/include/libpq/libpq.h b/src/include/libpq/libpq.h index 13d8143a893..6c92949cb0a 100644 --- a/src/include/libpq/libpq.h +++ b/src/include/libpq/libpq.h @@ -71,7 +71,7 @@ extern int AcceptConnection(pgsocket server_fd, ClientSocket *client_sock); extern void TouchSocketFiles(void); extern void RemoveSocketFiles(void); extern Port *pq_init(ClientSocket *client_sock); -extern int pq_getbytes(char *s, size_t len); +extern int pq_getbytes(void *b, size_t len); extern void pq_startmsgread(void); extern void pq_endmsgread(void); extern bool pq_is_reading_msg(void); diff --git a/src/include/libpq/pqformat.h b/src/include/libpq/pqformat.h index 6b1a31f8541..9a1534be521 100644 --- a/src/include/libpq/pqformat.h +++ b/src/include/libpq/pqformat.h @@ -200,7 +200,7 @@ extern int64 pq_getmsgint64(StringInfo msg); extern float4 pq_getmsgfloat4(StringInfo msg); extern float8 pq_getmsgfloat8(StringInfo msg); extern const char *pq_getmsgbytes(StringInfo msg, int datalen); -extern void pq_copymsgbytes(StringInfo msg, char *buf, int datalen); +extern void pq_copymsgbytes(StringInfo msg, void *buf, int datalen); extern char *pq_getmsgtext(StringInfo msg, int rawbytes, int *nbytes); extern const char *pq_getmsgstring(StringInfo msg); extern const char *pq_getmsgrawstring(StringInfo msg); -- 2.48.1