File: osfiler.go

package info (click to toggle)
golang-github-cznic-lldb 1.0.1-1.1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 708 kB
  • sloc: makefile: 46
file content (130 lines) | stat: -rw-r--r-- 2,521 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// Copyright 2014 The lldb Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package lldb

import (
	"io"
	"os"

	"github.com/cznic/mathutil"
)

var _ Filer = (*OSFiler)(nil)

// OSFile is an os.File like minimal set of methods allowing to construct a
// Filer.
type OSFile interface {
	Name() string
	Stat() (fi os.FileInfo, err error)
	Sync() (err error)
	Truncate(size int64) (err error)
	io.Closer
	io.Reader
	io.ReaderAt
	io.Seeker
	io.Writer
	io.WriterAt
}

// OSFiler is like a SimpleFileFiler but based on an OSFile.
type OSFiler struct {
	f    OSFile
	nest int
	size int64 // not set if < 0
}

// NewOSFiler returns a Filer from an OSFile. This Filer is like the
// SimpleFileFiler, it does not implement the transaction related methods.
func NewOSFiler(f OSFile) (r *OSFiler) {
	return &OSFiler{
		f:    f,
		size: -1,
	}
}

// BeginUpdate implements Filer.
func (f *OSFiler) BeginUpdate() (err error) {
	f.nest++
	return nil
}

// Close implements Filer.
func (f *OSFiler) Close() (err error) {
	if f.nest != 0 {
		return &ErrPERM{(f.Name() + ":Close")}
	}

	return f.f.Close()
}

// EndUpdate implements Filer.
func (f *OSFiler) EndUpdate() (err error) {
	if f.nest == 0 {
		return &ErrPERM{(f.Name() + ":EndUpdate")}
	}

	f.nest--
	return
}

// Name implements Filer.
func (f *OSFiler) Name() string {
	return f.f.Name()
}

// PunchHole implements Filer.
func (f *OSFiler) PunchHole(off, size int64) (err error) {
	return
}

// ReadAt implements Filer.
func (f *OSFiler) ReadAt(b []byte, off int64) (n int, err error) {
	return f.f.ReadAt(b, off)
}

// Rollback implements Filer.
func (f *OSFiler) Rollback() (err error) { return }

// Size implements Filer.
func (f *OSFiler) Size() (n int64, err error) {
	if f.size < 0 { // boot
		fi, err := f.f.Stat()
		if err != nil {
			return 0, err
		}

		f.size = fi.Size()
	}
	return f.size, nil
}

// Sync implements Filer.
func (f *OSFiler) Sync() (err error) {
	return f.f.Sync()
}

// Truncate implements Filer.
func (f *OSFiler) Truncate(size int64) (err error) {
	if size < 0 {
		return &ErrINVAL{"Truncate size", size}
	}

	f.size = size
	return f.f.Truncate(size)
}

// WriteAt implements Filer.
func (f *OSFiler) WriteAt(b []byte, off int64) (n int, err error) {
	if f.size < 0 { // boot
		fi, err := os.Stat(f.f.Name())
		if err != nil {
			return 0, err
		}

		f.size = fi.Size()
	}
	f.size = mathutil.MaxInt64(f.size, int64(len(b))+off)
	return f.f.WriteAt(b, off)
}