summaryrefslogtreecommitdiff
path: root/src/syscall
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2008-09-11 13:40:17 -0700
committerRob Pike <r@golang.org>2008-09-11 13:40:17 -0700
commitc3ae75b49dfeddcf941853aaf7330554a1fef964 (patch)
tree63ad4f7c84d3162b515c764370c4025bc20dc823 /src/syscall
parent4b4588d46ecf0636f8c655c7f9b6353bd3f65840 (diff)
downloadgo-c3ae75b49dfeddcf941853aaf7330554a1fef964.tar.gz
make syscall use strings for file names
tweak os to adjust move StringToBytes into syscall, at least for now this program still works: package main import os "os" func main() { os.Stdout.WriteString("hello, world\n"); a, b := os.NewFD(77).WriteString("no way"); os.Stdout.WriteString(b.String() + "\n"); } R=rsc DELTA=263 (59 added, 176 deleted, 28 changed) OCL=15153 CL=15153
Diffstat (limited to 'src/syscall')
-rw-r--r--src/syscall/Makefile22
-rw-r--r--src/syscall/file_amd64_darwin.go34
-rw-r--r--src/syscall/file_amd64_linux.go34
-rw-r--r--src/syscall/syscall.go14
4 files changed, 81 insertions, 23 deletions
diff --git a/src/syscall/Makefile b/src/syscall/Makefile
index 468909a10..9ae0c6a72 100644
--- a/src/syscall/Makefile
+++ b/src/syscall/Makefile
@@ -8,23 +8,31 @@ CC=$(O)c
AS=$(O)a
GC=$(O)g
-PKG=syscall.a
+PKG=$(GOROOT)/pkg/syscall.a
-OFILES=\
+O1=\
syscall.$O \
errstr_$(GOOS).$O \
+
+O2=\
file_$(GOARCH)_$(GOOS).$O \
syscall_$(GOARCH)_$(GOOS).$O \
-install: $(PKG)
- cp $(PKG) $(GOROOT)/pkg/$(PKG)
+install: nuke $(PKG)
+
+$(PKG): a1 a2
+
+a1: $(O1)
+ $(O)ar grc $(PKG) $(O1)
+ rm *.6
-$(PKG): $(OFILES)
- $(O)ar grc $(PKG) $(OFILES)
+a2: $(O2)
+ $(O)ar grc $(PKG) $(O2)
+ rm *.6
nuke:
- rm -f *.$(O) *.a $(GOROOT)/pkg/$(PKG)
+ rm -f *.$(O) *.a $(PKG)
clean:
rm -f *.$(O) *.a
diff --git a/src/syscall/file_amd64_darwin.go b/src/syscall/file_amd64_darwin.go
index 58cf6e93b..95d3ce55d 100644
--- a/src/syscall/file_amd64_darwin.go
+++ b/src/syscall/file_amd64_darwin.go
@@ -65,15 +65,25 @@ const (
O_TRUNC = 0x400;
)
-export func open(name *byte, mode int64, flags int64) (ret int64, errno int64) {
+const NameBufsize = 512
+
+export func open(name string, mode int64, perm int64) (ret int64, errno int64) {
+ var namebuf [NameBufsize]byte;
+ if !StringToBytes(&namebuf, name) {
+ return -1, syscall.ENAMETOOLONG
+ }
const SYSOPEN = 5;
- r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, flags);
+ r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(&namebuf[0]), mode, perm);
return r1, err;
}
-export func creat(name *byte, mode int64) (ret int64, errno int64) {
+export func creat(name string, perm int64) (ret int64, errno int64) {
+ var namebuf [NameBufsize]byte;
+ if !StringToBytes(&namebuf, name) {
+ return -1, syscall.ENAMETOOLONG
+ }
const SYSOPEN = 5;
- r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, O_CREAT|O_WRONLY|O_TRUNC);
+ r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(&namebuf[0]), O_CREAT|O_WRONLY|O_TRUNC, perm);
return r1, err;
}
@@ -106,9 +116,13 @@ export func pipe(fds *[2]int64) (ret int64, errno int64) {
return 0, 0;
}
-export func stat(name *byte, buf *Stat) (ret int64, errno int64) {
+export func stat(name string, buf *Stat) (ret int64, errno int64) {
+ var namebuf [NameBufsize]byte;
+ if !StringToBytes(&namebuf, name) {
+ return -1, syscall.ENAMETOOLONG
+ }
const SYSSTAT = 338;
- r1, r2, err := syscall.Syscall(SYSSTAT, AddrToInt(name), StatToInt(buf), 0);
+ r1, r2, err := syscall.Syscall(SYSSTAT, AddrToInt(&namebuf[0]), StatToInt(buf), 0);
return r1, err;
}
@@ -124,8 +138,12 @@ export func fstat(fd int64, buf *Stat) (ret int64, errno int64) {
return r1, err;
}
-export func unlink(name *byte) (ret int64, errno int64) {
+export func unlink(name string) (ret int64, errno int64) {
+ var namebuf [NameBufsize]byte;
+ if !StringToBytes(&namebuf, name) {
+ return -1, syscall.ENAMETOOLONG
+ }
const SYSUNLINK = 10;
- r1, r2, err := syscall.Syscall(SYSUNLINK, AddrToInt(name), 0, 0);
+ r1, r2, err := syscall.Syscall(SYSUNLINK, AddrToInt(&namebuf[0]), 0, 0);
return r1, err;
}
diff --git a/src/syscall/file_amd64_linux.go b/src/syscall/file_amd64_linux.go
index d00222a26..dc99d7de3 100644
--- a/src/syscall/file_amd64_linux.go
+++ b/src/syscall/file_amd64_linux.go
@@ -66,15 +66,25 @@ const (
O_TRUNC = 0x200;
)
-export func open(name *byte, mode int64, flags int64) (ret int64, errno int64) {
+const NameBufsize = 512
+
+export func open(name string, mode int64, perm int64) (ret int64, errno int64) {
+ var namebuf [NameBufsize]byte;
+ if !StringToBytes(&namebuf, name) {
+ return -1, syscall.ENAMETOOLONG
+ }
const SYSOPEN = 2;
- r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, flags);
+ r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(&namebuf[0]), mode, perm);
return r1, err;
}
-export func creat(name *byte, mode int64) (ret int64, errno int64) {
+export func creat(name string, perm int64) (ret int64, errno int64) {
+ var namebuf [NameBufsize]byte;
+ if !StringToBytes(&namebuf, name) {
+ return -1, syscall.ENAMETOOLONG
+ }
const SYSOPEN = 2;
- r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(name), mode, O_CREAT|O_WRONLY|O_TRUNC);
+ r1, r2, err := syscall.Syscall(SYSOPEN, AddrToInt(&namebuf[0]), O_CREAT|O_WRONLY|O_TRUNC, perm);
return r1, err;
}
@@ -108,9 +118,13 @@ export func pipe(fds *[2]int64) (ret int64, errno int64) {
return 0, 0;
}
-export func stat(name *byte, buf *Stat) (ret int64, errno int64) {
+export func stat(name string, buf *Stat) (ret int64, errno int64) {
+ var namebuf [NameBufsize]byte;
+ if !StringToBytes(&namebuf, name) {
+ return -1, syscall.ENAMETOOLONG
+ }
const SYSSTAT = 4;
- r1, r2, err := syscall.Syscall(SYSSTAT, AddrToInt(name), StatToInt(buf), 0);
+ r1, r2, err := syscall.Syscall(SYSSTAT, AddrToInt(&namebuf[0]), StatToInt(buf), 0);
return r1, err;
}
@@ -126,8 +140,12 @@ export func fstat(fd int64, buf *Stat) (ret int64, errno int64) {
return r1, err;
}
-export func unlink(name *byte) (ret int64, errno int64) {
+export func unlink(name string) (ret int64, errno int64) {
+ var namebuf [NameBufsize]byte;
+ if !StringToBytes(&namebuf, name) {
+ return -1, syscall.ENAMETOOLONG
+ }
const SYSUNLINK = 87;
- r1, r2, err := syscall.Syscall(SYSUNLINK, AddrToInt(name), 0, 0);
+ r1, r2, err := syscall.Syscall(SYSUNLINK, AddrToInt(&namebuf[0]), 0, 0);
return r1, err;
}
diff --git a/src/syscall/syscall.go b/src/syscall/syscall.go
index 7f31c11c9..384be2429 100644
--- a/src/syscall/syscall.go
+++ b/src/syscall/syscall.go
@@ -11,3 +11,17 @@ package syscall
export func Syscall(trap int64, a1, a2, a3 int64) (r1, r2, err int64);
export func AddrToInt(b *byte) int64;
+/*
+ * Used to convert file names to byte arrays for passing to kernel,
+ * but useful elsewhere too.
+ */
+export func StringToBytes(b *[]byte, s string) bool {
+ if len(s) >= len(b) {
+ return false
+ }
+ for i := 0; i < len(s); i++ {
+ b[i] = s[i]
+ }
+ b[len(s)] = '\000'; // not necessary - memory is zeroed - but be explicit
+ return true
+}