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  }