github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/archive/tar/common.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // tarパッケージは、tarアーカイブへのアクセスを実装します。 6 // 7 // テープアーカイブ(tar)は、ストリーミング方式で読み書きできるファイル形式で、 8 // 一連のファイルを格納するために使用されます。 9 // このパッケージは、GNUおよびBSD tarツールによって生成されたものを含め、 10 // このフォーマットのほとんどのバリエーションをカバーすることを目的としています。 11 package tar 12 13 import ( 14 "github.com/shogo82148/std/errors" 15 "github.com/shogo82148/std/io/fs" 16 "github.com/shogo82148/std/time" 17 ) 18 19 var ( 20 ErrHeader = errors.New("archive/tar: invalid tar header") 21 ErrWriteTooLong = errors.New("archive/tar: write too long") 22 ErrFieldTooLong = errors.New("archive/tar: header field too long") 23 ErrWriteAfterClose = errors.New("archive/tar: write after close") 24 ErrInsecurePath = errors.New("archive/tar: insecure file path") 25 ) 26 27 // Type flags for Header.Typeflag. 28 const ( 29 // Type '0' は通常のファイルを示します。 30 TypeReg = '0' 31 32 // Deprecated: 非推奨:かわりにTypeRegを使用してください。 33 TypeRegA = '\x00' 34 35 // Type '1'から'6'は、ヘッダーのみのフラグであり、データ本体を持たない場合があります。 36 TypeLink = '1' 37 TypeSymlink = '2' 38 TypeChar = '3' 39 TypeBlock = '4' 40 TypeDir = '5' 41 TypeFifo = '6' 42 43 // Type '7' は予約されています。 44 TypeCont = '7' 45 46 // Type 'x' は、PAXフォーマットで、次のファイルにのみ関連するキー-値レコードを格納するために使用されます。 47 // このパッケージは、これらのタイプを透過的に処理します。 48 TypeXHeader = 'x' 49 50 // 'g' 型は、すべての後続ファイルに関連するキーと値のレコードを格納するために PAX 形式で使用されます。 51 // このパッケージは、このようなヘッダーの解析と構成のみをサポートしていますが、現在はファイル間でグローバル状態を永続化することはできません。 52 TypeXGlobalHeader = 'g' 53 54 // 'S' 型は、GNU 形式でスパースファイルを示します。 55 TypeGNUSparse = 'S' 56 57 // 'L' 型と 'K' 型は、GNU 形式でメタファイルに使用されます。 58 // このメタファイルは、次のファイルのパスまたはリンク名を格納するために使用されます。 59 // このパッケージは、これらのタイプを透過的に処理します。 60 TypeGNULongName = 'L' 61 TypeGNULongLink = 'K' 62 ) 63 64 // Header は、tar アーカイブ内の単一のヘッダーを表します。 65 // 一部のフィールドは、値が設定されていない場合があります。 66 // 67 // 将来の互換性のために、Reader.Next から Header を取得し、 68 // いくつかの方法で変更し、Writer.WriteHeader に戻すユーザーは、 69 // 新しい Header を作成し、保存する必要があるフィールドをコピーすることで行う必要があります。 70 type Header struct { 71 // Typeflagはヘッダーエントリのタイプです。 72 // ゼロ値は、Nameの末尾のスラッシュの有無に応じて、自動的にTypeRegまたはTypeDirに昇格します。 73 Typeflag byte 74 75 Name string 76 Linkname string 77 78 Size int64 79 Mode int64 80 Uid int 81 Gid int 82 Uname string 83 Gname string 84 85 // Formatが指定されていない場合、Writer.WriteHeaderはModTimeを最も近い秒に丸め、 86 // AccessTimeとChangeTimeフィールドを無視します。 87 // 88 // AccessTimeまたはChangeTimeを使用するには、FormatをPAXまたはGNUとして指定します。 89 // サブセカンドの解像度を使用するには、FormatをPAXとして指定します。 90 ModTime time.Time 91 AccessTime time.Time 92 ChangeTime time.Time 93 94 Devmajor int64 95 Devminor int64 96 97 // Xattrsは、"SCHILY.xattr."名前空間の下のPAXレコードとして拡張属性を保存します。 98 // 99 // 以下は意味的に等価です: 100 // h.Xattrs[key] = value 101 // h.PAXRecords["SCHILY.xattr."+key] = value 102 // 103 // Writer.WriteHeaderが呼び出されると、Xattrsの内容がPAXRecordsのものよりも優先されます。 104 // 105 // Deprecated: 代わりにPAXRecordsを使用してください。 106 Xattrs map[string]string 107 108 // PAXRecordsは、PAX拡張ヘッダーレコードのマップです。 109 // 110 // ユーザー定義のレコードは、次の形式のキーを持つべきです: 111 // VENDOR.keyword 112 // ここで、VENDORはすべて大文字の何らかの名前空間であり、keywordは 113 // '='文字を含んではなりません(例:"GOLANG.pkg.version")。 114 // キーと値は非空のUTF-8文字列でなければなりません。 115 // 116 // Writer.WriteHeaderが呼び出されると、Headerの他のフィールドから派生した 117 // PAXレコードは、PAXRecordsよりも優先されます。 118 PAXRecords map[string]string 119 120 // Formatはtarヘッダーの形式を指定します。 121 // 122 // これは、Reader.Nextによって形式の最善の推測として設定されます。 123 // Readerは一部の非準拠ファイルを寛大に読み取るため、 124 // これがFormatUnknownである可能性があります。 125 // 126 // Writer.WriteHeaderが呼び出されたときに形式が指定されていない場合、 127 // このHeaderをエンコードできる最初の形式(USTAR、PAX、GNUの順)を使用します(Formatを参照)。 128 Format Format 129 } 130 131 // fs.FileInfoのNameメソッドは、説明するファイルのベース名のみを返すため、 132 // ファイルの完全なパス名を提供するためにHeader.Nameを変更する必要がある場合があります。 133 // 134 // fiが [FileInfoNames] を実装している場合、ヘッダーのGnameとUnameは、 135 // インターフェースのメソッドによって提供されます。 136 // FileInfoは、Headerのfs.FileInfoを返します。 137 func (h *Header) FileInfo() fs.FileInfo 138 139 // FileInfoHeaderは、fiから部分的に設定された [Header] を作成します。 140 // fiがシンボリックリンクを記述している場合、FileInfoHeaderはlinkをリンクターゲットとして記録します。 141 // fiがディレクトリを記述している場合、名前にスラッシュが追加されます。 142 // 143 // fs.FileInfoのNameメソッドは、それが記述するファイルのベース名のみを返すため、 144 // ファイルの完全なパス名を提供するためにHeader.Nameを変更する必要があるかもしれません。 145 // 146 // fiが [FileInfoNames] を実装している場合、 147 // Header.GnameとHeader.Unameはインターフェースのメソッドによって提供されます。 148 func FileInfoHeader(fi fs.FileInfo, link string) (*Header, error) 149 150 // FileInfoNames extends [fs.FileInfo]. 151 // Passing an instance of this to [FileInfoHeader] permits the caller 152 // to avoid a system-dependent name lookup by specifying the Uname and Gname directly. 153 type FileInfoNames interface { 154 fs.FileInfo 155 156 Uname() (string, error) 157 158 Gname() (string, error) 159 }