From d33ae76d85ba7bfc273e77921595ff80f8e97022 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sun, 29 Jul 2018 19:24:19 +0300 Subject: [PATCH] [TAR] Add initializer to ext header which creates header with only necessary fields --- Sources/TAR/TarExtendedHeader.swift | 37 +++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Sources/TAR/TarExtendedHeader.swift b/Sources/TAR/TarExtendedHeader.swift index d3bbcd97..6fbf0f72 100644 --- a/Sources/TAR/TarExtendedHeader.swift +++ b/Sources/TAR/TarExtendedHeader.swift @@ -85,6 +85,43 @@ struct TarExtendedHeader { self.unknownRecords = unknownRecords } + init(_ info: TarEntryInfo) { + let maxOctalLengthEight = (1 << 24) - 1 + let maxOctalLengthTwelve = (1 << 36) - 1 + + if let uid = info.ownerID, uid > maxOctalLengthEight { + self.uid = uid + } + if let gid = info.groupID, gid > maxOctalLengthEight { + self.gid = gid + } + if let uname = info.ownerUserName, uname.data(using: .ascii) == nil { + self.uname = uname + } + if let gname = info.ownerGroupName, gname.data(using: .ascii) == nil { + self.gname = gname + } + if let size = info.size, size > maxOctalLengthTwelve { + self.size = size + } + if let mtime = info.modificationTime?.timeIntervalSince1970, + (mtime < 0 || mtime > Double(maxOctalLengthTwelve)) { + self.mtime = mtime + } + if info.name.data(using: .ascii) == nil { + self.path = info.name + } + if info.linkName.data(using: .ascii) == nil { + self.linkpath = info.linkName + } + + self.atime = info.accessTime?.timeIntervalSince1970 + self.ctime = info.creationTime?.timeIntervalSince1970 + self.charset = info.charset + self.comment = info.comment + self.unknownRecords = info.unknownExtendedHeaderRecords ?? [:] + } + func generateContainerData() throws -> Data { var headerString = "" if let atime = self.atime {