buf = palloc(mysink->base.bbs_buffer_length + MAXIMUM_ALIGNOF);
    mysink->msgbuffer = buf + (MAXIMUM_ALIGNOF - 1);
    mysink->base.bbs_buffer = buf + MAXIMUM_ALIGNOF;
-   mysink->msgbuffer[0] = 'd'; /* archive or manifest data */
+   mysink->msgbuffer[0] = PqMsg_CopyData;  /* archive or manifest data */
 
    /* Tell client the backup start location. */
    SendXlogRecPtrResult(state->startptr, state->starttli);
 
    ti = list_nth(state->tablespaces, state->tablespace_num);
    pq_beginmessage(&buf, PqMsg_CopyData);
-   pq_sendbyte(&buf, 'n');     /* New archive */
+   pq_sendbyte(&buf, PqBackupMsg_NewArchive);
    pq_sendstring(&buf, archive_name);
    pq_sendstring(&buf, ti->path == NULL ? "" : ti->path);
    pq_endmessage(&buf);
    if (mysink->send_to_client)
    {
        /* Add one because we're also sending a leading type byte. */
-       pq_putmessage('d', mysink->msgbuffer, len + 1);
+       pq_putmessage(PqMsg_CopyData, mysink->msgbuffer, len + 1);
    }
 
    /* Consider whether to send a progress report to the client. */
            mysink->last_progress_report_time = now;
 
            pq_beginmessage(&buf, PqMsg_CopyData);
-           pq_sendbyte(&buf, 'p'); /* Progress report */
+           pq_sendbyte(&buf, PqBackupMsg_ProgressReport);
            pq_sendint64(&buf, state->bytes_done);
            pq_endmessage(&buf);
            pq_flush_if_writable();
    mysink->bytes_done_at_last_time_check = state->bytes_done;
    mysink->last_progress_report_time = GetCurrentTimestamp();
    pq_beginmessage(&buf, PqMsg_CopyData);
-   pq_sendbyte(&buf, 'p');     /* Progress report */
+   pq_sendbyte(&buf, PqBackupMsg_ProgressReport);
    pq_sendint64(&buf, state->bytes_done);
    pq_endmessage(&buf);
    pq_flush_if_writable();
    StringInfoData buf;
 
    pq_beginmessage(&buf, PqMsg_CopyData);
-   pq_sendbyte(&buf, 'm');     /* Manifest */
+   pq_sendbyte(&buf, PqBackupMsg_Manifest);
    pq_endmessage(&buf);
 }
 
    if (mysink->send_to_client)
    {
        /* Add one because we're also sending a leading type byte. */
-       pq_putmessage('d', mysink->msgbuffer, len + 1);
+       pq_putmessage(PqMsg_CopyData, mysink->msgbuffer, len + 1);
    }
 }
 
 
 
            /*
             * The first byte of messages sent from leader apply worker to
-            * parallel apply workers can only be 'w'.
+            * parallel apply workers can only be PqReplMsg_WALData.
             */
            c = pq_getmsgbyte(&s);
-           if (c != 'w')
+           if (c != PqReplMsg_WALData)
                elog(ERROR, "unexpected message \"%c\"", c);
 
            /*
 
 
                    c = pq_getmsgbyte(&s);
 
-                   if (c == 'w')
+                   if (c == PqReplMsg_WALData)
                    {
                        XLogRecPtr  start_lsn;
                        XLogRecPtr  end_lsn;
 
                        maybe_advance_nonremovable_xid(&rdt_data, false);
                    }
-                   else if (c == 'k')
+                   else if (c == PqReplMsg_Keepalive)
                    {
                        XLogRecPtr  end_lsn;
                        TimestampTz timestamp;
 
                        UpdateWorkerStats(last_received, timestamp, true);
                    }
-                   else if (c == 's')  /* Primary status update */
+                   else if (c == PqReplMsg_PrimaryStatusUpdate)
                    {
                        rdt_data.remote_lsn = pq_getmsgint64(&s);
                        rdt_data.remote_oldestxid = FullTransactionIdFromU64((uint64) pq_getmsgint64(&s));
    else
        resetStringInfo(reply_message);
 
-   pq_sendbyte(reply_message, 'r');
+   pq_sendbyte(reply_message, PqReplMsg_StandbyStatusUpdate);
    pq_sendint64(reply_message, recvpos);   /* write */
    pq_sendint64(reply_message, flushpos);  /* flush */
    pq_sendint64(reply_message, writepos);  /* apply */
     * Send the current time to update the remote walsender's latest reply
     * message received time.
     */
-   pq_sendbyte(request_message, 'p');
+   pq_sendbyte(request_message, PqReplMsg_PrimaryStatusRequest);
    pq_sendint64(request_message, GetCurrentTimestamp());
 
    elog(DEBUG2, "sending publisher status request message");
 
 
    switch (type)
    {
-       case 'w':               /* WAL records */
+       case PqReplMsg_WALData:
            {
                StringInfoData incoming_message;
 
                XLogWalRcvWrite(buf, len, dataStart, tli);
                break;
            }
-       case 'k':               /* Keepalive */
+       case PqReplMsg_Keepalive:
            {
                StringInfoData incoming_message;
 
    applyPtr = GetXLogReplayRecPtr(NULL);
 
    resetStringInfo(&reply_message);
-   pq_sendbyte(&reply_message, 'r');
+   pq_sendbyte(&reply_message, PqReplMsg_StandbyStatusUpdate);
    pq_sendint64(&reply_message, writePtr);
    pq_sendint64(&reply_message, flushPtr);
    pq_sendint64(&reply_message, applyPtr);
 
    /* Construct the message and send it. */
    resetStringInfo(&reply_message);
-   pq_sendbyte(&reply_message, 'h');
+   pq_sendbyte(&reply_message, PqReplMsg_HotStandbyFeedback);
    pq_sendint64(&reply_message, GetCurrentTimestamp());
    pq_sendint32(&reply_message, xmin);
    pq_sendint32(&reply_message, xmin_epoch);
 
 
    resetStringInfo(ctx->out);
 
-   pq_sendbyte(ctx->out, 'w');
+   pq_sendbyte(ctx->out, PqReplMsg_WALData);
    pq_sendint64(ctx->out, lsn);    /* dataStart */
    pq_sendint64(ctx->out, lsn);    /* walEnd */
 
        switch (firstchar)
        {
                /*
-                * 'd' means a standby reply wrapped in a CopyData packet.
+                * PqMsg_CopyData means a standby reply wrapped in a CopyData
+                * packet.
                 */
            case PqMsg_CopyData:
                ProcessStandbyMessage();
                break;
 
                /*
-                * CopyDone means the standby requested to finish streaming.
-                * Reply with CopyDone, if we had not sent that already.
+                * PqMsg_CopyDone means the standby requested to finish
+                * streaming.  Reply with CopyDone, if we had not sent that
+                * already.
                 */
            case PqMsg_CopyDone:
                if (!streamingDoneSending)
                break;
 
                /*
-                * 'X' means that the standby is closing down the socket.
+                * PqMsg_Terminate means that the standby is closing down the
+                * socket.
                 */
            case PqMsg_Terminate:
                proc_exit(0);
 
    switch (msgtype)
    {
-       case 'r':
+       case PqReplMsg_StandbyStatusUpdate:
            ProcessStandbyReplyMessage();
            break;
 
-       case 'h':
+       case PqReplMsg_HotStandbyFeedback:
            ProcessStandbyHSFeedbackMessage();
            break;
 
-       case 'p':
+       case PqReplMsg_PrimaryStatusRequest:
            ProcessStandbyPSRequestMessage();
            break;
 
 
    /* construct the message... */
    resetStringInfo(&output_message);
-   pq_sendbyte(&output_message, 's');
+   pq_sendbyte(&output_message, PqReplMsg_PrimaryStatusUpdate);
    pq_sendint64(&output_message, lsn);
    pq_sendint64(&output_message, (int64) U64FromFullTransactionId(fullOldestXidInCommit));
    pq_sendint64(&output_message, (int64) U64FromFullTransactionId(nextFullXid));
     * OK to read and send the slice.
     */
    resetStringInfo(&output_message);
-   pq_sendbyte(&output_message, 'w');
+   pq_sendbyte(&output_message, PqReplMsg_WALData);
 
    pq_sendint64(&output_message, startptr);    /* dataStart */
    pq_sendint64(&output_message, SendRqstPtr); /* walEnd */
 
    /* construct the message... */
    resetStringInfo(&output_message);
-   pq_sendbyte(&output_message, 'k');
+   pq_sendbyte(&output_message, PqReplMsg_Keepalive);
    pq_sendint64(&output_message, XLogRecPtrIsInvalid(writePtr) ? sentPtr : writePtr);
    pq_sendint64(&output_message, GetCurrentTimestamp());
    pq_sendbyte(&output_message, requestReply ? 1 : 0);
 
 #include "fe_utils/option_utils.h"
 #include "fe_utils/recovery_gen.h"
 #include "getopt_long.h"
+#include "libpq/protocol.h"
 #include "receivelog.h"
 #include "streamutil.h"
 
    /* Each CopyData message begins with a type byte. */
    switch (GetCopyDataByte(r, copybuf, &cursor))
    {
-       case 'n':
+       case PqBackupMsg_NewArchive:
            {
                /* New archive. */
                char       *archive_name;
                break;
            }
 
-       case 'd':
+       case PqMsg_CopyData:
            {
                /* Archive or manifest data. */
                if (state->manifest_buffer != NULL)
                break;
            }
 
-       case 'p':
+       case PqBackupMsg_ProgressReport:
            {
                /*
                 * Progress report.
                break;
            }
 
-       case 'm':
+       case PqBackupMsg_Manifest:
            {
                /*
                 * Manifest data will be sent next. This message is not
 
 #include "getopt_long.h"
 #include "libpq-fe.h"
 #include "libpq/pqsignal.h"
+#include "libpq/protocol.h"
 #include "pqexpbuffer.h"
 #include "streamutil.h"
 
                    LSN_FORMAT_ARGS(output_fsync_lsn),
                    replication_slot);
 
-   replybuf[len] = 'r';
+   replybuf[len] = PqReplMsg_StandbyStatusUpdate;
    len += 1;
    fe_sendint64(output_written_lsn, &replybuf[len]);   /* write */
    len += 8;
        }
 
        /* Check the message type. */
-       if (copybuf[0] == 'k')
+       if (copybuf[0] == PqReplMsg_Keepalive)
        {
            int         pos;
            bool        replyRequested;
             * We just check if the server requested a reply, and ignore the
             * rest.
             */
-           pos = 1;            /* skip msgtype 'k' */
+           pos = 1;            /* skip msgtype PqReplMsg_Keepalive */
            walEnd = fe_recvint64(©buf[pos]);
            output_written_lsn = Max(walEnd, output_written_lsn);
 
 
            continue;
        }
-       else if (copybuf[0] != 'w')
+       else if (copybuf[0] != PqReplMsg_WALData)
        {
            pg_log_error("unrecognized streaming header: \"%c\"",
                         copybuf[0]);
         * message. We only need the WAL location field (dataStart), the rest
         * of the header is ignored.
         */
-       hdr_len = 1;            /* msgtype 'w' */
+       hdr_len = 1;            /* msgtype PqReplMsg_WALData */
        hdr_len += 8;           /* dataStart */
        hdr_len += 8;           /* walEnd */
        hdr_len += 8;           /* sendTime */
 
 #include "access/xlog_internal.h"
 #include "common/logging.h"
 #include "libpq-fe.h"
+#include "libpq/protocol.h"
 #include "receivelog.h"
 #include "streamutil.h"
 
    char        replybuf[1 + 8 + 8 + 8 + 8 + 1];
    int         len = 0;
 
-   replybuf[len] = 'r';
+   replybuf[len] = PqReplMsg_StandbyStatusUpdate;
    len += 1;
    fe_sendint64(blockpos, &replybuf[len]); /* write */
    len += 8;
            }
 
            /* Check the message type. */
-           if (copybuf[0] == 'k')
+           if (copybuf[0] == PqReplMsg_Keepalive)
            {
                if (!ProcessKeepaliveMsg(conn, stream, copybuf, r, blockpos,
                                         &last_status))
                    goto error;
            }
-           else if (copybuf[0] == 'w')
+           else if (copybuf[0] == PqReplMsg_WALData)
            {
                if (!ProcessWALDataMsg(conn, stream, copybuf, r, &blockpos))
                    goto error;
     * Parse the keepalive message, enclosed in the CopyData message. We just
     * check if the server requested a reply, and ignore the rest.
     */
-   pos = 1;                    /* skip msgtype 'k' */
+   pos = 1;                    /* skip msgtype PqReplMsg_Keepalive */
    pos += 8;                   /* skip walEnd */
    pos += 8;                   /* skip sendTime */
 
     * message. We only need the WAL location field (dataStart), the rest of
     * the header is ignored.
     */
-   hdr_len = 1;                /* msgtype 'w' */
+   hdr_len = 1;                /* msgtype PqReplMsg_WALData */
    hdr_len += 8;               /* dataStart */
    hdr_len += 8;               /* walEnd */
    hdr_len += 8;               /* sendTime */
 
 #define PqMsg_Progress              'P'
 
 
+/* Replication codes sent by the primary (wrapped in CopyData messages). */
+
+#define PqReplMsg_Keepalive            'k'
+#define PqReplMsg_PrimaryStatusUpdate 's'
+#define PqReplMsg_WALData          'w'
+
+
+/* Replication codes sent by the standby (wrapped in CopyData messages). */
+
+#define PqReplMsg_HotStandbyFeedback 'h'
+#define PqReplMsg_PrimaryStatusRequest 'p'
+#define PqReplMsg_StandbyStatusUpdate 'r'
+
+
+/* Codes used for backups via COPY OUT (wrapped in CopyData messages). */
+
+#define PqBackupMsg_Manifest       'm'
+#define PqBackupMsg_NewArchive     'n'
+#define PqBackupMsg_ProgressReport 'p'
+
+
 /* These are the authentication request codes sent by the backend. */
 
 #define AUTH_REQ_OK            0   /* User is authenticated  */