#include "pg_getopt.h"
 
+#include "access/xlog_internal.h"
+
 const char *progname;
 
 /* Options and defaults */
 char      *priorWALFileName;   /* the file we need to get from archive */
 char       WALFilePath[MAXPGPATH];     /* the file path including archive */
 char       restoreCommand[MAXPGPATH];  /* run this to restore */
-char       exclusiveCleanupFileName[MAXPGPATH];        /* the file we need to
+char       exclusiveCleanupFileName[MAXFNAMELEN];      /* the file we need to
                                                         * get from archive */
 
 /*
  * folded in to later versions of this program.
  */
 
-#define XLOG_DATA_FNAME_LEN        24
-/* Reworked from access/xlog_internal.h */
-#define XLogFileName(fname, tli, log, seg) \
-   snprintf(fname, XLOG_DATA_FNAME_LEN + 1, "%08X%08X%08X", tli, log, seg)
-
 /*
  * Initialize allows customized commands into the warm standby program.
  *
         * If it's a backup file, return immediately. If it's a regular file
         * return only if it's the right size already.
         */
-       if (strlen(nextWALFileName) > 24 &&
-           strspn(nextWALFileName, "0123456789ABCDEF") == 24 &&
-       strcmp(nextWALFileName + strlen(nextWALFileName) - strlen(".backup"),
-              ".backup") == 0)
+       if (IsBackupHistoryFileName(nextWALFileName))
        {
            nextWALFileType = XLOG_BACKUP_LABEL;
            return true;
                 * are not removed in the order they were originally written,
                 * in case this worries you.
                 */
-               if (strlen(xlde->d_name) == XLOG_DATA_FNAME_LEN &&
-                   strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_DATA_FNAME_LEN &&
+               if (IsXLogFileName(xlde->d_name) &&
                  strcmp(xlde->d_name + 8, exclusiveCleanupFileName + 8) < 0)
                {
 #ifdef WIN32
        }
    }
 
-   XLogFileName(exclusiveCleanupFileName, tli, log, seg);
+   XLogFileNameById(exclusiveCleanupFileName, tli, log, seg);
 
    return cleanup;
 }
     * Check for initial history file: always the first file to be requested
     * It's OK if the file isn't there - all other files need to wait
     */
-   if (strlen(nextWALFileName) > 8 &&
-       strspn(nextWALFileName, "0123456789ABCDEF") == 8 &&
-       strcmp(nextWALFileName + strlen(nextWALFileName) - strlen(".history"),
-              ".history") == 0)
+   if (IsTLHistoryFileName(nextWALFileName))
    {
        nextWALFileType = XLOG_HISTORY;
        if (RestoreWALFileForRecovery())
 
 
 #include "pg_getopt.h"
 
+#include "access/xlog_internal.h"
+
 const char *progname;
 
 /* Options and defaults */
 char      *archiveLocation;    /* where to find the archive? */
 char      *restartWALFileName; /* the file from which we can restart restore */
 char       WALFilePath[MAXPGPATH];     /* the file path including archive */
-char       exclusiveCleanupFileName[MAXPGPATH];        /* the oldest file we
+char       exclusiveCleanupFileName[MAXFNAMELEN];      /* the oldest file we
                                                         * want to remain in
                                                         * archive */
 
  * folded in to later versions of this program.
  */
 
-#define XLOG_DATA_FNAME_LEN        24
-/* Reworked from access/xlog_internal.h */
-#define XLogFileName(fname, tli, log, seg) \
-   snprintf(fname, XLOG_DATA_FNAME_LEN + 1, "%08X%08X%08X", tli, log, seg)
-#define XLOG_BACKUP_FNAME_LEN  40
-
 /*
  * Initialize allows customized commands into the archive cleanup program.
  *
        {
            /*
             * Truncation is essentially harmless, because we skip names of
-            * length other than XLOG_DATA_FNAME_LEN.  (In principle, one
+            * length other than XLOG_FNAME_LEN.  (In principle, one
             * could use a 1000-character additional_ext and get trouble.)
             */
            strlcpy(walfile, xlde->d_name, MAXPGPATH);
             * file. Note that this means files are not removed in the order
             * they were originally written, in case this worries you.
             */
-           if (strlen(walfile) == XLOG_DATA_FNAME_LEN &&
-               strspn(walfile, "0123456789ABCDEF") == XLOG_DATA_FNAME_LEN &&
+           if (IsXLogFileName(walfile) &&
                strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0)
            {
                /*
     * 000000010000000000000010.00000020.backup is after
     * 000000010000000000000010.
     */
-   if (strlen(restartWALFileName) == XLOG_DATA_FNAME_LEN &&
-       strspn(restartWALFileName, "0123456789ABCDEF") == XLOG_DATA_FNAME_LEN)
+   if (IsXLogFileName(restartWALFileName))
    {
        strcpy(exclusiveCleanupFileName, restartWALFileName);
        fnameOK = true;
    }
-   else if (strlen(restartWALFileName) == XLOG_BACKUP_FNAME_LEN)
+   else if (IsBackupHistoryFileName(restartWALFileName))
    {
        int         args;
        uint32      tli = 1,
             * Use just the prefix of the filename, ignore everything after
             * first period
             */
-           XLogFileName(exclusiveCleanupFileName, tli, log, seg);
+           XLogFileNameById(exclusiveCleanupFileName, tli, log, seg);
        }
    }
 
 
                break;
 
            case 'l':
-               if (strspn(optarg, "01234567890ABCDEFabcdef") != 24)
+               if (strspn(optarg, "01234567890ABCDEFabcdef") != XLOG_FNAME_LEN)
                {
                    fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-l");
                    fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
 
    while (errno = 0, (xlde = readdir(xldir)) != NULL)
    {
-       if (strlen(xlde->d_name) == 24 &&
-           strspn(xlde->d_name, "0123456789ABCDEF") == 24)
+       if (IsXLogFileName(xlde->d_name))
        {
            snprintf(path, MAXPGPATH, "%s/%s", XLOGDIR, xlde->d_name);
            if (unlink(path) < 0)
 
    while (errno = 0, (xlde = readdir(xldir)) != NULL)
    {
-       if (strspn(xlde->d_name, "0123456789ABCDEF") == 24 &&
-           (strcmp(xlde->d_name + 24, ".ready") == 0 ||
-            strcmp(xlde->d_name + 24, ".done") == 0))
+       if (strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_FNAME_LEN &&
+           (strcmp(xlde->d_name + XLOG_FNAME_LEN, ".ready") == 0 ||
+            strcmp(xlde->d_name + XLOG_FNAME_LEN, ".done") == 0))
        {
            snprintf(path, MAXPGPATH, "%s/%s", ARCHSTATDIR, xlde->d_name);
            if (unlink(path) < 0)
 
  */
 #define MAXFNAMELEN        64
 
+/* Length of XLog file name */
+#define XLOG_FNAME_LEN     24
+
 #define XLogFileName(fname, tli, logSegNo) \
    snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli,       \
             (uint32) ((logSegNo) / XLogSegmentsPerXLogId), \
             (uint32) ((logSegNo) % XLogSegmentsPerXLogId))
 
+#define XLogFileNameById(fname, tli, log, seg) \
+   snprintf(fname, MAXFNAMELEN, "%08X%08X%08X", tli, log, seg)
+
 #define IsXLogFileName(fname) \
-   (strlen(fname) == 24 && strspn(fname, "0123456789ABCDEF") == 24)
+   (strlen(fname) == XLOG_FNAME_LEN && \
+    strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN)
 
 /*
  * XLOG segment with .partial suffix.  Used by pg_receivexlog and at end of
  * be complete yet.
  */
 #define IsPartialXLogFileName(fname)   \
-   (strlen(fname) == 24 + strlen(".partial") &&    \
-    strspn(fname, "0123456789ABCDEF") == 24 &&     \
-    strcmp((fname) + 24, ".partial") == 0)
+   (strlen(fname) == XLOG_FNAME_LEN + strlen(".partial") &&    \
+    strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN &&     \
+    strcmp((fname) + XLOG_FNAME_LEN, ".partial") == 0)
 
 #define XLogFromFileName(fname, tli, logSegNo) \
    do {                                                \
             (uint32) ((logSegNo) % XLogSegmentsPerXLogId), offset)
 
 #define IsBackupHistoryFileName(fname) \
-   (strlen(fname) > 24 && \
-    strspn(fname, "0123456789ABCDEF") == 24 && \
+   (strlen(fname) > XLOG_FNAME_LEN && \
+    strspn(fname, "0123456789ABCDEF") == XLOG_FNAME_LEN && \
     strcmp((fname) + strlen(fname) - strlen(".backup"), ".backup") == 0)
 
 #define BackupHistoryFilePath(path, tli, logSegNo, offset) \