summaryrefslogtreecommitdiff
path: root/src/syscall
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2008-07-30 14:23:53 -0700
committerRob Pike <r@golang.org>2008-07-30 14:23:53 -0700
commit8f229b133e0ce7543e931a752ed56a1128cd0ffa (patch)
treea1311d923f764f1783116956efc0c392065ec5ee /src/syscall
parentddd49b03d4c4adb264266e63d1275bce00261b81 (diff)
downloadgo-8f229b133e0ce7543e931a752ed56a1128cd0ffa.tar.gz
- mark syscall support routines as non-stack-generating
- add unlink, creat - add constants for open - fix some comments R=gri OCL=13654 CL=13656
Diffstat (limited to 'src/syscall')
-rw-r--r--src/syscall/file_amd64_darwin.go53
-rw-r--r--src/syscall/file_amd64_linux.go53
-rw-r--r--src/syscall/syscall_amd64_darwin.s7
-rw-r--r--src/syscall/syscall_amd64_linux.s9
4 files changed, 102 insertions, 20 deletions
diff --git a/src/syscall/file_amd64_darwin.go b/src/syscall/file_amd64_darwin.go
index df2a1f81f..97017e5d3 100644
--- a/src/syscall/file_amd64_darwin.go
+++ b/src/syscall/file_amd64_darwin.go
@@ -4,16 +4,17 @@
package syscall
+// File operations for Darwin
+
import syscall "syscall"
export Stat
export stat, fstat, lstat
-export open, close, read, write, pipe
+export open, creat, close, read, write, pipe
+export unlink
func StatToInt(s *Stat) int64;
-// Stat and relatives for Darwin
-
type dev_t uint32;
type ino_t uint64;
type mode_t uint16;
@@ -50,9 +51,43 @@ type Stat struct {
st_qspare[2] int64;
}
-func open(name *byte, mode int64) (ret int64, errno int64) {
+const (
+ O_RDONLY = 0x0;
+ O_WRONLY = 0x1;
+ O_RDWR = 0x2;
+ O_APPEND = 0x8;
+ O_ASYNC = 0x40;
+ O_CREAT = 0x200;
+ O_NOCTTY = 0x20000;
+ O_NONBLOCK = 0x4;
+ O_NDELAY = O_NONBLOCK;
+ O_SYNC = 0x80;
+ O_TRUNC = 0x400;
+)
+
+export (
+ O_RDONLY,
+ O_WRONLY,
+ O_RDWR,
+ O_APPEND,
+ O_ASYNC,
+ O_CREAT,
+ O_NOCTTY,
+ O_NONBLOCK,
+ O_NDELAY,
+ O_SYNC,
+ O_TRUNC
+)
+
+func open(name *byte, mode int64, flags int64) (ret int64, errno int64) {
const SYSOPEN = 5;
- r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, 0);
+ r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, flags);
+ return r1, err;
+}
+
+func creat(name *byte, mode int64) (ret int64, errno int64) {
+ const SYSOPEN = 5;
+ r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, O_CREAT|O_WRONLY|O_TRUNC);
return r1, err;
}
@@ -82,7 +117,7 @@ func pipe(fds *[2]int64) (ret int64, errno int64) {
}
fds[0] = r1;
fds[1] = r2;
- return 0, err;
+ return 0, 0;
}
func stat(name *byte, buf *Stat) (ret int64, errno int64) {
@@ -102,3 +137,9 @@ func fstat(fd int64, buf *Stat) (ret int64, errno int64) {
r1, r2, err := syscall.Syscall(SYSFSTAT, fd, StatToInt(buf), 0);
return r1, err;
}
+
+func unlink(name *byte) (ret int64, errno int64) {
+ const SYSUNLINK = 10;
+ r1, r2, err := syscall.Syscall(SYSUNLINK, AddrToInt(name), 0, 0);
+ return r1, err;
+}
diff --git a/src/syscall/file_amd64_linux.go b/src/syscall/file_amd64_linux.go
index e407a17fe..dc600b8c3 100644
--- a/src/syscall/file_amd64_linux.go
+++ b/src/syscall/file_amd64_linux.go
@@ -4,17 +4,18 @@
package syscall
+// File operations for Linux
+
import syscall "syscall"
export Stat
export stat, fstat, lstat
-export open, close, read, write, pipe
+export open, creat, close, read, write, pipe
+export unlink
func StatToInt(s *Stat) int64;
func Addr32ToInt(s *int32) int64;
-// Stat and relatives for Linux
-
type dev_t uint64;
type ino_t uint64;
type mode_t uint32;
@@ -51,9 +52,43 @@ type Stat struct {
st_unused6 int64;
}
-func open(name *byte, mode int64) (ret int64, errno int64) {
+const (
+ O_RDONLY = 0x0;
+ O_WRONLY = 0x1;
+ O_RDWR = 0x2;
+ O_APPEND = 0x400;
+ O_ASYNC = 0x2000;
+ O_CREAT = 0x40;
+ O_NOCTTY = 0x100;
+ O_NONBLOCK = 0x800;
+ O_NDELAY = O_NONBLOCK;
+ O_SYNC = 0x1000;
+ O_TRUNC = 0x200;
+)
+
+export (
+ O_RDONLY,
+ O_WRONLY,
+ O_RDWR,
+ O_APPEND,
+ O_ASYNC,
+ O_CREAT,
+ O_NOCTTY,
+ O_NONBLOCK,
+ O_NDELAY,
+ O_SYNC,
+ O_TRUNC
+)
+
+func open(name *byte, mode int64, flags int64) (ret int64, errno int64) {
+ const SYSOPEN = 2;
+ r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, flags);
+ return r1, err;
+}
+
+func creat(name *byte, mode int64) (ret int64, errno int64) {
const SYSOPEN = 2;
- r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, 0);
+ r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, O_CREAT|O_WRONLY|O_TRUNC);
return r1, err;
}
@@ -64,7 +99,6 @@ func close(fd int64) (ret int64, errno int64) {
}
func read(fd int64, buf *byte, nbytes int64) (ret int64, errno int64) {
-print "READ: ", fd, " ", nbytes, "\n";
const SYSREAD = 0;
r1, r2, err := syscall.Syscall(SYSREAD, fd, AddrToInt(buf), nbytes);
return r1, err;
@@ -85,7 +119,7 @@ func pipe(fds *[2]int64) (ret int64, errno int64) {
}
fds[0] = int64(t[0]);
fds[1] = int64(t[1]);
- return 0, err;
+ return 0, 0;
}
func stat(name *byte, buf *Stat) (ret int64, errno int64) {
@@ -106,3 +140,8 @@ func fstat(fd int64, buf *Stat) (ret int64, errno int64) {
return r1, err;
}
+func unlink(name *byte) (ret int64, errno int64) {
+ const SYSUNLINK = 87;
+ r1, r2, err := syscall.Syscall(SYSUNLINK, AddrToInt(name), 0, 0);
+ return r1, err;
+}
diff --git a/src/syscall/syscall_amd64_darwin.s b/src/syscall/syscall_amd64_darwin.s
index 2d8cd075e..5631803e2 100644
--- a/src/syscall/syscall_amd64_darwin.s
+++ b/src/syscall/syscall_amd64_darwin.s
@@ -9,7 +9,7 @@
// func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
// Trap # in AX, args in DI SI DX, return in AX DX
-TEXT syscall·Syscall(SB),1,$-8
+TEXT syscall·Syscall(SB),7,$-8
MOVQ 16(SP), DI
MOVQ 24(SP), SI
MOVQ 32(SP), DX
@@ -26,12 +26,13 @@ TEXT syscall·Syscall(SB),1,$-8
MOVQ $0, 56(SP) // errno
RET
-TEXT syscall·AddrToInt(SB),1,$-8
+// conversion operators - really just casts
+TEXT syscall·AddrToInt(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
-TEXT syscall·StatToInt(SB),1,$-8
+TEXT syscall·StatToInt(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
diff --git a/src/syscall/syscall_amd64_linux.s b/src/syscall/syscall_amd64_linux.s
index b50fc0c13..c6ce48cd0 100644
--- a/src/syscall/syscall_amd64_linux.s
+++ b/src/syscall/syscall_amd64_linux.s
@@ -9,7 +9,7 @@
// func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
// Trap # in AX, args in DI SI DX, return in AX DX
-TEXT syscall·Syscall(SB),1,$-8
+TEXT syscall·Syscall(SB),7,$-8
MOVQ 16(SP), DI
MOVQ 24(SP), SI
MOVQ 32(SP), DX
@@ -27,17 +27,18 @@ TEXT syscall·Syscall(SB),1,$-8
MOVQ $0, 56(SP) // errno
RET
-TEXT syscall·AddrToInt(SB),1,$-8
+// conversion operators - really just casts
+TEXT syscall·AddrToInt(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
-TEXT syscall·Addr32ToInt(SB),1,$-8
+TEXT syscall·Addr32ToInt(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET
-TEXT syscall·StatToInt(SB),1,$-8
+TEXT syscall·StatToInt(SB),7,$-8
MOVQ 8(SP), AX
MOVQ AX, 16(SP)
RET