diff options
author | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
---|---|---|
committer | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
commit | f154da9e12608589e8d5f0508f908a0c3e88a1bb (patch) | |
tree | f8255d51e10c6f1e0ed69702200b966c9556a431 /src/os/dir_plan9.go | |
parent | 8d8329ed5dfb9622c82a9fbec6fd99a580f9c9f6 (diff) | |
download | golang-upstream/1.4.tar.gz |
Imported Upstream version 1.4upstream/1.4
Diffstat (limited to 'src/os/dir_plan9.go')
-rw-r--r-- | src/os/dir_plan9.go | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/os/dir_plan9.go b/src/os/dir_plan9.go new file mode 100644 index 000000000..8195c02a4 --- /dev/null +++ b/src/os/dir_plan9.go @@ -0,0 +1,73 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package os + +import ( + "io" + "syscall" +) + +func (file *File) readdir(n int) ([]FileInfo, error) { + // If this file has no dirinfo, create one. + if file.dirinfo == nil { + file.dirinfo = new(dirInfo) + } + d := file.dirinfo + size := n + if size <= 0 { + size = 100 + n = -1 + } + fi := make([]FileInfo, 0, size) // Empty with room to grow. + for n != 0 { + // Refill the buffer if necessary. + if d.bufp >= d.nbuf { + nb, err := file.Read(d.buf[:]) + + // Update the buffer state before checking for errors. + d.bufp, d.nbuf = 0, nb + + if err != nil { + if err == io.EOF { + break + } + return fi, &PathError{"readdir", file.name, err} + } + if nb < syscall.STATFIXLEN { + return fi, &PathError{"readdir", file.name, syscall.ErrShortStat} + } + } + + // Get a record from the buffer. + b := d.buf[d.bufp:] + m := int(uint16(b[0])|uint16(b[1])<<8) + 2 + if m < syscall.STATFIXLEN { + return fi, &PathError{"readdir", file.name, syscall.ErrShortStat} + } + + dir, err := syscall.UnmarshalDir(b[:m]) + if err != nil { + return fi, &PathError{"readdir", file.name, err} + } + fi = append(fi, fileInfoFromStat(dir)) + + d.bufp += m + n-- + } + + if n >= 0 && len(fi) == 0 { + return fi, io.EOF + } + return fi, nil +} + +func (file *File) readdirnames(n int) (names []string, err error) { + fi, err := file.Readdir(n) + names = make([]string, len(fi)) + for i := range fi { + names[i] = fi[i].Name() + } + return +} |