Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
lima-vm
GitHub Repository: lima-vm/lima
Path: blob/master/pkg/iso9660util/iso9660util.go
2621 views
1
// SPDX-FileCopyrightText: Copyright The Lima Authors
2
// SPDX-License-Identifier: Apache-2.0
3
4
package iso9660util
5
6
import (
7
"io"
8
"os"
9
"path"
10
11
"github.com/diskfs/go-diskfs/backend/file"
12
"github.com/diskfs/go-diskfs/filesystem"
13
"github.com/diskfs/go-diskfs/filesystem/iso9660"
14
"github.com/sirupsen/logrus"
15
)
16
17
type Entry struct {
18
Path string
19
Reader io.Reader
20
}
21
22
func Write(isoPath, label string, layout []Entry) error {
23
if err := os.RemoveAll(isoPath); err != nil {
24
return err
25
}
26
27
isoFile, err := os.Create(isoPath)
28
if err != nil {
29
return err
30
}
31
32
backendFile := file.New(isoFile, false)
33
defer isoFile.Close()
34
35
workdir, err := os.MkdirTemp("", "diskfs_iso")
36
if err != nil {
37
return err
38
}
39
logrus.Debugf("Creating iso file %s", isoFile.Name())
40
logrus.Debugf("Using %s as workspace", workdir)
41
fs, err := iso9660.Create(backendFile, 0, 0, 0, workdir)
42
if err != nil {
43
return err
44
}
45
46
for _, f := range layout {
47
if _, err := WriteFile(fs, f.Path, f.Reader); err != nil {
48
return err
49
}
50
}
51
52
finalizeOptions := iso9660.FinalizeOptions{
53
RockRidge: true,
54
VolumeIdentifier: label,
55
}
56
if err := fs.Finalize(finalizeOptions); err != nil {
57
return err
58
}
59
60
return isoFile.Close()
61
}
62
63
func WriteFile(fs filesystem.FileSystem, pathStr string, r io.Reader) (int64, error) {
64
if dir := path.Dir(pathStr); dir != "" && dir != "/" {
65
if err := fs.Mkdir(dir); err != nil {
66
return 0, err
67
}
68
}
69
f, err := fs.OpenFile(pathStr, os.O_CREATE|os.O_RDWR)
70
if err != nil {
71
return 0, err
72
}
73
defer f.Close()
74
return io.Copy(f, r)
75
}
76
77
func IsISO9660(imagePath string) (bool, error) {
78
imageFile, err := os.Open(imagePath)
79
if err != nil {
80
return false, err
81
}
82
defer imageFile.Close()
83
backendFile := file.New(imageFile, true)
84
85
fileInfo, err := imageFile.Stat()
86
if err != nil {
87
return false, err
88
}
89
_, err = iso9660.Read(backendFile, fileInfo.Size(), 0, 0)
90
return err == nil, nil
91
}
92
93