/src/postgres/src/include/pgtar.h
Line | Count | Source (jump to first uncovered line) |
1 | | /*------------------------------------------------------------------------- |
2 | | * |
3 | | * pgtar.h |
4 | | * Functions for manipulating tarfile datastructures (src/port/tar.c) |
5 | | * |
6 | | * |
7 | | * Portions Copyright (c) 1996-2025, 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 | 0 | #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 | | tarPaddingBytesRequired(size_t len) |
80 | 0 | { |
81 | 0 | return TYPEALIGN(TAR_BLOCK_SIZE, len) - len; |
82 | 0 | } Unexecuted instantiation: basebackup.c:tarPaddingBytesRequired Unexecuted instantiation: tar.c:tarPaddingBytesRequired |
83 | | |
84 | | #endif |