Skip to content

Commit

Permalink
add username, groupname, and fileflag support
Browse files Browse the repository at this point in the history
Signed-off-by: Alex Goodman <alex.goodman@anchore.com>
  • Loading branch information
wagoodman committed Apr 12, 2021
1 parent 0043963 commit 8decccf
Show file tree
Hide file tree
Showing 5 changed files with 252 additions and 59 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ go 1.14
require (
github.com/go-restruct/restruct v0.0.0-20191227155143-5734170a48a1
github.com/go-test/deep v1.0.7
github.com/stretchr/testify v1.4.0
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
)
58 changes: 58 additions & 0 deletions pkg/file_flags.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package rpmdb

// source: https://github.com/rpm-software-management/rpm/blob/da55723907418bfb3939cd6ddd941b3fdb4f6887/lib/rpmfiles.h#L46-L63
const (
RPMFILE_CONFIG int32 = 1 << iota /*!< from %%config */
RPMFILE_DOC /*!< from %%doc */
RPMFILE_ICON /*!< from %%donotuse. */
RPMFILE_MISSINGOK /*!< from %%config(missingok) */
RPMFILE_NOREPLACE /*!< from %%config(noreplace) */
RPMFILE_SPECFILE /*!< @todo (unnecessary) marks 1st file in srpm. */
RPMFILE_GHOST /*!< from %%ghost */
RPMFILE_LICENSE /*!< from %%license */
RPMFILE_README /*!< from %%readme */
_ /* bit 9 unused */
_ /* bit 10 unused */
RPMFILE_PUBKEY /*!< from %%pubkey */
RPMFILE_ARTIFACT /*!< from %%artifact */
)

var flagChar = map[int32]string{
RPMFILE_CONFIG: "c",
RPMFILE_DOC: "d",
RPMFILE_SPECFILE: "s",
RPMFILE_MISSINGOK: "m",
RPMFILE_NOREPLACE: "n",
RPMFILE_GHOST: "g",
RPMFILE_LICENSE: "l",
RPMFILE_README: "r",
RPMFILE_ARTIFACT: "a",
}

var flagFormatOrder = []int32{
RPMFILE_DOC,
RPMFILE_CONFIG,
RPMFILE_SPECFILE,
RPMFILE_MISSINGOK,
RPMFILE_NOREPLACE,
RPMFILE_GHOST,
RPMFILE_LICENSE,
RPMFILE_README,
RPMFILE_ARTIFACT,
}

type FileFlags int32

// source: https://github.com/rpm-software-management/rpm/blob/551e66fc94668e62910008d047428eb5ec62f896/lib/verify.c#L298-L312
func (flags FileFlags) String() (result string) {
for _, flag := range flagFormatOrder {
if int32(flags)&flag == 0 {
// flag is NOT set
continue
}
if char, exists := flagChar[flag]; exists {
result += char
}
}
return
}
91 changes: 91 additions & 0 deletions pkg/file_flags_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package rpmdb

import (
"github.com/stretchr/testify/assert"
"testing"
)

func TestFormatFileFlags(t *testing.T) {
tests := []struct {
flags FileFlags
expected string
}{
// empty
{
flags: 0,
expected: "",
},
// check that the formatting works relative to the configured bits
{
flags: FileFlags(RPMFILE_CONFIG),
expected: "c",
},
{
flags: FileFlags(RPMFILE_DOC),
expected: "d",
},
{
flags: FileFlags(RPMFILE_MISSINGOK),
expected: "m",
},
{
flags: FileFlags(RPMFILE_NOREPLACE),
expected: "n",
},
{
flags: FileFlags(RPMFILE_SPECFILE),
expected: "s",
},
{
flags: FileFlags(RPMFILE_GHOST),
expected: "g",
},
{
flags: FileFlags(RPMFILE_LICENSE),
expected: "l",
},
{
flags: FileFlags(RPMFILE_README),
expected: "r",
},
{
flags: FileFlags(RPMFILE_ARTIFACT),
expected: "a",
},
{
flags: FileFlags(RPMFILE_CONFIG | RPMFILE_DOC | RPMFILE_SPECFILE | RPMFILE_MISSINGOK | RPMFILE_NOREPLACE | RPMFILE_GHOST | RPMFILE_LICENSE | RPMFILE_README | RPMFILE_ARTIFACT),
expected: "dcsmnglra",
},
{
flags: FileFlags(RPMFILE_DOC | RPMFILE_ARTIFACT),
expected: "da",
},
// check that the formatting matches relative to verified correct values
// see helpful examples from: rpm --dbpath=/var/lib/rpm -qa --queryformat '%{FILEFLAGS:fflags}|%{FILEFLAGS}\n'
{
flags: FileFlags(89),
expected: "cmng",
},
{
flags: FileFlags(16),
expected: "n",
},
{
flags: FileFlags(64),
expected: "g",
},
{
flags: FileFlags(17),
expected: "cn",
},
{
flags: FileFlags(4096),
expected: "a",
},
}
for _, test := range tests {
t.Run(test.expected, func(t *testing.T) {
assert.Equal(t, test.expected, test.flags.String())
})
}
}
93 changes: 68 additions & 25 deletions pkg/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,30 +21,36 @@ type PackageInfo struct {
}

type FileInfo struct {
Path string
Mode uint16
SHA256 string
Size int32
Path string
Mode uint16
SHA256 string
Size int32
Username string
Groupname string
Flags FileFlags
}

const (
// rpmTag_e
// ref. https://github.com/rpm-software-management/rpm/blob/rpm-4.11.3-release/lib/rpmtag.h#L28
RPMTAG_NAME = 1000 /* s */
RPMTAG_VERSION = 1001 /* s */
RPMTAG_RELEASE = 1002 /* s */
RPMTAG_EPOCH = 1003 /* i */
RPMTAG_ARCH = 1022 /* s */
RPMTAG_SOURCERPM = 1044 /* s */
RPMTAG_SIZE = 1009 /* i */
RPMTAG_LICENSE = 1014 /* s */
RPMTAG_VENDOR = 1011 /* s */
RPMTAG_DIRINDEXES = 1116 /* i[] */
RPMTAG_BASENAMES = 1117 /* s[] */
RPMTAG_DIRNAMES = 1118 /* s[] */
RPMTAG_FILESIZES = 1028 /* i[] */
RPMTAG_FILEMODES = 1030 /* h[] , specifically []uint16 (ref https://github.com/rpm-software-management/rpm/blob/2153fa4ae51a84547129b8ebb3bb396e1737020e/lib/rpmtypes.h#L53 )*/
RPMTAG_FILEDIGESTS = 1035 /* s[] */
RPMTAG_NAME = 1000 /* s */
RPMTAG_VERSION = 1001 /* s */
RPMTAG_RELEASE = 1002 /* s */
RPMTAG_EPOCH = 1003 /* i */
RPMTAG_ARCH = 1022 /* s */
RPMTAG_SOURCERPM = 1044 /* s */
RPMTAG_SIZE = 1009 /* i */
RPMTAG_LICENSE = 1014 /* s */
RPMTAG_VENDOR = 1011 /* s */
RPMTAG_DIRINDEXES = 1116 /* i[] */
RPMTAG_BASENAMES = 1117 /* s[] */
RPMTAG_DIRNAMES = 1118 /* s[] */
RPMTAG_FILESIZES = 1028 /* i[] */
RPMTAG_FILEMODES = 1030 /* h[] , specifically []uint16 (ref https://github.com/rpm-software-management/rpm/blob/2153fa4ae51a84547129b8ebb3bb396e1737020e/lib/rpmtypes.h#L53 )*/
RPMTAG_FILEDIGESTS = 1035 /* s[] */
RPMTAG_FILEFLAGS = 1037 /* i[] */
RPMTAG_FILEUSERNAME = 1039 /* s[] */
RPMTAG_FILEGROUPNAME = 1040 /* s[] */

//rpmTagType_e
// ref. https://github.com/rpm-software-management/rpm/blob/rpm-4.11.3-release/lib/rpmtag.h#L362
Expand Down Expand Up @@ -199,6 +205,9 @@ func getFileInfo(indexEntries []indexEntry) ([]FileInfo, error) {
var allFileDigests []string
var allFileModes []uint16
var allFileSizes []int32
var allFileFlags []int32
var allUserNames []string
var allGroupNames []string

for _, indexEntry := range indexEntries {
switch indexEntry.Info.Tag {
Expand All @@ -212,6 +221,15 @@ func getFileInfo(indexEntries []indexEntry) ([]FileInfo, error) {
if err != nil {
return nil, xerrors.Errorf("failed to parse file-sizes: %w", err)
}
case RPMTAG_FILEFLAGS:
// note: there is no distinction between int32, uint32, and []uint32
if indexEntry.Info.Type != RPM_INT32_TYPE {
return nil, xerrors.New("invalid tag file-flags")
}
allFileFlags, err = parseInt32Array(indexEntry.Data, indexEntry.Length)
if err != nil {
return nil, xerrors.Errorf("failed to parse file-flags: %w", err)
}
case RPMTAG_FILEDIGESTS:
if indexEntry.Info.Type != RPM_STRING_ARRAY_TYPE {
return nil, xerrors.New("invalid tag file-digests")
Expand All @@ -231,6 +249,16 @@ func getFileInfo(indexEntries []indexEntry) ([]FileInfo, error) {
return nil, xerrors.New("invalid tag basenames")
}
allBasenames = parseStringArray(indexEntry.Data)
case RPMTAG_FILEUSERNAME:
if indexEntry.Info.Type != RPM_STRING_ARRAY_TYPE {
return nil, xerrors.New("invalid tag usernames")
}
allUserNames = parseStringArray(indexEntry.Data)
case RPMTAG_FILEGROUPNAME:
if indexEntry.Info.Type != RPM_STRING_ARRAY_TYPE {
return nil, xerrors.New("invalid tag groupnames")
}
allGroupNames = parseStringArray(indexEntry.Data)
case RPMTAG_DIRNAMES:
if indexEntry.Info.Type != RPM_STRING_ARRAY_TYPE {
return nil, xerrors.New("invalid tag dir-names")
Expand All @@ -252,9 +280,9 @@ func getFileInfo(indexEntries []indexEntry) ([]FileInfo, error) {
var files []FileInfo
if allDirs != nil && allDirIndexes != nil {
for i, file := range allBasenames {
var digest string
var digest, username, groupname string
var mode uint16
var size int32
var size, flags int32

if allFileDigests != nil && len(allFileDigests) > i {
digest = allFileDigests[i]
Expand All @@ -268,11 +296,26 @@ func getFileInfo(indexEntries []indexEntry) ([]FileInfo, error) {
size = allFileSizes[i]
}

if allUserNames != nil && len(allUserNames) > i {
username = allUserNames[i]
}

if allGroupNames != nil && len(allGroupNames) > i {
groupname = allGroupNames[i]
}

if allFileFlags != nil && len(allFileFlags) > i {
flags = allFileFlags[i]
}

record := FileInfo{
Path: allDirs[allDirIndexes[i]] + file,
Mode: mode,
SHA256: digest,
Size: size,
Path: allDirs[allDirIndexes[i]] + file,
Mode: mode,
SHA256: digest,
Size: size,
Username: username,
Groupname: groupname,
Flags: FileFlags(flags),
}
files = append(files, record)
}
Expand Down
68 changes: 34 additions & 34 deletions pkg/rpmdb_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,47 +103,47 @@ func TestPackageFileList(t *testing.T) {
file: "testdata/centos6-plain/Packages",
fileList: map[string][]FileInfo{
"libffi": {
{Path: "/usr/lib64/libffi.so.5", Mode: 41471, SHA256: "", Size: 15},
{Path: "/usr/lib64/libffi.so.5.0.6", Mode: 33261, SHA256: "2009cab32d65011e653d7c87b49ad74541484467b3dc96be05bb2198b6c7a730", Size: 31720},
{Path: "/usr/share/doc/libffi-3.0.5", Mode: 16877, SHA256: "", Size: 4096},
{Path: "/usr/share/doc/libffi-3.0.5/LICENSE", Mode: 33188, SHA256: "b0421fa2fcb17d5d603cc46c66d69a8d943a03d48edbdfd672f24068bf6b2b65", Size: 1119},
{Path: "/usr/share/doc/libffi-3.0.5/README", Mode: 33188, SHA256: "d8a1231d9090231272d547f7a7ee922298c20d34d4c79772f5ed4badc3a86f8d", Size: 10042},
{Path: "/usr/lib64/libffi.so.5", Mode: 41471, SHA256: "", Size: 15, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/lib64/libffi.so.5.0.6", Mode: 33261, SHA256: "2009cab32d65011e653d7c87b49ad74541484467b3dc96be05bb2198b6c7a730", Size: 31720, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/share/doc/libffi-3.0.5", Mode: 16877, SHA256: "", Size: 4096, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/share/doc/libffi-3.0.5/LICENSE", Mode: 33188, SHA256: "b0421fa2fcb17d5d603cc46c66d69a8d943a03d48edbdfd672f24068bf6b2b65", Size: 1119, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/doc/libffi-3.0.5/README", Mode: 33188, SHA256: "d8a1231d9090231272d547f7a7ee922298c20d34d4c79772f5ed4badc3a86f8d", Size: 10042, Username: "root", Groupname: "root", Flags: 2},
},
},
},
{
file: "testdata/centos7-plain/Packages",
fileList: map[string][]FileInfo{
"ncurses": {
{Path: "/usr/bin/captoinfo", Mode: 41471, SHA256: "", Size: 3},
{Path: "/usr/bin/clear", Mode: 33261, SHA256: "68353b0b989463d9e202362c843ee42c408dd1e08dd5e8e93733753749a96208", Size: 7192},
{Path: "/usr/bin/infocmp", Mode: 33261, SHA256: "469fd67a3bdc7967a4c05b39a1b9a87635448520a619e608e702310480cef153", Size: 57416},
{Path: "/usr/bin/infotocap", Mode: 41471, SHA256: "", Size: 3},
{Path: "/usr/bin/reset", Mode: 41471, SHA256: "", Size: 4},
{Path: "/usr/bin/tabs", Mode: 33261, SHA256: "85a7fb2d93019eb9ff1dd907dc649e9be5a49c704a26d94572418aea77affe46", Size: 15680},
{Path: "/usr/bin/tic", Mode: 33261, SHA256: "df2ea23f0fdcd9a13a846de6d1880197d2fd60afe7b9b2945aa77f8595137a0c", Size: 65800},
{Path: "/usr/bin/toe", Mode: 33261, SHA256: "b6cad57397f83d187c1361daf20d2b6a59982f9aa553a95d659edebe3116d26a", Size: 15800},
{Path: "/usr/bin/tput", Mode: 33261, SHA256: "737da2a672c9ac17f86ebba733d316639365ad8459e16939fa03faea8e7d720f", Size: 15784},
{Path: "/usr/bin/tset", Mode: 33261, SHA256: "50fa6ec48545da72f5c92040a39fbacb61ff1e45e14f9998a281b6c3285564c1", Size: 20072},
{Path: "/usr/share/doc/ncurses-5.9", Mode: 16877, SHA256: "", Size: 75},
{Path: "/usr/share/doc/ncurses-5.9/ANNOUNCE", Mode: 33188, SHA256: "1694388b7f5ce0819e1f8fd1c2b40979e82df58541ceb0c8b60c683f29378b78", Size: 13750},
{Path: "/usr/share/doc/ncurses-5.9/AUTHORS", Mode: 33188, SHA256: "5e59823796c266525a92a6cd31bf144603a7d1b65362e48aa85e74a2b8093d50", Size: 2529},
{Path: "/usr/share/doc/ncurses-5.9/NEWS.bz2", Mode: 33188, SHA256: "bb48de080557f81b9626ebd0baf48e559ae241dace93d57b7d618a441f8737fb", Size: 131412},
{Path: "/usr/share/doc/ncurses-5.9/README", Mode: 33188, SHA256: "37e56186af1edbc4b0c41b85e224295fe2ef114399a488651ebc658f57bf80c7", Size: 10212},
{Path: "/usr/share/doc/ncurses-5.9/TO-DO", Mode: 33188, SHA256: "9a40247610befa57d2c47d0fcd5d3ff3587edad07287f17a8279b98e4221692a", Size: 9651},
{Path: "/usr/share/man/man1/captoinfo.1m.gz", Mode: 33188, SHA256: "40940eef25e38baaaa2ceb1cd7edb3508718400846485ed6f5c1e13bba1f1a34", Size: 2904},
{Path: "/usr/share/man/man1/clear.1.gz", Mode: 33188, SHA256: "1ce7d795bb239d39ca5e11808f0766b456766ad1a914c6097beb7f9c8af638b9", Size: 1262},
{Path: "/usr/share/man/man1/infocmp.1m.gz", Mode: 33188, SHA256: "2649e8bf304f00eb5624293515c4bd6eb7c7f847f33c3308dd8b76c5e44122dd", Size: 6952},
{Path: "/usr/share/man/man1/infotocap.1m.gz", Mode: 33188, SHA256: "edd4d4bb4d79044d32f3422d5ba1e15302769b8a9a5e2fe0f8ce13967443bc25", Size: 1579},
{Path: "/usr/share/man/man1/reset.1.gz", Mode: 41471, SHA256: "", Size: 9},
{Path: "/usr/share/man/man1/tabs.1.gz", Mode: 33188, SHA256: "d9841dc62123346f2973dafb79874f794690f88725135a4d21805284cb973492", Size: 2253},
{Path: "/usr/share/man/man1/tic.1m.gz", Mode: 33188, SHA256: "a5f8512a7a0e252225bd18efd0bcdbcee752e9bf5d539aef5948d3ab9230da8e", Size: 5677},
{Path: "/usr/share/man/man1/toe.1m.gz", Mode: 33188, SHA256: "ca295431aa6b43954409c314bb15687dfc93b95ad8fbd5fcc183bd205008f995", Size: 1874},
{Path: "/usr/share/man/man1/tput.1.gz", Mode: 33188, SHA256: "2f0d53ffbf8bef6d1a932a9955701ada4842f133ecdfb5b324604a703376bd2f", Size: 4529},
{Path: "/usr/share/man/man1/tset.1.gz", Mode: 33188, SHA256: "7a2332f6d2305af034eafc9c94ed427f5d63c12087f611c4a499546fa9240a9c", Size: 4907},
{Path: "/usr/share/man/man5/term.5.gz", Mode: 33188, SHA256: "0d53e8274fcd0c91ec79d1c7911c68d6993025335f0ed688413c38cf80edb04a", Size: 4431},
{Path: "/usr/share/man/man5/terminfo.5.gz", Mode: 33188, SHA256: "c94c45d9713db4c2380b53fc5130e41ec3034e256a0cfc6f523676a49cf7f02e", Size: 33598},
{Path: "/usr/share/man/man7/term.7.gz", Mode: 33188, SHA256: "29346e334d22d23120a45e692b0dc8f2d8262ef077149dbac3f775fbe0c9125d", Size: 4114},
{Path: "/usr/bin/captoinfo", Mode: 41471, SHA256: "", Size: 3, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/bin/clear", Mode: 33261, SHA256: "68353b0b989463d9e202362c843ee42c408dd1e08dd5e8e93733753749a96208", Size: 7192, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/bin/infocmp", Mode: 33261, SHA256: "469fd67a3bdc7967a4c05b39a1b9a87635448520a619e608e702310480cef153", Size: 57416, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/bin/infotocap", Mode: 41471, SHA256: "", Size: 3, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/bin/reset", Mode: 41471, SHA256: "", Size: 4, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/bin/tabs", Mode: 33261, SHA256: "85a7fb2d93019eb9ff1dd907dc649e9be5a49c704a26d94572418aea77affe46", Size: 15680, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/bin/tic", Mode: 33261, SHA256: "df2ea23f0fdcd9a13a846de6d1880197d2fd60afe7b9b2945aa77f8595137a0c", Size: 65800, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/bin/toe", Mode: 33261, SHA256: "b6cad57397f83d187c1361daf20d2b6a59982f9aa553a95d659edebe3116d26a", Size: 15800, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/bin/tput", Mode: 33261, SHA256: "737da2a672c9ac17f86ebba733d316639365ad8459e16939fa03faea8e7d720f", Size: 15784, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/bin/tset", Mode: 33261, SHA256: "50fa6ec48545da72f5c92040a39fbacb61ff1e45e14f9998a281b6c3285564c1", Size: 20072, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/share/doc/ncurses-5.9", Mode: 16877, SHA256: "", Size: 75, Username: "root", Groupname: "root", Flags: 0},
{Path: "/usr/share/doc/ncurses-5.9/ANNOUNCE", Mode: 33188, SHA256: "1694388b7f5ce0819e1f8fd1c2b40979e82df58541ceb0c8b60c683f29378b78", Size: 13750, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/doc/ncurses-5.9/AUTHORS", Mode: 33188, SHA256: "5e59823796c266525a92a6cd31bf144603a7d1b65362e48aa85e74a2b8093d50", Size: 2529, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/doc/ncurses-5.9/NEWS.bz2", Mode: 33188, SHA256: "bb48de080557f81b9626ebd0baf48e559ae241dace93d57b7d618a441f8737fb", Size: 131412, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/doc/ncurses-5.9/README", Mode: 33188, SHA256: "37e56186af1edbc4b0c41b85e224295fe2ef114399a488651ebc658f57bf80c7", Size: 10212, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/doc/ncurses-5.9/TO-DO", Mode: 33188, SHA256: "9a40247610befa57d2c47d0fcd5d3ff3587edad07287f17a8279b98e4221692a", Size: 9651, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/man/man1/captoinfo.1m.gz", Mode: 33188, SHA256: "40940eef25e38baaaa2ceb1cd7edb3508718400846485ed6f5c1e13bba1f1a34", Size: 2904, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/man/man1/clear.1.gz", Mode: 33188, SHA256: "1ce7d795bb239d39ca5e11808f0766b456766ad1a914c6097beb7f9c8af638b9", Size: 1262, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/man/man1/infocmp.1m.gz", Mode: 33188, SHA256: "2649e8bf304f00eb5624293515c4bd6eb7c7f847f33c3308dd8b76c5e44122dd", Size: 6952, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/man/man1/infotocap.1m.gz", Mode: 33188, SHA256: "edd4d4bb4d79044d32f3422d5ba1e15302769b8a9a5e2fe0f8ce13967443bc25", Size: 1579, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/man/man1/reset.1.gz", Mode: 41471, SHA256: "", Size: 9, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/man/man1/tabs.1.gz", Mode: 33188, SHA256: "d9841dc62123346f2973dafb79874f794690f88725135a4d21805284cb973492", Size: 2253, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/man/man1/tic.1m.gz", Mode: 33188, SHA256: "a5f8512a7a0e252225bd18efd0bcdbcee752e9bf5d539aef5948d3ab9230da8e", Size: 5677, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/man/man1/toe.1m.gz", Mode: 33188, SHA256: "ca295431aa6b43954409c314bb15687dfc93b95ad8fbd5fcc183bd205008f995", Size: 1874, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/man/man1/tput.1.gz", Mode: 33188, SHA256: "2f0d53ffbf8bef6d1a932a9955701ada4842f133ecdfb5b324604a703376bd2f", Size: 4529, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/man/man1/tset.1.gz", Mode: 33188, SHA256: "7a2332f6d2305af034eafc9c94ed427f5d63c12087f611c4a499546fa9240a9c", Size: 4907, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/man/man5/term.5.gz", Mode: 33188, SHA256: "0d53e8274fcd0c91ec79d1c7911c68d6993025335f0ed688413c38cf80edb04a", Size: 4431, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/man/man5/terminfo.5.gz", Mode: 33188, SHA256: "c94c45d9713db4c2380b53fc5130e41ec3034e256a0cfc6f523676a49cf7f02e", Size: 33598, Username: "root", Groupname: "root", Flags: 2},
{Path: "/usr/share/man/man7/term.7.gz", Mode: 33188, SHA256: "29346e334d22d23120a45e692b0dc8f2d8262ef077149dbac3f775fbe0c9125d", Size: 4114, Username: "root", Groupname: "root", Flags: 2},
},
},
},
Expand Down

0 comments on commit 8decccf

Please sign in to comment.