Changeset 98325 in vbox
- Timestamp:
- Jan 26, 2023 4:16:07 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 155544
- Location:
- trunk
- Files:
-
- 4 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/formats/tar.h
r98322 r98325 35 35 */ 36 36 37 #ifndef IPRT_INCLUDED_ SRC_common_zip_tar_h38 #define IPRT_INCLUDED_ SRC_common_zip_tar_h37 #ifndef IPRT_INCLUDED_formats_tar_h 38 #define IPRT_INCLUDED_formats_tar_h 39 39 #ifndef RT_WITHOUT_PRAGMA_ONCE 40 40 # pragma once … … 295 295 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, devminor, RTZIPTARHDRGNU, devminor); 296 296 297 298 299 /** 300 * Tar header union. 301 */ 302 typedef union RTZIPTARHDR 303 { 304 /** Byte view. */ 305 char ab[512]; 306 /** The standard header. */ 307 RTZIPTARHDRANCIENT Ancient; 308 /** The standard header. */ 309 RTZIPTARHDRPOSIX Posix; 310 /** The GNU header. */ 311 RTZIPTARHDRGNU Gnu; 312 /** The bits common to both GNU and the standard header. */ 313 RTZIPTARHDRCOMMON Common; 314 /** GNU sparse header. */ 315 RTZIPTARHDRGNUSPARSE GnuSparse; 316 } RTZIPTARHDR; 317 AssertCompileSize(RTZIPTARHDR, 512); 318 /** Pointer to a tar file header. */ 319 typedef RTZIPTARHDR *PRTZIPTARHDR; 320 /** Pointer to a const tar file header. */ 321 typedef RTZIPTARHDR const *PCRTZIPTARHDR; 322 323 324 /** 325 * Tar header type. 326 */ 327 typedef enum RTZIPTARTYPE 328 { 329 /** Invalid type value. */ 330 RTZIPTARTYPE_INVALID = 0, 331 /** Posix header. */ 332 RTZIPTARTYPE_POSIX, 333 /** The old GNU header, has layout conflicting with posix. */ 334 RTZIPTARTYPE_GNU, 335 /** Ancient tar header which does not use anything beyond the magic. */ 336 RTZIPTARTYPE_ANCIENT, 337 /** End of the valid type values (this is not valid). */ 338 RTZIPTARTYPE_END, 339 /** The usual type blow up. */ 340 RTZIPTARTYPE_32BIT_HACK = 0x7fffffff 341 } RTZIPTARTYPE; 342 typedef RTZIPTARTYPE *PRTZIPTARTYPE; 343 344 345 /** 346 * Calculates the TAR header checksums and detects if it's all zeros. 347 * 348 * @returns true if all zeros, false if not. 349 * @param pHdr The header to checksum. 350 * @param pi32Unsigned Where to store the checksum calculated using 351 * unsigned chars. This is the one POSIX specifies. 352 * @param pi32Signed Where to store the checksum calculated using 353 * signed chars. 354 * 355 * @remarks The reason why we calculate the checksum as both signed and unsigned 356 * has to do with various the char C type being signed on some hosts 357 * and unsigned on others. 358 */ 359 DECLINLINE(bool) rtZipTarCalcChkSum(PCRTZIPTARHDR pHdr, int32_t *pi32Unsigned, int32_t *pi32Signed) 360 { 361 int32_t i32Unsigned = 0; 362 int32_t i32Signed = 0; 363 364 /* 365 * Sum up the entire header. 366 */ 367 const char *pch = (const char *)pHdr; 368 const char *pchEnd = pch + sizeof(*pHdr); 369 do 370 { 371 i32Unsigned += *(unsigned char *)pch; 372 i32Signed += *(signed char *)pch; 373 } while (++pch != pchEnd); 374 375 /* 376 * Check if it's all zeros and replace the chksum field with spaces. 377 */ 378 bool const fZeroHdr = i32Unsigned == 0; 379 380 pch = pHdr->Common.chksum; 381 pchEnd = pch + sizeof(pHdr->Common.chksum); 382 do 383 { 384 i32Unsigned -= *(unsigned char *)pch; 385 i32Signed -= *(signed char *)pch; 386 } while (++pch != pchEnd); 387 388 i32Unsigned += (unsigned char)' ' * sizeof(pHdr->Common.chksum); 389 i32Signed += (signed char)' ' * sizeof(pHdr->Common.chksum); 390 391 *pi32Unsigned = i32Unsigned; 392 if (pi32Signed) 393 *pi32Signed = i32Signed; 394 return fZeroHdr; 395 } 396 397 398 #endif /* !IPRT_INCLUDED_SRC_common_zip_tar_h */ 399 297 #endif /* !IPRT_INCLUDED_formats_tar_h */ 298 -
trunk/src/VBox/Runtime/common/zip/tar.h
r98322 r98325 42 42 43 43 #include <iprt/assert.h> 44 45 /** @name RTZIPTARHDRPOSIX::typeflag 46 * @{ */ 47 #define RTZIPTAR_TF_OLDNORMAL '\0' /**< Normal disk file, Unix compatible */ 48 #define RTZIPTAR_TF_NORMAL '0' /**< Normal disk file */ 49 #define RTZIPTAR_TF_LINK '1' /**< Link to previously dumped file */ 50 #define RTZIPTAR_TF_SYMLINK '2' /**< Symbolic link */ 51 #define RTZIPTAR_TF_CHR '3' /**< Character special file */ 52 #define RTZIPTAR_TF_BLK '4' /**< Block special file */ 53 #define RTZIPTAR_TF_DIR '5' /**< Directory */ 54 #define RTZIPTAR_TF_FIFO '6' /**< FIFO special file */ 55 #define RTZIPTAR_TF_CONTIG '7' /**< Contiguous file */ 56 57 #define RTZIPTAR_TF_X_HDR 'x' /**< Extended header. */ 58 #define RTZIPTAR_TF_X_GLOBAL 'g' /**< Global extended header. */ 59 60 #define RTZIPTAR_TF_SOLARIS_XHDR 'X' 61 62 #define RTZIPTAR_TF_GNU_DUMPDIR 'D' 63 #define RTZIPTAR_TF_GNU_LONGLINK 'K' /**< GNU long link header. */ 64 #define RTZIPTAR_TF_GNU_LONGNAME 'L' /**< GNU long name header. */ 65 #define RTZIPTAR_TF_GNU_MULTIVOL 'M' 66 #define RTZIPTAR_TF_GNU_SPARSE 'S' 67 #define RTZIPTAR_TF_GNU_VOLDHR 'V' 68 /** @} */ 69 70 /** Maximum length of a tar filename, excluding the terminating '\0'. More 71 * does not fit into a tar record. */ 72 #define RTZIPTAR_NAME_MAX 99 73 74 75 /** 76 * The ancient tar header. 77 * 78 * The posix and gnu headers are compatible with the members up to and including 79 * link name, from there on they differ. 80 */ 81 typedef struct RTZIPTARHDRANCIENT 82 { 83 char name[100]; 84 char mode[8]; 85 char uid[8]; 86 char gid[8]; 87 char size[12]; 88 char mtime[12]; 89 char chksum[8]; 90 char typeflag; 91 char linkname[100]; /**< Was called linkflag. */ 92 char unused[8+64+16+155+12]; 93 } RTZIPTARHDRANCIENT; 94 AssertCompileSize(RTZIPTARHDRANCIENT, 512); 95 AssertCompileMemberOffset(RTZIPTARHDRANCIENT, name, 0); 96 AssertCompileMemberOffset(RTZIPTARHDRANCIENT, mode, 100); 97 AssertCompileMemberOffset(RTZIPTARHDRANCIENT, uid, 108); 98 AssertCompileMemberOffset(RTZIPTARHDRANCIENT, gid, 116); 99 AssertCompileMemberOffset(RTZIPTARHDRANCIENT, size, 124); 100 AssertCompileMemberOffset(RTZIPTARHDRANCIENT, mtime, 136); 101 AssertCompileMemberOffset(RTZIPTARHDRANCIENT, chksum, 148); 102 AssertCompileMemberOffset(RTZIPTARHDRANCIENT, typeflag, 156); 103 AssertCompileMemberOffset(RTZIPTARHDRANCIENT, linkname, 157); 104 AssertCompileMemberOffset(RTZIPTARHDRANCIENT, unused, 257); 105 106 107 /** The uniform standard tape archive format magic value. */ 108 #define RTZIPTAR_USTAR_MAGIC "ustar" 109 /** The ustar version string. 110 * @remarks The terminator character is not part of the field. */ 111 #define RTZIPTAR_USTAR_VERSION "00" 112 113 /** The GNU magic + version value. */ 114 #define RTZIPTAR_GNU_MAGIC "ustar " 115 116 117 /** 118 * The posix header (according to SuS). 119 */ 120 typedef struct RTZIPTARHDRPOSIX 121 { 122 char name[100]; 123 char mode[8]; 124 char uid[8]; 125 char gid[8]; 126 char size[12]; 127 char mtime[12]; 128 char chksum[8]; 129 char typeflag; 130 char linkname[100]; 131 char magic[6]; 132 char version[2]; 133 char uname[32]; 134 char gname[32]; 135 char devmajor[8]; 136 char devminor[8]; 137 char prefix[155]; 138 char unused[12]; 139 } RTZIPTARHDRPOSIX; 140 AssertCompileSize(RTZIPTARHDRPOSIX, 512); 141 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, name, 0); 142 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, mode, 100); 143 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, uid, 108); 144 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, gid, 116); 145 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, size, 124); 146 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, mtime, 136); 147 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, chksum, 148); 148 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, typeflag, 156); 149 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, linkname, 157); 150 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, magic, 257); 151 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, version, 263); 152 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, uname, 265); 153 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, gname, 297); 154 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, devmajor, 329); 155 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, devminor, 337); 156 AssertCompileMemberOffset(RTZIPTARHDRPOSIX, prefix, 345); 157 158 /** 159 * GNU sparse data segment descriptor. 160 */ 161 typedef struct RTZIPTARGNUSPARSE 162 { 163 char offset[12]; /**< Absolute offset relative to the start of the file. */ 164 char numbytes[12]; 165 } RTZIPTARGNUSPARSE; 166 AssertCompileSize(RTZIPTARGNUSPARSE, 24); 167 AssertCompileMemberOffset(RTZIPTARGNUSPARSE, offset, 0); 168 AssertCompileMemberOffset(RTZIPTARGNUSPARSE, numbytes, 12); 169 /** Pointer to a GNU sparse data segment descriptor. */ 170 typedef RTZIPTARGNUSPARSE *PRTZIPTARGNUSPARSE; 171 /** Pointer to a const GNU sparse data segment descriptor. */ 172 typedef RTZIPTARGNUSPARSE *PCRTZIPTARGNUSPARSE; 173 174 /** 175 * The GNU header. 176 */ 177 typedef struct RTZIPTARHDRGNU 178 { 179 char name[100]; 180 char mode[8]; 181 char uid[8]; 182 char gid[8]; 183 char size[12]; 184 char mtime[12]; 185 char chksum[8]; 186 char typeflag; 187 char linkname[100]; 188 char magic[8]; 189 char uname[32]; 190 char gname[32]; 191 char devmajor[8]; 192 char devminor[8]; 193 char atime[12]; 194 char ctime[12]; 195 char offset[12]; /**< for multi-volume? */ 196 char longnames[4]; /**< Seems to be unused. */ 197 char unused[1]; 198 RTZIPTARGNUSPARSE sparse[4]; 199 char isextended; /**< More headers about sparse stuff if binary value 1. */ 200 char realsize[12]; 201 char unused2[17]; 202 } RTZIPTARHDRGNU; 203 AssertCompileSize(RTZIPTARHDRGNU, 512); 204 AssertCompileMemberOffset(RTZIPTARHDRGNU, name, 0); 205 AssertCompileMemberOffset(RTZIPTARHDRGNU, mode, 100); 206 AssertCompileMemberOffset(RTZIPTARHDRGNU, uid, 108); 207 AssertCompileMemberOffset(RTZIPTARHDRGNU, gid, 116); 208 AssertCompileMemberOffset(RTZIPTARHDRGNU, size, 124); 209 AssertCompileMemberOffset(RTZIPTARHDRGNU, mtime, 136); 210 AssertCompileMemberOffset(RTZIPTARHDRGNU, chksum, 148); 211 AssertCompileMemberOffset(RTZIPTARHDRGNU, typeflag, 156); 212 AssertCompileMemberOffset(RTZIPTARHDRGNU, linkname, 157); 213 AssertCompileMemberOffset(RTZIPTARHDRGNU, magic, 257); 214 AssertCompileMemberOffset(RTZIPTARHDRGNU, uname, 265); 215 AssertCompileMemberOffset(RTZIPTARHDRGNU, gname, 297); 216 AssertCompileMemberOffset(RTZIPTARHDRGNU, devmajor, 329); 217 AssertCompileMemberOffset(RTZIPTARHDRGNU, devminor, 337); 218 AssertCompileMemberOffset(RTZIPTARHDRGNU, atime, 345); 219 AssertCompileMemberOffset(RTZIPTARHDRGNU, ctime, 357); 220 AssertCompileMemberOffset(RTZIPTARHDRGNU, offset, 369); 221 AssertCompileMemberOffset(RTZIPTARHDRGNU, longnames, 381); 222 AssertCompileMemberOffset(RTZIPTARHDRGNU, unused, 385); 223 AssertCompileMemberOffset(RTZIPTARHDRGNU, sparse, 386); 224 AssertCompileMemberOffset(RTZIPTARHDRGNU, isextended,482); 225 AssertCompileMemberOffset(RTZIPTARHDRGNU, realsize, 483); 226 AssertCompileMemberOffset(RTZIPTARHDRGNU, unused2, 495); 227 228 229 /** 230 * GNU sparse header. 231 */ 232 typedef struct RTZIPTARHDRGNUSPARSE 233 { 234 RTZIPTARGNUSPARSE sp[21]; 235 char isextended; 236 char unused[7]; 237 } RTZIPTARHDRGNUSPARSE; 238 AssertCompileSize(RTZIPTARHDRGNUSPARSE, 512); 239 AssertCompileMemberOffset(RTZIPTARHDRGNUSPARSE, sp, 0); 240 AssertCompileMemberOffset(RTZIPTARHDRGNUSPARSE, isextended, 504); 241 AssertCompileMemberOffset(RTZIPTARHDRGNUSPARSE, unused, 505); 242 243 244 /** 245 * The bits common to posix and GNU. 246 */ 247 typedef struct RTZIPTARHDRCOMMON 248 { 249 char name[100]; 250 char mode[8]; 251 char uid[8]; 252 char gid[8]; 253 char size[12]; 254 char mtime[12]; 255 char chksum[8]; 256 char typeflag; 257 char linkname[100]; 258 char magic[6]; 259 char version[2]; 260 char uname[32]; 261 char gname[32]; 262 char devmajor[8]; 263 char devminor[8]; 264 char not_common[155+12]; 265 } RTZIPTARHDRCOMMON; 266 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, name, RTZIPTARHDRPOSIX, name); 267 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, mode, RTZIPTARHDRPOSIX, mode); 268 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, uid, RTZIPTARHDRPOSIX, uid); 269 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, gid, RTZIPTARHDRPOSIX, gid); 270 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, size, RTZIPTARHDRPOSIX, size); 271 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, mtime, RTZIPTARHDRPOSIX, mtime); 272 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, chksum, RTZIPTARHDRPOSIX, chksum); 273 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, typeflag, RTZIPTARHDRPOSIX, typeflag); 274 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, linkname, RTZIPTARHDRPOSIX, linkname); 275 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, magic, RTZIPTARHDRPOSIX, magic); 276 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, version, RTZIPTARHDRPOSIX, version); 277 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, uname, RTZIPTARHDRPOSIX, uname); 278 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, gname, RTZIPTARHDRPOSIX, gname); 279 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, devmajor, RTZIPTARHDRPOSIX, devmajor); 280 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, devminor, RTZIPTARHDRPOSIX, devminor); 281 282 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, name, RTZIPTARHDRGNU, name); 283 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, mode, RTZIPTARHDRGNU, mode); 284 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, uid, RTZIPTARHDRGNU, uid); 285 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, gid, RTZIPTARHDRGNU, gid); 286 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, size, RTZIPTARHDRGNU, size); 287 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, mtime, RTZIPTARHDRGNU, mtime); 288 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, chksum, RTZIPTARHDRGNU, chksum); 289 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, typeflag, RTZIPTARHDRGNU, typeflag); 290 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, linkname, RTZIPTARHDRGNU, linkname); 291 AssertCompileMembersAtSameOffset( RTZIPTARHDRCOMMON, magic, RTZIPTARHDRGNU, magic); 292 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, uname, RTZIPTARHDRGNU, uname); 293 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, gname, RTZIPTARHDRGNU, gname); 294 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, devmajor, RTZIPTARHDRGNU, devmajor); 295 AssertCompileMembersSameSizeAndOffset(RTZIPTARHDRCOMMON, devminor, RTZIPTARHDRGNU, devminor); 296 297 44 #include <iprt/formats/tar.h> 298 45 299 46 /** -
trunk/src/VBox/Runtime/common/zip/tarvfs.cpp
r98322 r98325 52 52 #include <iprt/vfslowlevel.h> 53 53 54 #include <iprt/formats/tar.h>55 54 #include "tarvfsreader.h" 56 55 -
trunk/src/VBox/Runtime/common/zip/tarvfsreader.h
r98322 r98325 41 41 #endif 42 42 43 #include <iprt/formats/tar.h>43 #include "tar.h" 44 44 45 45 -
trunk/src/VBox/Runtime/common/zip/tarvfswriter.cpp
r98322 r98325 52 52 #include <iprt/vfslowlevel.h> 53 53 #include <iprt/zero.h> 54 55 #include <iprt/formats/tar.h>56 54 57 55 #include "tarvfsreader.h"
Note:
See TracChangeset
for help on using the changeset viewer.