backend libpq void * argument for binary data
authorPeter Eisentraut <peter@eisentraut.org>
Sun, 23 Feb 2025 13:26:39 +0000 (14:26 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Sun, 23 Feb 2025 13:27:02 +0000 (14:27 +0100)
Change some backend libpq functions to take void * for binary data
instead of char *.  This removes the need for numerous casts.

Reviewed-by: Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Discussion: https://www.postgresql.org/message-id/flat/fd1fcedb-3492-4fc8-9e3e-74b97f2db6c7%40eisentraut.org

src/backend/libpq/pqcomm.c
src/backend/libpq/pqformat.c
src/backend/tcop/backend_startup.c
src/backend/utils/adt/varbit.c
src/include/libpq/libpq.h
src/include/libpq/pqformat.h

index 61ea3722ae237414d72cf93d4da67b296c13d122..e5171467de18da0f68a035887f20dabd327bd60b 100644 (file)
@@ -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))
index 295297cb559a9e60995115767f777492140c7136..1cc126772f7c013437764eaab442b0e9039f5eda 100644 (file)
@@ -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,
index 9ee738eb1e0500b209bba48ee5a8d3829bbdf614..c70746fa562e437c58083d60b19e2914c365bf75 100644 (file)
@@ -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;
index 0071e026f01d1cc549c9f856aa1305ba45df9597..205a67dafc56bf04ae3b1031d78f9b49847c1de7 100644 (file)
@@ -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);
index 8defcb6de19f9dd25d57ed51a45f44c944c1def4..aeb66ca40cf38da9f78feb66a80521323e90753b 100644 (file)
@@ -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);
index 6b1a31f854197da82896f2a6d64f5fc5f199a432..9a1534be521c66005d66306549331a38021d1368 100644 (file)
@@ -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);