diff options
| author | Ondřej Surý <ondrej@sury.org> | 2011-08-03 16:54:30 +0200 | 
|---|---|---|
| committer | Ondřej Surý <ondrej@sury.org> | 2011-08-03 16:54:30 +0200 | 
| commit | 28592ee1ea1f5cdffcf85472f9de0285d928cf12 (patch) | |
| tree | 32944e18b23f7fe4a0818a694aa2a6dfb1835463 /doc/progs/file_windows.go | |
| parent | e836bee4716dc0d4d913537ad3ad1925a7ac32d0 (diff) | |
| download | golang-28592ee1ea1f5cdffcf85472f9de0285d928cf12.tar.gz | |
Imported Upstream version 59upstream/59
Diffstat (limited to 'doc/progs/file_windows.go')
| -rw-r--r-- | doc/progs/file_windows.go | 89 | 
1 files changed, 89 insertions, 0 deletions
| diff --git a/doc/progs/file_windows.go b/doc/progs/file_windows.go new file mode 100644 index 000000000..d5e7c00d3 --- /dev/null +++ b/doc/progs/file_windows.go @@ -0,0 +1,89 @@ +// 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 file + +import ( +	"os" +	"syscall" +) + +type File struct { +	fd   syscall.Handle    // file descriptor number +	name string // file name at Open time +} + +func newFile(fd syscall.Handle, name string) *File { +	if fd < 0 { +		return nil +	} +	return &File{fd, name} +} + +var ( +	Stdin  = newFile(syscall.Stdin, "/dev/stdin") +	Stdout = newFile(syscall.Stdout, "/dev/stdout") +	Stderr = newFile(syscall.Stderr, "/dev/stderr") +) + +func OpenFile(name string, mode int, perm uint32) (file *File, err os.Error) { +	r, e := syscall.Open(name, mode, perm) +	if e != 0 { +		err = os.Errno(e) +	} +	return newFile(r, name), err +} + +const ( +	O_RDONLY = syscall.O_RDONLY +	O_RDWR   = syscall.O_RDWR +	O_CREATE = syscall.O_CREAT +	O_TRUNC  = syscall.O_TRUNC +) + +func Open(name string) (file *File, err os.Error) { +	return OpenFile(name, O_RDONLY, 0) +} + +func Create(name string) (file *File, err os.Error) { +	return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666) +} + +func (file *File) Close() os.Error { +	if file == nil { +		return os.EINVAL +	} +	e := syscall.Close(file.fd) +	file.fd = syscall.InvalidHandle // so it can't be closed again +	if e != 0 { +		return os.Errno(e) +	} +	return nil +} + +func (file *File) Read(b []byte) (ret int, err os.Error) { +	if file == nil { +		return -1, os.EINVAL +	} +	r, e := syscall.Read(file.fd, b) +	if e != 0 { +		err = os.Errno(e) +	} +	return int(r), err +} + +func (file *File) Write(b []byte) (ret int, err os.Error) { +	if file == nil { +		return -1, os.EINVAL +	} +	r, e := syscall.Write(file.fd, b) +	if e != 0 { +		err = os.Errno(e) +	} +	return int(r), err +} + +func (file *File) String() string { +	return file.name +} | 
