Home | History | Annotate | Download | only in time
      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 
      5 // +build plan9
      6 
      7 package time
      8 
      9 import (
     10 	"errors"
     11 	"syscall"
     12 )
     13 
     14 // for testing: whatever interrupts a sleep
     15 func interrupt() {
     16 	// cannot predict pid, don't want to kill group
     17 }
     18 
     19 func open(name string) (uintptr, error) {
     20 	fd, err := syscall.Open(name, syscall.O_RDONLY)
     21 	if err != nil {
     22 		return 0, err
     23 	}
     24 	return uintptr(fd), nil
     25 }
     26 
     27 func read(fd uintptr, buf []byte) (int, error) {
     28 	return syscall.Read(int(fd), buf)
     29 }
     30 
     31 func closefd(fd uintptr) {
     32 	syscall.Close(int(fd))
     33 }
     34 
     35 func preadn(fd uintptr, buf []byte, off int) error {
     36 	whence := seekStart
     37 	if off < 0 {
     38 		whence = seekEnd
     39 	}
     40 	if _, err := syscall.Seek(int(fd), int64(off), whence); err != nil {
     41 		return err
     42 	}
     43 	for len(buf) > 0 {
     44 		m, err := syscall.Read(int(fd), buf)
     45 		if m <= 0 {
     46 			if err == nil {
     47 				return errors.New("short read")
     48 			}
     49 			return err
     50 		}
     51 		buf = buf[m:]
     52 	}
     53 	return nil
     54 }
     55