Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * pgtar.h 4 : * Functions for manipulating tarfile datastructures (src/port/tar.c) 5 : * 6 : * 7 : * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group 8 : * Portions Copyright (c) 1994, Regents of the University of California 9 : * 10 : * src/include/pgtar.h 11 : * 12 : *------------------------------------------------------------------------- 13 : */ 14 : #ifndef PG_TAR_H 15 : #define PG_TAR_H 16 : 17 : #define TAR_BLOCK_SIZE 512 18 : 19 : enum tarError 20 : { 21 : TAR_OK = 0, 22 : TAR_NAME_TOO_LONG, 23 : TAR_SYMLINK_TOO_LONG, 24 : }; 25 : 26 : /* 27 : * Offsets of fields within a 512-byte tar header. 28 : * 29 : * "tar number" values should be generated using print_tar_number() and can be 30 : * read using read_tar_number(). Fields that contain strings are generally 31 : * both filled and read using strlcpy(). 32 : * 33 : * The value for the checksum field can be computed using tarChecksum(). 34 : * 35 : * Some fields are not used by PostgreSQL; see tarCreateHeader(). 36 : */ 37 : enum tarHeaderOffset 38 : { 39 : TAR_OFFSET_NAME = 0, /* 100 byte string */ 40 : TAR_OFFSET_MODE = 100, /* 8 byte tar number, excludes S_IFMT */ 41 : TAR_OFFSET_UID = 108, /* 8 byte tar number */ 42 : TAR_OFFSET_GID = 116, /* 8 byte tar number */ 43 : TAR_OFFSET_SIZE = 124, /* 8 byte tar number */ 44 : TAR_OFFSET_MTIME = 136, /* 12 byte tar number */ 45 : TAR_OFFSET_CHECKSUM = 148, /* 8 byte tar number */ 46 : TAR_OFFSET_TYPEFLAG = 156, /* 1 byte file type, see TAR_FILETYPE_* */ 47 : TAR_OFFSET_LINKNAME = 157, /* 100 byte string */ 48 : TAR_OFFSET_MAGIC = 257, /* "ustar" with terminating zero byte */ 49 : TAR_OFFSET_VERSION = 263, /* "00" */ 50 : TAR_OFFSET_UNAME = 265, /* 32 byte string */ 51 : TAR_OFFSET_GNAME = 297, /* 32 byte string */ 52 : TAR_OFFSET_DEVMAJOR = 329, /* 8 byte tar number */ 53 : TAR_OFFSET_DEVMINOR = 337, /* 8 byte tar number */ 54 : TAR_OFFSET_PREFIX = 345, /* 155 byte string */ 55 : /* last 12 bytes of the 512-byte block are unassigned */ 56 : }; 57 : 58 : enum tarFileType 59 : { 60 : TAR_FILETYPE_PLAIN = '0', 61 : TAR_FILETYPE_SYMLINK = '2', 62 : TAR_FILETYPE_DIRECTORY = '5', 63 : }; 64 : 65 : extern enum tarError tarCreateHeader(char *h, const char *filename, 66 : const char *linktarget, pgoff_t size, 67 : mode_t mode, uid_t uid, gid_t gid, 68 : time_t mtime); 69 : extern uint64 read_tar_number(const char *s, int len); 70 : extern void print_tar_number(char *s, int len, uint64 val); 71 : extern int tarChecksum(char *header); 72 : 73 : /* 74 : * Compute the number of padding bytes required for an entry in a tar 75 : * archive. We must pad out to a multiple of TAR_BLOCK_SIZE. Since that's 76 : * a power of 2, we can use TYPEALIGN(). 77 : */ 78 : static inline size_t 79 1209920 : tarPaddingBytesRequired(size_t len) 80 : { 81 1209920 : return TYPEALIGN(TAR_BLOCK_SIZE, len) - len; 82 : } 83 : 84 : #endif