mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-27 17:21:55 +02:00
29275b1d17
Reported-by: Michael Paquier Discussion: https://postgr.es/m/ZZKTDPxBBMt3C0J9@paquier.xyz Backpatch-through: 12
85 lines
2.6 KiB
C
85 lines
2.6 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* pgtar.h
|
|
* Functions for manipulating tarfile datastructures (src/port/tar.c)
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/pgtar.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef PG_TAR_H
|
|
#define PG_TAR_H
|
|
|
|
#define TAR_BLOCK_SIZE 512
|
|
|
|
enum tarError
|
|
{
|
|
TAR_OK = 0,
|
|
TAR_NAME_TOO_LONG,
|
|
TAR_SYMLINK_TOO_LONG,
|
|
};
|
|
|
|
/*
|
|
* Offsets of fields within a 512-byte tar header.
|
|
*
|
|
* "tar number" values should be generated using print_tar_number() and can be
|
|
* read using read_tar_number(). Fields that contain strings are generally
|
|
* both filled and read using strlcpy().
|
|
*
|
|
* The value for the checksum field can be computed using tarChecksum().
|
|
*
|
|
* Some fields are not used by PostgreSQL; see tarCreateHeader().
|
|
*/
|
|
enum tarHeaderOffset
|
|
{
|
|
TAR_OFFSET_NAME = 0, /* 100 byte string */
|
|
TAR_OFFSET_MODE = 100, /* 8 byte tar number, excludes S_IFMT */
|
|
TAR_OFFSET_UID = 108, /* 8 byte tar number */
|
|
TAR_OFFSET_GID = 116, /* 8 byte tar number */
|
|
TAR_OFFSET_SIZE = 124, /* 8 byte tar number */
|
|
TAR_OFFSET_MTIME = 136, /* 12 byte tar number */
|
|
TAR_OFFSET_CHECKSUM = 148, /* 8 byte tar number */
|
|
TAR_OFFSET_TYPEFLAG = 156, /* 1 byte file type, see TAR_FILETYPE_* */
|
|
TAR_OFFSET_LINKNAME = 157, /* 100 byte string */
|
|
TAR_OFFSET_MAGIC = 257, /* "ustar" with terminating zero byte */
|
|
TAR_OFFSET_VERSION = 263, /* "00" */
|
|
TAR_OFFSET_UNAME = 265, /* 32 byte string */
|
|
TAR_OFFSET_GNAME = 297, /* 32 byte string */
|
|
TAR_OFFSET_DEVMAJOR = 329, /* 8 byte tar number */
|
|
TAR_OFFSET_DEVMINOR = 337, /* 8 byte tar number */
|
|
TAR_OFFSET_PREFIX = 345, /* 155 byte string */
|
|
/* last 12 bytes of the 512-byte block are unassigned */
|
|
};
|
|
|
|
enum tarFileType
|
|
{
|
|
TAR_FILETYPE_PLAIN = '0',
|
|
TAR_FILETYPE_SYMLINK = '2',
|
|
TAR_FILETYPE_DIRECTORY = '5',
|
|
};
|
|
|
|
extern enum tarError tarCreateHeader(char *h, const char *filename,
|
|
const char *linktarget, pgoff_t size,
|
|
mode_t mode, uid_t uid, gid_t gid,
|
|
time_t mtime);
|
|
extern uint64 read_tar_number(const char *s, int len);
|
|
extern void print_tar_number(char *s, int len, uint64 val);
|
|
extern int tarChecksum(char *header);
|
|
|
|
/*
|
|
* Compute the number of padding bytes required for an entry in a tar
|
|
* archive. We must pad out to a multiple of TAR_BLOCK_SIZE. Since that's
|
|
* a power of 2, we can use TYPEALIGN().
|
|
*/
|
|
static inline size_t
|
|
tarPaddingBytesRequired(size_t len)
|
|
{
|
|
return TYPEALIGN(TAR_BLOCK_SIZE, len) - len;
|
|
}
|
|
|
|
#endif
|