diff --git a/fs/Android.bp b/fs/Android.bp index 68cb88d1e..f4706ca2a 100644 --- a/fs/Android.bp +++ b/fs/Android.bp @@ -22,6 +22,15 @@ bootstrap_go_package { srcs: [ "fs.go", ], + darwin: { + srcs: [ + "fs_darwin.go", + ], + }, + linux: { + srcs: [ + "fs_linux.go", + ], + }, } - diff --git a/fs/fs.go b/fs/fs.go index c6060c008..d8ef5315b 100644 --- a/fs/fs.go +++ b/fs/fs.go @@ -1,4 +1,4 @@ -// Copyright 2016 Google Inc. All rights reserved. +// Copyright 2017 Google Inc. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -24,7 +24,6 @@ import ( "os/user" "path/filepath" "sync" - "syscall" "time" ) @@ -77,33 +76,6 @@ func (osFs) Lstat(path string) (stats os.FileInfo, err error) { return os.Lstat(path) } -func (osFs) InodeNumber(info os.FileInfo) (number uint64, err error) { - sys := info.Sys() - linuxStats, ok := sys.(*syscall.Stat_t) - if ok { - return linuxStats.Ino, nil - } - return 0, fmt.Errorf("%v is not a *syscall.Stat_t", sys) -} - -func (osFs) DeviceNumber(info os.FileInfo) (number uint64, err error) { - sys := info.Sys() - linuxStats, ok := sys.(*syscall.Stat_t) - if ok { - return linuxStats.Dev, nil - } - return 0, fmt.Errorf("%v is not a *syscall.Stat_t", sys) -} - -func (osFs) PermTime(info os.FileInfo) (when time.Time, err error) { - sys := info.Sys() - linuxStats, ok := sys.(*syscall.Stat_t) - if ok { - return time.Unix(linuxStats.Ctim.Sec, linuxStats.Ctim.Nsec), nil - } - return time.Date(0, 0, 0, 0, 0, 0, 0, nil), fmt.Errorf("%v is not a *syscall.Stat_t", sys) -} - func (osFs) ReadDir(path string) (contents []os.FileInfo, err error) { return ioutil.ReadDir(path) } diff --git a/fs/fs_darwin.go b/fs/fs_darwin.go new file mode 100644 index 000000000..c04883584 --- /dev/null +++ b/fs/fs_darwin.go @@ -0,0 +1,49 @@ +// Copyright 2017 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fs + +import ( + "fmt" + "os" + "syscall" + "time" +) + +func (osFs) InodeNumber(info os.FileInfo) (number uint64, err error) { + sys := info.Sys() + darwinStats, ok := sys.(*syscall.Stat_t) + if ok { + return darwinStats.Ino, nil + } + return 0, fmt.Errorf("%v is not a *syscall.Stat_t", sys) +} + +func (osFs) DeviceNumber(info os.FileInfo) (number uint64, err error) { + sys := info.Sys() + darwinStats, ok := sys.(*syscall.Stat_t) + if ok { + return uint64(darwinStats.Dev), nil + } + return 0, fmt.Errorf("%v is not a *syscall.Stat_t", sys) +} + +func (osFs) PermTime(info os.FileInfo) (when time.Time, err error) { + sys := info.Sys() + darwinStats, ok := sys.(*syscall.Stat_t) + if ok { + return time.Unix(darwinStats.Ctimespec.Sec, darwinStats.Ctimespec.Nsec), nil + } + return time.Time{}, fmt.Errorf("%v is not a *syscall.Stat_t", sys) +} diff --git a/fs/fs_linux.go b/fs/fs_linux.go new file mode 100644 index 000000000..0a22a2c95 --- /dev/null +++ b/fs/fs_linux.go @@ -0,0 +1,49 @@ +// Copyright 2017 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fs + +import ( + "fmt" + "os" + "syscall" + "time" +) + +func (osFs) InodeNumber(info os.FileInfo) (number uint64, err error) { + sys := info.Sys() + linuxStats, ok := sys.(*syscall.Stat_t) + if ok { + return linuxStats.Ino, nil + } + return 0, fmt.Errorf("%v is not a *syscall.Stat_t", sys) +} + +func (osFs) DeviceNumber(info os.FileInfo) (number uint64, err error) { + sys := info.Sys() + linuxStats, ok := sys.(*syscall.Stat_t) + if ok { + return linuxStats.Dev, nil + } + return 0, fmt.Errorf("%v is not a *syscall.Stat_t", sys) +} + +func (osFs) PermTime(info os.FileInfo) (when time.Time, err error) { + sys := info.Sys() + linuxStats, ok := sys.(*syscall.Stat_t) + if ok { + return time.Unix(linuxStats.Ctim.Sec, linuxStats.Ctim.Nsec), nil + } + return time.Time{}, fmt.Errorf("%v is not a *syscall.Stat_t", sys) +}