@@ -4,8 +4,11 @@ import (
4
4
"bytes"
5
5
"fmt"
6
6
"io"
7
+ "os"
7
8
"sort"
8
9
"strings"
10
+
11
+ "github.com/kaz/patchwork/overlay"
9
12
)
10
13
11
14
const (
@@ -32,6 +35,25 @@ func NewImage(dev Device) *Image {
32
35
return & Image {dev }
33
36
}
34
37
38
+ // Create instance from image file. Changes will be applied directly.
39
+ // If you prefer to avoid change original file, use NewOverlayedImageFromFile instead.
40
+ func NewImageFromFile (file string ) (* Image , * os.File , error ) {
41
+ fh , err := os .OpenFile (file , os .O_RDWR , 0644 )
42
+ if err != nil {
43
+ return nil , nil , fmt .Errorf ("failed to open file: %w" , err )
44
+ }
45
+ return NewImage (fh ), fh , nil
46
+ }
47
+
48
+ // Create instance from image file with overlay reader as a device. Changes won't be applied to original file.
49
+ func NewOverlayedImageFromFile (file string ) (* Image , * overlay.Overlay , error ) {
50
+ ol , err := overlay .NewFromFile (file )
51
+ if err != nil {
52
+ return nil , nil , fmt .Errorf ("failed to initialize overlay: %w" , err )
53
+ }
54
+ return & Image {ol }, ol , nil
55
+ }
56
+
35
57
func (img * Image ) setExtent (r * directoryRecord , buf []byte ) error {
36
58
if n , err := img .dev .WriteAt (buf , int64 (r .ExtentLocation * SECTOR_SIZE )); err != nil {
37
59
return fmt .Errorf ("failed to write data to image: %w" , err )
0 commit comments