*** a/src/bin/pg_resetxlog/pg_resetxlog.c --- b/src/bin/pg_resetxlog/pg_resetxlog.c *************** *** 86,94 **** main(int argc, char *argv[]) Oid set_oid = 0; MultiXactId set_mxid = 0; MultiXactOffset set_mxoff = (MultiXactOffset) -1; ! uint32 minXlogTli = 0; XLogSegNo minXlogSegNo = 0; char *endptr; char *DataDir; int fd; char path[MAXPGPATH]; --- 86,98 ---- Oid set_oid = 0; MultiXactId set_mxid = 0; MultiXactOffset set_mxoff = (MultiXactOffset) -1; ! uint32 minXlogTli = 0, ! minXlogId = 0, ! minXlogSeg = 0; XLogSegNo minXlogSegNo = 0; char *endptr; + char *endptr2; + char *endptr3; char *DataDir; int fd; char path[MAXPGPATH]; *************** *** 200,212 **** main(int argc, char *argv[]) break; case 'l': ! if (strspn(optarg, "01234567890ABCDEFabcdef") != 24) { fprintf(stderr, _("%s: invalid argument for option -l\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); } ! XLogFromFileName(optarg, &minXlogTli, &minXlogSegNo); break; default: --- 204,231 ---- break; case 'l': ! minXlogTli = strtoul(optarg, &endptr, 0); ! if (endptr == optarg || *endptr != ',') { fprintf(stderr, _("%s: invalid argument for option -l\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); } ! minXlogId = strtoul(endptr + 1, &endptr2, 0); ! if (endptr2 == endptr + 1 || *endptr2 != ',') ! { ! fprintf(stderr, _("%s: invalid argument for option -l\n"), progname); ! fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); ! exit(1); ! } ! minXlogSeg = strtoul(endptr2 + 1, &endptr3, 0); ! if (endptr3 == endptr2 + 1 || *endptr3 != '\0') ! { ! fprintf(stderr, _("%s: invalid argument for option -l\n"), progname); ! fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); ! exit(1); ! } ! minXlogSegNo = (uint64) minXlogId * XLogSegmentsPerXLogId + minXlogSeg; break; default: