From 71d08324ed0f842228ee8aa966736a157b4a2422 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 26 Sep 2017 10:50:57 -0700 Subject: [PATCH] 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 TryBot-Result: Gobot Gobot Reviewed-by: Joe Tsai --- src/time/sys_plan9.go | 34 ++++------------------------------ src/time/sys_unix.go | 34 ++++------------------------------ src/time/sys_windows.go | 34 ++++------------------------------ src/time/zoneinfo_read.go | 30 ++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 90 deletions(-) diff --git a/src/time/sys_plan9.go b/src/time/sys_plan9.go index 9086a6e835..b7fba0802c 100644 --- a/src/time/sys_plan9.go +++ b/src/time/sys_plan9.go @@ -16,36 +16,6 @@ func interrupt() { // cannot predict pid, don't want to kill group } -// readFile reads and returns the content of the named file. -// It is a trivial implementation of ioutil.ReadFile, reimplemented -// here to avoid depending on io/ioutil or os. -// It returns an error if name exceeds maxFileSize bytes. -func readFile(name string) ([]byte, error) { - f, err := syscall.Open(name, syscall.O_RDONLY) - if err != nil { - return nil, err - } - defer syscall.Close(f) - var ( - buf [4096]byte - ret []byte - n int - ) - for { - n, err = syscall.Read(f, buf[:]) - if n > 0 { - ret = append(ret, buf[:n]...) - } - if n == 0 || err != nil { - break - } - if len(ret) > maxFileSize { - return nil, fileSizeError(name) - } - } - return ret, err -} - func open(name string) (uintptr, error) { fd, err := syscall.Open(name, syscall.O_RDONLY) if err != nil { @@ -54,6 +24,10 @@ func open(name string) (uintptr, error) { return uintptr(fd), nil } +func read(fd uintptr, buf []byte) (int, error) { + return syscall.Read(int(fd), buf) +} + func closefd(fd uintptr) { syscall.Close(int(fd)) } diff --git a/src/time/sys_unix.go b/src/time/sys_unix.go index bb44b84b37..0ef597fd9b 100644 --- a/src/time/sys_unix.go +++ b/src/time/sys_unix.go @@ -16,36 +16,6 @@ func interrupt() { syscall.Kill(syscall.Getpid(), syscall.SIGCHLD) } -// readFile reads and returns the content of the named file. -// It is a trivial implementation of ioutil.ReadFile, reimplemented -// here to avoid depending on io/ioutil or os. -// It returns an error if name exceeds maxFileSize bytes. -func readFile(name string) ([]byte, error) { - f, err := syscall.Open(name, syscall.O_RDONLY, 0) - if err != nil { - return nil, err - } - defer syscall.Close(f) - var ( - buf [4096]byte - ret []byte - n int - ) - for { - n, err = syscall.Read(f, buf[:]) - if n > 0 { - ret = append(ret, buf[:n]...) - } - if n == 0 || err != nil { - break - } - if len(ret) > maxFileSize { - return nil, fileSizeError(name) - } - } - return ret, err -} - func open(name string) (uintptr, error) { fd, err := syscall.Open(name, syscall.O_RDONLY, 0) if err != nil { @@ -54,6 +24,10 @@ func open(name string) (uintptr, error) { return uintptr(fd), nil } +func read(fd uintptr, buf []byte) (int, error) { + return syscall.Read(int(fd), buf) +} + func closefd(fd uintptr) { syscall.Close(int(fd)) } diff --git a/src/time/sys_windows.go b/src/time/sys_windows.go index 9e38165393..481aea562e 100644 --- a/src/time/sys_windows.go +++ b/src/time/sys_windows.go @@ -13,36 +13,6 @@ import ( func interrupt() { } -// readFile reads and returns the content of the named file. -// It is a trivial implementation of ioutil.ReadFile, reimplemented -// here to avoid depending on io/ioutil or os. -// It returns an error if name exceeds maxFileSize bytes. -func readFile(name string) ([]byte, error) { - f, err := syscall.Open(name, syscall.O_RDONLY, 0) - if err != nil { - return nil, err - } - defer syscall.Close(f) - var ( - buf [4096]byte - ret []byte - n int - ) - for { - n, err = syscall.Read(f, buf[:]) - if n > 0 { - ret = append(ret, buf[:n]...) - } - if n == 0 || err != nil { - break - } - if len(ret) > maxFileSize { - return nil, fileSizeError(name) - } - } - return ret, err -} - func open(name string) (uintptr, error) { fd, err := syscall.Open(name, syscall.O_RDONLY, 0) if err != nil { @@ -51,6 +21,10 @@ func open(name string) (uintptr, error) { return uintptr(fd), nil } +func read(fd uintptr, buf []byte) (int, error) { + return syscall.Read(syscall.Handle(fd), buf) +} + func closefd(fd uintptr) { syscall.Close(syscall.Handle(fd)) } diff --git a/src/time/zoneinfo_read.go b/src/time/zoneinfo_read.go index 191fabb409..eaaaf1f2b4 100644 --- a/src/time/zoneinfo_read.go +++ b/src/time/zoneinfo_read.go @@ -403,3 +403,33 @@ func loadLocation(name string, sources []string) (z *Location, firstErr error) { } return nil, errors.New("unknown time zone " + name) } + +// readFile reads and returns the content of the named file. +// It is a trivial implementation of ioutil.ReadFile, reimplemented +// here to avoid depending on io/ioutil or os. +// It returns an error if name exceeds maxFileSize bytes. +func readFile(name string) ([]byte, error) { + f, err := open(name) + if err != nil { + return nil, err + } + defer closefd(f) + var ( + buf [4096]byte + ret []byte + n int + ) + for { + n, err = read(f, buf[:]) + if n > 0 { + ret = append(ret, buf[:n]...) + } + if n == 0 || err != nil { + break + } + if len(ret) > maxFileSize { + return nil, fileSizeError(name) + } + } + return ret, err +} -- 2.48.1