1// Copyright 2011 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package time 6 7import ( 8 "errors" 9 "syscall" 10) 11 12// for testing: whatever interrupts a sleep 13func interrupt() { 14} 15 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. 19func readFile(name string) ([]byte, error) { 20 f, err := syscall.Open(name, syscall.O_RDONLY, 0) 21 if err != nil { 22 return nil, err 23 } 24 defer syscall.Close(f) 25 var ( 26 buf [4096]byte 27 ret []byte 28 n int 29 ) 30 for { 31 n, err = syscall.Read(f, buf[:]) 32 if n > 0 { 33 ret = append(ret, buf[:n]...) 34 } 35 if n == 0 || err != nil { 36 break 37 } 38 } 39 return ret, err 40} 41 42func open(name string) (uintptr, error) { 43 fd, err := syscall.Open(name, syscall.O_RDONLY, 0) 44 if err != nil { 45 return 0, err 46 } 47 return uintptr(fd), nil 48} 49 50func closefd(fd uintptr) { 51 syscall.Close(syscall.Handle(fd)) 52} 53 54func preadn(fd uintptr, buf []byte, off int) error { 55 whence := 0 56 if off < 0 { 57 whence = 2 58 } 59 if _, err := syscall.Seek(syscall.Handle(fd), int64(off), whence); err != nil { 60 return err 61 } 62 for len(buf) > 0 { 63 m, err := syscall.Read(syscall.Handle(fd), buf) 64 if m <= 0 { 65 if err == nil { 66 return errors.New("short read") 67 } 68 return err 69 } 70 buf = buf[m:] 71 } 72 return nil 73} 74