diff options
author | Russ Cox <rsc@golang.org> | 2009-05-18 10:49:34 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-05-18 10:49:34 -0700 |
commit | df7681858bd5b1294bddfbbef6fb734b35d29dd8 (patch) | |
tree | eb92c3b09fb143cf90ddfe36300008082006c8e0 /src/lib/syscall/file_linux.go | |
parent | 445e1228300e765463b16c0cc59da0e54a17ad4c (diff) | |
download | golang-df7681858bd5b1294bddfbbef6fb734b35d29dd8.tar.gz |
add Getwd, Fchdir, tests
R=r
DELTA=215 (186 added, 0 deleted, 29 changed)
OCL=28968
CL=28995
Diffstat (limited to 'src/lib/syscall/file_linux.go')
-rw-r--r-- | src/lib/syscall/file_linux.go | 60 |
1 files changed, 40 insertions, 20 deletions
diff --git a/src/lib/syscall/file_linux.go b/src/lib/syscall/file_linux.go index f6b6ea7e6..2f8b9101f 100644 --- a/src/lib/syscall/file_linux.go +++ b/src/lib/syscall/file_linux.go @@ -13,39 +13,39 @@ import ( const nameBufsize = 512 -func Open(name string, mode int64, perm int64) (ret int64, errno int64) { +func Open(name string, mode int64, perm int64) (ret, errno int64) { namebuf := StringBytePtr(name); r1, r2, err := Syscall(SYS_OPEN, int64(uintptr(unsafe.Pointer(namebuf))), mode, perm); return r1, err; } -func Creat(name string, perm int64) (ret int64, errno int64) { +func Creat(name string, perm int64) (ret, errno int64) { namebuf := StringBytePtr(name); r1, r2, err := Syscall(SYS_OPEN, int64(uintptr(unsafe.Pointer(namebuf))), O_CREAT|O_WRONLY|O_TRUNC, perm); return r1, err; } -func Close(fd int64) (ret int64, errno int64) { +func Close(fd int64) (ret, errno int64) { r1, r2, err := Syscall(SYS_CLOSE, fd, 0, 0); return r1, err; } -func Read(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) { +func Read(fd int64, buf *byte, nbytes int64) (ret, errno int64) { r1, r2, err := Syscall(SYS_READ, fd, int64(uintptr(unsafe.Pointer(buf))), nbytes); return r1, err; } -func Write(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) { +func Write(fd int64, buf *byte, nbytes int64) (ret, errno int64) { r1, r2, err := Syscall(SYS_WRITE, fd, int64(uintptr(unsafe.Pointer(buf))), nbytes); return r1, err; } -func Seek(fd int64, offset int64, whence int64) (ret int64, errno int64) { +func Seek(fd int64, offset int64, whence int64) (ret, errno int64) { r1, r2, err := Syscall(SYS_LSEEK, fd, offset, whence); return r1, err; } -func Pipe(fds *[2]int64) (ret int64, errno int64) { +func Pipe(fds *[2]int64) (ret, errno int64) { var t [2] int32; r1, r2, err := Syscall(SYS_PIPE, int64(uintptr(unsafe.Pointer(&t[0]))), 0, 0); if r1 < 0 { @@ -56,77 +56,97 @@ func Pipe(fds *[2]int64) (ret int64, errno int64) { return 0, 0; } -func Stat(name string, buf *Stat_t) (ret int64, errno int64) { +func Stat(name string, buf *Stat_t) (ret, errno int64) { namebuf := StringBytePtr(name); r1, r2, err := Syscall(SYS_STAT, int64(uintptr(unsafe.Pointer(namebuf))), int64(uintptr(unsafe.Pointer(buf))), 0); return r1, err; } -func Lstat(name string, buf *Stat_t) (ret int64, errno int64) { +func Lstat(name string, buf *Stat_t) (ret, errno int64) { namebuf := StringBytePtr(name); r1, r2, err := Syscall(SYS_LSTAT, int64(uintptr(unsafe.Pointer(namebuf))), int64(uintptr(unsafe.Pointer(buf))), 0); return r1, err; } -func Fstat(fd int64, buf *Stat_t) (ret int64, errno int64) { +func Fstat(fd int64, buf *Stat_t) (ret, errno int64) { r1, r2, err := Syscall(SYS_FSTAT, fd, int64(uintptr(unsafe.Pointer(buf))), 0); return r1, err; } -func Unlink(name string) (ret int64, errno int64) { +func Unlink(name string) (ret, errno int64) { namebuf := StringBytePtr(name); r1, r2, err := Syscall(SYS_UNLINK, int64(uintptr(unsafe.Pointer(namebuf))), 0, 0); return r1, err; } -func Rmdir(name string) (ret int64, errno int64) { +func Rmdir(name string) (ret, errno int64) { namebuf := StringBytePtr(name); r1, r2, err := Syscall(SYS_RMDIR, int64(uintptr(unsafe.Pointer(namebuf))), 0, 0); return r1, err; } -func Fcntl(fd, cmd, arg int64) (ret int64, errno int64) { +func Fcntl(fd, cmd, arg int64) (ret, errno int64) { r1, r2, err := Syscall(SYS_FCNTL, fd, cmd, arg); return r1, err } -func Mkdir(name string, perm int64) (ret int64, errno int64) { +func Mkdir(name string, perm int64) (ret, errno int64) { namebuf := StringBytePtr(name); r1, r2, err := Syscall(SYS_MKDIR, int64(uintptr(unsafe.Pointer(namebuf))), perm, 0); return r1, err; } -func Dup2(fd1, fd2 int64) (ret int64, errno int64) { +func Dup2(fd1, fd2 int64) (ret, errno int64) { r1, r2, err := Syscall(SYS_DUP2, fd1, fd2, 0); return r1, err; } -func Getdents(fd int64, buf *Dirent, nbytes int64) (ret int64, errno int64) { +func Getdents(fd int64, buf *Dirent, nbytes int64) (ret, errno int64) { r1, r2, err := Syscall(SYS_GETDENTS64, fd, int64(uintptr(unsafe.Pointer(buf))), nbytes); return r1, err; } -func Chdir(dir string) (ret int64, errno int64) { +func Chdir(dir string) (ret, errno int64) { namebuf := StringBytePtr(dir); r1, r2, err := Syscall(SYS_CHDIR, int64(uintptr(unsafe.Pointer(namebuf))), 0, 0); return r1, err; } -func Link(oldpath, newpath string) (ret int64, errno int64) { +func Fchdir(fd int64) (ret, errno int64) { + r1, r2, err := Syscall(SYS_FCHDIR, fd, 0, 0); + return r1, err; +} + +const ImplementsGetwd = true + +func Getwd() (ret string, errno int64) { + var buf [PathMax]byte; + r1, r2, err := Syscall(SYS_GETCWD, int64(uintptr(unsafe.Pointer(&buf))), int64(len(buf)), 0); + if err != 0 { + return "", err; + } + // SYS_GETCWD returns the number of bytes written to buf, including the NUL. + if r1 < 1 || r1 > int64(len(buf)) || buf[r1-1] != 0 { + return "", EINVAL; + } + return string(buf[0:r1-1]), 0 +} + +func Link(oldpath, newpath string) (ret, errno int64) { oldbuf := StringBytePtr(oldpath); newbuf := StringBytePtr(newpath); r1, r2, err := Syscall(SYS_LINK, int64(uintptr(unsafe.Pointer(oldbuf))), int64(uintptr(unsafe.Pointer(newbuf))), 0); return r1, err; } -func Symlink(oldpath, newpath string) (ret int64, errno int64) { +func Symlink(oldpath, newpath string) (ret, errno int64) { oldbuf := StringBytePtr(oldpath); newbuf := StringBytePtr(newpath); r1, r2, err := Syscall(SYS_SYMLINK, int64(uintptr(unsafe.Pointer(oldbuf))), int64(uintptr(unsafe.Pointer(newbuf))), 0); return r1, err; } -func Readlink(path string, buf *byte, nbytes int64) (ret int64, errno int64) { +func Readlink(path string, buf *byte, nbytes int64) (ret, errno int64) { pathbuf := StringBytePtr(path); r1, r2, err := Syscall(SYS_READLINK, int64(uintptr(unsafe.Pointer(pathbuf))), int64(uintptr(unsafe.Pointer(buf))), nbytes); return r1, err; |