Skip to content

Commit 71d0832

Browse files
time: unify three readFile implementations into one
Undoes this part of https://golang.org/cl/5447061 by using the OS-specific open and close functions, and adding a read function. Change-Id: If37ef43eb5df8554fc03f3922bbc2f785129bb9c Reviewed-on: https://go-review.googlesource.com/66271 Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Joe Tsai <[email protected]>
1 parent 7340d13 commit 71d0832

File tree

4 files changed

+42
-90
lines changed

4 files changed

+42
-90
lines changed

src/time/sys_plan9.go

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,36 +16,6 @@ func interrupt() {
1616
// cannot predict pid, don't want to kill group
1717
}
1818

19-
// readFile reads and returns the content of the named file.
20-
// It is a trivial implementation of ioutil.ReadFile, reimplemented
21-
// here to avoid depending on io/ioutil or os.
22-
// It returns an error if name exceeds maxFileSize bytes.
23-
func readFile(name string) ([]byte, error) {
24-
f, err := syscall.Open(name, syscall.O_RDONLY)
25-
if err != nil {
26-
return nil, err
27-
}
28-
defer syscall.Close(f)
29-
var (
30-
buf [4096]byte
31-
ret []byte
32-
n int
33-
)
34-
for {
35-
n, err = syscall.Read(f, buf[:])
36-
if n > 0 {
37-
ret = append(ret, buf[:n]...)
38-
}
39-
if n == 0 || err != nil {
40-
break
41-
}
42-
if len(ret) > maxFileSize {
43-
return nil, fileSizeError(name)
44-
}
45-
}
46-
return ret, err
47-
}
48-
4919
func open(name string) (uintptr, error) {
5020
fd, err := syscall.Open(name, syscall.O_RDONLY)
5121
if err != nil {
@@ -54,6 +24,10 @@ func open(name string) (uintptr, error) {
5424
return uintptr(fd), nil
5525
}
5626

27+
func read(fd uintptr, buf []byte) (int, error) {
28+
return syscall.Read(int(fd), buf)
29+
}
30+
5731
func closefd(fd uintptr) {
5832
syscall.Close(int(fd))
5933
}

src/time/sys_unix.go

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,36 +16,6 @@ func interrupt() {
1616
syscall.Kill(syscall.Getpid(), syscall.SIGCHLD)
1717
}
1818

19-
// readFile reads and returns the content of the named file.
20-
// It is a trivial implementation of ioutil.ReadFile, reimplemented
21-
// here to avoid depending on io/ioutil or os.
22-
// It returns an error if name exceeds maxFileSize bytes.
23-
func readFile(name string) ([]byte, error) {
24-
f, err := syscall.Open(name, syscall.O_RDONLY, 0)
25-
if err != nil {
26-
return nil, err
27-
}
28-
defer syscall.Close(f)
29-
var (
30-
buf [4096]byte
31-
ret []byte
32-
n int
33-
)
34-
for {
35-
n, err = syscall.Read(f, buf[:])
36-
if n > 0 {
37-
ret = append(ret, buf[:n]...)
38-
}
39-
if n == 0 || err != nil {
40-
break
41-
}
42-
if len(ret) > maxFileSize {
43-
return nil, fileSizeError(name)
44-
}
45-
}
46-
return ret, err
47-
}
48-
4919
func open(name string) (uintptr, error) {
5020
fd, err := syscall.Open(name, syscall.O_RDONLY, 0)
5121
if err != nil {
@@ -54,6 +24,10 @@ func open(name string) (uintptr, error) {
5424
return uintptr(fd), nil
5525
}
5626

27+
func read(fd uintptr, buf []byte) (int, error) {
28+
return syscall.Read(int(fd), buf)
29+
}
30+
5731
func closefd(fd uintptr) {
5832
syscall.Close(int(fd))
5933
}

src/time/sys_windows.go

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,36 +13,6 @@ import (
1313
func interrupt() {
1414
}
1515

16-
// readFile reads and returns the content of the named file.
17-
// It is a trivial implementation of ioutil.ReadFile, reimplemented
18-
// here to avoid depending on io/ioutil or os.
19-
// It returns an error if name exceeds maxFileSize bytes.
20-
func readFile(name string) ([]byte, error) {
21-
f, err := syscall.Open(name, syscall.O_RDONLY, 0)
22-
if err != nil {
23-
return nil, err
24-
}
25-
defer syscall.Close(f)
26-
var (
27-
buf [4096]byte
28-
ret []byte
29-
n int
30-
)
31-
for {
32-
n, err = syscall.Read(f, buf[:])
33-
if n > 0 {
34-
ret = append(ret, buf[:n]...)
35-
}
36-
if n == 0 || err != nil {
37-
break
38-
}
39-
if len(ret) > maxFileSize {
40-
return nil, fileSizeError(name)
41-
}
42-
}
43-
return ret, err
44-
}
45-
4616
func open(name string) (uintptr, error) {
4717
fd, err := syscall.Open(name, syscall.O_RDONLY, 0)
4818
if err != nil {
@@ -51,6 +21,10 @@ func open(name string) (uintptr, error) {
5121
return uintptr(fd), nil
5222
}
5323

24+
func read(fd uintptr, buf []byte) (int, error) {
25+
return syscall.Read(syscall.Handle(fd), buf)
26+
}
27+
5428
func closefd(fd uintptr) {
5529
syscall.Close(syscall.Handle(fd))
5630
}

src/time/zoneinfo_read.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,3 +403,33 @@ func loadLocation(name string, sources []string) (z *Location, firstErr error) {
403403
}
404404
return nil, errors.New("unknown time zone " + name)
405405
}
406+
407+
// readFile reads and returns the content of the named file.
408+
// It is a trivial implementation of ioutil.ReadFile, reimplemented
409+
// here to avoid depending on io/ioutil or os.
410+
// It returns an error if name exceeds maxFileSize bytes.
411+
func readFile(name string) ([]byte, error) {
412+
f, err := open(name)
413+
if err != nil {
414+
return nil, err
415+
}
416+
defer closefd(f)
417+
var (
418+
buf [4096]byte
419+
ret []byte
420+
n int
421+
)
422+
for {
423+
n, err = read(f, buf[:])
424+
if n > 0 {
425+
ret = append(ret, buf[:n]...)
426+
}
427+
if n == 0 || err != nil {
428+
break
429+
}
430+
if len(ret) > maxFileSize {
431+
return nil, fileSizeError(name)
432+
}
433+
}
434+
return ret, err
435+
}

0 commit comments

Comments
 (0)