diff options
Diffstat (limited to 'src/bin/pg_basebackup/bbstreamer_tar.c')
-rw-r--r-- | src/bin/pg_basebackup/bbstreamer_tar.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/src/bin/pg_basebackup/bbstreamer_tar.c b/src/bin/pg_basebackup/bbstreamer_tar.c index 03d7fd3375a..d7b438d0f59 100644 --- a/src/bin/pg_basebackup/bbstreamer_tar.c +++ b/src/bin/pg_basebackup/bbstreamer_tar.c @@ -286,22 +286,20 @@ bbstreamer_tar_header(bbstreamer_tar_parser *mystreamer) /* * Parse key fields out of the header. - * - * FIXME: It's terrible that we use hard-coded values here instead of some - * more principled approach. It's been like this for a long time, but we - * ought to do better. */ - strlcpy(member->pathname, &buffer[0], MAXPGPATH); + strlcpy(member->pathname, &buffer[TAR_OFFSET_NAME], MAXPGPATH); if (member->pathname[0] == '\0') pg_fatal("tar member has empty name"); - member->size = read_tar_number(&buffer[124], 12); - member->mode = read_tar_number(&buffer[100], 8); - member->uid = read_tar_number(&buffer[108], 8); - member->gid = read_tar_number(&buffer[116], 8); - member->is_directory = (buffer[156] == '5'); - member->is_link = (buffer[156] == '2'); + member->size = read_tar_number(&buffer[TAR_OFFSET_SIZE], 12); + member->mode = read_tar_number(&buffer[TAR_OFFSET_MODE], 8); + member->uid = read_tar_number(&buffer[TAR_OFFSET_UID], 8); + member->gid = read_tar_number(&buffer[TAR_OFFSET_GID], 8); + member->is_directory = + (buffer[TAR_OFFSET_TYPEFLAG] == TAR_FILETYPE_DIRECTORY); + member->is_link = + (buffer[TAR_OFFSET_TYPEFLAG] == TAR_FILETYPE_SYMLINK); if (member->is_link) - strlcpy(member->linktarget, &buffer[157], 100); + strlcpy(member->linktarget, &buffer[TAR_OFFSET_LINKNAME], 100); /* Compute number of padding bytes. */ mystreamer->pad_bytes_expected = tarPaddingBytesRequired(member->size); |