Skip to content

Commit 001bb66

Browse files
committed
get full filename from Rock Ridge NM record
1 parent 51085a0 commit 001bb66

3 files changed

Lines changed: 73 additions & 3 deletions

File tree

image_reader.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ type File struct {
7373

7474
var _ os.FileInfo = &File{}
7575

76+
func (f *File) hasRockRidge() bool {
77+
return f.susp != nil && f.susp.HasRockRidge
78+
}
79+
7680
// IsDir returns true if the entry is a directory or false otherwise
7781
func (f *File) IsDir() bool {
7882
return f.de.FileFlags&dirFlagDir != 0
@@ -94,6 +98,12 @@ func (f *File) Mode() os.FileMode {
9498

9599
// Name returns the base name of the given entry
96100
func (f *File) Name() string {
101+
if f.hasRockRidge() {
102+
if name := f.de.SystemUseEntries.GetRockRidgeName(); name != "" {
103+
return name
104+
}
105+
}
106+
97107
if f.IsDir() {
98108
return f.de.Identifier
99109
}

image_reader_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,15 +144,15 @@ func TestImageReaderSUSP(t *testing.T) {
144144
assert.Len(t, children, 4)
145145

146146
dir1 := children[1]
147-
assert.Equal(t, "DIR1", dir1.Name())
147+
assert.Equal(t, "dir1", dir1.Name())
148148

149149
dir1Children, err := dir1.GetChildren()
150150
assert.NoError(t, err)
151151
assert.Len(t, dir1Children, 1)
152152

153153
// lorem ipsum
154154
loremFile := dir1Children[0]
155-
assert.Equal(t, "LOREM_IP.TXT", loremFile.Name())
155+
assert.Equal(t, "lorem_ipsum.txt", loremFile.Name())
156156
assert.Equal(t, int64(446), loremFile.Size())
157157
assert.NotNil(t, loremFile.susp)
158158
assert.True(t, loremFile.susp.HasRockRidge)
@@ -164,7 +164,6 @@ func TestImageReaderSUSP(t *testing.T) {
164164

165165
assert.Len(t, loremFile.de.SystemUseEntries, 4)
166166
assert.Equal(t, "RR", loremFile.de.SystemUseEntries[0].Type())
167-
assert.Equal(t, "NM", loremFile.de.SystemUseEntries[1].Type())
168167
assert.Equal(t, "PX", loremFile.de.SystemUseEntries[2].Type())
169168
assert.Equal(t, "TF", loremFile.de.SystemUseEntries[3].Type())
170169
}

rockridge.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package iso9660
2+
3+
/* The following types of Rock Ridge records are being handled in some way:
4+
* - [ ] PX (RR 4.1.1: POSIX file attributes)
5+
* - [ ] PN (RR 4.1.2: POSIX device number)
6+
* - [ ] SL (RR 4.1.3: symbolic link)
7+
* - [ ] NM (RR 4.1.4: alternate name)
8+
* - [ ] CL (RR 4.1.5.1: child link)
9+
* - [ ] PL (RR 4.1.5.2: parent link)
10+
* - [ ] RE (RR 4.1.5.3: relocated directory)
11+
* - [ ] TF (RR 4.1.6: time stamp(s) for a file)
12+
* - [ ] SF (RR 4.1.7: file data in sparse file format)
13+
*/
14+
15+
const (
16+
RockRidgeIdentifier = "RRIP_1991A"
17+
RockRidgeVersion = 1
18+
)
19+
20+
type RockRidgeNameEntry struct {
21+
Flags byte
22+
Name string
23+
}
24+
25+
func suspHasRockRidge(se SystemUseEntrySlice) (bool, error) {
26+
extensions, err := se.GetExtensionRecords()
27+
if err != nil {
28+
return false, err
29+
}
30+
31+
for _, entry := range extensions {
32+
if entry.Identifier == RockRidgeIdentifier && entry.Version == RockRidgeVersion {
33+
return true, nil
34+
}
35+
}
36+
37+
return false, nil
38+
}
39+
40+
func (s SystemUseEntrySlice) GetRockRidgeName() string {
41+
var name string
42+
43+
for _, entry := range s {
44+
if entry.Type() == "NM" {
45+
nm := umarshalRockRidgeNameEntry(entry)
46+
name += nm.Name
47+
}
48+
}
49+
50+
return name
51+
}
52+
53+
func umarshalRockRidgeNameEntry(e SystemUseEntry) *RockRidgeNameEntry {
54+
// There is a continuation flag in byte 0, but we determine continuation
55+
// by simply reading all entries.
56+
57+
return &RockRidgeNameEntry{
58+
Flags: e.Data()[0],
59+
Name: string(e.Data()[1:]),
60+
}
61+
}

0 commit comments

Comments
 (0)